function populatePageLinks() {
    var formObj = getDynamicSearchFormObj();
    var totalHitCount = formObj.searchEndCount.value;
    var currentPosition = formObj.currentPosition.value;
    var totalNoOfPages = parseInt(totalHitCount / RESULTS_PER_PAGE);
    if (totalHitCount % RESULTS_PER_PAGE != 0) {
        totalNoOfPages = totalNoOfPages + 1;
    }
    var initialValue = 5;
    var finalValue = 10;
    var start = 1;
    var end = initialValue;
    var currLink;

    if (isNumeric(currentPosition)) {
        currLink = parseInt(((currentPosition - 1) / RESULTS_PER_PAGE) + 1);
    } else {
        currLink = 1;
    }

    if (isValidObject(this.nodeName)) currLink = this.innerText;

    if (currLink <= finalValue) {
        end = currLink - 1 + initialValue;
        start = 1;
    } else {
        start = currLink - initialValue;
        end = start + finalValue - 1;
    }

    if (end > finalValue) start = end - finalValue + 1;
    if (getElementById("jumpLinks_1")) {
        var linkDiv1 = getElementById("jumpLinks_1");
        //	linkDiv1.innerHTML = "<label>" + JUMP_TO_PAGE + "</label> ";

        var linkDiv2 = getElementById("jumpLinks_2");
        //	linkDiv2.innerHTML = "<label>" + JUMP_TO_PAGE + "</label> ";

        for (i = start; ((i <= totalNoOfPages) && (i <= end)); i++) {
            getLink(i, currLink, RESULTS_PER_PAGE, linkDiv1);
            getLink(i, currLink, RESULTS_PER_PAGE, linkDiv2);
        }
    }
    return;
}

function getLink(linkPage, currentPage, resultsPerPage, linkDiv) {
    var formText = document.createTextNode(linkPage);
    var space = document.createTextNode(" ");

    if (linkPage == currentPage) {
        linkDiv.appendChild(formText);
        linkDiv.appendChild(space);
    } else {
        var anchorElement = document.createElement("a");
        var currentPosition = parseInt(((linkPage - 1) * resultsPerPage) + 1);
        var formObj = getDynamicSearchFormObj();
        var paginationUrl = formObj.paginationUrl.value;
        paginationUrl = unescape(paginationUrl) + "&currentPosition=" + currentPosition;
        anchorElement.setAttribute("href", paginationUrl);
        anchorElement.appendChild(formText);
        linkDiv.appendChild(anchorElement);
        linkDiv.appendChild(space);
    }
}

function doPageInitialization() {
    var marklistDivs = document.getElementsBySelector("div.markItem");
    var pgCnt = 0;
    var checkAllBx = true;
    // Flag to check or uncheck the checkAll box in searchresult page.
    for (var i = 0; i < marklistDivs.length; i++) {
        var element = marklistDivs[i].getElementsByTagName("INPUT")[0];
        if (element.checked == true) {
            pgCnt += 1;
        } else {
            checkAllBx = false;
        }
    }
    if (checkAllBx == true) {
        checkOrUncheckMarkAll(true);
    }
    PG_CNT = pgCnt;
}

function enableOrDisableDatesByMode() {
    disableOrEnableDates(document.forms[0], this, dateIndices[0]);
}

function initLimitExpandForm() {
    initializeDateLimiters(document.forms[0]);
    initializeStandAloneLimiterArray(document.forms[0]);
}

function validateLimitExpandForm(event) {
    var formObj = getDynamicSearchFormObj();
    var searchTerm = formObj.quickSearchTerm.value;
    if (searchTerm == "") {
        if (!standAloneLimitersSelected(formObj)) {
            alert(STAND_ALONE_LIMITER_MSG);
            return false;
        }
    } else if (!isValidWildCardSearch(searchTerm)) {
        alert(WILDCARD_SEARCH_TERMS);
        document.forms[0].quickSearchTerm.focus();
        cancelEvent(event);
        return false;
    }
    return validateLimiters(formObj, event);

}

function performSearchSortBy() {
    var sortSelector = getElementById("sorter");
    var sortOrder = sortSelector.options[sortSelector.selectedIndex].value
    //var sortOrder = this.options[this.selectedIndex].value;
    var searchSortLink = SEARCH_SORT_LINK + "&sort=" + sortOrder + "&currentPosition=1";
    // need this one to reset the Pagination on Sort.
    window.location.href = unescape(searchSortLink);
}

/**
 * Attatch events to make the "go" button work
 * used by the result list, but not document iteration.
 */
function attachPaginationEvents() {
    attachEventForLink("iterator-go_1", paginateResult);
    attachEventForLink("iterator-go_2", paginateResult);
}

/**
 * Used by the "Go" button on the result list
 */
function paginateResult() {
    var formObj = getResultSearchForm();
    var id = this.id;
    var index = parseInt(id.split("_")[1], 10);
    var endCount = getElementById("iterator-max_" + index).innerHTML;
    var paginationUrl = this.href;
    var currentPos = getElementById("iterator-currentPos_" + index).value;
    currentPos = trim(currentPos);
    if (isNumeric(currentPos)) {
        if (parseInt(currentPos, 10) > parseInt(endCount, 10) || parseInt(currentPos, 10) <= 0) {
            alert("Enter a Valid Document Range");
            return false;
        } else {
            paginationUrl = unescape(paginationUrl) + "&currentPosition=" + currentPos;
            if (BR_NS6 || BR_NS4) {
                this.href = paginationUrl;
            } else {
                document.location.href = paginationUrl;
                return false;
                // avoid triggering the base link in the HTML
            }
        }
    } else {
        alert("Enter a Valid Number");
        return false;
    }
}

function showExpandLimit() {
    var formObj = getDynamicSearchFormObj();
    formObj.showLimitExpand.value = "yes";
    formObj.submit();
}

function hideExpandLimit() {
    var formObj = getDynamicSearchFormObj();
    formObj.showLimitExpand.value = "no";
    formObj.submit();
}


function submitForQuickSearch(event) {
    var formObj = getDynamicSearchFormObj();
    formObj.currentPosition.value = "1";
    if (isValidObject(getElementById("inresults"))) {
        var chkBox = getElementById("inresults");
        if (chkBox.checked) {
            if (validateLimitExpandForm(document.forms[0], event)) {
                var url = document.location.href;
                var paths = url.split("/");
                var context = paths[paths.length - 2];
                document.forms[0].action = "/" + context + "/limitExpandSearchResults.do";
            } else {
                cancelEvent(event);
                return false;
            }
        } else {
            return validateQuickSearch(event);
        }
    } else {
        return validateQuickSearch(event);
    }
    return true;
}

function validateQuickSearch(event) {
    var searchTerm = document.forms[0].quickSearchTerm.value;
    if (searchTerm == "") {
        alert(SEARCH_TERMS_EMPTY);
        document.forms[0].quickSearchTerm.focus();
        cancelEvent(event);
        return false;
    } else if (!isValidWildCardSearch(searchTerm)) {
        alert(WILDCARD_SEARCH_TERMS);
        document.forms[0].quickSearchTerm.focus();
        cancelEvent(event);
        return false;
    }
}

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=" + ADDITIONAL_SEARCH_TERM;
    if (remote.opener == null) {
        remote.opener = window;
    } else {
        remote.focus();
    }
    return false;
}


/***************************************** Search Results Event Binding ******************************************/
function searchResultsBodyOnLoad() {
    doPageInitialization();
    window.focus();
    initLimitExpandForm();
    if (isValidObject(getDynamicSearchFormObj().searchEndCount)) {
        populatePageLinks();
    }
}

function markCheckBox() {
    mark(this);
    Toggle(this);
}

function markAllCheckBox() {
    markAll(this);
}

function attachSearchResultEvents() {
    //	addSubmitEvent(document.forms[1], validateLimitExpandForm);
    addChangeEventForId("sorter", performSearchSortBy);
    attachPopupForSelector("ul.libraryLinks", openGaleChildWindow);
    attachPopup("globalTools-infomark", openGaleChildWindow);
    attachPopup("recentUpdates", openGaleChildWindow);
    attachPopupForSelector("li.howToCiteLink", openGaleChildWindow);
    attachPopupForSelector("li.pdfLink", retrievePDFFromResultList);
    attachPopupForSelector("a.googleChildWindow", openGoogleChildWindow);
    attachPopupForSelector("a.alertXml", openGaleChildWindow);
    attachPaginationEvents();
    searchResultsBodyOnLoad();
    attachDateModeSelectEvents();
    attachLimitExpandEvents();
    attachEventForGoogleSearch();
    performTabLimitersSearch();
}

function attachMarkListEvents() {
    //  	addClickEventForId("iteratorBar-selectAll_2",markAllCheckBox);
    //  	addClickEventForId("iteratorBar-selectAll_1",markAllCheckBox);
    attachMarkListCheckBoxEvent();
}

function attachMarkListCheckBoxEvent() {
    var marklistDivs = document.getElementsBySelector("div.markItem");
    for (var i = 0; i < marklistDivs.length; i++) {
        var chkBox = marklistDivs[i].getElementsByTagName("INPUT")[0];
        Toggle(chkBox);
        chkBox.onclick = markCheckBox;
    }
    var markAll_1 = getElementById("iteratorBar-selectAll_1");
    if (markAll_1 != null) {
        markAll_1.onclick = markAllCheckBox;
        Toggle(chkBox);
        /* no longer 2 checkboxes on page, just one; ECE200025805 - jmarx
	    var markAll_2 = getElementById("iteratorBar-selectAll_2");
	    markAll_2.onclick = markAllCheckBox;
	    */
    }
}

function attachDateModeSelectEvents() {
    var DL_PREFIX = "dateLimiterValue";
    var formObj = document.forms[0];
    populateDateIndicesArray(formObj);
    for (dateItr = 0; dateItr < dateIndices.length; dateItr++) {
        var index = dateIndices[dateItr];
        var dateMode = DL_PREFIX + "(" + index + ").dateMode";
        var dateModeObj = formObj.elements[dateMode];
        if (dateModeObj) {
            for (j = 0; j < dateModeObj.length; j++) {
                dateModeObj[j].onclick = enableOrDisableDatesByMode;
            }
        }
    }
}

function enableOrDisableDatesByMode() {
    disableOrEnableDates(document.forms[0], this, dateIndices[0]);
}

function getResultSearchForm() {
    return document.forms[0];
}

function attachLimitExpandEvents() {
    /*var hideLimit = getElementById("searchResults-hideLimit");
     if (hideLimit != null ) {
           hideLimit.onclick = hideExpandLimit;
     }

     var expandLimit = getElementById("searchResults-expandLimit");
     if (expandLimit != null) {
         expandLimit.onclick = showExpandLimit;
     }*/
    addSubmitRequest();
    attachMultiIndexLimiterSelectEvents();
    attachWithinResultCheckBoxEvent();
}

/*function submitLimiters(){
	var indexName = this.id.split("_")[0];
	var formObj = getDynamicSearchFormObj();
    var productId = formObj.prodId.value;
    var usrGrp = formObj.userGroupName.value;
    var baseURL = "limitExpandSearchResults.do?inPS=true&userGroupName=" + usrGrp + "&prodId=" + productId;
    baseURL += "&searchId=" + formObj.searchId.value + "&tabID=" + formObj.tabID.value + "&searchType=" + formObj.searchType.value;
    baseURL += "&tabLimiterIndex=" + indexName + "&tabLimiterValue=" +this.value +"&isTabLimiter=true" + "&IS_LINK_DIRECTED_SEARCH=true";
	document.location.href = baseURL;
}*/
function submitLimitExpandForm(event) {
    var formObj = document.getElementById("limitExpandForm");
    var actionObj = document.forms[1].elements["actionCmd"];
     //Fix for EREF-2871 : LitRG\LitRC: Limit Only search: Error message is displayed on the search form instead of a pop error message on the result list page on removing the single static limiter from the 'limit to:' section on the result list page.
    initializeStandAloneLimiterArray(formObj);
    //Fix for EREF-2626 commented below code for not displaying Error message.
   /* if(!standAloneLimitersSelected(formObj)){
     alert(PARSER_STATIC_LIMITER_ERROR);
    	return false;
    } */
    if (this.checked == 1) {
        actionObj.value = "DO_LIMIT_SEARCH_RESULTS";
    } else {
        if (IS_SINGLE_TAB_LIMITER_SELECTED) {
            alert(ONE_TAB_LIMITER_MUST_BE_SELECTED);
            this.checked = true;
            //cancelEvent(event);
            return false;
        }
        actionObj.value = "DO_EXPAND_SEARCH_RESULTS";
    }
    formObj.submit();
}


function performTabLimitersSearch() {
    var elements = document.forms[1].elements;
    for (var i = 0; i < elements.length; i++) {
        if (elements[i].id.match("dynamicLimiterField")) {
            elements[i].onclick = submitLimitExpandForm;
        }
    }
}

function attachWithinResultCheckBoxEvent() {
    if (isValidObject(getElementById("quicksearch-withinresults"))) {
        var limitExpandOption = getElementById("inresults");
        limitExpandOption.onclick = disableLimiters;
    }
}

function disableLimiters() {
    var limitExpandOption = getElementById("inresults");
    if (limitExpandOption.checked == 1) {
        //TODO: hard code the limiters for now. This has to be dynamic
        if (document.getElementById('LI_dynamicLimiterField') != null) {
            document.getElementById('LI_dynamicLimiterField').disabled = false;
        }
        if (document.getElementById('RE_dynamicLimiterField') != null) {
            document.getElementById('RE_dynamicLimiterField').disabled = false;
        }
        if (document.getElementById('AC_dynamicLimiterField') != null) {
            document.getElementById('AC_dynamicLimiterField').disabled = false;
        }
        document.getElementById('multiIndexLimiter').disabled = false;
    } else {
        if (document.getElementById('LI_dynamicLimiterField') != null) {
            document.getElementById('LI_dynamicLimiterField').disabled = true;
        }
        if (document.getElementById('RE_dynamicLimiterField') != null) {
            document.getElementById('RE_dynamicLimiterField').disabled = true;
        }
        if (document.getElementById('AC_dynamicLimiterField') != null) {
            document.getElementById('AC_dynamicLimiterField').disabled = true;
        }
        document.getElementById('multiIndexLimiter').disabled = true;
    }
}

function attachMultiIndexLimiterSelectEvents() {
    if (isValidObject(getElementById("multiIndexLimiter"))) {
        var multiIndexObj = getElementById("multiIndexLimiter");
        var paginationOptionObj = document.getElementsByName("sideBarPagination");
        multiIndexObj.onchange = addSubmitRequest;
        for (var i = 0; i < paginationOptionObj.length; i++) {
            paginationOptionObj[i].onclick = addSubmitRequest;
        }
    }
}

function updateResponse() {
    if (xmlhttp.readyState == 4 || xmlhttp.readyState == "complete")
    {
        document.getElementById("subjectterm").innerHTML = xmlhttp.responseText;
    } else if (xmlhttp.readyState == 1) {
        document.getElementById("subjectterm").innerHTML = QUICK_SEARCH_LOADING_MESSAGE;
    }
}

function addSubmitRequest() {
    if (isValidObject(getElementById("multiIndexLimiter"))) {
        var multiIndexObj = getElementById("multiIndexLimiter");
        var paginationOptionObj = document.getElementsByName("sideBarPagination");
        multiIndexObj.onchange = addSubmitRequest;
        var browsePagination = 25;
        for (var i = 0; i < paginationOptionObj.length; i++) {
            if (paginationOptionObj[i].checked) {
                browsePagination = paginationOptionObj[i].value;
                break;
            }
        }
        var formObj = getDynamicSearchFormObj();
        var productId = formObj.prodId.value;
        var usrGrp = formObj.userGroupName.value;
        xmlhttp = getXmlHttpRequest();
        var baseURL = "limitExpandSearchResults.do?inPS=true&userGroupName=" + usrGrp + "&prodId=" + productId + "&browseIndex=" + multiIndexObj.value + "&browsePagination=" + browsePagination + "&buildLimiterValues=true";
        /*This is working fine in FireFox and IE 7. In IE 6 alone this scenario is reproducible.The reason is IE 6 loads pages from cache if the URL remains same. 
        To fix that the current system time('&now=') is passed as a param in the URL since its a variable one.*/
        baseURL += "&searchId=" + formObj.searchId.value + "&tabID=" + formObj.tabID.value + "&searchType=" + formObj.searchType.value + "&now=" + new Date().getTime();
        xmlhttp.onreadystatechange = updateResponse;
        xmlhttp.open("GET", baseURL, true);
        xmlhttp.send(null);
    }
}

// Function for displayingalert and preventing user from removing the last stand-alone limiter.
function validateNarrowing(event) {
	var e;
	e = (isValidObject(event.target) ? event.target : event.srcElement);	
	if(isValidObject(e) && (e.tagName == "A" || e.tagName == "a")){ 
		if(!isLimitingResults(e.href)) {
			var dynamicSearchFormObj = getDynamicSearchFormObj();
			var limitExpandFormObj = getLimitExpandFormObj();
			if (isValidObject(getElementById("removesubject"))){
				var divObj = getElementById("removesubject");
				var links = divObj.getElementsByTagName("a");
				//Fix for EREF-2100 Limit Only search: Error message is displayed on Search Form instead of Result List Page on removing applied limiter from the Limit/Expand side bar of result list
				initializeStandAloneLimiterArray(limitExpandFormObj);	
				var isStandAloneLimiterSelected = standAloneLimitersSelected(limitExpandFormObj);
		// Comment below code for fixing bug EREF-2626 		
			/*	 if (!isStandAloneLimiterSelected) {
					if (links.length == 1) {
						links[0].href = "#";
			            alert(PARSER_STATIC_LIMITER_ERROR);
						return false;
		        	}
				} */
			}
		}
	}
	return true;
}

function isLimitingResults(url) {
	var limiting = false;
	var str = url.split("actionCmd=");
	if (str.length > 1) {
		var actionCmd = str[1].split("&");
		if (actionCmd[0] == "DO_LIMIT_SEARCH_RESULTS") {
	 		limiting = true;
		}
		return limiting;   
	}
}

function getDynamicSearchFormObj() {
    return document.forms[0];
}

function getLimitExpandFormObj () {
	return document.forms[1];
}

function addQuickSearchEvents() {
    addSubmitEvent(document.forms[0], submitForQuickSearch);
	addClickEvent(document.forms[0],validateNarrowing);
}

function attachEventForGoogleSearch() {
    var elements = document.getElementById("googleCaller");
    if (elements != null)
        elements.onclick = googleCall;
}
addWindowLoadEvent(addQuickSearchEvents);
addWindowLoadEvent(attachMarkListEvents);
addWindowLoadEvent(attachSearchResultEvents);
