var XMLdoc;
var XSLdoc;
var XSLurl = "dockets.xsl";

var dateSort;
var dockSort = "descending";
var descSort;
var printURL = "print.xsl";

function getElement(name)
{
    if (document.getElementById)
    {
        return document.getElementById(name);
    }
    if (document.all)
    {
        return document.all[name];
    }
    if (document.layers)
    {
        return document[name];
    }
    return null;
}

function loadImages() {
  neutral = new Image();
  ascend = new Image();
  descend = new Image();

  neutral.src = "neutral-arrow.gif";
  ascend.src = "arrow-ascend.gif";
  descend.src = "arrow-descend.gif";
}

function applyImage(field, sort, e) {
  var img = e.getElementById(field + "-img");
  var imgSrc = "";

  if (sort == "ascending") {
    imgSrc = "arrow-ascend.gif";
  } else if (sort == "descending") {
    imgSrc = "arrow-descend.gif";
  } else {
    imgSrc = "neutral-arrow.gif";
  }

  img.src = imgSrc;
}

var currentSortOrder = "descending";
function reverseSort()
{
    var current = getElement("currentSort");
    var other = getElement("changeSort");
    if (currentSortOrder == "ascending")
    {
	currentSortOrder = "descending";
	current.innerHTML = "reverse chronological";
	other.innerHTML = "chronological";
    }
    else
    {
	currentSortOrder = "ascending";
	other.innerHTML = "reverse chronological";
	current.innerHTML = "chronological";
    }
    // sort("seconds", currentSortOrder);
    sort("docket", currentSortOrder);
}

function getDisplayText(e) {
  if (typeof(window.opera) == 'undefined' && (
      navigator.userAgent.indexOf('Internet Explorer') >= 0 ||
      navigator.userAgent.indexOf('MSIE') >= 0)) {
    try {
      if (e.style.display != "none") {
        return "display:block;";
      } else {
        return "display:none;";
      }
    } catch (e) {
      return "display:block;";
    }
  } else {
    if (document.getElementById) {
      if (e.style.display == "none") {
        return "display:none;";
      }
    } else if (document.layers) {
      if (e.display == "none") {
        return "display:none;";
      }
    } else {
      if (e.style.display == "none") {
        return "display:none;";
      }
    }
  }

  return "display:table-row;";
}

function hideElement(e) {
  if (document.getElementById) {
    if (e.style.display != "none") {
      e.style.display = "none";
    }
  } else {
    if (document.layers) {
      if (e.display != "none") {
        e.display = "none";
      }
    } else {
      if (e.style.display != "none") {
	    e.style.display = "none";
      }
    }
  }
}

function showElement(e) {
  if (typeof(window.opera) == 'undefined' && (
      navigator.userAgent.indexOf('Internet Explorer') >= 0 ||
      navigator.userAgent.indexOf('MSIE') >= 0)) {
    e.style.display = "block";
  } else {
    if (document.getElementById) {
      if (e.style.display == "none") {
        e.style.display = "table-row";
      }
    } else {
      if (document.layers) {
        if (e.display == "none") {
          e.display = "table-row";
        }
      } else {
        if (e.style.display == "none") {
          e.style.display = "table-row";
        }
	  }
    }
  }
}

function fixDate(text) {
    hasSeconds = text.indexOf(" ");
    if (hasSeconds != -1)
    {
        text = text.substring(text.indexOf(" ") + 1);
    }
    yr = text.substring(text.indexOf("/", text.indexOf("/") + 1) + 1);
    dt = text.substring(0, text.indexOf("/", text.indexOf("/") + 1) + 1);

    if (yr.length == 2) {
	if (yr.search(/[6-9][0-9]/) >= 0) {
	    yr = "19" + yr;
	} else {
	    yr = "20" + yr;
	}
    }

    return dt + yr;
}

function fixLink(text) {
  var hrefStart = new RegExp("href=\"", "i");
  var hrefEnd = new RegExp("\"");
  var allButFilename = new RegExp(".*/");

  var line = text.substring(text.search(hrefStart) + 6);
  line = line.substring(0, line.search(hrefEnd));
  line = line.replace(allButFilename, "");

  return line;
}

function clearSearch() {
  var nodeNum = document.getElementById('SearchTable').childNodes.length - 1;
  var searchTable = document.getElementById('SearchTable').childNodes[nodeNum];

  for (var i = 1; i < searchTable.childNodes.length; i++) {
    if (searchTable.childNodes[i].innerHTML) {
      showElement(searchTable.childNodes[i]);
    }
  }

  return false;
}

function searchAll() {
  var searchString = document.SearchForm.desc.value;
  var nodeNum = document.getElementById('SearchTable').childNodes.length - 1;
  var searchTable = document.getElementById('SearchTable').childNodes[nodeNum];
  var dateSearch = false; var dateRange = false;
  var dockSearch = false; var dockRange = false;
  var descSearch = false; var foundResult = false;

  // Identify Search Requests
  if (fixDate(document.SearchForm.start_dt.value.replace(/\s/, "")).length != 0) {
    dateSearch = true;
    if (fixDate(document.SearchForm.end_dt.value.replace(/\s/, "")).length != 0) {
	  dateRange = true;
	}
  } else {
    if (fixDate(document.SearchForm.end_dt.value.replace(/\s/, "")).length != 0) {
	  dateSearch = true;
	}
  }

  if (document.SearchForm.start_no.value.replace(/\s/, "").length != 0) {
    dockSearch = true;
    if (document.SearchForm.end_no.value.replace(/\s/, "").length != 0) {
	  dockRange = true;
	}
  } else {
    if (document.SearchForm.end_no.value.replace(/\s/, "").length != 0) {
      document.SearchForm.start_no.value = 0;
	  dockSearch = true;
	}
  }

  if (document.SearchForm.desc.value.replace(/\s/, "").length != 0) {
    descSearch = true;
  }

  if (!document.SearchForm.within.checked) {
    clearSearch();
  }

  if (!dateSearch && !dockSearch && !descSearch) {
    alert("No Search Terms Entered");
    return false;
  }

  var StartDate = new Date(fixDate(document.SearchForm.start_dt.value));
  var EndDate = new Date(fixDate(document.SearchForm.end_dt.value));
  var StartNo = new Number(document.SearchForm.start_no.value);
  var EndNo = new Number(document.SearchForm.end_no.value);

  var dateNode = 0;
  var dockNode = 1;
  var descNode = 2;
  if (searchTable.childNodes[1].childNodes[dockNode] == undefined) {
    dockNode = 2;
    descNode = dockNode + 1;
  }
  if (searchTable.childNodes[1].childNodes[descNode] == undefined) {
    descNode += 1;
  }

  var searchArray = searchString.split(" ");
  var searchElements = "";
  for (var i = 0; i < searchArray.length; i++) {
    if (i > 0) {
      searchElements += "|";
    }
    searchElements += "(" + searchArray[i] + ")";
  }
  var searchText = new RegExp(searchElements, "i");

  // Loop through Entries and Search
  for (var i = 1; i < searchTable.childNodes.length; i++) {
    var found = false;
    node = searchTable.childNodes[i];

    if (searchTable.childNodes[i].innerHTML) {
      var dateText = "";
      var docketText = "";
      var descriptionText = "";

      if (dateSearch && node.childNodes[dateNode]) {
        dateText = node.childNodes[dateNode].innerHTML.replace(/<(.+?)>/gi, " ").replace(/^\s*/, "").replace(/\s*$/, "");
      }

      if (dockSearch && node.childNodes[dockNode]) {
      	docketText = node.childNodes[dockNode].innerHTML.replace(/<(.+?)>/gi, " ").replace(/^\s*/, "").replace(/\s*$/, "");
      }

      if (descSearch && node.childNodes[descNode]) {
	    descriptionText = node.childNodes[descNode].innerHTML.replace(/<(.+?)>/gi, " ").replace(/^\s*/, "").replace(/\s*$/, "");
      }

	  // Perform Search on Row
      if (dateSearch) {
        var dateInfo = new Date(fixDate(dateText));

        if (dateRange) {
          if (dateInfo >= StartDate && dateInfo <= EndDate) {
            found = true;
          }
        } else {
          if (dateInfo.valueOf() == StartDate.valueOf()) {
            found = true;
          }
        }
      }

      if (dockSearch) {
        var dockInfo = new Number(docketText);

        if (dockRange) {
          if (dockInfo >= StartNo && dockInfo <= EndNo) {
            if (!dateSearch || (dateSearch && found)) {
              found = true;
            }
          } else {
            found = false;
          }
        } else {
          if (dockInfo.valueOf() == StartNo.valueOf()) {
            if (!dateSearch || (dateSearch && found)) {
              found = true;
            }
          } else {
            found = false;
          }
        }
      }

      if (descSearch) {
        //var textFound = false;

        //for (var i = 0; i < searchElements.length; i++) {
        //  if(descriptionText.search(searchElements[i])) {
        //    textFound = true;
        //  }
        //}

        if (descriptionText.search(searchText) < 0) {
        //if (!textFound) {
          found = false;
        } else {
          if ((!dateSearch || (dateSearch && found)) &&
              (!dockSearch || (dockSearch && found))) {
            found = true;
          }
        }
      }

      if (!found) {
        hideElement(node);
      } else {
        foundResult = true;
      }
    }
  }

    if (!foundResult) {
      alert("No Docket Entries Found.");
      clearSearch();
    } else {
      XMLdoc = createXML();
      setTableContents(transform(XMLdoc, XSLdoc));

		if (descSearch) {
			var replaceText = new RegExp("(" + searchElements + ")", "gi");
			//var bodyText = document.getElementById('SearchTableWrapper').innerHTML;
			//bodyText.replace(replaceText, "<span class=\"found\">$1</span>");
			//document.getElementById('SearchTableWrapper').innerHTML = bodyText;
			document.getElementById('SearchTableWrapper').innerHTML = document.getElementById('SearchTableWrapper').innerHTML.replace(replaceText, "<span class=\"found\">$1</span>");
		}
    }

  return false;
}

function docketRange(from, to) {
  clearSearch();
  document.SearchForm.start_no.value = from;
  document.SearchForm.end_no.value = to;

  searchAll();
}

function createXML() {
  var xml;

  if (window.ActiveXObject) {
    xml = new ActiveXObject("Microsoft.XMLDOM");
  } else if (document.implementation &&
      document.implementation.createDocument) {
    xml = document.implementation.createDocument("", "", null);
  } else {
    return null;
  }

  xml.appendChild(xml.createElement("data"));
  var root = xml.documentElement;
  root.setAttribute("selection", "docket");
  root.setAttribute("type", "number");
  root.setAttribute("order", "descending");

  var nodeNum = document.getElementById('SearchTable').childNodes.length - 1;
  var searchTable = document.getElementById('SearchTable').childNodes[nodeNum];

  var dateNode = 0;
  var dockNode = 1;
  var descNode = 2;
  if (searchTable.childNodes[1].childNodes[dockNode] == undefined) {
    dockNode = 2;
    descNode = dockNode + 1;
  }
  if (searchTable.childNodes[1].childNodes[descNode] == undefined) {
    descNode += 1;
  }

  // Loop Through Rows and enter Data
  for (var i = 1; i < searchTable.childNodes.length; i++) {
    node = searchTable.childNodes[i];

    if (searchTable.childNodes[i].innerHTML) {
	  var td0 = node.childNodes[dateNode].innerHTML.replace(/<(.+?)>/gi, " ").replace(/^\s*/, "").replace(/\s*$/, "");
	  var secondsText = td0.replace(/ .*/, "");
	  var dateText = td0.replace(/.* /, "");
	  var dockText = node.childNodes[dockNode].innerHTML.replace(/<(.+?)>/gi, " ").replace(/^\s*/, "").replace(/\s*$/, "");
	  var dockLink = fixLink(node.childNodes[dockNode].innerHTML);
	  var descText = node.childNodes[descNode].innerHTML.replace(/<(.+?)>/gi, " ").replace(/^\s*/, "").replace(/\s*$/, "");

	  row = xml.createElement("row");
	  row.setAttribute("style", getDisplayText(node));

	  secondsInfo = xml.createElement("seconds");
	  dateInfo = xml.createElement("date");
	  dockInfo = xml.createElement("docket");
	  descInfo = xml.createElement("description");

	  secondsInfo.appendChild(xml.createTextNode(secondsText));
	  dateInfo.appendChild(xml.createTextNode(dateText));
	  dockInfo.appendChild(xml.createTextNode(dockText));
	  descInfo.appendChild(xml.createCDATASection(descText));
	  dockInfo.setAttribute("link", dockLink);

	  row.appendChild(secondsInfo);
	  row.appendChild(dateInfo);
	  row.appendChild(dockInfo);
	  row.appendChild(descInfo);

	  root.appendChild(row);
    }
  }

  return xml;
}

function loadXML(fileName) {
  var xml;

  if (window.ActiveXObject) {
    xml = new ActiveXObject("Microsoft.XMLDOM");
  } else if (document.implementation &&
      document.implementation.createDocument) {
    xml = document.implementation.createDocument("", "", null);
  } else {
    msg("Not Supported");
  }

  xml.async = false;
  xml.load(fileName);
  return xml;
}

function toString(xml) {
  if (window.ActiveXObject) {
    return xml.xml;
  } else {
    return new XMLSerializer().serializeToString(xml);
  }
}

function transform(xml, xsl) {
  if (window.ActiveXObject) {
    return xml.transformNode(xsl);
  } else if (document.implementation &&
      document.implementation.createDocument) {
    xsltProcessor = new XSLTProcessor();
    xsltProcessor.importStylesheet(xsl);
    resultDocument = xsltProcessor.transformToFragment(xml, document);
    return toString(resultDocument);
  } else {
    return "";
  }
}

function wrapTable() {
  var searchTable = document.getElementById('SearchTable');
  var parent = searchTable.parentNode;
  var wrap = document.createElement("span");
  wrap.setAttribute("id", "SearchTableWrapper");

  wrap.appendChild(searchTable.cloneNode(true));
  parent.replaceChild(wrap, searchTable);
}

function setTableContents(str) {
  document.getElementById('SearchTableWrapper').innerHTML = str;
}


function setup() {
  loadImages();
  XMLdoc = createXML();
  XSLdoc = loadXML(XSLurl);

  wrapTable();
  setTableContents(transform(XMLdoc, XSLdoc));
}

function sort(field, order) {
  var root = XMLdoc.documentElement;
  root.setAttribute("selection", field);
  if ((field == "seconds") || (field == "docket")) {
    root.setAttribute("type", "number");
  } else {
    root.setAttribute("type", "text");
  }
  root.setAttribute("order", order);

  setTableContents(transform(XMLdoc, XSLdoc));

  return null;
}

function printVisible() {
  var root = XMLdoc.documentElement;
  var temp_type =  root.getAttribute("type");
  var temp_selection = root.getAttribute("selection");
  var temp_order = root.getAttribute("order");

  XMLdoc = createXML();
  root = XMLdoc.documentElement;
  root.setAttribute("selection", temp_selection);
  root.setAttribute("type", temp_type);
  root.setAttribute("order", temp_order);

  XSLdoc = loadXML(printURL);
  document.write(transform(XMLdoc, XSLdoc));
}

