﻿// JScript File Utils.js
// Contains JScript functions used throughout the web application.


function ClearHtmlElement(htmlElement)
{
   while (htmlElement.firstChild != undefined)
   {
      htmlElement.removeChild(htmlElement.firstChild);
   }
}


function TrimString(text)
{
   if (text == null) return null;

   var index1 = 0;
   var index2 = text.length - 1;

   for (; text.charAt(index1) == ' '; index1++);
   for (; text.charAt(index2) == ' '; index2--);

   if (index1 == 0 && index2 == text.length)
   {
      return text;
   }

   return text.substring(index1, index2 + 1);
}

function LoadXMLDocFromString(xmlString)
{
   var xmlDoc;
   if (window.ActiveXObject)
   {
      xmlDoc = LoadXMLDocFromStringForIE(xmlString);
   }
   // code for Firefox, Chrome, Safari, etc.
   else if (document.implementation && document.implementation.createDocument)
   {
      xmlDoc = LoadXMLDocFromStringForNonIE(xmlString);
   }
   else
   {
      throw "This page cannot load XML in your browser. Please try loading the page in another browser.";
   }
   return xmlDoc;
}


function LoadXMLActiveXObject()
{
   var xmlDoc = null;
   var msXmlSignatures = [
      "MSXML2.DOMDocument.6.0",
      "MSXML2.DOMDocument.5.0",
      "MSXML2.DOMDocument.4.0",
      "MSXML2.DOMDocument.3.0",
      "MSXML2.DOMDocument",
      "Microsoft.XMLDOM"];

   for (var i = 0; i < msXmlSignatures.length; i++)
   {
      try
      {
         xmlDoc = new ActiveXObject(msXmlSignatures[i]);
         break;
      }
      catch (ex)
      {
         // Simply ignore. We will try the next MsXML version.
      }
   }

   return xmlDoc;
}

function LoadXMLDocFromStringForIE(xmlString)
{
   var xmlDoc = LoadXMLActiveXObject();
   xmlDoc.async = false;
   xmlDoc.loadXML(xmlString);

   if (xmlDoc == null)
   {
      throw "This page cannot load XML content using your browser. MsXML support is not installed or is corrupted on your system. Please try loading the page in another browser.";
   }

   if (xmlDoc.parseError != 0)
   {
      throw " line: " + xmlDoc.parseError.line +
            " position: " + xmlDoc.parseError.linepos +
            ". Reason: " + xmlDoc.parseError.reason;
   }

   return xmlDoc;
}

function LoadXMLDocFromStringForNonIE(xmlString)
{
   var parser = new DOMParser();
   var xmlDoc = parser.parseFromString(xmlString, "text/xml");

   var parsererrorElements = xmlDoc.getElementsByTagName("parsererror");
   if (parsererrorElements.length > 0)
   {
      var errorLine;
      var errorPosition;
      var errorReson;

      if (browserType == "Firefox")
      {
         var reError = />([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column (\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;
         reError.test(parsererrorElements[0].xml);
         // this.parseError.reason = RegExp.$1;
         // this.parseError.url = RegExp.$2;
         // this.parseError.line = parseInt(RegExp.$3);
         // this.parseError.linepos = parseInt(RegExp.$4);
         // this.parseError.srcText = RegExp.$5;

         errorLine = RegExp.$3;
         errorPosition = RegExp.$4;
         errorReson = RegExp.$1;
      }
      else if (browserType == "Safari" || browserType == "Chrome")
      {
         reError = />[\s\S]*?error on line (\d+) at column (\d+): ([\s\S]*?)\<\/div\>/;
         reError.test(parsererrorElements[0].xml);

         errorLine = RegExp.$1;
         errorPosition = RegExp.$2;
         errorReson = RegExp.$3;
      }
      else
      {
         errorLine = "N/A";
         errorPosition = "N/A";
         errorReson = "N/A";
      }

      throw " line: " + errorLine +
            " position: " + errorPosition +
            ". Reason: " + errorReson;

   }
   
   return xmlDoc;
}

function TransformXml2DocFragment(xml, xsl)
{
   var docFragment;

   if (window.ActiveXObject)
   {
      // code for IE
      var transformResult = xml.transformNode(xsl);
      var docFragment = document.createDocumentFragment();
      var spanNode = document.createElement("span");
      spanNode.innerHTML = transformResult;
      docFragment.appendChild(spanNode);
   }
   else if (document.implementation && document.implementation.createDocument)
   {
      // code for Firefox, Chrome, Safari, etc.
      xsltProcessor = new XSLTProcessor();
      xsltProcessor.importStylesheet(xsl);
      docFragment = xsltProcessor.transformToFragment(xml, document);
   }
   else
   {
      throw "This page cannot apply XSL transformations in your browser. Please try loading the page in another browser.";
   }

   return docFragment;
}

function TransformXmlToString(xml, xsl)
{
   var docFragment;

   if (window.ActiveXObject)
   {
      // code for IE
      var transformResult = xml.transformNode(xsl);
      return transformResult;
   }
   else if (document.implementation && document.implementation.createDocument)
   {
      // code for Firefox, Chrome, Safari, etc.
      var xsltProcessor = new XSLTProcessor();
      xsltProcessor.importStylesheet(xsl);
      var docFragment = xsltProcessor.transformToFragment(xml, document);
      return docFragment.xml;
   }
   else
   {
      throw "This page cannot apply XSL transformations in your browser. Please try loading the page in another browser.";
   }

}


function PrepareBrowsers()
{
   DetectBrowser();

   if (browserType == 'Firefox' ||
      browserType == 'Chrome' ||
      browserType == 'Safari')
   {
      PrepareNonIEBrowsers();
   }

}

function PrepareNonIEBrowsers()
{

   Node.prototype.__defineGetter__("xml", function()
   {
      var serializer = new XMLSerializer();
      return serializer.serializeToString(this, "text/xml");
   });

}

var browserType = '';

function DetectBrowser()
{

   if (navigator.userAgent.indexOf('Mozilla') >= 0 &&
      navigator.userAgent.indexOf('compatible') >= 0 &&
      navigator.userAgent.indexOf('MSIE') >= 0)
   {
      browserType = 'MsIE';
      return;
   }


   if (navigator.userAgent.indexOf('Mozilla') >= 0 &&
      navigator.userAgent.indexOf('Firefox') >= 0)
   {
      browserType = 'Firefox';
      return;
   }

   if (navigator.userAgent.indexOf('Chrome') >= 0)
   {
      browserType = 'Chrome';
      return;
   }

   if (navigator.userAgent.indexOf('Safari') >= 0)
   {
      browserType = 'Safari';
      return;
   }

}

