/**
 * Copyright (c) 2007 Hoang Hac Solutions Team. All rights reserved.
 *
 * The copyright to the computer software herein is the property of
 * Hoang Hac Solutions Team. The software may be used and/or copied only
 * with the written permission of Hoang Hac Solutions Team. or in accordance
 * with the terms and conditions stipulated in the agreement/contract
 * under which the software has been supplied.
 *
 * @author: Vien Nguyen [vien.ly.hhac@gmail.com]
 */
 function getXMLHTTPRequest() {
	httpRequest = false;

    if (window.XMLHttpRequest) { // FireFox
        httpRequest = new XMLHttpRequest();
        if (httpRequest.overrideMimeType) {
            httpRequest.overrideMimeType("text/xml");
        }

    } else if (window.ActiveXObject) { // IE
        try {

            httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {

                httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
        
            } catch (e) {}
        }

    }
    return httpRequest;
};

 
 function getXML (response) {
  var contentType = response.getResponseHeader("Content-Type");
  if (contentType) {
    //if (contentType.match(/^text\/xml;/i)) {
    if (contentType != '') {
      var xml;
      if (!hasNativeXPathSupport()) {
        xml = xmlParse(response.responseText);
      } else {
        xml = response.responseXML;
      }
      if (xml.parseError && xml.parseError.errorCode != 0) { // for IE
        //Raise event error here
      }
      if (xml.documentElement.tagName == "parsererror") { // for Gecko
        //Raise event error here
      }
      return xml;
    } else {
       alert("Server is busy. Invalid Content Type. Please try again later.");
    }
  } else { // server down
    alert("Server is busy. Please try again later.");
  }
};

function selectNode(context, expr) {
  if (context.documentElement) {
    var xml = context;
    context = context.documentElement;
  } else {
    var xml = context.ownerDocument;
  }
  if (!hasNativeXPathSupport()) {
    // This is for all browsers with no built in XPath support.
    var compExpr = xpathParse(expr);
    var node = compExpr.evaluate(new ExprContext(context));
    return (node.value[0]);
  } else if (window.ActiveXObject) {
    xml.setProperty("SelectionLanguage", "XPath");
    var node = context.selectSingleNode(expr);
    return node;
  } else if (xml.evaluate) {
    return xml.evaluate(expr, context, xml.createNSResolver(context),
        XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  } else {
    // Should never get here.
  }
  return null;
};
  
function selectNodeList (context, expr) {
  if (context.documentElement) {
    var xml = context;
    context = context.documentElement;
  } else {
    var xml = context.ownerDocument;
  }
  if (!hasNativeXPathSupport()) {
    // This is for all browsers with no built in XPath support   
    var compExpr = xpathParse(expr);
    var iterator = compExpr.evaluate(new ExprContext(context));
    var list = iterator.nodeSetValue();
    return (list);
  } else if (window.ActiveXObject) {
    xml.setProperty("SelectionLanguage", "XPath");
    var iterator = context.selectNodes(expr);
    var list = new Array();
    while (true) {
      var node = iterator.nextNode();
      if (node) {
        list.push(node);
      } else {
        break;
      }
    }
    return list;
  } else if (xml.evaluate) {
    var iterator = xml.evaluate(expr, context, xml.createNSResolver(context),
        XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
    var list = new Array();
    while(true) {
      var node = iterator.iterateNext();
      if (node) {
        list.push(node);
      } else {
        break;
      }
    }
    return list;
  } else {
    // Should never get here.
  }
  return null;
};

/**
 * Returns true if the browser has built in XPath support, false otherwise.
 */

function hasNativeXPathSupport (xml) {
  var result = false;
  // An override to make debugging easier.  This override will enable the
  // Google XPath/XSLT library for all browsers
  if (window.overrideNativeXPath) {
    return (result);
  }
  if (!xml) {
    if (document.implementation &&
        document.implementation.createDocument) {
      xml = document.implementation.createDocument("", "", null);
    }
  }
  if (window.ActiveXObject) {
    result = true;
  } else if (xml.evaluate) {
    result = true;
  }
  return (result);
};

function selectString (context, expr) {
  if (context.documentElement) {
    var xml = context;
    context = context.documentElement;
  } else {
    var xml = context.ownerDocument;
  }
  if (!hasNativeXPathSupport()) {
    // This is for all browsers with no built in XPath support
    debug("selectString: expr=" + expr);
    var compExpr = xpathParse(expr);
    var node = compExpr.evaluate(new ExprContext(context));
    debug("selectString: expr=" + expr + " done.");
    return (node.stringValue());
  } else if (window.ActiveXObject) {
    xml.setProperty("SelectionLanguage", "XPath");
    var node = context.selectSingleNode(expr);
    return node != null ? node.text : null;
  } else if (xml.evaluate) {
    return xml.evaluate(expr, context, xml.createNSResolver(context),
        XPathResult.STRING_TYPE, null).stringValue;
  } else {
    // Should never get here.
  }
  return null;
};


function selectInt(context, expr) {
  return parseInt(selectString(context, expr));
};



