

// Search


function searchErrorHandler(message) {
	alert(message);
	setAjaxLoaderVisibility(0);
};

function SearchObject(onreadyHandler,CMSServiceURL,IndexSourceMask,SiteHostURL,SiteID,SubsiteID,CompanyID,LanguageID,initialString) {
	this.ajax = new AJAXObject(onreadyHandler,searchErrorHandler);
	this.minQueryLength=2;
	this.queryString='';
	this.query=document.getElementById('searchfield');
	this.resultPane=document.getElementById('resultPane');
	this.resultPaneInner=document.getElementById('resultPaneInner');
  this.tagsElement=document.getElementById('queryTags');
	this.results=document.getElementById('queryResults');
	this.initialString = initialString; //this.query.value;
	if (this.query.value=='') {
		var savedQuery = 0; //getCookie('cms.query');
		if (savedQuery) {
			this.query.value = savedQuery;
			setCookie('cms.query','');
		} else {
			this.query.value = this.initialString;
			this.query.style.color='#909090';
		};
	};
	this.tags=0;
	this.hits=0;
	this.lastkeypress=new Date();
	this.timer=0;
	this.CMSServiceURL = CMSServiceURL;
 	this.IndexSourceMask = IndexSourceMask;
	this.SiteHostURL = SiteHostURL;
	this.SiteID = SiteID;
	this.CompanyID = CompanyID;
	this.SubsiteID = SubsiteID;
	this.LanguageID = LanguageID;

	this.strokes=0;
	this.searches=0;
	this.CACHE=1;
	this.debug=0;
		 
};
	
function initSearch(SiteHostURL, CMSServiceURL, IndexSourceMask, SiteID, SubsiteID, CompanyID, LanguageID, initialString) {
	document.search = new SearchObject(XMLReady,CMSServiceURL,IndexSourceMask,SiteHostURL,SiteID,SubsiteID,CompanyID,LanguageID,initialString);
	addEvent(document.getElementById('topheader'),'click',stopProp,true);
	addEvent(document.search.resultPane,'click',stopProp,true);
	//addEvent(document.search.query,'keydown',trapEnter,true);
	addEvent(document.search.query,'keyup',queryKeyPressed,true);
	addEvent(document.search.query,'blur',recheckSearch,true);
	dynObjects[0]=new dynObj(setQueryResultHeight);


  
  document.search.closebutton = document.getElementById('searchclosebutton');
  
  document.search.query.setAttribute('autocomplete','off'); 
  
  document.search.closebutton.click=closeSearch;
	addEventHandler(document.search.closebutton, document.search.closebutton, 'click', false)

};

function searchExtended() {
	var s = document.search;
	var frm = document.getElementById('cms.searchform');
	if ((s.initialString!=s.query.value) && (s.query.value!='')) {
		frm['cms.cmd'].value='search';
		frm['cms.logging'].value='true';
		frm['cms.key'].value='';
		frm.submit();
	};
};

function queryKeyPressed(e) {
	var keyCode = (window.event) ? event.keyCode : e.keyCode;
	var s = document.search;

	if (s.debugResetTimer) window.clearTimeout(s.debugResetTimer);
	s.debugResetTimer = window.setTimeout('resetDebug()',5000);

	debugSetText('debug3','strokes='+(++s.strokes));
	var searchMode = ((s.query.value.length>=s.minQueryLength) && (s.query.value!=s.initialString));
	if (!searchMode) setVisibility(s.tagsElement,searchMode);
	if (!searchMode) setVisibility(s.results,searchMode);
	switch (keyCode) {
	case 27:
		resetSearch();
		s.query.blur();	
		break;
	case 112:
	case 113:
  case 116:
    // Toogle Mask
    s.IndexSourceMask ^= (1 << (keyCode-112));
    s.queryString = '';
  	document.search.debug=true;
  	updateDebugIX();
	  setVisibility('debug',document.search.debug);
    search();
    break;
	default:
		var now = new Date();
		if (s.query.value!=s.queryString) {
			setAjaxLoaderVisibility((searchMode));
		};
		if (s.query.value!=s.initialString) s.query.style.color = '#000000';
		if (s.query.value.length<s.minQueryLength) {s.hits = 0; s.tags = 0};

		if ((now-s.lastkeypress>200) && (now-s.lastkeypress<3000)) {
			search();
			if (s.timer) {window.clearTimeout(s.timer); s.timer=0};
		} else {
			if (s.timer) {window.clearTimeout(s.timer); s.timer=0};
			s.timer = setTimeout('search()',300);
		};
		s.lastkeypress=now;
  };
};

function setAjaxLoaderVisibility(display) {
	var s = document.search;
	if (!display) {
		s.ajaxLoaderDisplayTimer = window.setTimeout('setVisibility(\'searchanimation\',0)',400);
	} else {
		if (s.ajaxLoaderDisplayTimer) window.clearTimeout(s.ajaxLoaderDisplayTimer);
		
    var anim = document.getElementById('searchanimation'), q = anim.src.indexOf('?');
    if (anim.style.display=='none') {
      if (!document.animcounter) document.animcounter = 0; 
      document.animcounter++;
      anim.src = (q>=0 ? anim.src.substring(0,q+document.animcounter) : anim.src + '?'+document.animcounter);
    };
    
    
    s.ajaxLoaderDisplayTimer = null;
		setVisibility('searchanimation',1);
	};
};

function hideAjaxLoader() {setVisibility('searchanimation',0)};;

function setQueryResultHeight(done) {
	var s = document.search, newHeight=Math.round(400*this.pos);
	s.resultPane.style.height=newHeight+'px';
	s.resultPaneInner.style.height=(newHeight<menuContentOffset?0:newHeight-menuContentOffset)+'px';
	setVisibility('searchclosebutton',(this.state>=0));
	
};

function openSearch() {
	var s = document.search;
	if (dynObjects[0].state<=0) {
		setVisibility(s.resultPane,1);
		toggleDynObject(0);
	};
};

function clearSearch() {
	var s = document.search;
	s.hits = 0; s.tags = 0;
	s.query.value = s.initialString;
	s.query.style.color = '#909090';
};

function recheckSearch() {
	var s = document.search;
	if (s.query.value == '') clearSearch();
}

function resetSearch() {
	clearSearch();
	closeSearch();
};

function closeSearch() {

	var s = document.search;
	if (s.timer) {window.clearTimeout(s.timer); s.timer=0; if (!s.ajax.idle()) s.queryString=''};

	if (s.ajax.httpRequest) s.ajax.httpRequest.abort();

	if (dynObjects[0].state>0) toggleDynObject(0);

	setAjaxLoaderVisibility(0);
};

function trapFocus() {
	var s = document.search;
	if (s) {
		s.query.style.color = '#000000';
		s.query.focus();

		if ((s.hits>0) || (s.tags>0)) 
			openSearch();
		else
			collapseMenus();
		if (s.query.value==s.initialString) s.query.value='';
		if (s.query.value!=s.queryString) search();
	};
};

function trapEnter(e) {
	var s = document.search;
	var keyCode = (window.event) ? event.keyCode : e.keyCode;

	switch (keyCode) {
		case 8: if (s.query.value=='') closeSearch(); break;
		case 13: stopProp(); return false; break;
    default: return true; break;
	};
	
};

function search() {

	var s = document.search;

	if ((s.query.value.length>=s.minQueryLength) && (s.query.value!=s.initialString) && (s.queryString!=s.query.value)) {
		s.queryString=s.query.value;
		//setCookie('cms.query',s.query.value);
		var url = s.CMSServiceURL+'?subject=index&action=search'+((s.CompanyID)?((s.IndexSourceMask)?'&indexsourcemask='+s.IndexSourceMask:'')+'&companyid='+s.CompanyID:'')+'&siteid='+s.SiteID+((s.SubsiteID) && (s.SubsiteID>1)?'&subsiteid='+s.SubsiteID:'')+((s.LanguageID) && (s.LanguageID>1)?'&languageid='+s.LanguageID:'')+((s.CACHE==0)?'&cache=flush':'')+'&query='+encodeURIComponent(s.queryString);
		setAjaxLoaderVisibility(1);
		s.ajax.open(url);
		debugSetText('debug2','trips='+(++s.searches));
	};
};

function resetDebug() {
	document.search.searches=0;
	document.search.strokes=0;
	debugSetText('debug1','');
	debugSetText('debug2','');
	debugSetText('debug3','');
};

function debugSetText(id,text) {
	var elem = document.getElementById(id);
	if (elem) elem.innerText=text;
};

function XMLReady() {
	var s=document.search,sHTML,xml;
	if (s.ajax.ready()) {
		var xml = s.ajax.xml;
		var cmd = s.ajax.xPathSearch('//*[name()=\'command\' and @error=\'0\']');
		if (cmd.length) {
			var tags = s.ajax.xPathSearch('//*[name()=\'tag\']');
			s.tags=tags.length;

			var hits = s.ajax.xPathSearch('//*[name()=\'result\']');
			s.hits=hits.length;

			/* debug start */
			var out='',cmdElement=cmd[0];
			out += xml.documentElement.getAttribute('server')+'   ';
			out += 'date='+xml.documentElement.getAttribute('date')+'   ';
			out += 'executiontime=' + cmdElement.getAttribute('executiontime')+'   ';
			if (cmdElement.getAttribute('cached')) out += 'cached='+cmdElement.getAttribute('cached')+'   ';
			if (cmdElement.getAttribute('cache')) out += 'cache='+cmdElement.getAttribute('cache')+'   ';
			out += 'query=' + cmdElement.getAttribute('query') + '   ';
			out += 'tags=' + s.tags+'   ';
			out += 'hits=' + s.hits+'   ';
			
			debugSetText('debug0', out);

			/* debug end */

			var exact=0;
			sHTML = '';			
			for (var i=0;i<s.tags;i++) {
				if ((tags[i].getAttribute('exact')=='false') || (s.tags==1)) {
					if (sHTML.length) sHTML += ', ';
					sHTML += insertTag((tags[i].text?tags[i].text:tags[i].textContent));
				};
				if (tags[i].getAttribute('exact')=='true') exact=1;
			};
			if (s.tags) {
				if (exact) {
					if (s.tags==1) 
						sHTML = 'Søgeord:&#160;&#160;'+sHTML;
					else
						sHTML = 'Andre søgeord' + ':&#160;&#160;'+sHTML;						 
				} else
					sHTML = 'Mener du' + ':&#160;&#160;'+sHTML;
			};
			
			if ((s.query.value.length>=s.minQueryLength) && (s.hits==0) && (s.tags==0)) sHTML = 'Søgningen gav ikke noget resultat.';

			if ((s.SiteID==131)) {
			  sHTML= sHTML +'<div style="margin-top:5px;">Vil du kontakte en medarbejder?&#160;<a href="/medarbejdere/?cmd=search&str=' + escape(s.query.value) + '">Søg her</a></div>';
			};
 
			s.tagsElement.innerHTML = '<div id="innerres1" class="resdiv">' + sHTML + '</div>';
			setVisibility(s.tagsElement,(s.tags) && (s.query.value.length>=s.minQueryLength));

			sHTML = '';
			for (var i=0;i<s.hits;i++) sHTML += makeDocumentLink(hits[i]);
			s.results.innerHTML = '<div id="innerres2" class="resdiv">' + sHTML + '<div style="clear:both;margin-bottom:10px"></div></div>';

			setVisibility(s.results, (s.hits) && (s.query.value.length>=s.minQueryLength));

			openSearch();

			document.reposition.run();

			if (s.query.value!=s.queryString) 			
				search();
			else {
				setAjaxLoaderVisibility(0);
			};
		};
	};
};


function setVisibility(elem,visible) {
	if (typeof(elem)=='string') elem=document.getElementById(elem);
	if (visible)
		elem.style.display='block';
	else
		elem.style.display='none';
};

function searchTag(tagName) {
	document.search.query.value = (document.all?unescape(tagName):decodeURIComponent(tagName));
	search();
};

function insertTag(tagName) {
  
  var tn = tagName.replace(/\\/g,'\\\\');
  var tn = tn.replace(/\x27/g,'\\\'');
  
  tn = (document.all?escape(tn):encodeURIComponent(tn));
  
	return '<a class="tag" href="javascript:searchTag(\'' + tn + '\')">' + tagName + '</a>'
};


function openKey(key,clear) {
  var s=document.search;
	var frm = document.getElementById('cms.searchform');
	frm['cms.cmd'].value='redir';
	frm['cms.key'].value=key;
	if ((s.query.value == s.initialString) || (clear)) s.query.value='';

	frm.submit();
};

function makeDocumentLink(doc) {
	var debug='';
	var indexsourceid=parseInt(doc.getAttribute('indexsourceid'));
	var typeid=parseInt(doc.getAttribute('typeid'));
	
	var summary = (doc.text?doc.lastChild.text:doc.lastChild.textContent);
	var title = (doc.text?doc.firstChild.text:doc.firstChild.textContent);
	var typeName=doc.getAttribute('typename');
	var key=indexsourceid+'.'+doc.getAttribute('sourcekey');

	if (summary.length>200) summary = summary.substring(0,199) + ' ...';
	if (document.search.debug) {
		debug='[key='+key+';rank='+doc.getAttribute('rank')+';typeid='+typeid+'] ';
	};
	return '<a class="result" href="javascript:openKey(\''+key+'\')"><div class="title">' + title + '</div><div class="summary"><span class="meta">'+typeName+'</span>' + debug + summary + '</div></a>';
};

function toggleDebugging() {
	document.search.debug=!document.search.debug;
	setVisibility('debug',document.search.debug);
};

function toggleSetting(name) {
	var s=document.search;
	var sElement = document.getElementById('setting_'+name);
	var newVal = ((sElement.innerText==name+' ON')?0:1);
	var newValText = ((newVal)?name+' ON':name+' OFF');
	sElement.innerText = newValText;
	var setting = eval('s.'+name);
	eval('s.'+name+'='+newVal);
	sElement.className = 'settings ' + ((newVal)?'ON':'OFF');
};


