// JavaScript Document


window.addEvent('domready', function(){
	ptpSearch = new PtpSearch({
		sScriptUrl						: 'http://'+location.host+'/assets/scripts/transform.jsp',
		sSRUGatewayExplainURL			: 'http://'+location.host+'/static/assets/xml/explain_v2.xml',
		sSRUGatewaySearchURL			: 'http://jsru.kb.nl/sru/sru?x-collection=MISC&operation=searchRetrieve&version=1.1&recordSchema=dcx+admin&x-fields=url,shelfmark&sortKeys=shelfmark,,a'
	});
	
});
window.addEvent('unload', function(){
	GUnload();
});

var PtpSearch = new Class({
	getOptions: function() {
		return {
			sDefaultLanguage				: 'EN',
			sScriptUrl						: 'http://'+location.host+'/assets/scripts/transform.jsp',
			sAutoCompleteUrl				: 'http://'+location.host+'/assets/scripts/AutoComplete.jsp',
			iAutoCompleteLimit				: 5,
//			sSRUGatewayExplainURL			: 'http://sru.kb.nl/sru/sru.pl?x-collection=MISC_O&operation=explain&version=1.1',
//			sSRUGatewaySearchURL			: 'http://sru.kb.nl/sru/sru.pl?x-collection=MISC&operation=searchRetrieve&version=1.1&recordSchema=dcx+admin&x-fields=url,shelfmark&sortKeys=shelfmark,,a',
			
			sSRUGatewayExplainURL			: 'http://jsru.kb.nl/sru/sru?x-collection=MISC&operation=explain&version=1.2',
			sSRUGatewaySearchURL			: 'http://jsru.kb.nl/sru/sru?x-collection=MISC&operation=searchRetrieve&version=1.2&recordSchema=dcx+admin&x-fields=url,shelfmark&sortKeys=shelfmark,,a',
			
			sXsltFile_simpleSearchForm		: 'sru/simpleSearchForm.xsl',
			sXsltFile_advancedSearchForm	: 'sru/advancedSearchForm.xsl',
			sXsltFile_resultList			: 'sru/resultList.xsl',
			sXsltFile_resultListNav			: 'sru/resultListNav.xsl',
			sXsltFile_detailResult			: 'sru/detailResult.xsl',
			iSearchHistoryLimit				: 10
		}
	},
	initialize: function(options) {
		if( (location.host!='kb') && (location.host!='kb.r-i.nl') ) {
			this.setOptions(this.getOptions(), options);
			this.getQueryStringData(location.href);
			this.checkGateway();
			this.errorMsgBoxIsOn = false;
			// searchhistory
			this.aSearchHistoryName = [];
			this.aSearchHistoryUrl = [];
			this.getSearchHistory();
		} else {
			this.sendErrorMsg(4);
		}
	},
	sendErrorMsg: function(errorCode,txt) {
		var aErrorMsg = [
			'Some error occurred, please try again...',
			'The searchengine is (momentarily) unavailable, please try again later...',
			'The searchengine returned an incorrect result, please note that shown results may be incorrect also...',
			'The location &quot;'+ txt +'&quot; is unknown...',
			'The searchengine wil not work on this host...'
		];
		var sHelpMsg = 'You can try again by using the refresh-button in your browser.';
		$('hiddenServiceBox').setHTML('<div class="error"><h1>'+aErrorMsg[errorCode]+'</h1><p>'+sHelpMsg+'</p><a class="closebutton" href="#" onclick="$(this).getParent().setStyle(\'display\',\'none\'); $(\'hiddenServiceBox\').empty();" title="close"><span>Close</span></a></div>');
		$('hiddenServiceBox').setStyle('display','block');
		//alert('ERROR: '+aErrorMsg[errorCode]);
	},
	checkGateway: function() {
		var myTransformer = new Transformer();
		myTransformer.ping(encodeURIComponent(this.options.sSRUGatewaySearchURL), function(status){
			if(status==200) {
				this.buildSearchForm();
			} else {
				this.sendErrorMsg(1);
			}
		}.bind(this));
	},
	highLightText: function(sSource, sQuery){
		var re = new RegExp(sQuery, "gi");
		return sSource.replace(re,('<strong>'+sQuery+'</strong>'));
	},
	getQueryStringData: function(uri){
		this.aQueryStringParameters = [];
		if(uri.indexOf('#')>-1){
			uri = uri.split('#')[0];
		}
		if(uri.indexOf('?')>-1){
			var sUri = uri.split('?')[1]
			var aItems = [];
			if (sUri.indexOf('&')<0){
				aItems.push(sUri);
			}else{
				aItems = sUri.split('&')
			}
			for (var i=0; i<aItems.length; i++){
				this.aQueryStringParameters.push(aItems[i]);
			}
		}
	},
	createSearchUrl: function() {
		var url = this.options.sSRUGatewaySearchURL;
		url += '&query=';
		url += encodeURIComponent(this.buildSearchQueryFromFormFields());
		var aFormElements = $$('input');
		for(var i=0;i<aFormElements.length;i++) {
			if( (aFormElements[i].type=='hidden') && ( (aFormElements[i].name=='maximumRecords') || (aFormElements[i].name=='startRecord') ) ){
				url += ('&'+aFormElements[i].name+'='+aFormElements[i].value);
			}
		}
		return url;
	},
	createSearchUrlForDetail: function() {
		var url = this.options.sSRUGatewaySearchURL;
		url += '&query=';
		url += encodeURIComponent('( (dcterms.isPartOf=PTP) and ( (dc.identifier="'+$E('input[name=recordId]').value+'") or (dcterms.isPartOf="PTPFra'+$E('input[name=recordId]').value+'") or (dcterms.isPartOf="PTPFaa'+$E('input[name=recordId]').value+'") ) )');
		url += '&startRecord=1&maximumRecords=30';
		
		return url;
	},
	buildSearchQueryFromFormFields: function() {
		var query = '(dcterms.isPartOf="PTP")';
		var aFormElements = $$('input');
		// holder variables to temporarily store startyear and endyear.
		var sy = null;
		var ey = null;
		// To decrease the number of results we only show the top-level results. No 'Fsa'.
		var resultListLimitor = false;
		var limitResultForFields = ['shelfmark','region','country','place','startyear','endyear','medium','binding','binder'];
		
		for(var i=0;i<aFormElements.length;i++) {
			if((aFormElements[i].value!=aFormElements[i].defaultValue) && ((aFormElements[i].type!='hidden') && (aFormElements[i].type!='submit')) ){
				if( aFormElements[i].name=='freetextsearch' ) {
					query += ' and ("'+aFormElements[i].value+'*")';
				// shelfmark (shelfmark and olim)
				} else if( aFormElements[i].name=='shelfmark' ) {
					query += ' and ( (shelfmark all "'+aFormElements[i].value+'")  or (olim all "'+aFormElements[i].value+'") )';
				// title
				} else if( aFormElements[i].name=='title' ) {
					query += ' and ('+aFormElements[i].name+' all "'+aFormElements[i].value+'")';
				// alternative title (dutch, english and other languages)
				} else if( aFormElements[i].name=='alt-title' ) {
					query += ' and ( (nickname_en all "'+aFormElements[i].value+'") or (nickname_nl all "'+aFormElements[i].value+'") or (nickname all "'+aFormElements[i].value+'") )';
				// country or region
				} else if( aFormElements[i].name=='country' || aFormElements[i].name=='region' ) {
					query += ' and ( (region="'+aFormElements[i].value+'") or (country="'+aFormElements[i].value+'") )';
				// date
				} else if (aFormElements[i].name=='startyear') {
					sy = aFormElements[i].value;
		        } else if (aFormElements[i].name=='endyear') {
					ey = aFormElements[i].value;
				
				// any other fields
				} else {
					if (/\s/g.test(aFormElements[i].value)) {
						query += ' and ('+aFormElements[i].name+' all "'+aFormElements[i].value+'")';
					} else {
						query += ' and ('+aFormElements[i].name+'='+aFormElements[i].value+')';
					}
				}
				// test if the resultlist should be limited
				if( limitResultForFields.indexOf(aFormElements[i].name) >-1 ) {
					resultListLimitor = true;
				}
			}
		}
		
		if (resultListLimitor==true) {
			query += ' not (dcterms.isPartOf all "PTPFa*")';
		}
		
		if (sy != null && ey != null) {
			// alle twee
			query += ' and ( (startyear >= "'+sy+'") and (startyear < "'+ey+'") )';
		} else if (sy != null) {
			// alleen startyear
			query += ' and (startyear >= "'+sy+'")';
		} else if (ey != null) {
			// alleen endyear
			query += ' and (startyear <= "'+ey+'")';
		}
		
		
		var aFormElements = $$('select');
		for(var i=0;i<aFormElements.length;i++) {
			if( aFormElements[i].value!='null' ){
				query += ' and ';
				if (aFormElements[i].name=='language') {
				   query += '(language="1'+aFormElements[i].options[aFormElements[i].selectedIndex].value+'")';
				} else if (aFormElements[i].name=='language_inbetween') {
				   query += '(language="2'+aFormElements[i].options[aFormElements[i].selectedIndex].value+'")';
				} else if (aFormElements[i].name=='language_original') {
				   query += '(language="3'+aFormElements[i].options[aFormElements[i].selectedIndex].value+'")';
				} else {
				   query += '('+aFormElements[i].name+'="'+aFormElements[i].options[aFormElements[i].selectedIndex].value+'")';
				}
			}
		}
		query = '('+query+')';
		
		return query;
	},
	initFormFields: function() {
		var aFormElements = $$('input');
		for(var i=0;i<aFormElements.length;i++) {
			// setValue
			for(var a=0; a<this.aQueryStringParameters.length;a++){
				if(aFormElements[i].getAttribute('name')==this.aQueryStringParameters[a].split('=')[0]){
					var sNewValue = unescape(this.aQueryStringParameters[a].split('=')[1]).replace(/\+/g,' ');
					if( (sNewValue!=aFormElements[i].defaultValue) && (sNewValue!='') ){
						aFormElements[i].value = sNewValue
						if(aFormElements[i].getAttribute('type')!='hidden'){
							aFormElements[i].getParent().addClass('modified');
							aFormElements[i].getParent().getParent().removeClass('collapsed');
						}
					}
				}
			}
			// add onfocus + onblur eventhandlers
			if(aFormElements[i].getAttribute('type')=='text'){
				aFormElements[i].addEvent('focus', function(){
					this.value=(this.value!=this.defaultValue)?this.value:'';
					this.getParent().addClass('modified');
				});
				aFormElements[i].addEvent('blur', function(){
					if(this.value==''){
						this.value=this.defaultValue;
						this.getParent().removeClass('modified');
					}
				});
				aFormElements[i].addEvent('change', function(){
					this.getParent().addClass('modified');
					$E('input[name=recordId]').value='null';
					$E('input[name=startRecord]').value='1';
					$E('input[name=maximumRecords]').value=$E('input[name=maximumRecords]').defaultValue;
				});
			}
		}
		var aFormElements = $$('select');
		for(var i=0;i<aFormElements.length;i++) {
			// setValue
			for(var a=0;a<this.aQueryStringParameters.length;a++){
				if(aFormElements[i].getAttribute('name')==this.aQueryStringParameters[a].split('=')[0]){
					var sNewValue = decodeURIComponent(this.aQueryStringParameters[a].split('=')[1].replace(/\+/g,' '));
					if(sNewValue!='null'){
						for(var o=0;o<aFormElements[i].options.length;o++){
							if(aFormElements[i].options[o].value==sNewValue){
								aFormElements[i].selectedIndex=o;
							}
						}
					}
					if(aFormElements[i].selectedIndex>0){
						aFormElements[i].getParent().addClass('modified');
						aFormElements[i].getParent().getParent().removeClass('collapsed');
					}
				}
			}
			aFormElements[i].addEvent('focus', function(){
				this.getParent().addClass('modified');
			});
			aFormElements[i].addEvent('click', function(){
				this.getParent().addClass('modified');
			});
			aFormElements[i].addEvent('blur', function(){
				if(this.options[this.selectedIndex].value=='null') {
					this.getParent().removeClass('modified');
					this.selectedIndex=0;
				}
			});
			aFormElements[i].addEvent('change', function(){
				if(this.options[this.selectedIndex].value!='null') {
					this.getParent().addClass('modified');
				}else{
					this.getParent().removeClass('modified');
					this.selectedIndex=0;
					$E('input[name=recordId]').value='null';
					$E('input[name=startRecord]').value='1';
					$E('input[name=maximumRecords]').value=$E('input[name=maximumRecords]').defaultValue;
				}
			});
		}
		var aFieldsetElements = $$('fieldset.toggelable');
		for(var i=0;i<aFieldsetElements.length;i++){
			var ref = this;
			$$(aFieldsetElements[i].getElementsByTagName('legend')[0].getElementsByTagName('span')[0]).addEvent('click', function(){
				$(this).getParent().getParent().toggleClass('collapsed');
				var divs = $(this).getParent().getParent().getElementsByTagName('div');
				for (var d=0; d<divs.length;d++) {
					if ($(divs[d]).hasClass('modified')) {
						if($(this).getParent().getParent().hasClass('collapsed')) {
							$(this).getParent().getParent().addClass('modified');
						} else {
							$(this).getParent().getParent().removeClass('modified');
						}
					}
				}
			});
		}
	},
	initAutoCompleteFields: function(){
		var ref = this;
		var aInputFields = $$('input.autoComplete');
		for(var i=0;i<aInputFields.length;i++){
			new Autocompleter.Ajax.Xhtml(aInputFields[i], this.options.sAutoCompleteUrl, {
				'postData': {
					c: aInputFields[i].name,
					l: this.options.iAutoCompleteLimit
				},
				'onRequest': function(el) {
					// insert indicator
					new Element('div').addClass('autocompleter-loading').setHTML('').injectAfter(el);
				},
				'onComplete': function(el) {
					// remove indicator
					$$('div.autocompleter-loading')[0].remove();
				},
				'parseChoices': function(el) {
					var value = el.getFirst().innerHTML;
					el.inputValue = value;
					this.addChoiceEvents(el).getFirst().setHTML(this.markQueryValue(value));
				}
			});
		}
	},
	buildSearchForm: function(){
		// insert a loader img..
		$('searchForm').setHTML('<div class="preloader"><img src="/static/assets/images/wait.gif" alt="" /><span>Loading...</span></div>');
		
		if( ($E('body').hasClass('homepage')) || ($E('body').hasClass('content')) ){
			var myFormTransformer = new Transformer();
			myFormTransformer.xmlToHtml(this.options.sSRUGatewayExplainURL, this.options.sXsltFile_simpleSearchForm, function(text, xml, status){
				$('searchForm').setHTML(text);
				$('searchForm').addEvent('submit', function(){
					$E('input[name=startRecord]').value='1';
					var aFormElements = $$('input');
					for(var i=0;i<aFormElements.length;i++) {
						if(aFormElements[i].getAttribute('type')=='text'){
							aFormElements[i].value=(aFormElements[i].value!=aFormElements[i].defaultValue)?aFormElements[i].value:'';
						}
					}
				});
				$('searchForm').addEvent('reset', function(){
					$E('input[name=recordId]').value='null';
				});
				this.initFormFields();
				this.initAutoCompleteFields();
			}.bind(this));
		} else if( $E('body').hasClass('simpleSearch') ){
			var myFormTransformer = new Transformer();
			myFormTransformer.xmlToHtml(this.options.sSRUGatewayExplainURL, this.options.sXsltFile_simpleSearchForm, function(text, xml, status){
				$('searchForm').setHTML(text);
				$('searchForm').addEvent('submit', function(){
					var aFormElements = $$('input');
					for(var i=0;i<aFormElements.length;i++) {
						if(aFormElements[i].getAttribute('type')=='text'){
							aFormElements[i].value=(aFormElements[i].value!=aFormElements[i].defaultValue)?aFormElements[i].value:'';
						}
					}
				});
				$('searchForm').addEvent('reset', function(){
					$E('input[name=recordId]').value='null';
				});
				this.initFormFields();
				this.initAutoCompleteFields();
				this.buildResultList();
			}.bind(this));
		} else if( $E('body').hasClass('advancedSearch') ){
			var myFormTransformer = new Transformer();
			myFormTransformer.xmlToHtml(this.options.sSRUGatewayExplainURL, this.options.sXsltFile_advancedSearchForm, function(text, xml, status){
				$('searchForm').setHTML(text);
				$('searchForm').addEvent('submit', function(){
					$E('input[name=startRecord]').value='1';
					var aFormElements = $$('input');
					for(var i=0;i<aFormElements.length;i++) {
						if(aFormElements[i].getAttribute('type')=='text'){
							aFormElements[i].value=(aFormElements[i].value!=aFormElements[i].defaultValue)?aFormElements[i].value:'';
						}
					}
				});
				$('searchForm').addEvent('reset', function(){
					$E('input[name=recordId]').value='null';
				});
				this.initFormFields();
				this.initAutoCompleteFields();
				this.buildResultList();
			}.bind(this));
		} else if( $E('body').hasClass('detail') ){
			var myFormTransformer = new Transformer();
			var sXslRef = (this.aQueryStringParameters.indexOf('searchMode=simple')>-1)?this.options.sXsltFile_simpleSearchForm:this.options.sXsltFile_advancedSearchForm;
			myFormTransformer.xmlToHtml(this.options.sSRUGatewayExplainURL, sXslRef, function(text, xml, status){
				$('searchForm').setHTML(text);
				$('searchForm').addEvent('submit', function(){
					var aFormElements = $$('input');
					for(var i=0;i<aFormElements.length;i++) {
						if(aFormElements[i].getAttribute('type')=='text'){
							aFormElements[i].value=(aFormElements[i].value!=aFormElements[i].defaultValue)?aFormElements[i].value:'';
						}
					}
				});
				$('searchForm').addEvent('reset', function(){
					$E('input[name=recordId]').value='null';
				});
				this.initFormFields();
				this.initAutoCompleteFields();
				this.buildDetailResult();
			}.bind(this));
		}
	},
	buildResultList: function(){
		if( ( $E('body').hasClass('advancedSearch') ) || ( $E('body').hasClass('simpleSearch') ) ){
			if( (this.aQueryStringParameters.length>0) && ($$('.modified').length>0) ){
				// insert a loader img..
				$('searchResultBox').setHTML('<div class="preloader"><img src="/static/assets/images/wait.gif" alt="" /><span>Loading...</span></div>');
				// setup the map
				if (GBrowserIsCompatible()) {
					$('resultMapContainer').setStyle('display','block');
					this.resultMap = new GMap2($('resultMap'));
					this.resultMap.addControl(new GSmallMapControl());
					this.resultMap.addControl(new GMapTypeControl());
					this.geocodercache = new GeoCacher();
					this.geocoder = new GClientGeocoder();
					setCenterByAddress(this.resultMap, this.geocoder, 'NL', 7);
					this.clusterer = new Clusterer( this.resultMap );
					$E('body').addEvent('unload', function(){
						GUnload();
					});
				}
				// get the results
				var myResultTransformer = new Transformer({
					iTimeOutValue			: (1000 * 30)
				});
				myResultTransformer.xmlToHtml(encodeURIComponent(this.createSearchUrl()), this.options.sXsltFile_resultList, function(text, xml, status){
					$('searchResultBox').setHTML(text);
					this.showResultsOnMap($$('div#searchResultBox ol li'));
					if ($E('input[name=showMap]').value=='1') {
						this.showMap();
					} else {
						this.hideMap();
					}
				}.bind(this));
				// history
				this.registerToSearchHistory();
			}else{
				$('searchResultBox').appendText('No search query...');
			}
		}
	},
	buildDetailResult: function(){
		// insert a loader img..
		$('recordDetail').setHTML('<div class="preloader"><img src="/static/assets/images/wait.gif" alt="" /><span>Loading...</span></div>');
		
		if( $E('body').hasClass('detail') ){
			if(this.aQueryStringParameters.length>0){
				// get search result for navbar
				/*
				var mySearchResultTransformer = new Transformer();
				mySearchResultTransformer.xmlToHtml(encodeURIComponent(this.createSearchUrl()), this.options.sXsltFile_resultListNav, function(text, xml, status){
					$('searchResultNavBox').setHTML(text);
				}.bind(this));
				*/
				// get detail result
				var myDetailResultTransformer = new Transformer({
					iTimeOutValue			: (1000 * 30)
				});
				myDetailResultTransformer.xmlToHtml(encodeURIComponent(this.createSearchUrlForDetail()), this.options.sXsltFile_detailResult, function(text, xml, status){
					$('recordDetail').setHTML(text);
					if($E('input[name=selectedRecordId]')) location.hash = 'r'+$E('input[name=selectedRecordId]').value;
					// search images in BNM database
					this.doSearchForImages($E('dd.database-bnm'));
				}.bind(this));
			}else{
				$('searchResultBox').appendText('No result...');
			}
			
		}
	},
	enhanceResultList: function(){
		var ref = this;
		var aResultItems = $$('div#searchResultBox ol li');
		for(var i=0;i<aResultItems.length;i++){
			var iItem = parseInt(aResultItems[i].id.split('_')[1]);
			var sHTML = '<span class="number">'+parseInt(aResultItems[i].id.split('_')[1])+'.</span>';
			sHTML += '<a id="item_'+iItem+'" class="marker" href="#" onclick="ptpSearch.showMap(); centerAndOpenMarker(ptpSearch,'+(iItem-parseInt($E('input[name=startRecord]').value))+'); return false;"><img src="/static/assets/images/0_to_99_markers/marker.gif" alt="" /></a>';
			aResultItems[i].setHTML(sHTML+aResultItems[i].innerHTML);
			aResultItems[i].addEvent('mouseover', function(){
				this.addClass('hover');
				ptpSearch.resultHoverTimeout = (function(){
					centerAndOpenMarker(ptpSearch,((parseInt(this.id.split('_')[1]))-parseInt($E('input[name=startRecord]').value)));
				}.bind(this)).delay(500);
			});
			aResultItems[i].addEvent('mouseout', function(){
				this.removeClass('hover');
				ptpSearch.resultHoverTimeout = $clear(ptpSearch.resultHoverTimeout);
			});
			
		}
	},
	showResultsOnMap: function(aResults){
		if(aResults.length>0){
			(function(){
				var oRecordData = new Object;
				oRecordData.number = aResults[0].id.split('_')[1];
				oRecordData.id = aResults[0].getElementsByTagName('a')[0].childNodes[0].nodeValue;
				oRecordData.city = aResults[0].getElementsByTagName('a')[0].childNodes[0].nodeValue.split(',')[0];
				if(oRecordData.city.indexOf(':')) {
					oRecordData.city = oRecordData.city.split(' ')[0];
				}
				oRecordData.title = aResults[0].getElementsByTagName('p')[0].childNodes[0].nodeValue;
				if(oRecordData.city.length>1){
					oRecordData.city += ',NL';
					if(this.geocodercache.get(oRecordData.city)!=null){
						this.clusterer.AddMarker( createMarker(this.geocodercache.get(oRecordData.city), oRecordData.number, '<div class="poiData"><span class="number">'+oRecordData.number+'</span><img src="/static/assets/images/0_to_99_markers/marker.gif" alt="" />'+aResults[0].innerHTML+'</div>', oRecordData.id), oRecordData.id );
						aResults.shift();
						this.showResultsOnMap(aResults);
					}else{
						this.geocoder.getLatLng(oRecordData.city, function(point) {
							if (point) {
								if(!this.geocodercache.put(oRecordData.city, point)) {
									// console.log('Error while caching geodata..');
								}
								this.clusterer.AddMarker( createMarker(point, oRecordData.number, '<div class="poiData"><span class="number">'+oRecordData.number+'</span><img src="/static/assets/images/0_to_99_markers/marker.gif" alt="" />'+aResults[0].innerHTML+'</div>', oRecordData.id), oRecordData.id );
								aResults.shift();
								this.showResultsOnMap(aResults);
							}else{
								this.sendErrorMsg(3,oRecordData.city);
								aResults.shift();
								this.showResultsOnMap(aResults);
								//alert('can\'t find '+ oRecordData.city);
							}
						}.bind(this));
					}
				}
			}.bind(this))();
		}else{
			this.enhanceResultList();
		}
	},
	toggleMap: function(){
		if($('resultMap').getStyle('display')!='none'){
			this.hideMap();
		} else {
			this.showMap();
		}
	},
	showMap: function(){
		$E('input[name=showMap]').value='1';
		$('resultMap').setStyle('display','block');
	},
	hideMap: function(){
		$E('input[name=showMap]').value='0';
		$('resultMap').setStyle('display','none');
	},
	showDetail: function(recordId, selectedRecordId){
		$E('div#searchForm form').action='/static/site/search/detail.html';	
		$E('input[name=recordId]').value=recordId;
		$E('input[name=selectedRecordId]').value=selectedRecordId;
		$E('div#searchForm form').submit();
	},
	setSearchMode: function(mode){
		$E('div#searchForm form').reset();
		$E('input[name=searchMode]').value=mode;
		$E('input[name=recordId]').value='null';
		$E('input[name=selectedRecordId]').value='null';
		$E('div#searchForm form').submit();
	},
	newSearch: function(){
		$E('input[name=recordId]').value='null';
		$E('input[name=selectedRecordId]').value='null';
		$E('input[name=startRecord]').value='1';
		$E('div#searchForm form').submit();
	},
	resetForm: function(){
		$E('div#searchForm form').reset();
		$E('div#searchForm form').submit();
	},
	backToResultPage: function(){
		$E('input[name=recordId]').value='null';
		$E('input[name=selectedRecordId]').value='null';
		$E('div#searchForm form').submit();
	},
	prefResultPage: function(ofset){
		$E('input[name=startRecord]').value=ofset;
		$E('div#searchForm form').submit();
	},
	nextResultPage: function(ofset){
		$E('input[name=startRecord]').value=ofset;
		$E('div#searchForm form').submit();
	},
	registerToSearchHistory: function() {
		var searchDataName = this.createHumanReadableSearchString()
		var pageUrl = location.href.split('?')[1].replace(/(Type\+in\+query(...\+\%28autocompleted\%29)?)/gi,'').replace(/(\&([\w-]*=(null)?))(?=\&)/gi,'').replace(/(\&([\w-]*=))$/gi,'');
		var searchDataUrl = escape(pageUrl);
		if (this.aSearchHistoryName.indexOf(searchDataName)<=-1) {
			// console.log(this.aSearchHistoryUrl.length,this.options.iSearchHistoryLimit);
			if ((this.aSearchHistoryName.length==this.aSearchHistoryUrl.length) &&(this.aSearchHistoryName.length>=this.options.iSearchHistoryLimit)) {
				this.aSearchHistoryName.pop();
				this.aSearchHistoryUrl.pop();
			}
			this.aSearchHistoryName.unshift(searchDataName);
			this.aSearchHistoryUrl.unshift(searchDataUrl);
			this.createCookie('mmdcSearchHistoryNames', escape(this.aSearchHistoryName.join(';')), 1);
			this.createCookie('mmdcSearchHistoryUrls', escape(this.aSearchHistoryUrl.join(';')), 1);
		}
	},
	getSearchHistory: function() {
		var namesCookieValue = unescape(this.readCookie('mmdcSearchHistoryNames'));
		if (namesCookieValue!=null && namesCookieValue!='null') {
			this.aSearchHistoryName = namesCookieValue.split(';');
		}
		var urlsCookieValue = unescape(this.readCookie('mmdcSearchHistoryUrls'));
		if (urlsCookieValue!=null && urlsCookieValue!='null') {
			this.aSearchHistoryUrl = urlsCookieValue.split(';');
		}
		// check both arrays
		if (this.aSearchHistoryUrl.length!=this.aSearchHistoryName.length) {
			//this.clearSearchHistory();
		}
	},
	clearSearchHistory: function(){
		this.aSearchHistoryName = [];
		this.aSearchHistoryUrl = [];
		this.eraseCookie('mmdcSearchHistoryNames');
		this.eraseCookie('mmdcSearchHistoryUrls');
		this.showSearchHistory();
	},
	createHumanReadableSearchString: function() {
		var sSearchString = '';
		var aFormInputElements = $('searchForm').getElementsByTagName('form')[0].elements;
		for(var i=0;i<aFormInputElements.length;i++) {
			var element = aFormInputElements[i];
			if(element.nodeName=='INPUT'){
				if((element.value!=element.defaultValue) && ((element.type!='hidden') && (element.type!='submit')) ){
					if(sSearchString!='') sSearchString += ' and ';
					sSearchString += $(element).getPrevious().innerHTML.replace(':','=')+' \''+element.value+'\'';
				}
			} else if (element.nodeName=='SELECT') {
				if( element.value!='null' ){
					if(sSearchString!='') sSearchString += ' and ';
					sSearchString += $(element).getPrevious().innerHTML.replace(':','=')+' \''+element.options[element.selectedIndex].text+'\'';
				}
			}
		}
		return sSearchString;
	},
	showSearchHistory: function() {
		var historyBox = ($('historyContainer'))?$('historyContainer'):new Element('div', {'id':'historyContainer'});
		var historyBoxContent = '';
		historyBoxContent += '<h3>My recent searches</h3>';
		if (this.aSearchHistoryName.length>0) {
			historyBoxContent += '<ul>'
			for (var i=0;i<this.aSearchHistoryName.length;i++) {
				historyBoxContent += '<li><a href="http://'+location.host+'/static/site/search/?'+unescape(this.aSearchHistoryUrl[i])+'">'+this.aSearchHistoryName[i]+'</a></li>'
			}
			historyBoxContent += '</ul><a class="clearHistory" href="#" onclick="ptpSearch.clearSearchHistory(); return false;">Clear search history</a>'
		} else {
			historyBoxContent += '<p>No search history avaiable<br /><br /></p>';
		}
		historyBox.setHTML(historyBoxContent);
		historyBox.injectInside($('searchForm'));
	},
	createCookie: function(name,value,days) {
		if (days) {
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		}
		else var expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	},	
	readCookie: function(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	},	
	eraseCookie: function(name) {
		this.createCookie(name,"",-1);
	},
	doSearchForImages: function(el) {
		if ($(el)) {
			var baseUrl = 'http://'+location.host+'/assets/scripts/ImageRepository.jsp?s='
			var key = $(el).getText();
			// insert loading image
			el.setHTML('<div class="preloader"><img src="/static/assets/images/wait.gif" alt="" /><span>Retrieving images...</span></div>');
			var myResultTransformer = new Transformer({
				bUseProxy				: false,
				iTimeOutValue			: (1000 * 30)
			});
			myResultTransformer.get(baseUrl+encodeURIComponent(key), function(text, xml, status){
				el.setHTML(text);
			}.bind(this));
		}
	}
});
PtpSearch.implement(new Events);
PtpSearch.implement(new Options);


var Transformer = new Class({
	getOptions: function() {
		return {
			bUseProxy				: true,
			sScriptUrl				: 'http://'+location.host+'/assets/scripts/transform.jsp?',
			sSourceParamName		: 'url',
			sStylesheetParamName	: 'xslfile',
			iTimeOutValue			: (1000 * 6)
		}
	},
	initialize: function(options){
		this.setOptions(this.getOptions(), options);
	},
	ping: function(url, callBack){
		var iBogusValue = new Date().getTime()+Math.random();
		var tTransportTimeout = (function(){
			tTransportTimeout = $clear(tTransportTimeout);
			this.transporter.transport.abort();
		}.bind(this)).delay(this.options.iTimeOutValue);
		var transportUrl = this.options.sScriptUrl+this.options.sSourceParamName+'='+url+'&bogus='+iBogusValue;
		this.transporter = new Ajax(transportUrl, {
			method: 'get',
			onFailure: function() {
				tTransportTimeout = $clear(tTransportTimeout);
				callBack(404);
			}.bind(this),
			onComplete: function(text, xml) {
				tTransportTimeout = $clear(tTransportTimeout);
				var iTransportStatus = parseInt(this.transporter.transport.status);
				callBack(iTransportStatus);
			}.bind(this)
		}).request();
	},
	get: function(url, callBack){
		var iBogusValue = new Date().getTime()+Math.random();
		var tTransportTimeout = (function(){
			tTransportTimeout = $clear(tTransportTimeout);
			this.transporter.transport.abort();
		}.bind(this)).delay(this.options.iTimeOutValue);
		if (this.options.bUseProxy==true) {
			var transportUrl = this.options.sScriptUrl+this.options.sSourceParamName+'='+url+'&bogus='+iBogusValue;
		} else {
			var transportUrl = url;
		}
		this.transporter = new Ajax(transportUrl, {
			method: 'get',
			onFailure: function() {
				tTransportTimeout = $clear(tTransportTimeout);
				callBack(null, null, 404);
			}.bind(this),
			onComplete: function(text, xml) {
				tTransportTimeout = $clear(tTransportTimeout);
				var iTransportStatus = parseInt(this.transporter.transport.status);
				callBack(text, xml, iTransportStatus);
			}.bind(this)
		}).request();
	},
	xmlToHtml: function(url, xslfile, callBack){
		var iBogusValue = new Date().getTime()+Math.random();
		var tTransportTimeout = (function(){
			tTransportTimeout = $clear(tTransportTimeout);
			this.transporter.transport.abort();
		}.bind(this)).delay(this.options.iTimeOutValue);
		var transportUrl = this.options.sScriptUrl+this.options.sSourceParamName+'='+url+'&'+this.options.sStylesheetParamName+'='+xslfile+'&bogus='+iBogusValue;
		this.transporter = new Ajax(transportUrl, {
			method: 'get',
			onFailure: function() {
				tTransportTimeout = $clear(tTransportTimeout);
				callBack(null, null, 404);
			}.bind(this),
			onComplete: function(text, xml) {
				tTransportTimeout = $clear(tTransportTimeout);
				var iTransportStatus = parseInt(this.transporter.transport.status);
				callBack(text, xml, iTransportStatus);
			}.bind(this)
		}).request();
	}
 });
Transformer.implement(new Events);
Transformer.implement(new Options);



