/* Script for Offer Database $Revision: 1.80 $ */
/* TODO: Loading Screen, Cache-Prevention, Error-Handling */

mam.odb.searchPaneControl = {
				_contentPane : null,
				_currentPage: null,
				_filterName: null,
				_filterValue: null,
				_filterValue2: null,
				_inputField: null,
				_inputFld: null,
				_targetFld: null,
				_numberOfPages: null,
				_paneId: null,
				_resultesPerPage: null,
				_searchFormId: null,
				_sortBy: null,
				_targetField: null,
				_redirectUrl: null,
				_webRep: null,
				ajaxLoaderPath: null,
				btn1Url: null,
				btn2Url: null,
				btn3Url: null,
				btn4Url: null,
				imgFirstId: null,
				imgLastId: null,
				imgNextId: null,
				imgPrevId: null,
				inputFieldId: null,
				inputPages1Id: null,
				inputPages2Id: null,
				inputPagesHiddenId: null,
				paramName: null,
				queryUri: null,
				resperpage1Id: null,
				resperpage2Id: null,
				results1Id: null,
				results2Id: null,
				resultsHiddenId: null,
				resultsHiddenTextId: null,
				resultsHiddenText2Id: null,
				targetFieldId: null,
				inputFldId: null,
				targetFldId: null,

	/** 
     * Initializes the contentpane on pageload and mixes the passed paramters into one object
     *
     * @param params 	passed arguments from the jsp
     */
	init: function(params) {
		dojo.mixin(this, params);
		this._contentPane = new dojox.layout.ContentPane({ 
			parseOnLoad: false,
			preload: false,
			loadingMessage: "<div class=\"mam-odb-loader\"><img src=\"" + this.ajaxLoaderPath + "\" width=\"52\" height=\"52\" alt=\"loading...\"/></div>"},
			dojo.byId(this._paneId)
		);
		this._searchForm = dojo.byId(this._searchFormId);
		
		try {
			this._inputField = dojo.byId(this.inputFieldId);
			this._targetField = dojo.byId(this.targetFieldId);
			this._inputFld = dojo.byId(this.inputFldId);
			this._targetFld = dojo.byId(this.targetFldId);
			this._webRep = params.webRep;
			this._partnerMap = params.partnerMap;
		} catch (err) {
			console.log(err);
		}
		
		_resultsHidden = dojo.byId(this.resultsHiddenId);
		
		this.synchElements();
		this.connectEvents();
		
		mam.keepAlive.enable();
	},

	/** 
     * Connects events to objects for updating the contentpane and form elements
     */
	connectEvents: function() {
		dojo.connect(this._contentPane, "onLoad", this, "synchElements");
		dojo.connect(this._contentPane, "onLoad", this, "track");
		for(i=0; i<this._searchForm.elements.length; i++) {
			dojo.connect(this._searchForm.elements[i], "onchange", this, "unfocus");
			if (this._searchForm.elements[i].type == "radio") {
				dojo.connect(this._searchForm.elements[i], "onclick", this, "updateContent");
			} else if ((this._searchForm.elements[i].id != this.resperpage1Id) && (this._searchForm.elements[i].id != this.resperpage2Id)){
				dojo.connect(this._searchForm.elements[i], "onchange", this, "resetFilters");
				dojo.connect(this._searchForm.elements[i], "onchange", this, "updateContent");
			} else {
				dojo.connect(this._searchForm.elements[i], "onchange", this, "updateContent");
			}
		}
		if (this._inputField != null){
  			dojo.connect(this._inputField, "onchange", this, "retrieveOptions");
  			//dojo.connect(this._targetField, "onchange", this, "webRepTrack");
  		}
	},

	/** 
     * Takes away the focus from a changed form element for usability issues especially in ie6
     */
	unfocus: function() {
		document.body.focus();
	},
	
	/** 
     * Updates the content according to changed form element and its criteria
     *
     * @param evt 	reference to the changed form element
     */
	updateContent: function(evt) {
		if(dojo.hasClass(dojo.byId(this._paneId),"mam-offer-list-no-res")) {
			dojo.removeClass(dojo.byId(this._paneId),"mam-offer-list-no-res");
			dojo.addClass(dojo.byId(this._paneId),"mam-offer-list");
			dojo.removeClass(dojo.byId("mam-search-tools1"),"mam-search-no-res");
			dojo.addClass(dojo.byId("mam-search-tools1"),"mam-search-res");
		} else if (dojo.hasClass(dojo.byId(this._paneId),"mam-partner-list-no-res")) {
			dojo.addClass(dojo.byId(this._paneId),"mam-partner-list");
			dojo.removeClass(dojo.byId(this._paneId),"mam-partner-list-no-res");			
			dojo.removeClass(dojo.byId("mam-search-tools1"),"mam-search-no-res");
			dojo.addClass(dojo.byId("mam-search-tools1"),"mam-search-res");
		}
		if((this.partnerFilterId != null) && (evt.target.id == this.partnerFilterId) && (evt.target.options[0].selected == false)){this.redirect(evt);}
		else{
			this._filterName = dojo.byId(this.filterNameId);
			this._filterValue = dojo.byId(this.filterValueId);
			if (this.filterValue2Id != null){this._filterValue2 = dojo.byId(this.filterValue2Id);}
			this._currentPage = dojo.byId(this.currentPageId);
			this._resultesPerPage = dojo.byId(this.resultesPerPageId);
			this._numberOfPages = dojo.byId(this.numberOfPagesId);
			if (this.sortById != null){this._sortBy = dojo.byId(this.sortById);}
		
			var sep = "?";
	    	if (this.queryUri.indexOf("?") >= 0){
	        	sep = "&";
	    	}
			paramsString = "&" + this._filterName.name + "=" + this._filterName.value + "&" + this._filterValue.name + "=" + this. _filterValue.value + "&" + this._currentPage.name + "=" + this._currentPage.value + "&" + this._resultesPerPage.name + "=" + this._resultesPerPage.value + "&" + this._numberOfPages.name + "=" + this._numberOfPages.value;
			if(this._filterValue2 != null){paramsString += "&" +  this._filterValue2.name + "=" + this._filterValue2.value;}
			if(this._sortBy != null){paramsString += "&" + this._sortBy.name + "=" + this._sortBy.value;}
			if (evt.target.name == "city"){
				queryUri = this.queryUri + sep + "element=" + evt.target.name + "&value=" + this._inputField.value + "&value2=" + evt.target.value + paramsString;
			} else if (evt.target.name == "country"){
				queryUri = this.queryUri + sep + "element=city&value=" + evt.target.value + paramsString;
			} else {
				queryUri = this.queryUri + sep + "element=" + evt.target.name + "&value=" + evt.target.value + paramsString;
			}
			this.synchRadios(evt);
			this._contentPane.cancel(); //terminate manually if user clicks on selects while requests are runnning, bug workaround
			this._contentPane.setHref(queryUri);
		}
	},
	/** 
     * Resets filters if not needed anymore
     *
     * @param evt 	reference to the changed form element
     */
	resetFilters: function(evt) {
		for(i=0; i<this._searchForm.elements.length; i++) {
			if ((this._searchForm.elements[i].type == "select-one") 
				&& (this._searchForm.elements[i].id != evt.target.id) 
				&& (this._searchForm.elements[i].id != this.resperpage1Id) 
				&& (this._searchForm.elements[i].id != this.resperpage2Id)) {
				if (evt.target.name != "city") {
					this._searchForm.elements[i].selectedIndex = 0;
				} if ((evt.target.name != "city") && (evt.target.name != "country") && (this._targetField != null)) {
					this._targetField.disabled = "disabled";
				} if ((evt.target.name == "country") && (evt.target.options[0].selected == true)){
					this._targetField.disabled = "disabled";
				}
			}
		}
	},
	
	/** 
     * Synchronizes upper and lower radio buttons
     *
     * @param evt 	reference to the changed radio button
     */
	synchRadios: function(evt) {
		try {
			switch (evt.target.id) {
				case "mam-rad-miles1": 	 	dojo.byId("mam-rad-miles2").checked = evt.target.checked; break;
				case "mam-rad-miles2": 	 	dojo.byId("mam-rad-miles1").checked = evt.target.checked; break;
				case "mam-rad-partner1": 	dojo.byId("mam-rad-partner2").checked = evt.target.checked; break;
				case "mam-rad-partner2": 	dojo.byId("mam-rad-partner1").checked = evt.target.checked; break;
				case this.resperpage1Id: 	dojo.byId(this.resperpage2Id).selectedIndex = evt.target.selectedIndex; break;
				case this.resperpage2Id: 	dojo.byId(this.resperpage1Id).selectedIndex = evt.target.selectedIndex; break;
				default:;  	                 				
			}  
		} catch(err) {
			console.log(err);
		}                 			                  					                   					
	},
	
	redirect: function(evt) {
		try{													
			this._filterName = dojo.byId(this.filterNameId);
			this._filterValue = dojo.byId(this.filterValueId);
			this._searchForm.action = this.redirectUrl;
			this._filterName.value = evt.target.name;
			this._filterValue.value = evt.target.value;
			if (this._webRep) {
				var trackStr = "";
				trackStr+="\"" + this._webRep.catKey + "\" , \"" + this._inputFld.options[this._inputFld.selectedIndex].value + "\"";
				trackStr+=", \"" + this._webRep.partnerKey + "\" , \"" + this._partnerMap[this._targetFld.options[this._targetFld.selectedIndex].value] + "\"";
				for (var key in this._webRep.optParams)  {
					trackStr+=", \"" + key + "\" , \"" + this._webRep.optParams[key] + "\"";
				}
			}
			eval("mam.webRep.multiTrack(" + trackStr + ")");
			var searchString = this._searchForm.action;
			searchString = searchString.substring(this._searchForm.action.indexOf("?") + 1, this._searchForm.action.length);
			var nvPairs = searchString.split("&");
			for (i = 0; i < nvPairs.length; i++)
			{
			     var nvPair = nvPairs[i].split("=");
				 var el = document.createElement("input");
				 el.type = "hidden";
				 el.name = nvPair[0];
				 el.value = nvPair[1];
				 this._searchForm.appendChild(el);
			}
	    	this._searchForm.submit();
		} catch(err){
			console.log(err);
		}
	},
	
	/** 
     * Synchronizes upper and lower buttons and tool elements
     */
	synchElements: function() {	
    		try	{
    			if(this.results1Id != null){_results1 = dojo.byId(this.results1Id)};
				_resultsHidden = dojo.byId(this.resultsHiddenId);
				_resultsHiddenText = dojo.byId(this.resultsHiddenTextId);
				_resultsHiddenText2 = dojo.byId(this.resultsHiddenText2Id);
				
				_inputPagesHidden = dojo.byId(this.inputPagesHiddenId);	
				_inputPages1 = dojo.byId(this.inputPages1Id);
				_inputPagesHidden = dojo.byId(this.inputPagesHiddenId);
    			var resString = "";
    			var resValue = parseInt(_resultsHidden.value);
    			if (resValue == 0) {
    				if(dojo.hasClass(dojo.byId(this._paneId),"mam-offer-list")) {
	    				dojo.removeClass(dojo.byId(this._paneId),"mam-offer-list");
	    				dojo.addClass(dojo.byId(this._paneId),"mam-offer-list-no-res");
    				} else if (dojo.hasClass(dojo.byId(this._paneId),"mam-partner-list")) {
    					dojo.removeClass(dojo.byId(this._paneId),"mam-partner-list");
	    				dojo.addClass(dojo.byId(this._paneId),"mam-partner-list-no-res");
    				}
    				dojo.addClass(dojo.byId("mam-search-tools1"),"mam-search-no-res");
    				dojo.removeClass(dojo.byId("mam-search-tools1"),"mam-search-res");
    			} else if (resValue != 1) {
    				resString = _resultsHidden.value + " " + _resultsHiddenText2.value;
    			} else {
    				resString = _resultsHidden.value + " " + _resultsHiddenText.value;
    			}  		
    			
    			if(_results1 != null){
    				if (dojo.isIE && dojo.isIE < 7) {
    					_results1.innerText = resString;
    				} else {
    					_results1.innerHTML = resString;
    				}
    			}

				_inputPages1.value = _inputPagesHidden.value;
				
				btn1Url = this.btn1Url;
				btn2Url = this.btn2Url;
				btn3Url = this.btn3Url;
				btn4Url = this.btn4Url;
				
				for(i=1; i<3; i++) {
					this.setButtonParams(this.imgFirstId, i, "src", btn1Url, "mam-btn-first");
					this.setButtonParams("mam-btn-firstpage", i, "class", null, "mam-btn-first");
					this.setButtonParams(this.imgPrevId, i, "src", btn2Url, "mam-btn-prev");
					this.setButtonParams("mam-btn-prevpage", i, "class", null, "mam-btn-prev");
					this.setButtonParams(this.imgNextId, i, "src", btn3Url, "mam-btn-next");
					this.setButtonParams("mam-btn-nextpage", i, "class", null, "mam-btn-next");
					this.setButtonParams(this.imgLastId, i, "src", btn4Url, "mam-btn-last");
					this.setButtonParams("mam-btn-lastpage", i, "class", null, "mam-btn-last");
				}
				
				_results2 = dojo.byId(this.results2Id);
				_inputPages2 = dojo.byId(this.inputPages2Id)
				
				if(_results2 != null){
					if (dojo.isIE && dojo.isIE < 7) {
    					_results2.innerText = resString;
    				} else {
    					_results2.innerHTML = resString;
    				}
				};
				
				_inputPages2.value = _inputPages1.value;
			} catch(err) {
				console.log(err);
			}
			
		if (dojo.byId("hiddenTools").value == "true"){
			if(dojo.byId("mam-sort") != null){dojo.byId("mam-sort").style.display = "none"; }
			if(dojo.byId("mam-nav") != null){dojo.byId("mam-nav").style.display = "none"; }
			if(dojo.byId("mam-line-top") != null){dojo.byId("mam-line-top").style.display = "none";}
			if(dojo.byId("mam-line-bottom") != null){dojo.byId("mam-line-bottom").style.display = "none";}
			if(dojo.byId("mam-search-tools2") != null){dojo.byId("mam-search-tools2").style.display = "none";} 
		} else {
			if(dojo.byId("mam-sort") != null){dojo.byId("mam-sort").style.display = "block";}
			if(dojo.byId("mam-nav") != null){dojo.byId("mam-nav").style.display = "block";}
			if(dojo.byId("mam-line-top") != null){dojo.byId("mam-line-top").style.display = "block";}
			if(dojo.byId("mam-line-bottom") != null){dojo.byId("mam-line-bottom").style.display = "block";}
			if(dojo.byId("mam-search-tools2") != null){dojo.byId("mam-search-tools2").style.display = "block";} 
		}
	},
	
	/** 
     * Sets image and cursor for navigation buttons
     *
     * @param elem		source button object
     * @param i			iterator to differentiate between upper and lower button
     * @param attr		attribute of hidden field
     * @param url		image url
     * @param id		hidden field id
     */
	setButtonParams: function(elem, i, attr, url, id){
		if (attr == "src") {
			dojo.byId(elem + "" + i).setAttribute(attr, url + dojo.byId(id).name + ".gif");
		} if (attr == "class") {
			if(dojo.byId(id).className==""){
				dojo.removeClass(dojo.byId(elem + "" + i), "ina");
			}else{
				dojo.addClass(dojo.byId(elem + "" + i), dojo.byId(id).className);
			}
		}
	},
  
	/** 
     * Retrieves options for chained filter update
     *
     * @param evt 		reference to the changed radio button
     * @return response	json string with filter options
     */
	retrieveOptions: function(evt){
		var separator = "?";
    	if (this.jsonPath.indexOf("?") >= 0){
        	separator = "&";
    	}
    	if (evt.target.options[0].selected != true){
			jsonUrl = this.jsonPath + separator + this.paramName + "=" + escape(this._inputField.options[this._inputField.selectedIndex].value);
			dojo.xhrGet({url: jsonUrl,
	            		handleAs: "json",
	                    load: dojo.hitch(this, "handlerFunc"),
	                    error: function(response, ioArgs){
	                          console.error("HTTP status code: ",ioArgs.xhr.status);
	                          return response;
	                    }
			});
		}
  	},

	/** 
     * Changes target filter according to value of input source filter
     *
     * @param response 	json string with filter options
     */
  	handlerFunc: function(response) {
  		this._targetField.options.length = 0;
  		this._targetField.disabled = false;
  		try{
  			var items = response.items;
  			for (i=0; i<items.length; i++){
  				this._targetField.options[i] = new Option(items[i].option.label, items[i].option.value, items[i].option.selected, false);
  			}
  		}catch(err){
  			console.log(err);
  		}
	},
	
	/** 
     * Updates content according to clicked navigation button
     *
     * @param pHref	url with parameters for contentpane update
     */
	handleClick: function(pHref) {
		dojo.publish("mamOdbSpc", [{message:"paging"}]);
		this._contentPane.cancel(); //terminate manually if user clicks on tab while requests are runnning, bug workaround
		this._contentPane.setHref(pHref);
	},
	track: function() {
		mam.webRep.multiTrack();
	}
};

/*
 *	sets the tracker variable based user selection of filter elements
 */
dojo.declare("mam.odb.OsTrackerMixin", null, {
	trigger:null,
	trackForm:null,
	constructor:function(params){
		this.trigger = params.trigger;
		this.trackForm = params.trackForm;
		dojo.subscribe("mamOdbSpc", this, "setTrigger"); // handleclick from paging
		for(i=0; i<this.trackForm.elements.length; i++) {
			if (this.trackForm.elements[i].type == "radio") {
				dojo.connect(this.trackForm.elements[i], "onclick", this, "setTrigger");
			} else if ((this.trackForm.elements[i].id != this.resperpage1Id) && (this.trackForm.elements[i].id != this.resperpage2Id)){
				dojo.connect(this.trackForm.elements[i], "onchange", this, "setTrigger");
			} else {
				dojo.connect(this.trackForm.elements[i], "onchange", this, "setTrigger");
			}
		}
	},
	setTrigger: function(evt){
		if (evt && dojo.exists("message", evt) && evt.message == "paging") {
			eval(this.trigger.key +"= '"+  this.trigger.pagingUsed + "';");
		} else {
			try {
				switch (evt.target.id) {
					case "mam-rad-miles1":;
					case "mam-rad-miles2":;
					case "mam-rad-partner1":;
					case "mam-rad-partner2": 	eval(this.trigger.key +"= '"+  this.trigger.orderUsed + "';"); break;
					case "mam-fld-resperpage1":;
					case "mam-fld-resperpage2": eval(this.trigger.key +"= '"+  this.trigger.resperpageUsed + "';"); break;
					default: eval(this.trigger.key +"= '"+  this.trigger.filterUsed + "';");;  	                 				
				}
			} catch (e) {};//squelch 
		}
	}
});