String.prototype.trim = function() { return this.replace(/^\s\s*/, '').replace(/\s\s*$/, '');};
var filledParts={};

if (typeof(console) == 'undefined'){
	var console = {

		enabled:false

		,init:function(){

			if (console.enabled){

				console.d=document.createElement('div');
				document.body.appendChild(console.d);
				var a=document.createElement('a');
				a.href='javascript:console.hide()';
				a.innerHTML='close';
				console.d.appendChild(a);
				var a=document.createElement('a');
				a.href='javascript:console.clear();';
				a.innerHTML='clear';
				console.d.appendChild(a);
	
				if(!document.getElementById('yinsconsole')){
					console.d.id='yinsconsole';
				}
				console.hide();

			}
		}

		,hide:function(){
			if (console.enabled)
				console.d.style.display='none';
		}

		,show:function(){
			if (console.enabled)
				console.d.style.display='block';
		}

		,info:function(o){

			if (console.enabled){
				console.d.innerHTML += '<br/>'+o;
				console.show();
			}
		}

		,log:function(text){
			if (console.enabled)
				info(text);
		}

		,clear:function(){

			if (console.enabled){
				console.d.parentNode.removeChild(console.d);
				console.init();
				console.show();
			}
		}

	};

	
	if(typeof window.onload != 'function'){
		window.onload=console.init;
	}else{
		var parentLoadFunc=window.onload;
		window.onload=function(){
			parentLoadFunc();
			console.init;
		}
	}

}

function utf8Encode(sInput){
	var sOutput=''
	for (var j=0; j<sInput.length; j++){
		iCode=sInput.charCodeAt(j);
		if (iCode<128){
			sOutput += String.fromCharCode(iCode);
		}else if (iCode<2048){
			sOutput += String.fromCharCode((iCode>>6)|192);
			sOutput += String.fromCharCode((iCode&63)|128);
		}else if (iCode<65536){
			sOutput += String.fromCharCode((iCode>>12)|224);
			sOutput += String.fromCharCode(((iCode>>6)&63)|128);
			sOutput += String.fromCharCode((iCode&63)|128);
		}else{
			sOutput += String.fromCharCode((iCode>>18)|240);
			sOutput += String.fromCharCode(((iCode>>12)&63)|128);
			sOutput += String.fromCharCode(((iCode>>6)&63)|128);
			sOutput += String.fromCharCode((iCode&63)|128);
		}
	}
	return sOutput;

}

function base64Utf8Encode(sInputX){

	var b64s='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';

	if(sInputX.length<=0)
		return '';

	var sInput=utf8Encode(sInputX);

	var sOutput='';
	var sChar1,sChar2,sChar3;
	var iCode1,iCode2,iCode3,iCode4;
	var i=0;
	do{
		sChar1=sInput.charCodeAt(i++);
		sChar2=sInput.charCodeAt(i++);
		sChar3=sInput.charCodeAt(i++);
		iCode1=sChar1>>2;
		iCode2=((sChar1&3)<<4)|(sChar2>>4);
		iCode3=((sChar2&15)<<2)|(sChar3>>6);
		iCode4=sChar3&63;
		if (!sChar2||isNaN(sChar2)) {
			iCode3=iCode4=64;
		}else if (!sChar2||isNaN(sChar3)) {
			iCode4=64;
		}
		sOutput=sOutput+b64s.charAt(iCode1)+b64s.charAt(iCode2)+b64s.charAt(iCode3)+b64s.charAt(iCode4);
	}while (i<sInput.length);
	return sOutput;
}

function intval (mixed_var, base) {
	var type = typeof(mixed_var);

	if (type === 'boolean') {       
		return (mixed_var) ? 1 : 0;
	} else if (type === 'string') {
		tmp = parseInt(mixed_var, base || 10);
		return (isNaN(tmp) || !isFinite(tmp)) ? 0 : tmp;
	} else if (type === 'number' && isFinite(mixed_var)) {        
		return Math.floor(mixed_var);
	} else {
		return 0;
	}
}

function str_ireplace (search, replace, subject) {
    
    var i, k = '';
    var searchl = 0;    var reg;
 
    var escapeRegex = function (s) {
        return s.replace(/([\\\^\$*+\[\]?{}.=!:(|)])/g, '\\$1');
    }; 
    
    searchl = search.length;
    if (!(replace instanceof Array)) {
        replace = [replace];        if (search instanceof Array) {
            // If search is an array and replace is a string,
            // then this replacement string is used for every value of search
            while (searchl > replace.length) {
                replace[replace.length] = replace[0];            }
        }
    }
 
    if (!(search instanceof Array)) {        search = [search];
    }
    while (search.length > replace.length) {
        // If replace has fewer values than search,
        // then an empty string is used for the rest of replacement values        replace[replace.length] = '';
    }
 
    if (subject instanceof Array) {
        // If subject is an array, then the search and replace is performed        // with every entry of subject , and the return value is an array as well.
        for (k in subject) {
            if (subject.hasOwnProperty(k)) {
                subject[k] = str_ireplace(search, replace, subject[k]);
            }        
	}
        return subject;
    }
 
    searchl = search.length;    for (i = 0; i < searchl; i++) {
        reg = new RegExp(escapeRegex(search[i]), 'gi');
        subject = subject.replace(reg, replace[i]);
    }
     return subject;
}

function processInputKeyUp(event,component, lookupDiv){

	if (typeof(lookupDiv) =='undefined')
		lookupDiv=null;

	var outputDiv = null;
	var sugesstionsList = null;

	if (lookupDiv != null){
		for (var childKey in lookupDiv.childNodes){
			if (lookupDiv.childNodes[childKey].nodeName == 'DIV'){
				outputDiv = lookupDiv.childNodes[childKey];
				break;
			}
		}
	}

	if (outputDiv != null){
		for (var childKey in outputDiv.childNodes){
			if (outputDiv.childNodes[childKey].nodeName == 'UL'){
				sugesstionsList = outputDiv.childNodes[childKey];
				break;
			}
		}
	}

	
	if(event.keyCode == 13){
		component.blur();
		var actionFunctionName='runSearch';
			if (component.getAttribute('actionFunction') != null)
				actionFunctionName = component.getAttribute('actionFunction');

		if (config.OnSymSearchEvent != null && ((typeof config.OnSymSearchEvent) == 'function'))
			window[config.OnSymSearchEvent]();

		console.info(actionFunctionName);
		console.info(component.value);
		console.info(encodeURIComponent(component.value));


		window[actionFunctionName](component.value);
	}else if(((event.keyCode == 38) || (event.keyCode == 40)) && sugesstionsList != null){
		var selectedText = stripKeyMarks(selectNthListItem(sugesstionsList,event.keyCode == 40, 'hover'));
		if ((selectedText != null) && (typeof(component) != 'undefined') && (typeof(component.value) != 'undefined')){
			
			component.value= selectedText;
		}
	}else if (lookupDiv != null){
		lookup(lookupDiv,component.value);
	}
}

function getInnerText(elt) {
	var _innerText = elt.innerText;
	if (_innerText == undefined) {
  		_innerText = elt.innerHTML.replace(/<[^>]+>/g,"");
	}
	return _innerText;
}

function selectNthListItem(listOrChild,bPlusMinus, className, classNameNonSelected){

	if (typeof(listOrChild) == 'undefined')
		return null;

	var selectedChild = null;
	var list = listOrChild;

	if ((typeof(bPlusMinus) == 'undefined') && (typeof(listOrChild) != 'undefined') && (typeof(listOrChild.parentNode) != 'undefined') && (typeof(listOrChild.parentNode.childNodes) != 'undefined')){
		list = listOrChild.parentNode;
		selectedChild = listOrChild;
	}

	if ((typeof(list) == 'undefined') || (typeof(list.childNodes) == 'undefined'))
		return null;

	classNameNonSelected = typeof(classNameNonSelected) != 'undefined' ? classNameNonSelected : '';
	className = typeof(className) != 'undefined' ? className : '';

	for (var childNodeKey in list.childNodes){
		list.childNodes[childNodeKey].className = classNameNonSelected;
	}


	if (selectedChild != null){
		selectedChild.className = className;

		return getInnerText(selectedChild);
		list.selectedN = 0;
	}else{
		if ((typeof(bPlusMinus) != 'boolean'))
			return null;

		var n = typeof(list.selectedN) != 'undefined' ? list.selectedN : -1;

		if (bPlusMinus)
			n++;
		else
			n--;

		if (n < 0)
			n=0;
		if (n > list.childNodes.size-1)
			n=list.childNodes.size-1;

		list.childNodes[n].className = className;

		list.selectedN = n;

		//console.info(getInnerText(list.childNodes[n]));
		return getInnerText(list.childNodes[n]);
		
	}
}

function pager(size, part, partKey, bShowCount) {

	
	var iCurrentPage = part.PageOffset;
	var iNumbersPerPage = part.NumbersPerPage;
	
	bShowCount = typeof(bShowCount) != 'undefined' ? bShowCount : true;
	
	var iNavigatorLimit = 10;
	var sPagerContent = "";
	var sHitContent = "";
	
	var iNumberPages = Math.ceil(size / iNumbersPerPage);
	
	if (bShowCount && intval(size))
		if (size > 1 || size == 0)
			sHitContent +="<button style=\"\" class=\"yinssearch-navbuttondisabled\">" + size + ' ' + l10n('SYS_count') + "</button>";
		else
			sHitContent +="<button style=\"\" class=\"yinssearch-navbuttondisabled\">" + size + ' ' + l10n('SYS_countsingle') + "</button>";
	if (iNumberPages > 1) {
	
		var iStart = ((iCurrentPage - iNavigatorLimit) < 0 ? 0 : (iCurrentPage - iNavigatorLimit));
		var iEnd = ((iCurrentPage + iNavigatorLimit) > iNumberPages ? iNumberPages : (iCurrentPage + iNavigatorLimit));
	
		// before
		if (iCurrentPage > 0) {
		    sPagerContent +="<button style=\"width:25px;\"  onClick=\"runSearch(null,'"+partKey +"',0);return false;\" class=\"yinssearch-navbutton navbegin\">|&laquo;</button>&nbsp;";
			sPagerContent +="<button style=\"width:25px;\"  onClick=\"runSearch(null,'"+partKey +"',"+(iCurrentPage-1)+");return false;\" class=\"yinssearch-navbutton navminus\">&laquo;&laquo;</button>&nbsp;";
		} else {
		    sPagerContent +="<button style=\"width:25px;\" onfocus=\"blur();\" class=\"yinssearch-navbuttondisabled navbegin\">|&laquo;</button>&nbsp;";
		    sPagerContent +="<button style=\"width:25px;\" onfocus=\"blur();\" class=\"yinssearch-navbuttondisabled navminus\">&laquo;&laquo;</button>&nbsp;";
		}
		sPagerContent +="&nbsp; &nbsp;";
	
		// center
		for (i = iStart; i < iEnd; i++) {
		    if (i != iCurrentPage)
		    	sPagerContent +="<button style=\"width:25px;\" class=\"yinssearch-navbutton navnormal\" onClick=\"runSearch(null,'"+partKey +"',"+(i)+");return false;\">" + (1 + i) + "</button>&nbsp;";
		    else
		    	sPagerContent += "<button style=\"width:25px;\" class=\"yinssearch-navbuttonactive navnormal\">" + (1 + i) + "</button>&nbsp;";
		}
		sPagerContent +="&nbsp; &nbsp;";
	
		// after
		if (iCurrentPage < iNumberPages - 1) {
				sPagerContent +="<button style=\"width:25px;\"  onClick=\"runSearch(null,'"+partKey +"',"+(iCurrentPage+1)+");return false;\" class=\"yinssearch-navbutton navplus\" >&raquo;&raquo;</button>&nbsp;";
				sPagerContent +="<button style=\"width:25px;\"  onClick=\"runSearch(null,'"+partKey +"',"+(iNumberPages-1)+");return false;\" class=\"yinssearch-navbutton navend\" >&raquo;|</button>&nbsp;";
		} else {
				sPagerContent +="<button style=\"width:25px;\" onfocus=\"blur();\" class=\"yinssearch-navbuttondisabled navplus\">&raquo;&raquo;</button>&nbsp;";
				sPagerContent +="<button style=\"width:25px;\" onfocus=\"blur();\" class=\"yinssearch-navbuttondisabled navend\">&raquo;|</button>&nbsp;";
		}
	}

	if (sPagerContent.length>0)
		sPagerContent = "<div class=\"yinssearch-nav\">"+sPagerContent+"</div>";
	else
		sPagerContent = "<div class=\"yinssearch-nonavneeded\"></div>";

	if (sHitContent.length>0)
		sHitContent = "<div class=\"yinssearch-blockhits\">"+sHitContent+"</div>";

	return (sHitContent+sPagerContent);
}

function fillError(content){
	
	window.document.getElementById('yinssearch-error').innerHTML = content;
	window.document.getElementById('yinssearch-div').innerHTML = '';
	
	$('#yinssearch-error').clearQueue();
	$('#yinssearch-error').fadeIn();
	
	fillQuickLinks(null);
	hideBlocker();
}

function clearError(){
	$('#yinssearch-error').clearQueue();
	$('#yinssearch-error').hide();
	window.document.getElementById('yinssearch-error').innerHTML = '';
}

function fillOutput(content, partKey, hideBlocker){

	clearError();
	
	hideBlocker = typeof(hideBlocker) != 'undefined' ? hideBlocker : true;
	partKey = typeof(partKey) != 'undefined' ? partKey : null;
	
	if (partKey !== null){
		
		if (window.document.getElementById('yinssearch-acontainer-'+partKey) === null){
			var newA= document.createElement('a');
			newA.setAttribute('id',"yinssearch-a-"+partKey);
			newA.setAttribute('name',"yinssearch-a-"+partKey);
			window.document.getElementById('yinssearch-div').appendChild(newA);
			var newAContainer= document.createElement('div');
			newAContainer.setAttribute('id',"yinssearch-acontainer-"+partKey);
			newAContainer.setAttribute('name',"yinssearch-acontainer-"+partKey);
			window.document.getElementById('yinssearch-div').appendChild(newAContainer);
		}
		
		$("#yinssearch-acontainer-"+partKey).html(content);
		//window.document.getElementById('yinssearch-acontainer-'+partKey).innerHTML = content;

		
	}
	
	if (hideBlocker)
		hideBlocker();
}

function fillQuickLinks(){

	window.document.getElementById('yinssearch-quicklinkdiv').innerHTML='';
	window.document.getElementById('yinssearch-quicklinkdiv').style.display = 'none';
	var renderedCount = 0;
	if (filledParts === null){
		return;
	}else if(config.ShowQuickLinks){

		
		for (filledPartKey in filledParts){
			var filledPart = filledParts[filledPartKey];

			if ((typeof(filledPart['QuickLink'])!='undefined') && filledPart['QuickLink'] !== null && filledPart['QuickLink'].length > 0){

				if (null === document.getElementById("yinssearch-quicklinkentry-"+filledPartKey)){

					var sQuickLink = '';

					if (renderedCount>0)
						sQuickLink+="<span class=\"yinssearch-quicklinkseparator2\">, </span>";

					sQuickLink+="<a id=\"yinssearch-quicklinkentry-"+filledPartKey+"\" href=\"#yinssearch-a-" + filledPartKey + "\" class=\"yinssearch-quicklinkentry\">" + filledPart['QuickLink'] + "</a><span class=\"yinssearch-quicklinkseparator\"><br/></span>";
					window.document.getElementById('yinssearch-quicklinkdiv').innerHTML += sQuickLink;
					renderedCount++;
				}

			}

		}


		if (renderedCount>0){
			window.document.getElementById('yinssearch-quicklinkdiv').style.display = 'block';
			if (null === document.getElementById('yinssearch-quicklinkdivhead')){
				window.document.getElementById('yinssearch-quicklinkdiv').innerHTML = "<div id=\"yinssearch-quicklinkdivhead\" class=\"yinssearch-quicklinkdivhead\">" +l10n('SYS_quicklinkstart')+ "</div>" + window.document.getElementById('yinssearch-quicklinkdiv').innerHTML;
			}
		}

	}
}

function fillLookup(lookupDiv,json){
	var actionFunctionName='runSearch';
	if (lookupDiv.getAttribute('actionFunction') != null)
		actionFunctionName = lookupDiv.getAttribute('actionFunction');

	var outputDivId = null;
	var divId = lookupDiv.id;
	for (var childKey in lookupDiv.childNodes){
		if (lookupDiv.childNodes[childKey].nodeName == 'DIV'){
			outputDivId = lookupDiv.childNodes[childKey].id;
			break;
		}
	}
	
	if (json && json.length) {
		var content = '<ul id="yinssearch-suggestionsul">';
		$('#'+divId).show();
		
		for (var key in json) {

			content+="<li class=\"lookupLink\" "
			+ " onmouseover=\"selectNthListItem(this,undefined, 'hover')\" "
			+ " onclick=\"" + ((config.OnSymSearchEvent != null) ? config.OnSymSearchEvent : '') + actionFunctionName+"('"+stripKeyMarks(json[key])+"');\" >"+htmlKeys(json[key],'yinssearch-suggestionHighlight')+"</li>";
			
		}
		content+="</ul>";
		$('#'+outputDivId).html(content);
		
		
	}else{
		$('#'+divId).fadeOut()
	}
}


function fillLikeness(json){
	
	window.document.getElementById('yinssearch-likenessdiv').style.display = 'none';
	
	if (json && json.length) {
		var content = '';
		window.document.getElementById('yinssearch-likenessdiv').style.display = 'block';
		
		content += "<span class=\"yinssearch-likenessdiv-head\">" +l10n('SYS_simmilarkeywords') + "</span><span class=\"yinssearch-likenessdiv-content\">";
		var bFirstKey = true;
		for (var key in json) {
			if (!bFirstKey)
				content+="<span class=\"yinssearch-likenessseparator2\">, </span>";
		
			content+="<span class=\"likenessLink\" onclick=\"" + ((config.OnSymSearchEvent != null) ? config.OnSymSearchEvent : '') + "runSearch('"+json[key]+"');\" >"+json[key]+"</span><span class=\"yinssearch-likenessseparator\"><br/></span>";
			bFirstKey = false;
		}
		content += "</span>";
		window.document.getElementById('yinssearch-likenessdiv').innerHTML = content;
		
	}
}
		
function displayPleaseWait(){

	$('#yinssearch-pleaseWaitContainer').fadeIn();
	$('#yinssearch-pleaseWait').fadeIn();

	//window.document.getElementById('yinssearch-pleaseWaitContainer').style.display = 'block';
	//window.document.getElementById('yinssearch-pleaseWait').style.display = 'block';
}

function hideBlocker(){

	$('#yinssearch-pleaseWaitContainer').clearQueue();
	$('#yinssearch-pleaseWait').clearQueue();

	$('#yinssearch-pleaseWaitContainer').hide();
	$('#yinssearch-pleaseWait').hide();

	//window.document.getElementById('yinssearch-pleaseWaitContainer').style.display = 'none';
	//window.document.getElementById('yinssearch-pleaseWait').style.display = 'none';
}

function l10n(key){

	if (typeof(config.L10N) != 'undefined' && typeof(config.L10N[key]) != 'undefined')
		return config.L10N[key];

	return '['+key+']';
}

function runSearch(search,singlePartKey,offset){
	
	displayPleaseWait();
	defaultConfig(config);
	

	if ((typeof(search) != 'undefined') && (search === null)){
		search = config.lastSearch;	
	}

	config.lastSearch=search;
	
	if (typeof(config) == 'undefined') {
		fillError(l10n('SYS_settingserror'));
		return;
	}

	search = typeof(search) != 'undefined' ? search : '';
	window.document.getElementById('yinssearch').value=search;
	
	singlePartKey = typeof(singlePartKey) != 'undefined' ? singlePartKey : null;

	// clear quicklink div if this is a complete new search
	if (singlePartKey === null)
		fillQuickLinks(null);

	var sContent = '';
	
	if (config.Parts.length == 0){
		fillError(l10n('SYS_partserror'));
		return;
	}
	
	if (search.trim().length == 0) {
		fillError(l10n('SYS_noinputstr'));
		return;
	}
	
	if (config.ShowSymKeywords)
		fetchLikenessKeys(search,config.Domains);
	
	filledParts={};
	
    for (var partKey in config.Parts) {
    	
    	if (singlePartKey === null || partKey === singlePartKey){

	    	var part=config.Parts[partKey];

	    	part.PageOffset = typeof(offset) != 'undefined' ? offset : 0;
	    	
    		filledParts[partKey]={};
    		filledParts[partKey]['Json'] = null;
    		filledParts[partKey]['QuickLink'] = undefined;
    		filledParts[partKey]['Done'] = false;
    		filledParts[partKey]['HasResults'] = false;
    		filledParts[partKey]['Rendered'] = false;

    		
    	}
    }
    
    if (filledParts.length <= 0){
    	hideBlocker();// hide blocker div
    }else{
    	for (var partKey in filledParts) {

	    	var part=config.Parts[partKey];
    		fetchPart(partKey, search, part.Domains, part.PageOffset * part.NumbersPerPage, part.NumbersPerPage, part.SearchAll, part.SearchExact, part.Jail, part.HostJail, part.Type, part.Language, part.Groups, part.Areas, config.Ignore, part.ContentID);	  

        }
    }
    
   
	
}

function processSearch(search,partKey){
	
    var bFirstQuicklinkContent = true;
	
	var aText = search.split(new RegExp('[' + "\\s;:,\\.\\?!'\"\\(\\)\\[\\]\\{\\}/\\\\\\+\\-=\\*%&„“_\\|@" + ']+'));
		
	var part = config.Parts[partKey];
    	var filledPart=filledParts[partKey];
    	
    	if (filledPart['HasResults'] === true){
    		
    		// ensure processing is done only once
    		if (filledParts[partKey]['Done'] == false){

			

    			filledParts[partKey]['Done'] = true;
    			var sContent = '';
			

			filledParts[partKey]['QuickLink']=l10n(part.QuickLinkName);

    			var sNav = pager(filledPart['Json'].size, part, partKey, true);

    			if (part.Header !== null)
    			    sContent+='<div class="yinssearch-blockhead">' +l10n(part.Header)+ '</div>';
    			
			sContent += sNav;
    			sContent +='<div class="yinssearch-block yinssearch-block-' + part.Name + '">'; // 639
    			
    			
    			var alternate = false;
    			
    			for (var key in filledPart['Json'].list){
    				var oO = filledPart['Json'].list[key];
    				alternate = !alternate;
    				
    				var aPrintTexts = [];
    			   	var aPrintStyles = [];
    				
    				for (var oContentBlockKey in oO.ContentBlocks) {
    					
    					
    					var oContentBlock = oO.ContentBlocks[oContentBlockKey];
    					
    					var xContentDisplayHint = 'Preview';
    					if ((part.ContentDisplayHints instanceof Array) && typeof(part.ContentDisplayHints[oContentBlock.ContentID]) != 'undefined') {
    					    xContentDisplayHint = aContentDisplayHints[oContentBlock.ContentID];
    					}

    					do {
    					    if (xContentDisplayHint == 'Hidden') {

    					    	aPrintTexts[oContentBlock.ContentID] = '';
    					    	break;
    					    }
    					    if (xContentDisplayHint == 'Full') {

    					    	aPrintTexts[oContentBlock.ContentID] = oContentBlock.Content;
    					    	break;
    					    } else if ("Array" == typeof(xContentDisplayHint) && (xContentDisplayHint['Pattern'] != null)) {

    					    	// pattern containing %#content#% assumed
    					    	aPrintTexts[oContentBlock.ContentID] = xContentDisplayHint['Pattern'].replace('%#content#%', oContentBlock.Content);
    					    	break;
    					    } else if (xContentDisplayHint == 'Preview') {
    					    	// default
    					    }

    					    aPrintTexts[oContentBlock.ContentID] = "..." + oContentBlock.Content + "...";
    					} while (false);

    					aPrintStyles[oContentBlock.ContentID] = oContentBlock.ContentID;
    					
    					if ((xContentDisplayHint instanceof Array) && typeof(xContentDisplayHint['Style']) != 'undefined') {
    					    aPrintStyles[oContentBlock.ContentID] = xContentDisplayHint['Style'];
    					}


    				
    					aPrintTexts[oContentBlock.ContentID] = htmlKeys(aPrintTexts[oContentBlock.ContentID]);
    				}

				var sTitleClassAddon = '';
				if (part.AreaStyling) {
				
					for (var oAreaKey in oO.SiteAreas) {
						
						var oArea = oO.SiteAreas[oAreaKey];
				
					    sTitleClassAddon+=' yinssearch-area-' + oArea.SysName + ' ';
					}
				}

				sContent+=
					    "<span class=\"yinssearch-span yinssearch-alternate" + (alternate ? "1":"0") + "\">";

				sContent+="<a " + (part.OnClickEvent != null ? ('onclick="' + part.OnClickEvent + '"') : '') + " " + (part.LinkTarget != null ? ('target="' + part.LinkTarget + '"') : '') + " class=\"yinssearch-title "+ sTitleClassAddon + "\" href=\"" + ((oO.LinkTarget != null && oO.LinkTarget.trim().length >0) ? oO.LinkTarget : oO.Path) + "\">" + oO.Title + "</a>";
				sContent+= "<span class=\"yinssearch-title-score\"> | " + l10n('SYS_score') + ' ' + oO.HC + "</span>";
				sContent+= "<span class=\"yinssearch-title-rating\"> | " + l10n('SYS_rating') + ' ' + oO.Rating + "</span>";
					
					
				for (var iContentID  in aPrintTexts) {
					var sPrintText = aPrintTexts[iContentID];

					sContent+="<span class=\"yinssearch-text-" + aPrintStyles[iContentID] + "\"><br/>" + sPrintText + "</span>";
				}
					
				var accessDate = new Date(oO.ATime*1000);
				var scanDate = new Date(oO.STime*1000);

			    	sContent+="<span class=\"yinssearch-path\"><br/>" + str_ireplace(['/', '.asp', '.php5', '.xins', '.php3', '.php', '.html', '.htm', 'jsp', 'aspx', 'shtml'], ['/&#8203;', '<b>.asp</b>', '<b>.php5</b>', '<b>.xins</b>', '<b>.php3</b>', '<b>.php</b>', '<b>.html</b>', '<b>.htm</b>', '<b>.jsp</b>', '<b>.aspx</b>', '<b>.shtml</b>'], oO.Path) + "</span>"
				    + "<span class=\"yinssearch-numbers\"><br/>"
				    + oO.WordCount + " " + l10n('SYS_words') + " -  " + sizeHumanSI(oO.Size) + " - " + oO.CRC.substring(0, 16) + ' - ' + oO.UniqueID.substring(0,16) + "</span>"
				    + "<span class=\"yinssearch-morenumbers\"><br/>" + l10n('SYS_lastmodified') + ":"
				    + accessDate.getDate() +"."+ (accessDate.getMonth()+1) +"."+ accessDate.getFullYear()
				    + " - " + l10n('SYS_accessed') 
				    + ":" 
				    + scanDate.getDate() +"."+ (scanDate.getMonth()+1) +"."+ scanDate.getFullYear() 
				    + "</span>";

			    	sContent+="<span class=\"yinssearch-morelink yinssearch-alternate" + (alternate ? "1":"0") + "\"><a class=\"yinssearch-morelinkhref\" href=\"" + oO.Path + "\">" + l10n('SYS_slmore') + "</a></span>";

			    	if (oO.SC > 1) {
    					sContent+="<span class=\"yinssearch-morepages-span\"><a class=\"yinssearch-morepages-title\" href=\"#\" onClick=\"document.getElementById('yinssearch" + oO.UniqueID + "').style.display=((document.getElementById('yinssearch" + oO.UniqueID + "').style.display=='none')?'block':'none');return false;\">" + (intval(oO.SC) - 1) + " " + l10n('SYS_morepages') + '</a></span>';
    					sContent+="<span id=\"yinssearch" + oO.UniqueID + "\" class=\"yinssearch-morepages\" style=\"display:none;\">";

    					
    					for (var otherUriKey in oO.DictinctUris) {
    						var otherUri = oO.DictinctUris[otherUriKey];
    					    sContent+=str_ireplace(['/', '.asp', '.php5', '.xins', '.php3', '.php', '.html', '.htm', 'jsp', 'aspx', 'shtml'], ['/&#8203;', '<b>.asp</b>', '<b>.php5</b>', '<b>.xins</b>', '<b>.php3</b>', '<b>.php</b>', '<b>.html</b>', '<b>.htm</b>', '<b>.jsp</b>', '<b>.aspx</b>', '<b>.shtml</b>'], otherUri) + '<br/>';
    					}
    					
    					
    					sContent+="</span>";
    				}
    				
    				sContent+="</span>";
    				
    			}
    			
    			sContent+='</div>';
    			
    			sContent += sNav;
    			
    			
    			
    			if (part.MoreItemsLink && filledPart['Json'].size > filledPart['Json'].list.length){
    				sContent+="<form action=\"" + part.MoreItemsLink + "\" method=\"GET\">" +
    						"<input type=\"hidden\" name=\"search\" value=\""+encodeURIComponent(search)+"\"/>" +
							"<input class=\"yinssearch-moreitemslink\" type=\"submit\" value=\"" + l10n('SYS_moreresults') + "\"/>" +
							"</form>";
    			}
    			
    			if (filledPart['Json'].list.length > 0 || part.NoResultsText != null)
    				sContent+="\n\n<hr class=\"yinssearch-hr\"/>\n\n";
    			
    			fillOutput(sContent,partKey,false);
			fillQuickLinks(filledParts);
    		}
	
	}else{
		fillOutput('',partKey,false);
	}

	filledParts[partKey]['Rendered']=true;

	var allDone=true;
	var resultsAvail=false;
	

	for (var partKey in filledParts) {
		

		if (filledParts[partKey]['HasResults'] === true){
			resultsAvail=true;
		}
	    	
		if (filledParts[partKey]['Rendered'] === false){
	    		allDone = false;
		}
	}



	if (allDone && !resultsAvail){
		if (config.NoResultsText != null) {
			fillError(l10n(config.NoResultsText));
		}
	}
	
	if (allDone)
		hideBlocker();
	
}



function defaultConfig(config){
	
	if (!config.hasOwnProperty('Server'))
		config.Server = null;
	
	if (!config.hasOwnProperty('ShowSymKeywords'))
		config.ShowSymKeywords = true;
	
	if (typeof config.Ignore == 'String')
		config.Ignore = config.Ignore.split(',');
	else if (!(config.Ignore  instanceof Array))
		config.Ignore = null;
	
	if (!config.hasOwnProperty('ShowQuickLinks'))
		config.ShowQuickLinks = true;
	if (!config.hasOwnProperty('SearchKey'))
		config.SearchKey = null;
	if (!config.hasOwnProperty('LinkTarget'))
		config.LinkTarget = null;
	if (!config.hasOwnProperty('Domains'))
		config.Domains = null;
	if (!config.hasOwnProperty('Groups'))
		config.Groups = null;
	if (!config.hasOwnProperty('Areas'))
		config.Areas = null;
	if (!config.hasOwnProperty('Language'))
		config.Language = null;
	if (!config.hasOwnProperty('OnSymSearchEvent'))
		config.OnSymSearchEvent = null;
	if (!config.hasOwnProperty('NoResultsText'))
		config.NoResultsText = 'SYS_noresults';
	if (!config.hasOwnProperty('Parts'))
		config.Parts = [];
	
	config.ShowQuickLinks = !!config.ShowQuickLinks;
	config.ShowSymKeywords = !!config.ShowSymKeywords;
	
	for (var partKey in config.Parts) {
		var part=config.Parts[partKey];
		
		if (!part.hasOwnProperty('PageOffset'))
			part.PageOffset = 0;
		
		if (!part.hasOwnProperty('MoreItemsLink'))
			part.MoreItemsLink = null;
		
		if (!part.hasOwnProperty('NumbersPerPage'))
			part.NumbersPerPage = 10;
		else
			part.NumbersPerPage = Math.max(1,intval(part.NumbersPerPage));
		
		if (!part.hasOwnProperty('Name'))
			part.Name = null;
		if (!part.hasOwnProperty('Jail'))
			part.Jail = null;
		if (!part.hasOwnProperty('HostJail'))
			part.HostJail = null;
		if (!part.hasOwnProperty('Type'))
			part.Type = null;
		
		if (!part.hasOwnProperty('SearchAll'))
			part.SearchAll = false;
		else
			part.SearchAll = !! part.SearchAll;
		
		if (!part.hasOwnProperty('AreaStyling'))
			part.AreaStyling = false;
		else
			part.AreaStyling = !! part.AreaStyling;
		
		if (!part.hasOwnProperty('SearchExact'))
			part.SearchExact = false;
		else
			part.SearchExact = !! part.SearchExact;
		
		if (!part.hasOwnProperty('ContentID'))
			part.ContentID = 0;
		if (!part.hasOwnProperty('Header'))
			part.Header = null;
		if (!part.hasOwnProperty('QuickLinkName'))
			part.QuickLinkName = part.Header;
		if (!part.hasOwnProperty('NoResultsText'))
			part.NoResultsText = config.NoResultsText;
		
		if (!part.hasOwnProperty('OnClickEvent'))
			part.OnClickEvent = null;
		if (!part.hasOwnProperty('OnPagerEvent'))
			part.OnPagerEvent = null;
		
		if (!part.hasOwnProperty('LinkTarget'))
			part.LinkTarget = config.LinkTarget;
		
		if (!part.hasOwnProperty('Navigation'))
			part.Navigation = true;
		else
			part.Navigation = !! part.Navigation;
		
		if (!part.hasOwnProperty('ContentDisplayHints'))
			part.ContentDisplayHints = null;
		
		if (!part.hasOwnProperty('Groups'))
			part.Groups = config.Groups;
		if (!part.hasOwnProperty('Areas'))
			part.Areas = config.Areas;
		if (!part.hasOwnProperty('Domains'))
			part.Domains = config.Domains;
		if (!part.hasOwnProperty('Language'))
			part.Language = config.Language;
    }
}

function preg_quote (str) {
    return (str + '').replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&');
}


function stripKeyMarks(sContent){
	return sContent.replace(new RegExp('#~','ig'),'').replace(new RegExp('~#','ig'),'');
}

function htmlKeys(sContent, cssHighlight) {

	cssHighlight = typeof(cssHighlight) != 'undefined' ? cssHighlight : 'yinssearch-bold';

	return sContent.replace(new RegExp('#~','ig'),'<b class=\"'+cssHighlight+'\">').replace(new RegExp('~#','ig'),'</b>');

}

function sizeHumanSI(iSize, sUnit) {
	sUnit = typeof(sUnit) != 'undefined' ? sUnit : 'B';
	
    iOrigSize = iSize;
    aLocalMod = ['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'];
    iCount = 0;
    while (iSize > 1000) {
		iCount++;
		iSize = iSize / 1000.0;
    }
    if (iCount >= aLocalMod.length)
    	return iOrigSize + ' ' + sUnit;
    return Math.round(iSize) + ' ' + aLocalMod[iCount] + sUnit;
}

function fetchPart(id, sSearch, aDomains, iOffset, iLimit, bSearchAll, bSearchExact, sJail, sHostJail, sType, language, xGroups, xAreas, aIgnore, xContentID) {
  
	if (config.Server == null){
		console.info("no server set for fetchPart!");
		filledParts[id]=null;
	}
	
	var internalRestBase=config.Server;
	if (internalRestBase.substring(internalRestBase.length-1) == '/')
		internalRestBase=internalRestBase.substring(0,internalRestBase.length-1);
	
    var out = internalRestBase + "/search";
    var first = null;

    first=true;
    if (aDomains  instanceof Array){
	    for (var domKey in aDomains){
	    	var dom = aDomains[domKey].replace(/\r/g,' ').replace(/\n/g,' ').trim()
			if (dom.length > 0){
			    out += (first?'/dom/':'.')+ base64Utf8Encode(dom).replace('/\\+/g','/').replace('/\\-/g','_');
			    first=false;
			}
	    }
	}
    
	first=true;
	if (!(xContentID  instanceof Array) && intval(xContentID)>=0){
	    out += "/cbn/" + intval(xContentID);
	}else if ((xContentID  instanceof Array)){
	    for (var key in xContentID){
	    	var val = xContentID[key];
			if (intval(val)>=0){
			    out += (first?'/cbn/':'.')+ intval(val);
				first=false;
			}
		}
	}

	first=true;
	if (typeof(xAreas) == 'String' && xAreas.replace(/\r/g,' ').replace(/\n/g,' ').trim().length > 0){
	    out += "/are/" + base64Utf8Encode(xAreas.replace(/\r/g,' ').replace(/\n/g,' ').trim()).replace('/\\+/g','/').replace('/\\-/g','_');
	}else if (xAreas instanceof Array){
	    for (var key in xAreas){
	    	var val = xAreas[key];
			if (val.replace(/\r/g,' ').replace(/\n/g,' ').trim().length > 0){
			    out += (first?'/are/':'.')+ base64Utf8Encode(val.replace(/\r/g,' ').replace(/\n/g,' ').trim()).replace('/\\+/g','/').replace('/\\-/g','_');
				first=false;
			}
		}
	}
	
	first=true;
	if (typeof(xGroups) == 'String' && xGroups.replace(/\r/g,' ').replace(/\n/g,' ').trim().length > 0){
	    out += "/grp/" + base64Utf8Encode(xGroups.replace(/\r/g,' ').replace(/\n/g,' ').trim()).replace('/\\+/g','/').replace('/\\-/g','_');
	}else if (xGroups  instanceof Array){
	    for (var key in xGroups){
	    	var val = xGroups[key];
			if (val.replace(/\r/g,' ').replace(/\n/g,' ').trim().length > 0){
			    out += (first?'/grp/':'.')+ base64Utf8Encode(val.replace(/\r/g,' ').replace(/\n/g,' ').trim()).replace('/\\+/g','/').replace('/\\-/g','_');
				first=false;
			}
		}
	}
	
	first=true;
	if (typeof(aIgnore) == 'String' && aIgnore.replace(/\r/g,' ').replace(/\n/g,' ').trim().length > 0){
	    out += "/ign/" + encodeURIComponent(aIgnore.replace(/\r/g,' ').replace(/\n/g,' ').trim());
	}else if (aIgnore  instanceof Array){
	    for (var key in aIgnore){
	    	var val = aIgnore[key];
			if (val.replace(/\r/g,' ').replace(/\n/g,' ').trim().length > 0){
			    out += (first?'/ign/':'.')+ base64Utf8Encode(val.replace(/\r/g,' ').replace(/\n/g,' ').trim()).replace('/\\+/g','/').replace('/\\-/g','_');
				first=false;
			}
		}
	}

	if (sHostJail != null && sHostJail.trim().length > 0){
	    out += "/hja/" + (base64Utf8Encode(sHostJail.replace(/\r/g,' ').replace(/\n/g,' ').trim()).replace('/\\+/g','/').replace('/\\-/g','_'));
	}
	
	if (sJail != null && sJail.trim().length > 0){
	    out += "/jai/" + (base64Utf8Encode(sJail.replace(/\r/g,' ').replace(/\n/g,' ').trim()).replace('/\\+/g','/').replace('/\\-/g','_'));
	}

	
	if (sType != null && sType.trim().length > 0){
	    out += "/typ/" + (base64Utf8Encode(sType.replace(/\r/g,' ').replace(/\n/g,' ').trim()).replace('/\\+/g','/').replace('/\\-/g','_'));
	}
	
	if (language != null && language.trim().length > 0){
	    out += "/lan/" + (base64Utf8Encode(language.replace(/\r/g,' ').replace(/\n/g,' ').trim()).replace('/\\+/g','/').replace('/\\-/g','_'));
	}

	out += "/off/" + iOffset;
	out += "/lim/" + Math.max(1, iLimit);

	out += "/sal/" + ((!!bSearchAll) ? 'true' : 'false');
	out += "/sxa/" + ((!!bSearchExact) ? 'true' : 'false');

	out += "/ste/" + (base64Utf8Encode(sSearch.replace(/\r/g,' ').replace(/\n/g,' ').trim()).replace('/\\+/g','/').replace('/\\-/g','_'));
	

	$.ajax({

		yinsId:id,
		
		
		url: out,
		dataType : "jsonp",

		complete: function(jqXHR, textStatus) {

			if (textStatus != "success"){

				
				processSearch(sSearch,this.yinsId);
			}
		},
		
		success: function(json, textStatus, jqXHR) { 

		    console.info("part returned: ",json);
		    
		    if(json && json.list && json.list.length) {
		    	
		    	filledParts[this.yinsId]['Json']=json;
		    	filledParts[this.yinsId]['HasResults']=true;
		    }

		    processSearch(sSearch,this.yinsId);
		}
	});
	
}

function fetchLikenessKeys(sSearch,aDomains) {
	
	if (config.Server == null){
		console.info("no server set for likenessKeys!");
		fillLikeness();
	}
	
	var internalRestBase=config.Server;
	if (internalRestBase.substring(internalRestBase.length-1) == '/')
		internalRestBase=internalRestBase.substring(0,internalRestBase.length-1);
	
    var url = internalRestBase + "/likenesskeys/ste/" + (base64Utf8Encode(sSearch.replace(/\r/g,' ').replace(/\n/g,' ').trim()).replace('/\\+/g','/').replace('/\\-/g','_'));

	var first=true;
	if (config.Domains != null){
	    for (var domKey in config.Domains){
	    	var dom = config.Domains[domKey].replace(/\r/g,' ').replace(/\n/g,' ').trim();
			if (dom.length > 0){
				url += (first?'/dom/':'.')+ base64Utf8Encode(dom).replace('/\\+/g','/').replace('/\\-/g','_');
		    	first=false;
			}
		}
	}

	if (config.Language != null && config.Language.trim().length > 0){
		url += "/lan/" + (base64Utf8Encode(config.Language.replace(/\r/g,' ').replace(/\n/g,' ').trim()).replace('/\\+/g','/').replace('/\\-/g','_'));
	}

	$.ajax({
		url: url,
		dataType : "jsonp",

		complete: function(jqXHR, textStatus) {

			if (textStatus != "success"){

				fillLikeness();
			}
		},

	  	success: function(json, textStatus, jqXHR) { 

			console.info("likeness returned: ",json);
		    
			if(json && json.length) {
				fillLikeness(json);
			}else{
				fillLikeness();
			}
		}
	});

}

function lookup(lookupDiv,inputString) {
	if(inputString.length == 0){
		fillLookup(lookupDiv);
	}else if (config.Server == null){
		console.info("no server set for lookup!");
		fillLookup(lookupDiv);
	}else{
		var internalRestBase=config.Server;
		if (internalRestBase.substring(internalRestBase.length-1) == '/')
			internalRestBase=internalRestBase.substring(0,internalRestBase.length-1);
	
	    	var url = internalRestBase + "/suggestions/ste/" + (base64Utf8Encode(inputString.replace(/\r/g,' ').replace(/\n/g,' ').trim()).replace('/\\+/g','/').replace('/\\-/g','_'));

		var first=true;
		if (config.Domains != null){
		    for (var domKey in config.Domains){
		    	var dom = config.Domains[domKey].replace(/\r/g,' ').replace(/\n/g,' ').trim();
				if (dom.length > 0){
					url += (first?'/dom/':'.')+ base64Utf8Encode(dom).replace('/\\+/g','/').replace('/\\-/g','_');
			    	first=false;
				}
			}
		}

		first=true;
		if (config.Groups != null){
		    for (var gKey in config.Groups){
		    	var g = config.Groups[gKey].replace(/\r/g,' ').replace(/\n/g,' ').trim();
				if (g.length > 0){
					url += (first?'/grp/':'.')+ base64Utf8Encode(g).replace('/\\+/g','/').replace('/\\-/g','_');
			    	first=false;
				}
			}
		}

		if (config.Language != null && config.Language.trim().length > 0){
			url += "/lan/" + (base64Utf8Encode(config.Language.replace(/\r/g,' ').replace(/\n/g,' ').trim()).replace('/\\+/g','/').replace('/\\-/g','_'));
		}
		
		$.ajax({
			url: url,
			dataType : "jsonp",

			complete: function(jqXHR, textStatus) {

				if (textStatus != "success"){
					fillLookup(lookupDiv);
				}
			},

		  	success: function(json, textStatus, jqXHR) { 

				console.info("suggestions returned: ",json);
			    
				if(json && json.length) {
					fillLookup(lookupDiv,json);
				}else{
					fillLookup(lookupDiv);
				}
			}
		});

	}
}

function getQueryParams() {
	var qsParm = new Array();
	var query = window.location.search.substring(1);
	var parms = query.split('&');
	for (var i=0; i<parms.length; i++) {
		var pos = parms[i].indexOf('=');
		if (pos > 0) {
				var key = parms[i].substring(0,pos);
				var val = parms[i].substring(pos+1);
				qsParm[key] = decodeURIComponent(val);
		}
	}
	return qsParm;
}

function processQueryParams() {
	if (queryParamsProcessed)
		return;
	queryParamsProcessed=true;
	var qsParm = getQueryParams();
	if (typeof(qsParm['yinssearch']) != 'undefined'){
		if (document.getElementById('yinssearch'))
			document.getElementById('yinssearch').value=qsParm['yinssearch'];
		runSearch(qsParm['yinssearch']);
	}

}
var queryParamsProcessed=false;
$(processQueryParams);

