var days_to_keep_cookie = 90;
var ms_per_day = 24*60*60*1000;

//Array of Search Hierarchy
var catids = new Array();
var unicatids = new Array();
var targids = new Array(); // (= search ids!!!)
var targnames = new Array();
var targlogos = new Array();
var cats = new Array();

var stSelByGroup = false;
var catArray = new Array();
var usingOldCatArray = false;
var selectedCat = 0;
var tgOpts = new Array();
var selTypeGroup = -1;
var needsUpdateSearchCheckboxes = false;
var typegroupMenuWasSet = false;

var showGlobalProgressBar=true;
var showSearchProgressBar=true;


var needSave = false;
var targetOfAskedError; //errorpage setting
var showDetails = false; //storing errorpage setting
var showTrace = false; //storing errorpage setting
var initReady = false;

var logoSrc = new Array();

var stArr = new Array();

var fullSearchTimeOut = 0;
var isSearchScriptFromCategory=false;

var ssid=''; //search summary stat id
var ajaxInWork = false;

function STO(searchTypeId, searchId, searchName, startUrl) { //SearchType Object
	this.searchTypeId = searchTypeId;
	this.searchId = searchId;
	this.searchName = searchName;
	this.startUrl = startUrl;
}

function init_objects(searchTypeSelectionByGroup)	{
	//alert('init_objects: ' + searchTypeSelectionByGroup);
	pageLoaded(searchTypeSelectionByGroup);

	initReady = true;
	if (toolBarSearchPhase != undefined) {
		changeQ(toolBarSearchPhase);
	}
	if(useCookies && !saveLastSearchedCatToCookie) {
		deleteCookie("lastCat");
	}

	if(document.images) {
		imglen = logoSrc.length;
		for(i=0; i<imglen; i++ ) {
			document.images["img"+i].src = logoSrc[i];
		}
	}
}

var lengthOfProcBar = typeof processBarText != 'undefined' ? processBarText.length+4 : 4; //+4 is the percentage
var processBarPhase;
var processBarFullPhases = 1;
//Calld from SearchServlet
function initProcessBar(activeSearches) {
	processBarFullPhases = activeSearches * numOfProgPhases;
}

function showProcessBar(show_) {
	if (showGlobalProcessBar) {
		processbarRow_obj = xg("processbarRow");
		if (show_) {
			processBarPhase = 0;
			processBarFullPhases = 1;
			show(processbarRow_obj);
			updateProcessBar(0);
		} else {
			hide(processbarRow_obj);
		}
	}
}

function updateProcessBar(step) {
	if (showGlobalProcessBar) {
		processBarPhase+=step;
		phase = processBarPhase/processBarFullPhases;
		num = parseInt(phase*100, 10);
		snum = ''+num;
		if (snum.length==1) {
			snum = "__"+snum;
		} else if (snum.length==2) {
			snum = "_"+snum;
		}
		fullpagetable_obj = xg("fullpagetable");
		fullpagetable_style = new xbStyle(fullpagetable_obj);
		cw = fullpagetable_style.getClientWidth();
		fullLength= parseInt(cw/20) - lengthOfProcBar;
		if (fullLength < 0) fullLength = 0;
		actProcessBarText = processBarText+snum+"%";
		emptyPartLength = parseInt(fullLength/2);
		if (emptyPartLength != fullLength/2) actProcessBarText = "_"+actProcessBarText;
		for (ind=0; ind<emptyPartLength; ind++) {
			actProcessBarText = "_"+actProcessBarText+"_";
		}
		actPhase = parseInt(phase*actProcessBarText.length, 10);

		tmp1 = actProcessBarText.substr(0, actPhase);
		tmp1 = tmp1.replace(/_/g, "&nbsp;");
		tmp2 = actProcessBarText.substr(actPhase);
		tmp2 = tmp2.replace(/_/g, "&nbsp;");
		procbar_obj = xg("procbar");
		procbar_style = new xbStyle(procbar_obj);
		procbar_style.setInnerHTML(tmp1);
		bgprocbar_obj = xg("bgprocbar");
		bgprocbar_style = new xbStyle(bgprocbar_obj);
		bgprocbar_style.setInnerHTML(tmp2);
	}
}

//If some error occured jump the processbar
function correctProcessBar(sid) {
	if (showSearchProcessBar) {
		txt = xg('progbar' + sid ).innerHTML;
		//Find first "."
		dotPos = txt.indexOf('.');
		if (dotPos>-1) {
			np = numOfProgPhases-dotPos+6; //6 is the length of "<code>" tag
			updateProcessBar(np); 
		}
	}
}

//Call back method - called by server from Search servlet
function notAuthenticated() {
    document.afterLogoutForm.q.value=document.searchForm.q.value;
    document.logoutForm.submit();
}

function setLastValue(value1, value2, value3) {
	lastValues_obj = xg('lastValues');
	lastValues_obj.setAttribute("curl", value1);
	lastValues_obj.setAttribute("cname", value2);
	lastValues_obj.setAttribute("cvalue", value3);
	lastValues_obj.fireEvent("onchange");
}

function selectAllTargets(select) {
	//Select categories
	for (ind=0; ind<unicatids.length; ind++) {
		showTargetsOf(unicatids[ind], select, true);
	}
	//Select targets
	for (ind=0; ind<targids.length; ind++) {
		var tcb_obj=xg('tcb'+targids[ind]);
		tcb_obj.checked = select;
		checkBoxClick(targids[ind],select); //searchtype listbox dis/appears
	}
}


function isThereATarget() { 
    for (ind=0; ind<targids.length; ind++) {
		var tcb_obj=xg('tcb'+targids[ind]);
		if(tcb_obj.checked ) {
			return true;
		}
    }
    return false;
}

function isThereATargetInActCat() { 
    for (ind=0; ind<targids.length; ind++) {
		var tcb_obj=xg('tcb'+targids[ind]);
		if(tcb_obj.checked && catids[ind]==selectedCat ) {
			return true;
		}
    }
    var found = false;
    for (ind=0; !found && ind<targids.length; ind++) {
		var tcb_obj=xg('tcb'+targids[ind]);
		if(tcb_obj.checked) {
                    if(selectedCat!=ALL_CAT) {
                      selectedCat = catids[ind];
                    }
                    return true;
		}
    }
    return false;
}

function selectTargetsOf(catid, expli, allcateg, directClick) {
	showTargetsOf(catid, expli, allcateg, directClick);
	for (ind=0; ind<catids.length; ind++) {
		if (catids[ind] == catid) {
			var tcb_obj=xg('tcb'+targids[ind]);
			tcb_obj.checked = expli;
			enableSearch(catid, targids[ind],expli); //searchtype listbox dis/appears
		}
	}
	if (stSelByGroup || (multiDimSearch && showTargetsService)) {
		setTypeGroupMenu();
	}
}

function showTargetsOf(catid, expli, allcateg, directClick) {
	var sgcb_obj=xg('sgcb'+catid);
	if (sgcb_obj) {
		mayenable = (arguments.length == 2) || (arguments.length > 2 && allcateg );
		if(arguments.length > 1 && !directClick) {
			sgcb_obj.checked = expli;
			if(!allcateg) { 
				sgcb_obj.checked = true;
			}
		}
		needSave = true; //Saving of config is needed
	//} else {
		//alert('sgcb not found: ' + catid);
	}
}

function enableSearch(catID, which, checked) {
	//alert("enables search " + catID + ", " + which + " , " + checked + ", stSelByGroup=" + stSelByGroup);
        var i = 0;
        for (i = 0; i < catArray.length; i++) {
                var cat = catArray[i];
                if (cat.id == catID) {
                        var j = 0;
                        for (j = 0; j < cat.searches.length;j++) {
                                var search = cat.searches[j];
                                if (search.id == which) {
                                        if(cat.stGroupSel) {
                                            search.enabled = checked;
                                            stSelByGroup=true;
                                            setTypeGroupMenu();
                                        } else {
                                            dispn('stsel'+which, checked);
                                        }
                                }
                        }
                }
        }
	needSave = true; //Saving of config is needed
}

function checkBoxClick(which, checked) {
	dispn('stsel'+which, checked);
	needSave = true; //Saving of config is needed
}

function selectChanged(searchId, catId) {

	needSave = true; //Saving of config is needed
	if(xg('sgcb'+catId).checked) { //
		var searchTypeIdToFind = xg('stsel'+searchId).value;
		var i = 0;
		while(i<stArr.length) {
			if(stArr[i].searchTypeId==searchTypeIdToFind && stArr[i].searchId==searchId) {
				var obj = xg('tgname'+stArr[i].searchId);
				var sn = stArr[i].searchName;
				var su = stArr[i].startUrl;
				if( su!=null ) {
					obj.innerHTML = "<A TARGET='_blank' HREF='" + su + "'>" + sn + "</A>";
				} else {
					obj.innerHTML = sn;
				}
				return;
			}
			i++;
		}
	}
}

//Server calling - saving changed configuration - calls back to "profileSaved()"
var logoutAfter = false;
function saveEnabled(par) {	
    logoutAfter = (par != undefined);
    if (needSave) {
        searchForm_obj = xg("searchForm");
        searchForm_obj.funct.value="justSave"; //Shows that the method is only "saving"
        searchForm_obj.submit(); 
        searchForm_obj.funct.value="search";  //setting back to "searching"
        needSave = false;
    }	else {
        //If logout request then it has to be called
        profileSaved();
    }
}

//Logout synchronized to profile saving
function profileSaved() {
    if (logoutAfter) {
        document.logoutForm.submit();
    }
}

//callback function to show hitcount
function hitCount(sid, result) {
	if(showTargetsService) { //dyn. search resp.
		var sr_obj=xg('sr'+sid);
		if(sr_obj) {
			var sr_style=new xbStyle(sr_obj);
                        //truncate hitcount (max 30 characters) and replace "<" ">" to "&lt;" "&gt;"
                        var resultMAXLENGTH = 30;
                        var SPAN = "<span>";
                        var PERSPAN = "</span>";
                        var indexOfPERSPAN = result.length-PERSPAN.length;
                        if (result.substr(0, SPAN.length)==SPAN && result.substr(indexOfPERSPAN, result.length)==PERSPAN){
                            resultTemp = result.substr(SPAN.length, indexOfPERSPAN-SPAN.length);
                            var resultTempMax = (resultTemp.length > resultMAXLENGTH) ? resultMAXLENGTH : resultTemp.length;
                            resultTemp = resultTemp.substr(0, resultTempMax);
                            while (resultTemp.indexOf("<") > -1){
                                resultTemp = resultTemp.replace("<","&lt;");
                            }
                            while (resultTemp.indexOf(">") > -1){
                                resultTemp = resultTemp.replace(">","&gt;");
                            }
                            result = SPAN + resultTemp + PERSPAN;
                        }
			sr_style.setInnerHTML(result+"&nbsp;");
		}
	}
}


//Progress bar
var fullbar="||||";
var numOfProgPhases = fullbar.length;
var emptybar=".....";
//Show progress bar...
function showBar(sid, phase) {
	if (showSearchProcessBar) {
		var progbar_obj=xg('progbar'+sid);
		if (progbar_obj) { //Not hidden
			var progbar_style=new xbStyle(progbar_obj);		
			if (phase > numOfProgPhases) {
				//This means that the whole searching is ready
				progbar_style.setInnerHTML('');
			} else {
				if(showTargetsService) {
					//Display progbar
					progbar_style.setInnerHTML('<code>'+fullbar.substr(0, phase)+emptybar.substr(0, numOfProgPhases-phase)+'</code>');
				}
			}
		}
	}
	if (phase >0 && phase<=numOfProgPhases) {
		//Update processbar too
		updateProcessBar(1);
	}
	
}

function clearSearchResultLinks() {
    for (var ind1=0; ind1<targids.length; ind1++) {
        currenttarg = targids[ind1];
        var sr_obj=xg('sr'+currenttarg);
        if (sr_obj.innerHTML != "") {
            var sr_style=new xbStyle(sr_obj);
            sr_style.setInnerHTML("");
            var progbar_obj=xg('progbar'+currenttarg);
            var progbar_style=new xbStyle(progbar_obj);
            progbar_style.setInnerHTML("");
            var targpanel_obj = xg('targpanel'+currenttarg);
            targpanel_obj.className = "category_table_targ";
        }
    }

    //Did you mean clearing
    didyoumean_obj = xg("didyoumean");
    didyoumean_style = new xbStyle(didyoumean_obj);
    //hide(didyoumean_obj);
    didyoumean_style.setInnerHTML("&nbsp;");
}



//callback function to show "did you mean" section
function didYouMean(result) {
	didyoumean_obj = xg("didyoumean");
	didyoumean_style = new xbStyle(didyoumean_obj);
	if (didyoumean_obj.style.display == "none") {
		show(didyoumean_obj);
	}
	didyoumean_style.setInnerHTML(result);
}

function changeQ(withThis,t,n) {
	if(n && statswitch) {
		//a 'did you mean' term was clicked on
		addStat(ssid+"!" + t + "Y!" + sStrip(encURI(withThis)) + "!" + n );	
		var ajaxRequest = new AjaxRequest( ajaxStubURL, dummyCallback );	
		ajaxRequest.sendRequest();
	}
	searchForm_obj = xg("searchForm");		
	searchForm_obj.q.value = withThis;
	searchSubmitted();
}

function nstc(targetName) { //not searched target clicked
	if(statswitch) {
		addStat(ssid+"!HCOL!" + targetName  );
		var ajaxRequest = new AjaxRequest( ajaxStubURL, nstc_callback );
		ajaxRequest.sendRequest();
	}
	return true;
}

function nstc_callback(ajaxRequest_) {
	var scriptText = ajaxRequest_.getScriptResponse();
	eval(scriptText);
}

//Called from ToolBar
function executeSearch(searchTerm) {
	if (useCookies && searchTerm == undefined) {
		searchTerm = getCookie("toxportal_searchphrase");
	}
	if (!initReady) {
		//Page init is not ready - save the search phase
		toolBarSearchPhase = searchTerm;
	} else {
		changeQ(searchTerm);
	}
}

function normalizeQuery(q) {
	if(q.length>300) {
		q = q.substring(0,300);
	}
    q = trim(q);
    q = q.replace(/\\+/, "");
    return q;
}

function searchSubmitted() {
	xg("searchError").style.display='none';
	//alert("SEACRHSUBMITTED " + stSelByGroup);
        var ok = true;
        if(multiDimSearch && showTargetsService) {
          ok = isThereATargetInActCat();
          var form_ = xg("searchForm");
          form_.sc.value = selectedCat;
          form_ = xg("advancedsearchform");
          form_.sc.value = selectedCat;
          form_ = xg("searchresform");
          form_.sc.value = selectedCat;        
        }
        if(multiDimSearch && showTargetsService && !ok ) {
            alert(selectOneTargetText);
            return;
        }
        
	if (stSelByGroup || (multiDimSearch && showTargetsService)) {
		setGroupedSearchTypes();
	} else {
		xg("typegroupmenu").value='';
		//xg("typegroupinfo").value='';
		xg('stselbg').innerHTML = '';
	}
	if(!resultsFound) {
		hideNoResultsFoundLabel();
	}
	resultsFound = true; //assuming 
	setCatEnabled(theSelectedCat, true);
	searchForm_obj = xg("searchForm");
	searchForm_obj.q.value = normalizeQuery(searchForm_obj.q.value);
        
	if(searchForm_obj.dr) {
		while( searchForm_obj.dr.value.indexOf(".")==0 ) {
			searchForm_obj.dr.value = searchForm_obj.dr.value.substring(1,1000);
		}
	}
                
	//searchForm_obj.sq.value = searchForm_obj.q.value;
	if (searchForm_obj.q.value.length != 0) {
                if (isSearchScriptFromCategory){
                    if (theSelectedCat==''){ //only one category
                        theSelectedCat = cats.length-1; // because cats['cat.ID']=cat.name
                    }
                    if (SearchScriptFromCategoryFunction(theSelectedCat,searchForm_obj.q.value)){
                        return;
                    }
                }
		if(showTargetsService && !isThereATarget()) {
			if(toolBarSearchPhase != undefined) {
                            selectTargetsOf(theSelectedCat, true, false, false);
			} else {
                            //setCatEnabled(theSelectedCat, false);
                            alert(selectOneTargetText);
                            return;
			}
			
		}
		//Stop the current search if runs
		if (oldButtonStat != READY_STATUS) {
			startNewSearch = true;
			shutDownSearches();
			return;
		}
		refreshCoOccuring(searchForm_obj.q.value);
		//clearSearchResultLinks();
		if(showTargetsMode) {
			hide(xg("selectalldiv"));
		}
//		if(showTargetsService && !showTargetsMode) {
//			show(xg("categoriestable"));
//			hide(xg("selectalldiv"));
//			prepareShowingSearchResults();
//		}
		if(useCookies && saveLastSearchedCatToCookie) {
			var expdate = new Date();
			expdate.setTime(expdate.getTime() + days_to_keep_cookie*ms_per_day);
			setCookie("lastCat", xg("sc").value, expdate, cookie_path);
		}

		//handling domain restriction
		/*if (searchForm_obj.dr.value.length != 0) {
		    searchForm_obj.q.value = searchForm_obj.q.value+" site:"+searchForm_obj.dr.value;
		}*/

		searchForm_obj.submit();
		oldButtonStat = SUBMITTED_STATUS;

		//Show global progress bar
		showProcessBar(true);

	} else {
		alert(enterQueryText);
	}
}

//Server calling - shut down searches
function shutDownSearches() {
	sdform = xg("sddummyForm");
	sdform.nextcallwillcome.value = ""+startNewSearch;
	sdform.submit(); 
}

function showInMain(thisPage) {
	document.loadmain.action=thisPage;
	document.loadmain.submit();
}

function logout() {
	saveEnabled(true); //Save config and logout after
}

function pageLoaded(searchTypeSelectionByGroup) {
	enableFunctions();
	searchForm_obj = xg("searchForm");
	if(searchForm_obj) searchForm_obj.q.focus();
	changeSearchTypeSelectionByGroup(searchTypeSelectionByGroup);
	if (stSelByGroup) {
		setTypeGroupMenu();
	}
}

function showcats() {
	showTargetsMode = !showTargetsMode;
	if(!showTargetsMode) {
		show(xg("showallcell"));
	}
	dispo(xg("categoriestable"), showTargetsMode);
	dispo(xg("selectalldiv"), showTargetsMode);
    xg("showcatslink").innerHTML = showTargetsMode ? hideSourcesLabel : showSourcesLabel;
	
	tmp_obj = xg("showtargets");
	if(tmp_obj) tmp_obj.value = "" + showTargetsMode;
	
	tmp_obj = xg("showtargets_sw");
	if(tmp_obj){
		tmp_obj.value = "" + showTargetsMode;
	}
	var queryObj = xg("q");
	if (queryObj){
		queryObj.focus();
	}
}

function showadvsearch() {
	advMode = !advMode;
	dispn("dr_cell", advMode);
	var searchForm_obj = xg("searchForm");
	var cell = xg("dr_cell");
	if(searchForm_obj &&cell && cell.style.display=="none") {
		if(searchForm_obj.drradio) {
			searchForm_obj.drradio[0].checked=true;
			searchForm_obj.drradio[1].checked=false;
		}
		if(searchForm_obj.drc) {
			searchForm_obj.drc[0].checked=true;
		}
		if(searchForm_obj.dr) {
			searchForm_obj.dr.value='';
		}
	}
    xg("showadvsearchlink").innerHTML = advMode ? hideAdvancedSearchLabel : showAdvancedSearchLabel;
}

function setCatEnabled(catid, enabled) {
	var catcb_obj = xg('sgcb'+catid);
	for (ind2=0; ind2<catids.length; ind2++) {
		if (catids[ind2] == catid) {
			var sel = xg('tcb'+targids[ind2]);
		}
	}
} 

function prepareShowingSearchResults() {
	for (ind=0; ind<unicatids.length; ind++) {
		id = unicatids[ind];
		hide(xg('cattable'+ id));
		hide(xg('selallcell'+ id));
		hide(xg('sgcb'+ id));
	}
	for (ind2=0; ind2<targids.length; ind2++) {
		var id = targids[ind2];
		hide(xg('tcb'+ id));
		hide(xg('stsel'+ id));
		hide(xg('targpanel'+ id));
		hide(xg('progbar'+ id));
	}
} 

function numOfResultAvailable(numofres) {
	preparingsect_obj = xg("preparingsect");
	show(preparingsect_obj);
	if(!hitcountsOnly_) {
		xg("preparingsect_content").innerHTML = analyzeTextOne + " " + numofres + " " + analyzeTextTwo;
	}
}

/*function showDownloadingResultLabel() {
	xg("preparingsect_content").innerHTML=downloadingResultText;
}*/

function showNoResultsFoundLabel(noResultsFoundText) {
	if(!hitcountsOnly_) {
		xg("preparingsect_content").innerHTML=noResultsFoundText;
	} else {
		hideNoResultsFoundLabel();
	}
}

function hideNoResultsFoundLabel() {
	hide(xg("preparingsect"));
}

	//It calls back from Logout servlet
	function afterLogout() {
		document.afterLogoutForm.submit();
	}

	function resizeProcessBar() {
		updateProcessBar(0);
	}
	
    
	
	function changeCategory(which) {
		var ajaxRequest = new AjaxRequest( ajaxStubURL + "?dest=categorychange.jsp&sc="+which + "&showtargets=" + showTargetsMode, changeCategoryCallBack );	
		ajaxRequest.sendRequest();

		var form_ = xg("searchForm");
		form_.sc.value = which;

		form_ = xg("advancedsearchform");
		form_.sc.value = which;
		form_.sq.value = xg("searchForm").q.value;

		form_ = xg("searchresform");
		form_.sc.value = which;

    }

	function changeCategoryCallBack(ajaxRequest_) {
		var text = ajaxRequest_.getHtmlResponse();
		var scriptText = ajaxRequest_.getScriptResponse();	
		if(!multiDimSearch) { 
			hide(xg("selectalldiv"));
			obj = xg("categoriesRow");
			var children = new Array();
			for(var z = 0; z < obj.childNodes.length; z++) {
				children[z] = obj.childNodes[z];
			}
			for(var z = 0; z < children.length; z++) {
				obj.removeChild(children[z]);
			}
			var cellobj = document.createElement("td");
			cellobj.valign="top";
			cellobj.width='25%';
			cellobj.align="center";
			var spanobj = document.createElement("span");
			cellobj.appendChild(spanobj);
		}
		//cat tab change
		var newcat = xg("advancedsearchform").sc.value;
		var oldcat = theSelectedCat;

		var elem1 = xg("catcell"+oldcat);
		if(elem1) {
			children = new Array();
			for(var z = 0; z < elem1.childNodes.length; z++) {
				children[z] = elem1.childNodes[z];
			}
			for(var z = 0; z < children.length; z++) {
				elem1.removeChild(children[z]);
			}
			var linkobj = document.createElement("a");
			linkobj.href="javascript: changeCategory" + (oldcat==ALL_CAT ? "2" : "") + "('" + oldcat + "')";
			var textobj = document.createTextNode(cats[oldcat]);
			linkobj.appendChild(textobj);
			elem1.className="category_name";
			elem1.appendChild(linkobj);
		}

		var elem2 = xg("catcell"+newcat);
		children = new Array();
		for(var z = 0; z < elem2.childNodes.length; z++) {
			children[z] = elem2.childNodes[z];
		}
		for(var z = 0; z < children.length; z++) {
			elem2.removeChild(children[z]);
		}
		var spanWrapper = document.createElement("span");
		textobj = document.createTextNode(cats[newcat]);
		spanWrapper.appendChild(textobj);
		elem2.className="category_name_selected";
		elem2.appendChild(spanWrapper);
		if(!multiDimSearch ) {                
			obj.appendChild(cellobj);                
			spanobj.innerHTML = text;
		}
		eval(scriptText);
		xg("searchForm").q.focus();
	}

	function changeSearchTypeSelectionByGroup(newVal) {
		//alert("changeSearchTypeSelectionByGroup " + newVal);
		stSelByGroup = newVal;
		dispo(xg('stselbg'), newVal);
	}

	// setting the category/search checkboxes from the values of catArray 
	// (used if the catArray was received from the session)
	function updateSearchCheckboxes() {
		for (i = 0; i < catArray.length; i++) {
				var cat = catArray[i];
				var catCB = xg('sgcb'+cat.id);
				if (catCB) {
					catCB.checked=cat.enabled;
				}
				var j = 0;
				for (j = 0; j < cat.searches.length; j++) {
					var search = cat.searches[j];
					var searchCB = xg('tcb'+search.id);
					if (searchCB) {
						searchCB.checked=search.enabled;
					}
				}
			}
	}

	// typegroup combo setup
    function setTypeGroupMenu() {
        //alert("setTypeGroupMenu " + stSelByGroup);
	if(stSelByGroup || (multiDimSearch && showTargetsService) ) {
		var searchTypeCombos = new Array();
		var typeGroups = new Array();
		var i = 0;
		for (i = 0; i < catArray.length; i++) {
			var cat = catArray[i];
			var j = 0;
			for (j = 0; j < cat.searches.length; j++) {
				var search = cat.searches[j];
				if (search.enabled && cat.enabled && (selectedCat=="-1" || cat.id==selectedCat) && cat.stGroupSel  ) {  //
					var k = 0;
					for (k = 0; k < search.stTypes.length; k++) {
						typeGroups[search.stTypes[k]] = true;
			                }
				} 
				var combo = xg('stsel'+search.id);
			        if (combo) {
					searchTypeCombos.push(combo);
				}
			}
		}
		var count = 0;
		var tgArr = new Array();
		var select = "<select id='typegroup' name='typegroup' onchange='typegroupchng(this);'>";
                var foundSelTypeGroup = false;
                var firstTypeGroup = false; //first type group in the combo - to adjust selTypeGroup 
		for (i = 0; i < allTypeGroups.length; i++) {
			if (typeGroups[i] == true) {
				select += "<option value='" + i + "' " + (selTypeGroup==i ? ' SELECTED ' : '') + ">" + allTypeGroups[i] + "</option>";
                                if(selTypeGroup==i) {
                                    foundSelTypeGroup = true;
                                }
				tgObject = new Object();
				tgObject.id = i;
				tgObject.text = allTypeGroups[i];
				tgArr.push(tgObject);
				count++;
			} 
		}
		select += "</select>";
		xg("typegroupmenu").value=tgArr.toJSONString();
                if(!foundSelTypeGroup && count>1) {
                  selTypeGroup = firstTypeGroup;
                }
                xg('stselbg').innerHTML = select;
		changeSearchTypeSelectionByGroup(count > 1);
	}
	typegroupMenuWasSet = true;
    }
    
    function typegroupchng(cmb) {
        selTypeGroup = cmb.value;
    }

    function setUnavailableSearch() {
	
    }


    function changeCategory2(which) {
		var form_ = xg("advancedsearchform");
        form_.sc.value = which;
		form_.sq.value = xg("searchForm").q.value;
		form_.submit();
	}

	var resultsFound = true;
	/* Callback function (see: SearchServlet) */
	function noResultFound() {
		resultsFound = false;
	}

	function dummyCallback() {
	}

	// adds a category for searchtype grouping catalog
	function addCategory(catID, enabled, stGroupSel) {
          //alert('adding cat: ' + catID);
          var cat = new Object();
          cat.id = catID;
          cat.enabled = enabled;
          cat.stGroupSel = stGroupSel;
          cat.searches = new Array();
          catArray.push(cat);
	}

	// adds a search for searchtype grouping catalog
	function addSearch(catID, searchID, enabled, stIDs, stTypes, stUseCount, defaultSearchTypeId) {
		var i = 0;
	    var found = false;
	    for (i = 0; i < catArray.length; i++) {
			var cat = catArray[i];
			if (catID == cat.id) {
				found = true;
				var search = new Object();
				search.id = searchID;
				search.enabled = enabled;
				search.stIDs = stIDs;
				search.stTypes = stTypes;
				search.stUseCount = stUseCount;
				search.defaultStId = defaultSearchTypeId;
				cat.searches.push(search);
				break;
			}
	    }
	    if (!found) {
		//alert('cat not found');
	    }
	}

	// chooses the searchtypes for grouping at query submit
	function setGroupedSearchTypes() {
		if (!typegroupMenuWasSet) {
			setTypeGroupMenu();
		}
		if (needsUpdateSearchCheckboxes) {
			updateSearchCheckboxes();
		}
		xg('typegroupinfo').value = catArray.toJSONString();
		var group = xg('typegroup').value;
		var i = 0;
		for (i = 0; i < catArray.length; i++) {
			var cat = catArray[i]
			if ( ((selectedCat == cat.id || selectedCat == '-1' ) && cat.enabled) || (multiDimSearch && cat.stGroupSel ) ) {
				var j = 0;
				for (j = 0; j < cat.searches.length; j++) {
					var search = cat.searches[j];
					var tcb = xg("tcb" + search.id);
					if (search.enabled) {
						var selSTID = -1;
						var selSTUC = -1;
						var found = false;
						var k = 0;
						for (k = 0; k < search.stTypes.length; k++) {
							if (search.stTypes[k] == group && search.stUseCount[k] > selSTUC) {
								found = true;
								selSTID = search.stIDs[k];
								selSTUC = search.stUseCount[k];
							}
						}
						if (found) {
							var control = xg('stsel' + search.id);
							if (control) {
								control.value = selSTID;
							}
						} else {
							/******** disabling search ********* not used
							var control = xg('tcb' + search.id);
							if (control) {
								control.checked = false;
							}
							************************************/
							if (search.defaultStId != '') {
								if (control) {
									control.value = search.defaultStId;
								}
								//alert('using default ST for search ' + search.id + ': ' + search.defaultStId);
							} else {
								if (control) {
									control.value = search.stIDs[0];
								}
								//alert('no default st specified for search: ' + search.id);
							}
							
						}
					}//search.enabled
				}
			}
		}
		
	}
	
function refreshCoOccuring(query){
	var ajaxRequest = new AjaxRequest( ajaxStubURL + "?dest=inc/exploreAndDiscover.jsp&q=" + query, refreshCoOccuringCallBack );
	ajaxRequest.sendRequest();
}

function refreshCoOccuringCallBack(ajaxRequest_){
	var text = ajaxRequest_.getHtmlResponse();
	var scriptText = ajaxRequest_.getScriptResponse();
	var coOccuringObj = xg("cooccuring_section");
	if (coOccuringObj){
		coOccuringObj.innerHTML = text;
	}
	eval(scriptText);
}

function exploreAndDiscover(exploreJSON, //JSON object
							title, //title of this section
							refButTitle, //title of the 'refine results' button
							isShowQueries, //show queries or not
							moreLessTitle, //title of show more/fewer concepts
							imgPrefixUrl, //the prefix of the images
							maxTerms, //maximum number of terms
							columnTitleLinks
							){
	var coObj = xg('cooccuring_section');
	var maxTermLength = 24;
	var termsCounter = 0;
	var maxDidYouMean = 6;
	window["cQA"] = new Array();
	window["cQAPopUp"] = new Array();
	var exploreAndDiscover = '';
	if (exploreJSON["healthmash"]["queryparts"].length == 1 && exploreJSON["healthmash"]["queryparts"][0]["querypart"]["topics"].length == 1){
		var topic = exploreJSON["healthmash"]["queryparts"][0]["querypart"]["topics"][0];
		var didYouMeanObj = xg("didyoumean");
		if (didYouMeanObj){
			var didYouMeanContent = "";
			for(var k = 0; k < topic["terms"].length; k++){
				if (termsCounter >= maxDidYouMean){
					break;
				}
				var t = topic["terms"][k];
				if (termsCounter >  0){
					didYouMeanContent += ', ';
				}
				didYouMeanContent += '<a onmouseout="hideCoOccuringPopup(' + termsCounter + ');" onmouseover="showCoOccuringPopup(' + termsCounter + ');" href="JavaScript:coOccuringClicked(cQA[' + termsCounter + ']);">'
										+ t["term"] + '</a><img style="position: absolute; display: none;" id="coOccuringLink_' + termsCounter + '" src="' + imgPrefixUrl + '/spinner.gif">';
				cQA[termsCounter] = t["term"];
				termsCounter++;
			}
			if(didYouMeanContent != ""){
				didYouMeanObj.innerHTML = '<span class="didymTitle">' + topic["name"] + ':</span>&nbsp;<span class="didym">' + didYouMeanContent + '</span>' + '<div onmouseout="hideCoOccuringPopup(-1);" onmouseover="noHideCoOccuringPopUp();" style="display:none;" id="coOccuringPopup"></div>';
				didYouMeanObj.style.display = "";
			}
		}
	}else if (coObj && exploreJSON["healthmash"]["queryparts"].length > 0){
		for (var i = 0; i < exploreJSON["healthmash"]["queryparts"].length; i++){
			var queryPart = exploreJSON["healthmash"]["queryparts"][i]["querypart"];
			var header = '';
			var terms = '';
			window["showMoreIds_" + i] = false;
			window["w_" + i] = new Array();
			for (var j = 0; j < queryPart["topics"].length; j++){
				window["w_" + i][window["w_" + i].length] = j;
				window["w_" + i + "_" + j] = new Array();
				var topic = queryPart["topics"][j];
				if (j == 0){
					header = '<tr class="showMoreCos" id="showMoreCos_' + i + '">';
					terms = '<tr class="showMoreCos" id="showMoreTerm_' + i + '">';
				}else{
					header += '<td class="coOccuringSpace"><div class="coOccuringSpace"></div></td>';
					terms += '<td class="coOccuringSpace"><div class="coOccuringSpace"></div></td>';
				}
				var actualTerms = '';
				var st = '';
				var css = ' even';
				var insSideHidedTerms = false;
				var firstLevelCounter = 0;
				var nextGroup = '';
//				var nextGroupOpen = '';
				var changedStAfterHide = false;
				var nextGroupCounter = 0;
//				var thereOpener = false;
				for (var k = 0; k < topic["terms"].length; k++){
					nextGroupCounter++;
					var t = topic["terms"][k];
					if(k == 0 || st != t["st"]){
						if(k > 0){
							nextGroup += '</ul>';
						}
//						actualTerms += (nextGroupOpen != '' ? '<table class="coTable' + css + '"><tr>' + nextGroupOpen + '<td>' + nextGroup + '</td></tr></table>' : nextGroup);
						actualTerms += nextGroup;
						if(css == ' even') css = ' uneven';else css = ' even';
						nextGroup = '<ul id="coOccuringUl' + i + '_' + j + '" class="coOccuringUl' + css + '">';
//						nextGroupOpen = '';
						st = t["st"];
						insSideHidedTerms = false;
						if(firstLevelCounter >= maxTerms && !changedStAfterHide){
							changedStAfterHide = true;
						}
						nextGroupCounter = 1;
					}
					var term = t["term"];
					var key = i + '_' + j + '_' + k;
					var hideNextTerms = !insSideHidedTerms && t["bigrel"] && k < topic["terms"].length - 1 && !topic["terms"][k + 1]["bigrel"];
					var termCss = '';
					if(!insSideHidedTerms){
						firstLevelCounter++;
					}
					if(firstLevelCounter > maxTerms && !insSideHidedTerms){
						termCss = 'hide';
					}
					if(hideNextTerms){
						termCss += " lastInST";
					}
					if(termCss != ''){
						termCss = ' class=" '+ termCss + '"';
					}
					nextGroup += '<li' + termCss + '> ' + '<a onmouseout="hideCoOccuringPopup(' + termsCounter + ');" onmouseover="showCoOccuringPopup(' + termsCounter + ');" href="JavaScript:coOccuringClicked(cQA[' + termsCounter + ']);">'
									+ (term.length > maxTermLength ? term.substr(0, maxTermLength - 1) + '...': term) + '</a><img style="position: absolute; display: none;" id="coOccuringLink_' + termsCounter + '" src="' + imgPrefixUrl + '/spinner.gif"></li>';
					if(hideNextTerms){
						var wKey = "w_" + i + "_" + j;
						(window[wKey])[window[wKey].length] = k;
//						nextGroupOpen += '<td class="showMoreLessTerm' + (firstLevelCounter > maxTerms && changedStAfterHide ? ' hide' : '') + '"><a id="w_' + i + "_" + j + "_" + k + '" title="' + moreLessTitle + '" class="showMoreTerm" onclick="coOccuringMoreLess(\'coOccuringHide' + key + '\',this);" href="JavaScript: void(0)"><img src="' + imgPrefixUrl + '/empty.gif"></a></td>';
//						nextGroupOpen += '<td class="showMoreLessTerm' + (firstLevelCounter > maxTerms && changedStAfterHide ? ' hide' : '') + '"><a id="w_' + i + "_" + j + "_" + k + '" title="' + moreLessTitle + '" class="showMoreTerm" onclick="showHideAllCo(\'' + i + '\');" href="JavaScript: void(0)"><img src="' + imgPrefixUrl + '/empty.gif"></a></td>';
						nextGroup += '</ul><ul class="coOccuringTermsHided' + css + '" id="coOccuringHide' + key + '">';
						insSideHidedTerms = true;
//						thereOpener = true;
					}
					cQA[termsCounter] = t["term"];
					termsCounter++;
				}
				if(nextGroupCounter > 0){
					nextGroup += '</ul>';
					//actualTerms += (nextGroupOpen != '' ? '<table class="coTable' + css + '"><tr>' + nextGroupOpen + '<td>' + nextGroup + '</td></tr></table>' : nextGroup);
					actualTerms += nextGroup;
				}
				if (actualTerms != ''){
					if(topic["terms"].length > maxTerms){
						window["showMoreIds_" + i] = true;
					}
					header += '<td class="coOccuringTitleTd"><div class="coOccuring_titleWrapper"><div class="coOccuring_titleNoMore">' + 
					(columnTitleLinks ? '<a href="JavaScript: void(0)" onclick="exAndDiColTitleClicked('+i+ ','+ j +');" >' : '')  + topic["name"] + (columnTitleLinks ? '</a>' :'' )+
						'</div>' +
//							(firstLevelCounter > maxTerms || thereOpener ? '<a title="' + moreLessTitle + '" class="showMoreCo" onclick="showHideAllCo(\'' + i + '\');" href="JavaScript: void(0)"><img src="' + imgPrefixUrl + '/empty.gif"></a>' : '') +
							(topic["terms"].length > maxTerms ? '<a title="' + moreLessTitle + '" class="showMoreCo" onclick="showHideAllCo(\'' + i + '\');" href="JavaScript: void(0)"><img src="' + imgPrefixUrl + '/empty.gif"></a>' : '') +
							'</div></td>';
//					terms += '<td class="coOccuringLinksTd' + (thereOpener ? ' thereOpener' : '') + '">' + actualTerms + '<div class="bottom"></div>' + '</td>';
					terms += '<td class="coOccuringLinksTd">' + actualTerms + '<div class="bottom"></div>' + '</td>';
				}
			}
			if (header != "" && terms != ""){
				if (isShowQueries){
					exploreAndDiscover += '<p class="coOccuring_def">' + queryPart["query"] + '</p>';
				}
				header += '</tr>';
				terms += '</tr>';
				exploreAndDiscover += '<table>' + header + terms + '</table>';
			}
		}
	}
	if(coObj){
		if (exploreAndDiscover != ''){
			exploreAndDiscover = '<div class="coOccuringWrapper">' +
				(columnTitleLinks ?
					('<TABLE cellpadding="0" cellspacing="0"><TR><TD><h2 class="coOccuringTitle">' + title + '</h2></TD><TD class="searchsection_button_left_td"><div class="searchsection_button_left"></div></TD><TD nowrap>'
					+'<input type="submit" class="searchsection_button_center" onclick="refineResults();" title=\''
					+ refButTitle+ '\' value=\'' + refButTitle  + '\' /></TD><TD><div class="searchsection_button_right"></div></TD></TR></TABLE>')
				 :
					('<h2 class="coOccuringTitle">' + title + '</h2>')
				)
				 + exploreAndDiscover + '</div>'
				+ '<div onmouseout="hideCoOccuringPopup(-1);" onmouseover="noHideCoOccuringPopUp();" style="display:none;" id="coOccuringPopup"></div>';
			coObj.innerHTML = exploreAndDiscover;
			coObj.style.display = "";
		}else{
			coObj.style.display = "none";
		}
	}
}

function coOccuringMoreLess(key, link, useShow, show){
	var terms = xg(key);
	if(terms){
		var css = terms.className.indexOf(' even') > -1 ? ' even': ' uneven';
		if(useShow){
			if(show){
				link.className = 'showLessTerm';
				terms.className = 'coOccuringTerms' + css;
			}else{
				link.className = 'showMoreTerm';
				terms.className = 'coOccuringTermsHided' + css;
			}
		}else{
			if(link.className == 'showMoreTerm'){
				link.className = 'showLessTerm';
				terms.className = 'coOccuringTerms' + css;
				if(statswitch){
					addStat(ssid+'!COSM');
				}
			}else{
				link.className = 'showMoreTerm';
				terms.className = 'coOccuringTermsHided' + css;
				if(statswitch){
					addStat(ssid+'!COSL');
				}
			}
		}
	}

}
function showHideAllCo(key){
	var arrayKey = 'showMoreIds_' + key;
	if(window[arrayKey]){
		var obj = xg('showMoreCos_' + key);
		var objTerms = xg('showMoreTerm_' + key);
		var showTerms = true;
		if(obj && objTerms){
			if (obj.className=='showMoreCos'){
				obj.className='showLessCos';
				objTerms.className='showLessCos';
				if(statswitch){
					addStat(ssid+'!COSM');
				}
			}else{
				obj.className='showMoreCos';
				objTerms.className='showMoreCos';
				if(statswitch){
					addStat(ssid+'!COSL');
				}
				showTerms = false;
			}
		}
		var wJ = window["w_" + key];
		if(wJ){
			for(var j = 0; j < wJ.length; j++){
				var wK = window["w_" + key + "_" + wJ[j]];
				if(wK){
					for(var k = 0; k < wK.length; k++){
						var w = key + "_" + wJ[j] + "_" + wK[k];
						coOccuringMoreLess("coOccuringHide" + w, xg("w_" + w), true, showTerms);
					}
				}
			}
		}
	}
}

function healthMashIndex(indexTitle){
	//do nothing
}

String.prototype.endsWith = function(str){
	return (this.match(str+"$")==str)
}

function refineResults() {
	var fullQuery1 = "";
	var fullQuery2 = "";
	var termsArr1 = window["healthMashSynonyms"] ;

	if(termsArr1) {
		fullQuery1 += "(";
		for(i=0; i<termsArr1.length;i++) {
			fullQuery1 += termsArr1[i] + ( (i<termsArr1.length-1) ? " OR " : "");
		}
		fullQuery1 += ")";
	}

	fullQuery2 += " AND (";
	var added = false;
	for(grp=1; grp<5; grp++) {
		var termsArr2 = window["firstTerms_0_" +grp];
		if(termsArr2 && termsArr2.length>0) {
			for(i=0; i<termsArr2.length;i++) {
				fullQuery2 += termsArr2[i] +  " OR " ;
				added = true;
			}
		}
	}
	if(added && fullQuery2.endsWith(" OR ")) {
		fullQuery2 = fullQuery2.substring(0,fullQuery2.length-4);
	}
	fullQuery2 += " ) ";
	var fullQuery =  fullQuery1 + (added ? fullQuery2 : "");
	if(statswitch) {
		addStat(ssid+"!COCL!" + sStrip(encURI(fullQuery)));
	}
	changeQ(fullQuery);
}

function changeLanguage(newLang,userId) {
	var expdate = new Date();
	expdate.setTime(expdate.getTime() + days_to_keep_cookie*ms_per_day);
	setCookie("language_"+userId, newLang, expdate, "/");
	var ajaxRequest = new AjaxRequest( ajaxStubURL + "?changelang="+newLang, changeLangCallBack );
	ajaxRequest.sendRequest();
}

function changeLangCallBack() {
	//reload page
	loc = location.href;
	if( loc.indexOf("#") == (loc.length-1) ) {
		location.href = loc.substring(0,loc.length-1);
	} else {
		location.href = loc;
	}
}
