
addJavascript("/search-browse/cmn/js/pageData.js");
addJavascript("/search-browse/cmn/js/searchTerms.js");
addJavascript("/search-browse/cmn/js/category.js");
addJavascript("/search-browse/cmn/js/categoryOption.js");
addJavascript("/search-browse/cmn/js/categoryTree.js");
addJavascript("/search-browse/cmn/js/embeddedProcess.js");
addJavascript("/search-browse/cmn/js/selectedResults.js");
addJavascript("/search-browse/cmn/js/results.js");
addJavascript("/search-browse/cmn/js/pager.js");
addJavascript("/search-browse/cmn/js/field.js");
addJavascript("/search-browse/cmn/js/result.js");
addJavascript("/search-browse/cmn/js/fieldValue.js");
addJavascript("/search-browse/cmn/js/searchTerm.js");
addJavascript("/search-browse/cmn/js/selectedResult.js");

addEvent(window, "load", initObjects);

/********************************************************
 * global variables
 ********************************************************/

var NBSP = '\u00A0'; // &nbsp;
var RESULTS_ID = "results";
var SELECTED_RESULTS_ID = "selEnts";
var SERVLET = "/search-async/update.jsp?"
var IMG_DIR = "/search-browse/img/";
var PAGE_DATA = null;
var interval = null;
var needsProcess=null;
var allLoaded=false;

/********************************************************
 * event functions
 ********************************************************/

function initObjects() {
if(needsProcess==null){
  needsProcess=new Boolean(true);
}
 if(needsProcess){
   var params = "entityType=" + document.getElementById("entityType").getAttribute("value");
   params += "&aucId=" + document.getElementById("aucId").getAttribute("value");
   var nli = document.getElementById("nli").getAttribute("value");
   if(nli != null && nli != "null") params += "&nli=" + nli;
   if(queryString != null && queryString.length > 0 && "null" != queryString && "entityType=publication" != queryString) {
   params += "&" + queryString;
 }else{
  params += "&resetSelEnt=true";
 }
 var url = SERVLET + params;
 initializeAJAXReq();
 REQ.open("GET", url, true);
 REQ.onreadystatechange = initObjectsCallback;
 REQ.send(null);

 }
}

function initObjectsCallback() {
  if (REQ.readyState == 4 && needsProcess) {
    if (REQ.status == 200 ) {
      setDefault("treeClass","mktree");
      setDefault("nodeClosedClass","liClosed");
      setDefault("nodeOpenClass","liOpen");
      setDefault("nodeBulletClass","liBullet");
      setDefault("nodeLinkClass","bullet");
      setDefault("preProcessTrees",true);
      var steps = 0;
      try{
        steps++;//1
        PAGE_DATA = new PageData();
        steps++;//2
        PAGE_DATA.render();
        steps++;//3
        convertTrees();
        steps++;//4
        needsProcess=false;
      }catch(e){
        var reportId = sendIncidentReport(steps);
        var results = document.getElementById('results');
        results.innerHTML = "";
        results.appendChild(document.createTextNode("We're sorry - we've experienced a problem getting your search results.  In most cases this is due to server latency because of heavy traffic volumes."));
        results.appendChild(document.createElement("br"));
        results.appendChild(document.createElement("br"));
        results.appendChild(document.createTextNode(" Please try again by "));
        var a = document.createElement("a");
        a.setAttribute("href", baseURI + "?" + queryString);
        a.className = "actionlink";
        a.appendChild(document.createTextNode("clicking here"));
        results.appendChild(a);
        results.appendChild(document.createElement("br"));
        results.appendChild(document.createElement("br"));
        results.appendChild(document.createTextNode(" If you receive message consistently, please contact MediaBids: "));
        a = document.createElement("a");
        a.setAttribute("href", "mailto:webadmn@mediabids.com?subject=Search Error&body=Mediabids Ref:"+reportId);
        a.className = "actionlink";
        a.appendChild(document.createTextNode("webadmn@mediabids.com"));
        results.appendChild(a);

        results.appendChild(document.createElement("br"));
        results.appendChild(document.createElement("hr"));
        results.appendChild(document.createTextNode("Reference No: ["));
        results.appendChild(document.createTextNode(reportId));
        results.appendChild(document.createTextNode("]"));


      }
    }
  }

}

function submitTerm(searchString) {

  if(PAGE_DATA.searchTerms.add(searchString)) {
    var node = document.getElementById("processingText");
    if(node != null) node.innerHTML = "<div class=\"processingContainer\"><span>Processing...</span></div>";
    PAGE_DATA.results.pager.currPage = 1;
    var params = PAGE_DATA.getParams();
    params += "&flags=" + (PAGE_DATA.categoriesFlag + PAGE_DATA.keyWordsFlag + PAGE_DATA.resultsFlag);
    PAGE_DATA.sendUpdateRequest(params);

  }
  else {
    document.getElementById("searchString").value = "";
  }
}

function removeSearchTerm(term) {
  PAGE_DATA.searchTerms.remove(term);
  var params = PAGE_DATA.getParams();
  params += "&flags=" + (PAGE_DATA.categoriesFlag + PAGE_DATA.keyWordsFlag + PAGE_DATA.resultsFlag);
  PAGE_DATA.sendUpdateRequest(params);
}


function setCheckBox(eId, checked) {
  var checkBox = document.getElementById("cb" + eId);
  while(checkBox.childNodes && checkBox.childNodes.length > 0) removeChildren(checkBox);
  checkBox.innerHTML = "<input type=\"checkbox\" name=\"eId\" value=\"" + eId + "\" onClick=\"javascript:clickCheckbox(this)\" " + checked + "/>";
}

function selectResult(eId) {
  setCheckBox(eId, "CHECKED");
  var result = PAGE_DATA.results.getResult(eId);
  PAGE_DATA.embeddedProcess.selectedResults.addResult(result);
  PAGE_DATA.embeddedProcess.render();
}

function unSelectResult(eId) {
  var result = PAGE_DATA.results.getResult(eId);
  if(result == null) {
    result = PAGE_DATA.embeddedProcess.selectedResults.results.getResult(eId);
    PAGE_DATA.embeddedProcess.selectedResults.addRemovedId(eId);
  }
  else {
    setCheckBox(eId, "");
  }
  PAGE_DATA.embeddedProcess.selectedResults.removeResult(result);
  PAGE_DATA.embeddedProcess.render();
}

function clickCheckbox(checkBox) {
  if(checkBox.checked) {
    selectResult(checkBox.value);
  }
  else {
    unSelectResult(checkBox.value);
  }
}

function selectAllResults() {
  for(var i=0; i<PAGE_DATA.results.results.length; i++) {
    if(PAGE_DATA.results.results[i].selectable) {
      setCheckBox(PAGE_DATA.results.results[i].eId, "CHECKED");
      PAGE_DATA.embeddedProcess.selectedResults.addResult(PAGE_DATA.results.results[i]);
    }
  }
  PAGE_DATA.embeddedProcess.render();
}

// unselects results on page
function unSelectAllResults() {
  for(var i=0; i<PAGE_DATA.results.results.length; i++) {
    if(PAGE_DATA.results.results[i].selectable) {
      setCheckBox(PAGE_DATA.results.results[i].eId, "");
      PAGE_DATA.embeddedProcess.selectedResults.removeResult(PAGE_DATA.results.results[i]);
    }
  }
  PAGE_DATA.embeddedProcess.render();
}

// unselects ALL results
function clearSelectedResults() {
  for(var i=0; i<PAGE_DATA.results.results.length; i++) {
    if(PAGE_DATA.results.results[i].selectable) {
      setCheckBox(PAGE_DATA.results.results[i].eId, "");
      PAGE_DATA.embeddedProcess.selectedResults.removeResult(PAGE_DATA.results.results[i]);
    }
  }
  PAGE_DATA.embeddedProcess.selectedResults = new SelectedResults(null);
  PAGE_DATA.embeddedProcess.selectedResults.removeEId = -333;
  PAGE_DATA.embeddedProcess.render();
}

/********************************************************
 * utility functions
 ********************************************************/

function removeChildren(node) {
  if(node != null && node.childNodes) {
    for(var i=0; i<node.childNodes.length; i++) {
      purge(node.childNodes[i]);
      node.removeChild(node.childNodes[i]);
      removeChildren(node.childNodes[i]);
    }
  }
}

function getAttributeBoolValue(node, attributeName) {
  var test = node.getAttribute(attributeName);
  if(test != null && test == "1") return true;
  return false;
}

function getAttributeNode(node, attributeName) {
  if(node != null && node.attributes) {
    for(var i=0; i<node.attributes.length; i++) {
      if(node.attributes[i].nodeName.toLowerCase() == attributeName.toLowerCase()) {
        return node.attributes[i];
      }
    }
  }
  return null;
}

function buildTotalNode(subTotalSpanId, subTotal, total) {
  var span = document.createElement("span");
  span.className = "subTotal";
  span.setAttribute("id", subTotalSpanId);
  span.appendChild(document.createTextNode(NBSP + "("));
  if(total != subTotal) {
    if(subTotal == 0) {
      span.appendChild(document.createTextNode(subTotal));
    }
    else {
      var numeratorSpan = document.createElement("span");
      numeratorSpan.className = "subNumerator";
      numeratorSpan.appendChild(document.createTextNode(subTotal));
      span.appendChild(numeratorSpan);
    }
    span.appendChild(document.createTextNode("/" + total));
  }
  else {
    var numeratorSpan = document.createElement("span");
    numeratorSpan.className = "subNumerator";
    numeratorSpan.appendChild(document.createTextNode(total));
    span.appendChild(numeratorSpan);
  }
  span.appendChild(document.createTextNode(")"));
  return span;
}

function getTwinTopCatName(categoryName, optionId) {
  var twinTopCatName = "";
  if(categoryName.substring(0, 4) == "top-") {
    twinTopCatName = categoryName.substring(4, categoryName.length);
  }
  else {
    var test = this.PAGE_DATA.categoryTree.getCategory("top-" + categoryName, optionId);
    if(test != null && test.containsOption(optionId)) {
      twinTopCatName = test.name;
    }
  }
  return twinTopCatName;
}

function purge(d) {
  var a = d.attributes, i, l, n;
  if (a) {
    l = a.length;
    for (i = 0; i < l; i += 1) {
      n = a[i].name;
      if (typeof d[n] === 'function') {
        d[n] = null;
      }
    }
  }
  a = d.childNodes;
  if (a) {
    l = a.length;
    for (i = 0; i < l; i += 1) {
      purge(d.childNodes[i]);
    }
  }
}



/*
  test..trying to get mouseover info div in pub results
  to appear under mouse cursor
http://www.webreference.com/programming/javascript/mk/column2/
*/

function mouseCoords(ev){
	if(ev.pageX || ev.pageY){
		return {x:ev.pageX, y:ev.pageY};
	}
	return {
		x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
		y:ev.clientY + document.body.scrollTop  - document.body.clientTop
	};
}

/********************************************************
 * collapse/expand tree code
 * Author: Matt Kruse <matt@mattkruse.com>
 * WWW: http://www.mattkruse.com/
 ********************************************************/

// Automatically attach a listener to the window onload, to convert the trees
//addEvent(window,"load",convertTrees);

// Utility function to add an event listener
function addEvent(o,e,f){
	if (o.addEventListener){
      o.addEventListener(e, f, true);
      return true;
    }
	else if (o.attachEvent){
      return o.attachEvent("on"+e,f);
    }
	else {
      return false;
    }
}

// utility function to set a global variable if it is not already set
function setDefault(name,val) {
	if (typeof(window[name])=="undefined" || window[name]==null) {
		window[name]=val;
	}
}

// Full expands a tree with a given ID
function expandTree(treeId) {
	var ul = document.getElementById(treeId);
	if (ul == null) { return false; }
	expandCollapseList(ul,nodeOpenClass);
}

// Fully collapses a tree with a given ID
function collapseTree(treeId) {
	var ul = document.getElementById(treeId);
	if (ul == null) { return false; }
	expandCollapseList(ul,nodeClosedClass);
}

// Expands enough nodes to expose an LI with a given ID
function expandToItem(treeId,itemId) {
	var ul = document.getElementById(treeId);
	if (ul == null) { return false; }
	var ret = expandCollapseList(ul,nodeOpenClass,itemId);
	if (ret) {
		var o = document.getElementById(itemId);
		if (o.scrollIntoView) {
			o.scrollIntoView(false);
		}
	}
}

// Performs 3 functions:
// a) Expand all nodes
// b) Collapse all nodes
// c) Expand all nodes to reach a certain ID
function expandCollapseList(ul,cName,itemId) {
	if (!ul.childNodes || ul.childNodes.length==0) { return false; }
	// Iterate LIs
	for (var itemi=0;itemi<ul.childNodes.length;itemi++) {
		var item = ul.childNodes[itemi];
		if (itemId!=null && item.id==itemId) { return true; }
		if (item.nodeName == "LI") {
			// Iterate things in this LI
			var subLists = false;
			for (var sitemi=0;sitemi<item.childNodes.length;sitemi++) {
				var sitem = item.childNodes[sitemi];
				if (sitem.nodeName=="UL") {
					subLists = true;
					var ret = expandCollapseList(sitem,cName,itemId);
					if (itemId!=null && ret) {
						item.className=cName;
						return true;
					}
				}
			}
			if (subLists && itemId==null) {
				item.className = cName;
			}
		}
	}
}

// Search the document for UL elements with the correct CLASS name, then process them
function convertTrees() {

	if (preProcessTrees) {

        if (!document.createElement) {
		  // Without createElement, we can't do anything
          return;
        }

		uls = document.getElementsByTagName("ul");


        for (var uli=0;uli<uls.length;uli++) {
        var ul=uls[uli];
        if (ul.nodeName=="UL" && ul.className==treeClass) {
        processList(ul);
        }
        // sue
        if(document.searchForm.searchString != null) document.searchForm.searchString.value = "";
        }

	}

}

// Process a UL tag and all its children, to convert to a tree
function processList(ul) {

	if (!ul.childNodes || ul.childNodes.length==0) { return; }
	// Iterate LIs
	for (var itemi=0;itemi<ul.childNodes.length;itemi++) {
		var item = ul.childNodes[itemi];
		if (item.nodeName == "LI") {

            // sue
            if(item.firstChild.nodeName != "SPAN") {

              // Iterate things in this LI
              var subLists = false;
              for (var sitemi=0;sitemi<item.childNodes.length;sitemi++) {
                  var sitem = item.childNodes[sitemi];
                  if (sitem.nodeName=="UL") {
                      subLists = true;

                      processList(sitem);
                  }
              }
              var s= document.createElement("SPAN");
              var t= '\u00A0'; // &nbsp;
              s.className = nodeLinkClass;
              if (subLists) {
                  // This LI has UL's in it, so it's a +/- node
                  if (item.className==null || item.className=="") {
                      item.className = nodeClosedClass;
                  }

                  // If it's just text, make the text work as the link also
                  for(var i=0; i<item.childNodes.length; i++) {
                    if (item.childNodes[i].nodeName=="#text") {
                        t = t+item.childNodes[i].nodeValue;
                        item.removeChild(item.childNodes[i]);
                    }
                  }

                  s.onclick = function () {
                  // lazy loading more options commented out below..
//                      if(this.firstChild.nodeValue == NBSP + "more" && this.parentNode.className == nodeClosedClass) {
//                        var li = document.createElement("li");
//                        var categoryName = this.parentNode.parentNode.id.substring(7, this.parentNode.parentNode.id.length);
//                        li.id = "loading" + categoryName
//                        li.style.textDecoration = "blink";
//                        li.appendChild(document.createTextNode("loading.."));
//                        this.appendChild(li);
//                        processList(this);
//                        getMore(this);
//                      }
                      this.parentNode.className = (this.parentNode.className==nodeOpenClass) ? nodeClosedClass : nodeOpenClass;

                      return false;
                  }
              }
              else {
                  // No sublists, so it's just a bullet node
                  item.className = nodeBulletClass;
                  s.onclick = function () { return false; }
              }
              s.appendChild(document.createTextNode(t));
              item.insertBefore(s,item.firstChild);
            }
		}
	}

}

