/**
 * @author Jordi Martinez Bosch 
 * 28.12.07: Creacio i primera versió
 */

//Extension Methods
Sys.UI.DomElement.changeCssClass = function(element, cssClass){
	if (typeof element == 'string') { element = $get(element); }
	Sys.UI.DomElement.removeCssClass(element, element.className);
	Sys.UI.DomElement.addCssClass(element, cssClass);
}
Sys.UI.DomElement.hide = function(element){
	if (typeof element == 'string') { element = $get(element); }
	element.style.display = 'none';
}
Sys.UI.DomElement.show = function(element){
	if (typeof element == 'string') { element = $get(element); }
	element.style.display = '';
}
Sys.UI.DomElement.setPositionFromParent = function(e, p){
	var c = Sys.UI.DomElement.getPosition(p);
	c[0] += p.offsetWidth;
	e.style.left = c[0] + 'px';
	e.style.top = c[1] + 'px';
}
Sys.UI.DomElement.getPosition= function(e){
	var cl = ct = 0;
 	if (e.offsetParent) {
 		cl = e.offsetLeft;
 		ct = e.offsetTop;
 		while (e = e.offsetParent) {
 			cl += e.offsetLeft;
 			ct += e.offsetTop;
 		}
 	}
 	return [cl, ct];
 }

Type.registerNamespace('Helix');

Helix.Suggest = {
	initialize: function(cid, lang){
		var prefix = cid;
		
		//Controls
		this._ctlTxt = $get(prefix + 'txtDonde1');				
		this._ctlSearchMode = $get(prefix + 'hdSearchMode');
		this._ctlSearchOption = $get(prefix + 'hdSearchOption');
		this._ctlSearchItemID = $get(prefix + 'hdSuggestItemID');
		this._ctlSearchWords = $get(prefix + 'hdSearchWords');
		this._autocomplete = $find('AutoCompleteExtender1');

		//Init values		
		this._ctlSearchOption.value = '0';
		this._ctlSearchMode.value = '1';
		this._services = ["GetMunicipios"];
		this._currentKey = '';		
		
		//Handlers
		$addHandler(this._ctlTxt, 'focus', function(){ Helix.Suggest.close(); });
		
		this._autocomplete.add_populated(Helix.Suggest.autoCompleteOnPopulated);
		this._autocomplete.add_itemSelected(Helix.Suggest.autoCompleteOnItemSelected);
		this._autocomplete.set_serviceMethod(Helix.Suggest._services[0]);
		
		this._onSuggestSearchModeChanged = null;
		this._onSuggestItemSelected = null;
		
		//Web Service
		this._ws = new CMS.Modulos.CTE.Services.Suggest()
		this._ws.set_defaultSucceededCallback(Helix.Suggest._onWsSuceeded);
		this._ws.set_defaultFailedCallback(Helix.Suggest._onWsFailed);
		
		//div free text search
		this._initializeFreeSuggest(prefix);
	},
	_initializeFreeSuggest: function(prefix){
		if (this._suggest_div == null) {
			this._suggest_div = document.createElement('div');
			this._suggest_div.id = prefix + '_suggest_div';
			Sys.UI.DomElement.addCssClass(this._suggest_div, 'suggestSearch')
			this._suggest_div.style.display = 'none';
			
			var inner = document.createElement('div');
			inner.id = prefix + '_suggest_inner_div';
			
			//header div
			this._suggest_header_div = document.createElement('div');
			this._suggest_header_div.id = prefix + 'suggest_header_div';
			//header message div
			this._suggest_header_msg_div = document.createElement('div');
			this._suggest_header_msg_div.id = prefix + 'suggest_header_msg_div';
			Sys.UI.DomElement.addCssClass(this._suggest_header_msg_div, 'suggestSearchMsg')
			
			//Results List
			this._suggest_results_ul = document.createElement('ul');
			this._suggest_results_ul.style.display = 'none';
			this._suggest_results_ul.id = prefix + 'suggest_results_ul';
			Sys.UI.DomElement.addCssClass(this._suggest_results_ul, this._autocomplete._completionListCssClass)
				
			$addHandler(this._suggest_results_ul, "mousedown", this._onFsMouseDown);
			$addHandler(this._suggest_results_ul, "mouseup", this._onFsMouseUp);
			$addHandler(this._suggest_results_ul, "mouseover", this._onFsMouseOver);
			
			inner.appendChild(this._suggest_header_div);
			inner.appendChild(this._suggest_header_msg_div);
			inner.appendChild(this._suggest_results_ul);
			
			this._suggest_div.appendChild(inner);
			
			//Close image
			var img = document.createElement('img');
			img.id = 'suggest_close_img';
			img.src = '/_aux_imagenes/boton-cerrar-small.gif';
			img.alt = img.title = uiStrings.strSuggestClose;
			
			$addHandler(img, "mouseover", function(evt){evt.target.src = '_aux_imagenes/boton-cerrar-small.gif';});
			$addHandler(img, "mouseout", function(evt){evt.target.src = '_aux_imagenes/boton-cerrar-small.gif';});
			$addHandler(img, "click", function(evt){Helix.Suggest.close();});
			
			this._suggest_div.appendChild(img);

			if (Sys.Browser.agent === Sys.Browser.Safari) {
				document.body.appendChild(this._suggest_div);
			} else {
				this._ctlTxt.parentNode.insertBefore(this._suggest_div, this._ctlTxt.nextSibling);
			}
		}

		var popupOptions = {'id' : prefix + 'PopupBehavior', 'parentElement':this._ctlTxt, 'positioningMode': AjaxControlToolkit.PositioningMode.BottomLeft };
		this._popupBehavior = $create(AjaxControlToolkit.PopupBehavior, popupOptions, null, null, this._suggest_div);
	},
	
	//****** Properties ******
	
	get_text : function(){ return Helix.Suggest._ctlTxt.value; },
	set_text : function(value){ Helix.Suggest._ctlTxt.value = value; },
	get_searchItemID : function() { return Helix.Suggest._ctlSearchItemID.value; },
	set_searchItemID : function(value) {Helix.Suggest._ctlSearchItemID.value = value; },
	get_key : function() { return Helix.Suggest._currentKey; },
	set_key : function(id, text) { Helix.Suggest._currentKey = id + '|' + text; },
	get_searchWords : function() { return Helix.Suggest._ctlSearchWords.value; },
	set_searchWords : function(value) { Helix.Suggest._ctlSearchWords.value = value; },
	get_searchMode : function() { return Helix.Suggest._ctlSearchMode.value; },
	set_searchMode : function(value) { Helix.Suggest._ctlSearchMode.value = value; },	
	get_searchOption : function() { return Helix.Suggest._ctlSearchOption.value; },
	get_textCtl : function(){ return Helix.Suggest._ctlTxt; },
	get_lnkSwapCtl : function(){ return $get('lnkSwap'); },
	
	//****** Events ******
	
	add_suggestSearchModeChanged: function(f){ Helix.Suggest._onSuggestSearchModeChanged = f;},
	add_suggestItemSelected: function(f){ Helix.Suggest._onSuggestItemSelected = f; },
	
	//****** Methods ******
	
	autoCompleteOnPopulated: function(obj){
		var cl = Helix.Suggest._autocomplete.get_completionList();
		for(var i=0;i<cl.childNodes.length;i++){
			var li = cl.childNodes[i];
			var text = li.innerHTML;			
			var arr = text.split('|');			
			li.id = arr[0];
			li.innerHTML = arr[1];
		}
	},
	autoCompleteOnItemSelected: function(obj, item, args){
		var li = item.get_item();
		var id = li.id;
		var text = li.innerHTML;
		
		if(text.length>0) {
			Helix.Suggest.set_text(text);
			Helix.Suggest.set_searchItemID(id);
			Helix.Suggest.set_key(id, text);
		}
		
		//throw event
		if (Helix.Suggest._onSuggestItemSelected != null) {
			Helix.Suggest._onSuggestItemSelected(text);
		}
	},
	suggestOnSubmit : function(){
		//Si el element seleccionat no te un ID associat (al camp amagat), farem una petició al
		//servei web per obtenir un valor o un llistat i no deixarlo continuar fins que en seleccioni un
		//Comprobem si la clau texte / id coincideix amb la que tinc guardada, si no coincideix es que s'ha modificat el texte (per exemple)
		var id = Helix.Suggest.get_searchItemID();
		var text = Helix.Suggest.get_text();
		var key = id + '|' + text;
		
		if(text==''){ return false; }
		
		if (id != null && id != '' && Helix.Suggest.get_key()==key) {
			return true;
		} else {
			var ws = Helix.Suggest._ws;
			var sOption = Helix.Suggest.get_searchOption();
			var text = Helix.Suggest.get_text();
			ws.GetCitiesFreeSearch(text);			
			return false;
		}
	},
	_onWsSuceeded : function(r){
		Helix.Suggest.clearChilds();
		if(r.length==0){
			Helix.Suggest.setMessage(String.format(uiStrings.strSuggestNoResults, Helix.Suggest.get_text()), 'NotFound');
		} else if(r.length>0){
			Helix.Suggest.setMessage(uiStrings.strSuggestResults, 'Confirm');
			for(var i=0;i<r.length;i++){
				var arr = r[i].split('|');
				Helix.Suggest.addSuggestChild(arr[0], arr[1]);
			}
		}
		Helix.Suggest.show();
	},
	_onWsFailed : function(r){
		//completar, quin hauria de ser el comportament?
		Helix.Suggest.setMessage(String.format(uiStrings.strSuggestNoResults, Helix.Suggest.get_text()), 'NotFound');
	},
	setMessage: function(text, type){
		Sys.UI.DomElement.changeCssClass(Helix.Suggest._suggest_header_div, type);
		Helix.Suggest._suggest_header_msg_div.innerHTML = text;
	},
	addSuggestChild: function(id, text){
		var ul = Helix.Suggest._suggest_results_ul;
		Sys.UI.DomElement.show(ul);
		var li = document.createElement('li');
		Sys.UI.DomElement.addCssClass(li, Helix.Suggest._autocomplete._completionListItemCssClass);
		li.id = id;
		li.innerHTML = text;
		ul.appendChild(li);
	},
	clearChilds: function(){
		var ul = Helix.Suggest._suggest_results_ul;
		Sys.UI.DomElement.hide(ul);
		ul.innerHTML = '';
	},
	changeService: function(index){
		var autoComplete = Helix.Suggest._autocomplete;
		if (autoComplete) {
			autoComplete.set_serviceMethod(Helix.Suggest._services[index]);
		}
		Helix.Suggest._ctlSearchOption.value = index;
		Helix.Suggest.set_text('');
		Helix.Suggest.set_searchItemID('');
		Helix.Suggest._ctlTxt.focus();				
	},
	close : function(){
		Helix.Suggest._popupBehavior.hide();
	},
	show : function(){
		Helix.Suggest._popupBehavior.show();
	},
	_onFsMouseDown: function(ev) {
		if (ev.target !== Helix.Suggest._suggest_results_ul) {
			var txt = ev.target.innerHTML;
			var id = ev.target.id;
			if(id==null || id=='') { return; }
		
			Helix.Suggest.set_searchWords(Helix.Suggest.get_text());
			Helix.Suggest.set_text(txt);
			Helix.Suggest.set_searchItemID(id);
			Helix.Suggest.set_key(id, txt);
			Helix.Suggest.close();
			
			//throw event
			if (Helix.Suggest._onSuggestItemSelected != null) {
				Helix.Suggest._onSuggestItemSelected(txt);
			}
		}		
	},
	_onFsMouseUp: function(ev) {
		Helix.Suggest._ctlTxt.focus();
	},
	_onFsMouseOver: function(ev) {
		var item = ev.target;
		if(item !== Helix.Suggest._suggest_results_ul) {
			var children =Helix.Suggest._suggest_results_ul.childNodes;
			for (var i = 0;i < children.length;++i) {
				if (item === children[i]) {
					Helix.Suggest.hlItem(item);
					break;
				}
			}
		}
	},
	hlItem: function(item) {
		var children = Helix.Suggest._suggest_results_ul.childNodes;
		for (var i = 0;i < children.length;i++) {
			var child = children[i];
			if (child._hl) {
				if (Helix.Suggest._autocomplete._completionListItemCssClass) {
					Sys.UI.DomElement.changeCssClass(child, Helix.Suggest._autocomplete._completionListItemCssClass);
					child._hl = false;
				}
			}
		}
		if(Helix.Suggest._autocomplete._highlightedItemCssClass) {
			Sys.UI.DomElement.changeCssClass(item, Helix.Suggest._autocomplete._highlightedItemCssClass);
		}
		item._hl = true;
	}
}

// Notify ScriptManager that this is the end of the script.
if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();