/**
 * @author Chris Friedrich
 * These classes control the UI for the My Links module.  When the module was 
 * ported to the cloud, a hack was implemented to quickly port it.  The module
 * calls myModule.refreshModuleContent as the callback for every AJAX request.
 * This results in unnecessary calls to the server.
 * These classes should be rewritten to handle the UI changes via DOM 
 * manipulation and then save the change to the module AJAX service.
 */

HP.Modules.MyLinks = Class.create(HP.Module, {
	initialize: function($super, moduleid){
		$super(moduleid);
		this.createSortable();
		this.panelid = 'MyLinksPanel'+moduleid;
		this.popup = new HP.ModulePopups.MyLinks(moduleid);
		
		// register addNew button
		this.$GEBI('addBtn').observe('click', this.popup.open.bindAsEventListener(this.popup, {popupid: 'addNew'}));
		// register edit buttons
		var edits = this.rootNode.select("a[action=editSaved]");
		for(var i = 0; i < edits.length; i++){
			var edit = edits[i];
			edit.observe('click',this.popup.open.bindAsEventListener(this.popup, {popupid: 'edit', url: edit.readAttribute('url')}));
		}
		//register save buttons
		var saves = this.rootNode.select("a[action=saveRecent]");
		for(var i = 0; i < saves.length; i++){
			var save = saves[i];
			save.observe('click',this.popup.open.bindAsEventListener(this.popup, {popupid: 'save', url: save.readAttribute('url')}));
		}
		
		//register delete buttons
		var deletes = this.rootNode.select("a[action=deleteSaved]");
		for(var i = 0; i < deletes.length; i++){
			var del = deletes[i];
			del.observe('click',this.deleteSavedURL.bind(this, del.readAttribute('url')));
		}
		var deletes = this.rootNode.select("a[action=deleteRecent]");
		for(var i = 0; i < deletes.length; i++){
			var del = deletes[i];
			del.observe('click',this.deleteRecentURL.bind(this, del.readAttribute('url')));
		}
		this.registerEvents('#undoBtn', this.undo.bind(this));
		this.registerEvents('#closeBtn', this.closeAlert.bind(this));
		this.registerEvents('#nothanksBtn', this.clearall.bind(this));
		this.registerEvents('#nextBtn', this.next.bind(this));
		this.registerEvents('#previousBtn', this.prev.bind(this));
	},
	createSortable: function(){
		var list = this.$GEBI('sortable');
		if(list){
			if(Prototype.Browser.IE){
				Element.setStyle(list,{position:'relative'});
			}
			Position.includeScrollOffsets = true;
			Sortable.create(list,
							{constraint:'vertical',
							scroll:'sortable',
							scrollSensitivity: 10,
							scrollSpeed: 10,
							markDropZone: false,
							onUpdate:this.saveOrder.bind(this)});
		}
	},
	saveOrder: function(list){
		var urls = [];
		for(var i = 0; i < list.childNodes.length; i++){
			urls.push(list.childNodes[i].readAttribute('url'));
		}
		
		var jsonurls = {urls: urls};
		this.doAJAX("reorder",jsonurls);
	},
	deleteRecentURL: function(url, ev){
		this.doAJAX("deleteRecent", {url: url}, this.refreshContent.bind(this));
	},
	deleteSavedURL: function(url, ev){
		this.doAJAX("deleteSaved", {url: url}, this.refreshContent.bind(this));
	},
	clearall: function(){
		this.doAJAX("clearall",{timezone: new Date().getTimezoneOffset()}, this.refreshContent.bind(this));
	},
	prev: function(){
		this.doAJAX("prev", {}, this.refreshContent.bind(this));
	},
	next: function(){
		this.doAJAX("next", {}, this.refreshContent.bind(this));
	},
	undo: function(){
		this.doAJAX("undo", {}, this.refreshContent.bind(this));
	},
	closeAlert: function(){
		this.doAJAX("closeAlert", {}, this.refreshContent.bind(this));
	}
});

HP.ModulePopups.MyLinks = Class.create(HP.ModulePopup,{
	initialize: function($super, moduleid){
		$super(moduleid);
	},
	prepForm: function($super, pars){
		if(pars.url){
			pars.url = pars.url.replace(/\t/g,'');
			var protocols = ["http", "https"];
			var hasProtocol = false;
			for(var i = 0; i < protocols.length; i++){
				if(pars.url.indexOf(protocols[i]) == 0){
					hasProtocol = true;
					break;
				}
			}
			if(!hasProtocol){
				pars.url = "http://" + pars.url;
			}
		}
		return pars;
	},
	validate: function($super, pars){
		var errs = $super(pars);
		if(pars.url){
			var v = new RegExp();
	    	v.compile("^[A-Za-z]+://[A-Za-z0-9-_]+\\.[A-Za-z0-9-_%&\?\/.=:\+]+$");
	    	errs.url = !v.test(pars.url); 
		}
		return errs;
	}
});
