

	     /**
	      * USER DEFINE HASH TABLE CLASS
	      * METHODS : put() and get()
	      * does not support deletion of keys
	      */
		function put(key, value)
	    {
	        if(key != null && value != null)
			{
				this.keys[key] = this.index;
				this.values[this.index] = value;
				this.currentIndex = this.index;
				++this.index;
	        }
	    }

	    function get(key)
	    {
			if(key != null)
		 	{
				var keyIndex = this.keys[key];
				if(keyIndex != null)
				{
					this.currentIndex = keyIndex;
					return this.values[keyIndex];
				}
				return null;
			}
			return null;
	    }

	    function HashTable()
	    {
			this.keys = new Array();
			this.values = new Array();
			this.index = 0;
			this.put = put;
	        this.get = get;
	        this.currentIndex = 0;
	    }
		/**
	      * USER DEFINE HASH TABLE CLASS Ends Here
	      */

	      function getDynamicSearchFormObj() {
			return document.dynamicSearchForm;
		  }

		  function formCookieId(name, suffix) {
			return name + "_" + suffix;
		  }

		  function setValueInCookieFor(cookieId, value) {
			document.cookie = cookieId + "=" + escape(value);
		  }

		  function getValueFromCookieFor(cookieId) {
			  var cnm = cookieId + "=";
			  var dck = document.cookie;
			  if (dck.length > 0) {
			    begin = dck.indexOf(cnm);
			    if (begin != -1) {
			      begin += cnm.length;
			      end = dck.indexOf(";", begin);
			      if (end == -1) end = dck.length;
			        return unescape(dck.substring(begin, end)) ;
			    }
			  }
			  return null;
		  }
		  function closeWindow()  {
             if(navigator.appName == "Netscape")
                {
  	            getReturnedObj("close").style.display = "none";
                }
             else
               {
  	           getReturnedObj("close").style.display = "block";
               }
         }


		/**************** LIMITERS SCRIPTS STARTS *******************
		These functions are used across all the search forms.
		**/

	   //dateIndices and standAloneLimiters are constructed in the Limiters.jsp
		var dateIndices = new Array();
	    var standAloneLimiters = new Array();
		var FROM = "from";
		var TO = "to";
		var ALL_DATES = "0";
	    var BETWEEN = "4";
		function initializeDateLimiters(formObj) {
			//This is to disable or enable the date select box based on the option selected, onload of the page.
			var DL_PREFIX = "dateLimiterValue";
			for (d = 0; d < dateIndices.length; d++) {
	            var index = dateIndices[d];
	            var dateMode = DL_PREFIX+"("+index+").dateMode";
				var dateModeObj = formObj.elements[dateMode];
		        for (j=0; j < dateModeObj.length; j++) {
		            disableOrEnableDates(dateModeObj[j], index);
		        }
		    }
		}

	   function isValidDateInformation(formObj) {
	   		if(dateIndices.length > 0) {
		   		var index = dateIndices[0];
		   		var dateLimiter = new DateLimiter(formObj, index);
		   		var validFromDate = true;
		   		var validToDate = true;
		   		if(!dateLimiter.dateModesObj[0].checked) {
		   			validFromDate = isValidDate(dateLimiter.fromDayVal, dateLimiter.fromMonthVal, dateLimiter.fromYearVal);
		   			if(!dateLimiter.toDayObj.disabled) {
		   				validToDate = isValidDate(dateLimiter.toDayVal, dateLimiter.toMonthVal, dateLimiter.toYearVal);
		   			}
		   		}
				return validFromDate && validToDate;
			}
			return true;
		}

	    function isValidDate(day, month, year) {
	        if(year == "") {
	            return false;
	        }

		    if (month < 1 || month > 12) {
	            return false;
	        }
	        if (day < 1 || day > 31) {
	            return false;
	        }
	        if ((month == 4 || month == 6 || month == 9 || month == 11) &&
	            (day == 31)) {
	            return false;
	        }
	        if (month == 2) {
	            var leap = (year % 4 == 0 &&
	                       (year % 100 != 0 || year % 400 == 0));
	            if (day > 29 || (day == 29 && !leap)) {
	                return false;
	            }
	        }
	        return true;
		}

		function validateDateRange(formObj, index) {
			if(dateIndices.length > 0) {
		   		var index = dateIndices[0];
		        var dateLimiter = new DateLimiter(formObj, index);

		        var flag=0;
		        if(!dateLimiter.fromDayObj.disabled && !dateLimiter.toDayObj.disabled && !dateLimiter.dateModesObj[0].checked) {
			        var fromDate = new Date(dateLimiter.fromYearVal, dateLimiter.fromMonthVal, dateLimiter.fromDayVal);
			        var toDate = new Date(dateLimiter.toYearVal, dateLimiter.toMonthVal, dateLimiter.toDayVal);
			        if(fromDate > toDate) {
			            return false;
			        }
		        }
			}
		    return true;
	    }

	    function disableOrEnableDates(option, index) {
			var formObj = getDynamicSearchFormObj();
		    if(option.checked) {
				if(option.value == ALL_DATES) {
					// Disable the from and to dates
					modifyDate(formObj, index, true, FROM);
					modifyDate(formObj, index, true, TO);
				} else if(option.value == BETWEEN) {
					// Enable the from and to dates
					modifyDate(formObj, index, false, FROM);
					modifyDate(formObj, index, false, TO);
				} else {
					// Enable the from date and Disable the to date
					modifyDate(formObj, index, false, FROM);
					modifyDate(formObj, index, true, TO);
				}
	        }
	    }


	    function modifyDate(formObj, index, disableFlag, type) {
	        var day = "dateLimiterValue("+index+")."+type+"Day";
	        var month = "dateLimiterValue("+index+")."+type+"Month";
	        var year = "dateLimiterValue("+index+")."+type+"Year";


	        // While disabling, reset all the values
	        if(disableFlag) {
	        	formObj.elements[day].selectedIndex = 0;
				formObj.elements[month].selectedIndex = 0;
				formObj.elements[year].selectedIndex = 0;
	        }
	        formObj.elements[day].disabled = disableFlag;
	        formObj.elements[month].disabled = disableFlag;
	        formObj.elements[year].disabled = disableFlag;
		}

		function DateLimiter(formObj, index) {
	    	this.fromDay = "dateLimiterValue("+index+")."+FROM+"Day";
	        this.fromMonth = "dateLimiterValue("+index+")."+FROM+"Month";
	        this.fromYear = "dateLimiterValue("+index+")."+FROM+"Year";

	        this.toDay = "dateLimiterValue("+index+")."+TO+"Day";
	        this.toMonth = "dateLimiterValue("+index+")."+TO+"Month";
	        this.toYear = "dateLimiterValue("+index+")."+TO+"Year";

	        this.fromDayObj = formObj.elements[this.fromDay];
	        this.fromMonthObj = formObj.elements[this.fromMonth]
	        this.fromYearObj = formObj.elements[this.fromYear]

	        this.toDayObj = formObj.elements[this.toDay];
	        this.toMonthObj = formObj.elements[this.toMonth]
	        this.toYearObj = formObj.elements[this.toYear]

	        this.fromDayVal = this.fromDayObj.value
	        this.fromMonthVal = this.fromMonthObj.value
	        this.fromYearVal = this.fromYearObj.value

	        this.toDayVal = formObj.elements[this.toDay].value
	        this.toMonthVal = formObj.elements[this.toMonth].value
	        this.toYearVal = formObj.elements[this.toYear].value

	        this.DATE_INDEX = index;
	        this.dateMode = "dateLimiterValue"+"("+this.DATE_INDEX+").dateMode";
	        this.dateModesObj = formObj.elements[this.dateMode];
	    }

		/********************** LIMITERS SCRIPTS ENDS ***************/

		/********************** ADVANCED SEARCH SCRIPTS STARTS ***************/
		var SEARCH_TABLE_ID = "SearchFieldTable";
		var STATIC_NO_OF_ROWS = 3;
		var noOfRows = parseInt(NUMBER_OF_ROWS);
		var HIDDEN_ROW_ID = HIDDEN_ROW_ID_STRING;
		var browsable = new Object();
		var OPERATOR_OR = " OR ";



	    function initAdvSearch() {

	    	var tableObj = getReturnedObj(SEARCH_TABLE_ID);
	    	if(tableObj!=null) {
	    		// ignore the hidden row ( operator(999) row )
	        	noOfRows = tableObj.rows.length-1;
	        }
	      	var formObj = getDynamicSearchFormObj();
			//This is to disable or enable the Browse link based on the query terms selected onload, of the page.
			for(var i = 0; i < noOfRows; ++i) {
				var indexFieldName = "inputFieldName("+i+")";
				var inputFieldObj = formObj.elements[indexFieldName];
				inputFieldObj.onchange();
			}
			var hiddenRowFieldName = "inputFieldName("+HIDDEN_ROW_ID+")";
			var hiddenRowField = formObj.elements[hiddenRowFieldName];
			if(hiddenRowField != null) {
				hiddenRowField.onchange();
			}
			initializeDateLimiters(formObj);
		}

		function addRow(tableId, rowId, deleteSpanId) {
			if(noOfRows >= MAX_ROW) {
				alert(MAX_ROW_REACHED_ERROR);
				return;
			}
			var tableObj = getReturnedObj(tableId);
			var oneRow = getReturnedObj(rowId);
			var newRow = tableObj.insertRow(tableObj.rows.length);
			for(var index = 0; index < oneRow.cells.length; ++index) {
				var newCell = newRow.insertCell(index);
				newCell.align = oneRow.cells[index].align;
				var processedHTMLString = processHTMLstring(oneRow.cells[index].innerHTML, noOfRows);
				newCell.innerHTML = processedHTMLString;
			}
			var deleteSpanObj = getReturnedObj(deleteSpanId);
			deleteSpanObj.style.display = "";
			++noOfRows;
		}

		function removeLastRow(tableId, deleteSpanId, totalNoOfRows) {
			var tableObj = getReturnedObj(tableId);
			if(tableObj.rows.length > (STATIC_NO_OF_ROWS + 1)) {
				var rowToBeDeleted = tableObj.rows.length - 1;
				tableObj.deleteRow(rowToBeDeleted);
				--noOfRows;
			}
			if(tableObj.rows.length == (STATIC_NO_OF_ROWS + 1)) {
				var deleteSpanObj = getReturnedObj(deleteSpanId);
				deleteSpanObj.style.display = "none";
			}
		}
		/*
		 * Replaces all the existense of HIDDEN_ROW_ID in the htmlString with the rowIndex.
		 */
		function processHTMLstring(htmlString, rowIndex) {
			var indexOfHIDDEN_ROW_ID = htmlString.indexOf(HIDDEN_ROW_ID);
			var resultString = "";
			if(indexOfHIDDEN_ROW_ID > 0) {
				while(indexOfHIDDEN_ROW_ID > 0) {
					resultString += htmlString.substring(0, indexOfHIDDEN_ROW_ID) + rowIndex;
					htmlString = htmlString.substring(indexOfHIDDEN_ROW_ID + HIDDEN_ROW_ID.length);
					indexOfHIDDEN_ROW_ID = htmlString.indexOf(HIDDEN_ROW_ID);
				}
				resultString += htmlString;
				return resultString;
			}
			return htmlString;
		}

		var browseWindow;
		/*
		 * TODO: The below three methods are tightly coupled
		 * limiterFieldControl, fieldIndex are used across these methods.
		 */
	    var limiterFieldControl;
	    var inputFieldControl;
	    var limiterChoosen = false;

		function doLimiterBrowse(inputField, index, standalone, tabID, searchId, resourceKeyForTitle) {
		    formObj=getDynamicSearchFormObj();
			var productId = formObj.prodId.value;
            var searchType = formObj.searchType.value;
			var usrGrp = formObj.userGroupName.value;
            var name = resourceKeyForTitle;
			limiterFieldObject = inputField;
			var fn = inputField.value;
			//var qt = index.toLowerCase();
			var qt = index;
			limiterChoosen = true;
			limiterFieldControl = inputField;

			var preselectOnLoad = '';

			if( (inputField.value != null) && (inputField.value.length > 0) ){
				preselectOnLoad = '&preselectOnLoad=Y';
			}
			var browseIndexUrl = BASIC_BROWSE_INDEX_URL+"&type=limiter&query=&terms="+qt+
			                     "&rowIndex="+qt+"&searchType="+searchType+"&hyperlink="+standalone+
			                     "&fieldName="+resourceKeyForTitle+"&tabID="+tabID+"&searchId="+searchId+preselectOnLoad;
			browseWindow = window.open(browseIndexUrl, "galeChildWindow", "toolbar=no, directories=no, status=yes, location=no, resizable=yes, menubar=no, scrollbars=yes,width=700,height=450");
		}

		function doMultiLimiterBrowse(formObj, inputField, index, hide, show, returnVal, clearVal) {
			toHide = hide;
			toShow = show;
			returnPulldown = returnVal;
			textToClear = clearVal;

			if(inputField.name == null){
				inputField = inputField[0];
			}// Deal with case when there are two limiters.

			limitFormField = inputField.name;
			var productId = formObj.prodId.value;
			var usrGrp = formObj.userGroupName.value;
			var fn = inputField.value;
			//var qt = index.toLowerCase();
			var qt = index;
			fieldIndex = -1;
			var name = BROWSE_INDEX_SELECTIONS;
		    browseWindow = window.open(BASIC_BROWSE_INDEX_URL+"&query="+fn+"&terms="+qt+"&rowIndex="+qt+"&fieldName="+name,"galeChildWindow","toolbar=no, directories=no, status=yes, location=no, resizable=yes, menubar=no, scrollbars=yes,width=700,height=450");
		}

		function doBrowse(inputRowNumber,fieldName) {
			rowNumberForPreviousSearches = inputRowNumber;
			var formObj = document.forms[0];
	        var productId = PRODUCT_ID;
	        var userGroupName = USER_GROUP_NAME;
	        var indexFieldName = "inputFieldName("+inputRowNumber+")";
	        var inputValueName = "inputFieldValue("+inputRowNumber+")";
			var index = formObj.elements[indexFieldName].value;
	        var inputQueryTerms = formObj.elements[inputValueName].value;
            var searchType = formObj.searchType.value;
			limiterChoosen = false;
			inputFieldControl = formObj.elements[inputValueName];
			var suffix = inputRowNumber + index;
			var browseTerm = getBrowseTermFromCookie(suffix);
			var fldIdx = fieldName.indexOf("(");
			//fieldName = fieldName.substring(0,fldIdx) + "(s)";
			browseWindow = window.open(BASIC_BROWSE_INDEX_URL+"&type=input&query="+browseTerm+"&terms="+index+"&hyperlink=true&searchType="+searchType+"&fieldName="+fieldName+"&rowIndex="+suffix,"galeChildWindow","toolbar=no, directories=no, location=no, status=yes, menubar=no, resizable=yes, scrollbars=yes,width=700,height=450");
		}

		function getBrowseTermFromCookie(suffix) {
			var cookieId = formCookieId("browseTerm", suffix);
			var browseTerm = getValueFromCookieFor(cookieId);
			if(browseTerm == null) {
				return "";
			}
			return browseTerm;
		}

	    function setFieldValue(selectionValues){
	    	if(limiterChoosen){
		    	appendOR(limiterFieldControl, selectionValues);
				//limiterFieldControl.value = selectionValues;
			}else{
				appendOR(inputFieldControl, selectionValues);
				//inputFieldControl.value = selectionValues;
			}
		}

		function clearLimiter(){
	    	limiterFieldControl.value = '';
		}

		function getLimiter(){
	    	return limiterFieldControl.value;
		}

		function appendOR(fieldObj, value) {
			if(value.length > 0) {
				if(fieldObj.value.length == 0) {
					fieldObj.value = value;
				} else {
					fieldObj.value = fieldObj.value + OPERATOR_OR + value;
				}
			}
		}

		/*
		 *ends here
		 */

		function isValidInputFieldValues(formObj) {
		    var validInputFieldValue = false;
			for(var i=0; i < noOfRows; i++) {
				var indexFieldValue = "inputFieldValue("+i+")";
				var inputFieldValueObj = formObj.elements[indexFieldValue];
				if (!trim(inputFieldValueObj.value) == '') {
					validInputFieldValue = true;
				}
			}
			return validInputFieldValue;
		}

	function ValidatePreviousSearchIds(formObj) {
		   var isValidSearchIds = true;
			for(var i=0; i < noOfRows; i++) {
				var indexFieldValue = "inputFieldValue("+i+")";
				var inputFieldValueObj = formObj.elements[indexFieldValue];
				var inputFieldName="inputFieldName("+i+")";
				var inputFieldNameObj = formObj.elements[inputFieldName];

				if(inputFieldNameObj.value==PASS_THROUGH_INDEX){
					var enteredIndexValue	= inputFieldValueObj.value.replace(new RegExp(QUERY_AND_OP, 'gi')," ");
					enteredIndexValue	= enteredIndexValue.replace(new RegExp(QUERY_OR_OP, 'gi')," ");
					enteredIndexValue	= enteredIndexValue.replace(new RegExp(QUERY_NOT_OP, 'gi')," ");

					var enteredIndexes=enteredIndexValue.split(" ");// Array containing the Indexes entered by the user for Previous Search
					for(var j=0;j<enteredIndexes.length;j++){
						if(trim(enteredIndexes[j]).length > 0) {
							if(!isValidPreviousSearchId(trim(enteredIndexes[j]))){
								isValidSearchIds = false;
							}
						}
					}
					if(!validateParanthesis(inputFieldValueObj.value)) {
						isValidSearchIds = false;
					}
				}

		}
		return isValidSearchIds;
	}

	function validateParanthesis(str) {
		if(str == null || str == undefined || str.length==0) {
			return true;
		}
		var openParenCount = 0;
		var closeParenCount = 0;
		for(i=0; i<str.length; i++) {
			var temp = str.charAt(i);
			if(temp == ')') {
				closeParenCount++;
			} else if(temp == '(') {
				openParenCount++;
			}
		}
		if(openParenCount == closeParenCount) {
			return true;
		} else  {
			return false;
		}
	}

	function isValidPreviousSearchId(searchId){

	    var validSearchIndex=false;
		searchId = searchId.replace("(","");
		searchId = searchId.replace(")","");
		if(trim(searchId).length == 0) {
			return true;
		}

		// return true if not a potential search history ID
	    var reg = new RegExp("^[rR][0-9]+$");
	    if (!reg.test(searchId)) {
	   	   return true;
	    }


		var searchHistoryEntries = SEARCH_HISTORY_ENTRIES;
		for(var i=0;i<searchHistoryEntries.length;i++){
			if(searchId.toUpperCase()==searchHistoryEntries[i]){
			validSearchIndex = true;
			break;
			}
		}
		return validSearchIndex;

	}

	function isValidPreviousSearchEntry(formObj){
		var isValid=true;
		var indexFieldValue = "inputFieldValue(0)";
		var inputFieldValueObj = formObj.elements[indexFieldValue];

		var enteredIndexValue	= inputFieldValueObj.value.replace(new RegExp(" ", 'gi'),"#");
			enteredIndexValue	= enteredIndexValue.replace(new RegExp("#"+trim(QUERY_AND_OP)+"#", 'gi')," ");
			enteredIndexValue	= enteredIndexValue.replace(new RegExp("#"+trim(QUERY_OR_OP)+"#", 'gi')," ");
			enteredIndexValue	= enteredIndexValue.replace(new RegExp("#"+trim(QUERY_NOT_OP)+"#", 'gi')," ");

		var enteredIndexes=enteredIndexValue.split(" ");
			for(var j=0;j<enteredIndexes.length;j++){
				if(trim(enteredIndexes[j]).length > 0 && enteredIndexes[j].indexOf("#")==-1) {
					if(!isValidPreviousSearchId(trim(enteredIndexes[j]))){
						isValid = false;
					}
				}
			}
			if(!validateParanthesis(inputFieldValueObj.value)) {
				isValid = false;
			}
			return isValid;
	}

	    // Returns boolean indicating if any stand alone limiters have been selected
	    // Currently handling for types: checkbox, text, List
	    function standAloneLimitersSelected(formObj) {
	        var limiterSelected = false;
	        for (var i = 0; i < standAloneLimiters.length && !limiterSelected; i++) {
	            var limiter = formObj.elements[standAloneLimiters[i]];
	            var limiterType = limiter != null ? limiter.type : "";
	            if((limiter != null) && limiter.type == null && standAloneLimitersArraySelected(limiter)){
	            	limiterSelected = true;
	            }//For processing limiters that have the same name
	             //an array is returned.

	            if ( (limiterType == "checkbox") && (limiter.checked == true) ) {
	                limiterSelected = true;
	            } else if ( (limiterType == "text") && (trim(limiter.value) != "") ) {
	                limiterSelected = true;
	            } else if ( (limiterType == "select-one") && (limiter.selectedIndex > 0) ) {
	                limiterSelected = true;
	            } else if ( limiterType == "select-multiple" && limiter.selectedIndex > -1 ) {
	            	var selections = limiter.options;
	            	for(var idx = 0; idx < selections.length; idx++) {
	            		if(selections[idx].selected && selections[idx].value != '') {
	            			limiterSelected = true;
	            		}
					}
	            }
	        }
	        return limiterSelected;
	    }


		function standAloneLimitersArraySelected(limiters) {
	        var limiterSelected = false;
	        for (var i = 0; i < limiters.length; i++) {
	            var limiter = limiters[i];
	            var limiterType = limiter != null ? limiter.type : "";
	            if ( (limiterType == "checkbox") && (limiter.checked == true) ) {
	                limiterSelected = true;
	            } else if ( (limiterType == "text") && (trim(limiter.value) != "") ) {
	                limiterSelected = true;
	            } else if ( (limiterType == "select-one") && (limiter.selectedIndex > 0) ) {
	                limiterSelected = true;
	            } else if ( limiterType == "select-multiple" && limiter.selectedIndex > -1 ) {
	            	var selections = limiter.options;
	            	for(var idx = 0; idx < selections.length; idx++) {
	            		if(selections[idx].selected && selections[idx].value != '') {
	            			limiterSelected = true;
	            		}
					}
	            }
	        }
	        return limiterSelected;
	    }

		function validateFuzzySearch(formObj) {
			for(var i=0;i<noOfRows;i++){
				var inputFieldName="inputFieldValue("+i+")";
				var inputFieldNameObj = formObj.elements[inputFieldName];
				var fuzzyFieldName="fuzzyLevel("+i+")";
				var fuzzyFieldNameObj = formObj.elements[fuzzyFieldName];
				if(containsWildcards(inputFieldNameObj.value) && fuzzyFieldNameObj.selectedIndex != 0){
			      	return false;
	    		 }
			}
			return true;
		}

		function validateSearchForm() {
			var formObj = getDynamicSearchFormObj();
			var documentField = formObj.elements["inputFieldValue("+ DOCUMENT_NUMBER_INDEX + ")"];
			if(documentField != null){
				if(trim(documentField.value) !=""){
					formObj.elements["inputFieldValue("+ DOCUMENT_NUMBER_INDEX + ")"].value = "";
				}
			}
			var validForm = true;
	        // If any standalone limiter has a value or is selected, search terms can be empty
			if(!isValidInputFieldValues(formObj) && !standAloneLimitersSelected(formObj)){
	            alert(SEARCH_TERMS_EMPTY);
	            validForm = false;
			} else if(!(isValidDateInformation(getDynamicSearchFormObj()))) {
			   alert(INVALID_DATE_MSG);
			   validForm = false;
			} else if(!validateDateRange(getDynamicSearchFormObj())) {
				alert(INVALID_DATE_RANGE);
				validForm = false;
			} else if(!ValidatePreviousSearchIds(getDynamicSearchFormObj())){
				alert(INVALID_SEARCH_INDEX);
				validForm = false;
			}
			else if(!validateLexileScore(formObj))
			{
				alert(INVALID_LEXILE_SCORE);
				validForm = false;
			}				
            /*
            Commented as fuzzy validations done at server side
			else if(isFuzzyLevelEnabled) {
			   validForm =	validateFuzzySearch(formObj);
			   if(!validForm) {
			   		alert(SEARCH_WILDCARDS);
			   }
	    	}
	    	*/
			return validForm;
		}
		/****************************************
		*  Function to validate the limit/expand
		*  Form.
		*
		*****************************************/
		function validateLimitExpandForm()
		{
			var formObj = getDynamicSearchFormObj();

			return validateLimiters(formObj);
		}

		function validateLimiters(formObj) {
		  	if(!isValidDateInformation(formObj) ) {
	   			alert(INVALID_DATE_MSG);
	            return false;
			}
			else if( !validateDateRange(formObj) ) 	{
				alert(INVALID_DATE_RANGE);
				return false;
			}
			else if(!validateLexileScore(formObj))
			{
				alert(INVALID_LEXILE_SCORE);
				return false;
			}						
  		    return true;
		}

		/****************************************
		*  Function to initialize the date limiters
		*  on the limit/expand Form.
		*
		*****************************************/
		function initLimitExpandForm()
		{
			var formObj = getDynamicSearchFormObj();
			initializeDateLimiters(formObj);
		}

        function toggleLimitExpand(show, curPos) {
			var formObj = getDynamicSearchFormObj();
			if (show) {
    			formObj.showLimitExpand.value = "yes";
			} else {
			    formObj.showLimitExpand.value = "no";
            }
            formObj.currentPosition.value = curPos;
			formObj.submit();
        }

		function clearForm(formObj){
		   var formObj = document.forms[0];
		   for(var k=0;k<formObj.elements.length;k++){

		    if(formObj.elements[k].type=="textarea"){
		    	formObj.elements[k].value="";
		    }
		    if(formObj.elements[k].type=="text"){
		    	formObj.elements[k].value="";
		    }
		    if(formObj.elements[k].type=="checkbox"){

		    	formObj.elements[k].checked=false;
		    }

		    if(formObj.elements[k].type=="select-one"){
		    	formObj.elements[k].selectedIndex=0;
		    	if(formObj.elements[k].id=="inputFieldName")
		    	{
		     		formObj.elements[k].onchange();
		     	}
		    }
		    if(formObj.elements[k].type=="select-multiple"){
		    	formObj.elements[k].selectedIndex=-1;
		    }

		   }
		   if(dateIndices.length > 0) {
			   var dateLimiter = new DateLimiter(formObj, dateIndices[0])
			   dateLimiter.dateModesObj[0].checked=true;
			   disableOrEnableDates(dateLimiter.dateModesObj[0], dateLimiter.DATE_INDEX);
		   }
		}

		function setBrowsable(fieldName, count) {
			var formObj = getDynamicSearchFormObj();
			var spanId = fieldName.value+count;
			if(count>=0)
			{
				hideSpans(fieldName, count);
				var indexName="indx_" + fieldName.value;
			 	if(browsable[indexName]){
			 		var fieldSpan = getReturnedObj(spanId);
			 		fieldSpan.style.visibility = "visible";
			 		fieldSpan.style.display = "block";
			 	}
                // Commented as search terms are not displayed when coming through bread crumb or search history revise
			 	//if(formObj.inputFieldValue(count+1)!=null)
				// 	formObj.inputFieldValue(count+1).value='';
	        }
	    }

		function hideSpans(fieldName, count){
			 var id;
			 var spanId;
			 for(var i=0;i<fieldName.options.length;i++){
			 	 id = fieldName.options[i].value+count;
			 	 var indexName="indx_"+fieldName.options[i].value;
			 	 if(browsable[indexName]){
	                spanId = getReturnedObj(id);
			 	 	spanId.style.visibility = "hidden";
			 		spanId.style.display = "none";
			 	 }

			 }
		}

		function getSearchFieldForTab() {
			var tabId ="";
	        var formObj = document.forms[0];
	        var selElement = formObj.selectedTab;
			var temp = ADVANCED_SEARCH_LINK;
			for(i=0; i < selElement.options.length;i++){
			    if(selElement.options[i].selected && selElement.options[i].value != "ALL") {
					tabId+="&selectedTab="+selElement.options[i].value;
				}
		    }
			this.location.href = temp+tabId;
		}
		/********************** ADVANCED SEARCH SCRIPTS ENDS ***************/



		/**************** BASIC SEARCH SCRIPTS STARTS*******************/

		function initBasicSearch() {
			var formObj = getDynamicSearchFormObj();
			var inputFieldChosen = false;
			var indexFieldName = "inputFieldName(0)";
			var inputFieldObj = formObj.elements[indexFieldName];
			for(var index =0; index < inputFieldObj.length; ++index) {
				if(inputFieldObj[index].checked) {
					inputFieldChosen = true;
				}
			}
			if(!inputFieldChosen) {
				inputFieldObj[1].checked = true;
			}
			initializeDateLimiters(formObj);
		}

		function validateBasicSearch() {
		    var validForm = true;
	    	var formObj = getDynamicSearchFormObj();
	    	var inputFieldValue = "inputFieldValue(0)";
	    	var searchTermObj = formObj.elements[inputFieldValue];
	    	if(searchTermObj!=null && trim(searchTermObj.value)=="" && !standAloneLimitersSelected(formObj)){
	    		alert(BASIC_SEARCH_ENTER_TERM);
	    		searchTermObj.focus();
	    		return false;
	    	}else if(!(isValidDateInformation(getDynamicSearchFormObj()))) {
			   alert(INVALID_DATE_MSG);
			   validForm = false;
			} else if(!validateDateRange(getDynamicSearchFormObj())) {
				alert(INVALID_DATE_RANGE);
				validForm = false;
			} else if(!(isValidInputFieldName(getDynamicSearchFormObj()))) {
	    		alert(BASIC_SEARCH_ENTER_FIELD_TERM);
	    		searchTermObj.focus();
	    		return false;
			//}else if(BASIC_SEARCH_SORT_IS_RELEVANCE && containsWildcards(searchTermObj.value)) {
	    	//	alert(BASIC_SEARCH_TERM_CONTAINS_WILDCARDS);
	    	//	searchTermObj.focus();
	    	//	return false;
			}
			return validForm;

		}

		function containsWildcards(inputString){
			if(trim(inputString) == ""){
				return false;
			}else if(  inputString.indexOf("*") >= 0
        			|| inputString.indexOf("?") >= 0
        			|| inputString.indexOf("!") >= 0){
        		return true;
        	}
        	return false;
		}

		function isValidInputFieldName(formObj) {
			var validInputFieldName = false;
			var inputFieldNameObj = formObj.elements["inputFieldName(0)"];
			var fieldCount = inputFieldNameObj.length;
			if(fieldCount != undefined) {
				for(var i=0; i<fieldCount; i++) {
					if(inputFieldNameObj[i].checked) {
						validInputFieldName = true;
						break;
					}
				}
			}else {
				if(inputFieldNameObj.checked) {
					validInputFieldName = true;
				}
			}
			return validInputFieldName;
		}

		/**************** BASIC SEARCH SCRIPTS ENDS*******************/


		/**************** SUBJECT GUIDE SEARCH SCRIPTS STARTS*******************/
	function initSubjectGuideSearch() {

			var formObj = getDynamicSearchFormObj();
			initializeDateLimiters(formObj);

		}
	function validateSubjectGuideSearch() {

		    var validForm = true;
	    	var formObj = getDynamicSearchFormObj();
	    	var inputFieldValue = "inputFieldValue(0)";
	    	var searchTermObj = formObj.elements[inputFieldValue];
	    	if(searchTermObj!=null && trim(searchTermObj.value)=="" && !standAloneLimitersSelected(formObj)){
	    		alert(BASIC_SEARCH_ENTER_TERM);
	    		searchTermObj.focus();
	    		return false;
	    	}else if(!(isValidDateInformation(getDynamicSearchFormObj()))) {
			   alert(INVALID_DATE_MSG);
			   validForm = false;
			} else if(!validateDateRange(getDynamicSearchFormObj())) {
				alert(INVALID_DATE_RANGE);
				validForm = false;
			}
			return validForm;

		}
		/**************** SUBJECT GUIDE SEARCH SCRIPTS ENDS*******************/


		/**************** PUBLICATION SEARCH SCRIPTS STARTS*******************/
	function initPublicationSearch() {

			var formObj = getDynamicSearchFormObj();
			initializeDateLimiters(formObj);

		}
	function validatePublicationSearch() {

		    var validForm = true;
	    	var formObj = getDynamicSearchFormObj();
	    	var inputFieldValue = "inputFieldValue(0)";
	    	var searchTermObj = formObj.elements[inputFieldValue];
	    	if(searchTermObj!=null && trim(searchTermObj.value)=="" && !standAloneLimitersSelected(formObj)){
	    		alert(BASIC_SEARCH_ENTER_TERM);
	    		searchTermObj.focus();
	    		return false;
	    	} else if(!(isValidDateInformation(getDynamicSearchFormObj()))) {
			   alert(INVALID_DATE_MSG);
			   validForm = false;
			} else if(!validateDateRange(getDynamicSearchFormObj())) {
				alert(INVALID_DATE_RANGE);
				validForm = false;
			}

			return validForm;

		}

    function listAllPublications() {
        var formObj = getDynamicSearchFormObj();
        formObj.type.value = "listAllPublications";
        formObj.submit();
    }

		/**************** PUBLICATION SEARCH SCRIPTS ENDS*******************/

	function submitForQuickSearch(quickSearchForm)
	{
		if(trim(quickSearchForm.quickSearchTerm.value) == "")
		{
		   alert(BASIC_SEARCH_RESULTS_ENTER_TERM);
	   	   quickSearchForm.quickSearchTerm.focus();
	   	   return false;
		}
		return true;
	}

	//For related subject Links.
	function fetchSubject(index, subject, serializeQryValue) {

		serializeQryValue = escape(serializeQryValue);
		subject = escape(subject);
		var tempUrl = "linkSearch.do?&subjectParam="+serializeQryValue+"&subjectAction=VIEW_TOPIC_FROM_LIST";

		if(index == null || trim(index) == "") {
			index = "su";
		}
		subject = "%22"+ subject + "%22";

		this.location.href= tempUrl + "&inputFieldName%280%29="+index.toUpperCase()+"&inputFieldValue%280%29="+subject+"&prodId="+PRODUCT_ID+"&userGroupName="+USER_GROUP_NAME+"&sgHitCountType=None";
	}

	var finalquery = "";

	function getFormObj() {
		return getDynamicSearchFormObj();
	}

	function init() {
		var formObj = getFormObj();
		initializeDateLimiters();
	}


	//Hides one limiter and shows another.
	//Also sets global for the values to return to.
	var toHide = '';
	var toShow = '';
	var returnPulldown;
	var textToClear;
	function toggleHideShow(){
		getReturnedObj(toHide).style.display = "none";
		getReturnedObj(toShow).style.display = "";
		dynamicPulldown = getReturnedObj(returnPulldown);
		clear = getReturnedObj(textToClear);
		clear.value='';
	}

	//For dynamic pulldown limiter GVRL style.
	//Global variable for pulldown
	var dynamicPulldown = null;
	function setPulldownFieldValue(nameArray, valueArray){
		toggleHideShow();

		nameArray = nameArray.substring(0, nameArray.lastIndexOf(' OR'));
		valueArray = valueArray.substring(0, valueArray.lastIndexOf(' OR'));

		var names = nameArray.split("OR");
		var value = valueArray.split(" OR ");

		dynamicPulldown.size = names.length;

		for(i=0; i < names.length; i++){
		  var option = document.createElement("option");
		  var name = names[i];
		  if(name.length > 30){
		  	name = name.substring(0, 30);
		  	name = name.substring(0, name.lastIndexOf(' '));
		  }

	      option.text = name;
	      option.value = value[i];
	      option.selected = true;
	      dynamicPulldown.options.add(option);
		}
	}

	function getReturnedObj(name) {
	  var thisObj;
	  if (document.getElementById) {
	  		thisObj = document.getElementById(name);
	  } else if (document.all) {
	  		thisObj = document.all[name];
	  } else if (document.layers) {
	  		thisObj = document.layers[name];
	  }
	  return thisObj;
	}


	/**************** SEARCH HISTORY SCRIPTS STARTS*******************/
	function rTrim(VALUE){
		var w_space = String.fromCharCode(32);
		var v_length = VALUE.length;
		var strTemp = "";
		if(v_length < 0){
			return"";
		}
		var iTemp = v_length -1;

		while(iTemp > -1){
			if(VALUE.charAt(iTemp) == w_space){
			}else{
				strTemp = VALUE.substring(0,iTemp +1);
				break;
			}
			iTemp = iTemp-1;

		}
		return strTemp;

	}

	function lTrim(VALUE){
		var w_space = String.fromCharCode(32);
		if(v_length < 1){
			return"";
		}
		var v_length = VALUE.length;
		var strTemp = "";

		var iTemp = 0;

		while(iTemp < v_length){
			if(VALUE.charAt(iTemp) == w_space){
			}
			else{
				strTemp = VALUE.substring(iTemp,v_length);
				break;
			}
			iTemp = iTemp + 1;
		}
		return strTemp;

	}


	function trim(TRIM_VALUE){
		if(TRIM_VALUE.length < 1){
			return"";
		}
		TRIM_VALUE = rTrim(TRIM_VALUE);
		TRIM_VALUE = lTrim(TRIM_VALUE);
		if(TRIM_VALUE==""){
			return "";
		}
		else{
			return TRIM_VALUE;
		}
	}

	/**************** SEARCH HISTORY SCRIPTS STARTS*******************/





	/**************** Tab.JSP SCRIPTS starts*******************/

	function showCitationsForTab(url){
		this.location.href=url;
	}
	/*************** Tab.JSP SCRIPTS ENDS*******************/


	/***************Additional Tab Content ******************/
	function googleCall() {
	    remote = window.open("","galeChildWindow","alwaysRaised=yes,width=720,height=520,screenX=50,screenY=50,top=50,left=50,resizable=yes,scrollbars=yes,toolbar=yes,menubar=no,status=no");
	    remote.location.href="http://images.google.com/images?q="+additionalSearchTerm;
		if (remote.opener == null)
			remote.opener = window;
		else
			remote.focus();
	}
	function validateDocNumberSearch()
	{
	   var validForm = true;
      var formObj = getDynamicSearchFormObj();
      var inputFieldValue = "inputFieldValue(0)";
      var searchTermObj = formObj.elements[inputFieldValue];
      searchTermObj.value = trim(searchTermObj.value);
      var docNumber = searchTermObj.value;
      if( docNumber == "" )
      {
         alert("Enter a document number in the search box.");
         searchTermObj.focus();
         return false;
      }
      var valid="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

      for( var i=0; i<docNumber.length; i++ )
      {
         if( valid.indexOf(docNumber.charAt(i)) < 0 )
         {
            alert('Enter a valid document number using only alphanumeric characters.');
            searchTermObj.focus();
            return false;
         }
      }
	   return validForm;

	}

        // global flag
        var isMSIE = false;
        // global request and XML document objects
        var xmlhttpReq;
        var size;
        var leftUrl;
        var rightUrl;

	/*************** Compare Documents SCRIPTS Starts *******************/
    function compareDocuments(url1, url2) {
        leftUrl = url1;
        rightUrl = url2;

        // branch for native XMLHttpRequest object
        if (window.XMLHttpRequest) {
            xmlhttpReq = new XMLHttpRequest();
        // branch for IE/Windows ActiveX version
        } else if (window.ActiveXObject) {
          isMSIE = true;
          try {
            xmlhttpReq = new ActiveXObject("MSXML2.XMLHttp");
          } catch (e) {
            try{
                xmlhttpReq = new ActiveXObject("Microsoft.XMLHTTP");
            }catch (E){
                return false;
            }
          }
        }
        if(isMSIE && xmlhttpReq){
        	xmlhttpReq.onreadystatechange = processStateChange;
            xmlhttpReq.open("GET", MARKLIST_SIZE_URL, false);
            xmlhttpReq.send();// Do not send null with IE
        }
        else if(!isMSIE && xmlhttpReq){
    	    xmlhttpReq.onreadystatechange = processStateChange;
            xmlhttpReq.open("GET", MARKLIST_SIZE_URL, true);
            xmlhttpReq.send(null);
        }else{
            return 'DEGRADE_TO_URL';
        }
    }

    // handle onreadystatechange event of xmlhttpReq object
    function processStateChange() {
        // only if xmlhttpReq shows "loaded"
        if (xmlhttpReq.readyState == 4) {
            // only if "OK"
            if (xmlhttpReq.status == 200) {
                //alert(xmlhttpReq.responseText);
                size = xmlhttpReq.responseText;
                xmlhttpReq = null;
                showComparePanes();
             } else {
                alert("There was a problem retrieving the XML data:\n" +
                    xmlhttpReq.statusText);
             }
        }
    }

    function showComparePanes() {
        if(size <= 0 ){
            alert(MARKLIST_EMPTY_COMPARE_MSG);
        } else {
            var width = screen.width/2;
            var height = screen.height;
             if(navigator.appName == "Netscape") {
                //Non-IE
                showLeftPane(leftUrl, width, height, 0, 0);
                showRightPane(rightUrl, width-15, height, width+15, 0);
            } else {
                //IE
                showLeftPane(leftUrl, width, height-60, 0, 0);
                showRightPane(rightUrl, width-20, height-60, width+12, 0);
            }
        }
    }

    function showLeftPane(url, fW, fH, wX, wY) {
        var loc = url;
        leftPane = window.open("","leftPane","width="+fW+",height="+fH+",top="+wY+",left="+wX+",resizable=yes,scrollbars=yes,toolbar=no,menubar=no,status=no");
        leftPane.location.href=url;
        if (leftPane.opener == null) leftPane.opener = window;
        else leftPane.focus();
    }

    function showRightPane(url, fW, fH, wX, wY) {
        var loc = url;
        var whatWidth=screen.width;
        var whatHeight=screen.height;
        whatWidth=whatWidth-410;
        rightPane = window.open("","rightPane","width="+fW+",height="+fH+",top="+wY+",left="+wX+",resizable=yes,scrollbars=yes,toolbar=no,menubar=no,status=no");
        rightPane.location.href=url;
        if (rightPane.opener == null) rightPane.opener = window;
        else rightPane.focus();
    }

    function closeCompareWindows() {
        leftPane.close();
        rightPane.close();
    }
	/*************** Compare Documents SCRIPTS Ends *******************/

	function doDocNumberSearch(prodId,userGroupName,docNumIndex, searchPageType){
		var formObj  =  getDynamicSearchFormObj();
		var documentId = formObj.elements["inputFieldValue("+ docNumIndex + ")"].value;
		if(validateDocumentNumberSearch()){
			this.location.href ="advancedSearch.do?docId="+documentId+"&prodId="+prodId+"&userGroupName="+userGroupName+"&searchPageType="+searchPageType+"&method=doDocumentNumberSearch&inputFieldName("+docNumIndex+")="+docNumIndex+"&inputFieldValue("+docNumIndex+")="+documentId;
		}
	}
	function validateDocumentNumberSearch(){
		var formObj  =  getDynamicSearchFormObj();
		var documentId = trim(formObj.elements["inputFieldValue("+ DOCUMENT_NUMBER_INDEX + ")"].value);
		if(documentId == ""){
			alert(DOCUMENT_NUMBER_SEARCH_EMPTY);
			return false;
		}
		var regEx = new RegExp("^[A-Za-z0-9]+$");
		if (regEx.test(documentId)) {
	   	   return true;
	    }else{
		    alert(INVALID_DOCUMENT_NUMBER);
    		return false;
	    }
		return true;
	}
	/**
	 * Validates the lexilescore text field value.
	 * Returns true if the entered value is:
	 * 
	 * A simple lexile score Ex:300
	 * A range of lexile scores
	 * Ex: 200-300
	 *     200 to 300
	 * 
	 */
	function validateLexileScore(formObj){
		var lexileScoreElems = formObj.elements["limiterFieldValue(LX)"];
		if(lexileScoreElems != null)
		{
			for(var i=0; i<lexileScoreElems.length; i++)
			{
				var lexileScoreField = lexileScoreElems[i];
				if(lexileScoreField.type == "text")
				{
					if(trim(lexileScoreField.value) != "")
					{
						var regEx1 = new RegExp("^[0-9]{1,}$");
						var regEx2 = new RegExp("^([0-9]{1,}-[0-9]{1,})$");
						var regEx3 = new RegExp("^([0-9]{1,} to [0-9]{1,})$");
						var lexileScore = lexileScoreField.value;
						if (regEx1.test(lexileScore))
						{
							return true;
						}
						else if( regEx2.test(lexileScore))
						{
							return true;
						}
						else if(regEx3.test(lexileScore))
						{
							return true;
						}
						else
						{
							return false;
						}						
					}				
				}
	
			}
		}
		return true;
	}	