var httpReq = null;
// DoAjaxRequest 
// Makes a request and processes it by a handler
// Format: DoAjaxRequest('URL' [, NAMEHANDLER (Must have suffix 'Handler')] [, args]); 
function DoAjaxRequest() {
  try {
    var args = arguments;
    if (args.length > 0) {
      var url = args[0];
      httpReq = window.XMLHttpRequest ? new XMLHttpRequest() : window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : null;
      httpReq.onreadystatechange = function () {
        if (httpReq.readyState == 4) {
          if (httpReq.status == 200) {
            handleHttpResponseTrigger(args);
          } else {
            alert("There was a problem retrieving the XML data:\n" + reqObj.statusText);
          }
        }
      };
      httpReq.open("GET", url, true);
      if (window.XMLHttpRequest) {
        httpReq.send(null);
      }
      else if (window.ActiveXObject) {
        httpReq.send();
      }
    }
  }
  catch (e) {
    // trigger probably doesn't exist;  
    alert(e.message);
  }
}

// Triggers functions
function handleHttpResponseTrigger() { 
    try {
      var handler = "BasicHandler";
      var args = arguments[0];
      if (args.length > 1 && args[1].indexOf("Handler") > -1) {
        handler = args[1];
      }
      return eval(handler+"(args);");
    }
    catch (e) {
      // trigger probably doesn't exist;  
      alert(e.message);
    }
    return true;
  }

// BasicHandler 
// Replaces parts of the page with new html
// Xml must look like this to work with BasicHandler
/*
<?xml version="1.0" encoding="utf-8"?>
<data>
  <part>
    <target>IDOFPARENTELEMENT</target>
    <content>    
       HTMLCONTENT here
    </content>
  </part>
</data>
*/
function BasicHandler () {
  try {
    var args = arguments[0];
    if (args.length > 0) {
    /*
      var xml = "";
      if (is.ie) {
        xml=httpReq.responseXML.documentElement.xml;
      }
      else {
        var s = new XMLSerializer();
        var str = s.serializeToString(httpReq.responseXML.documentElement);
        if (str+"" != "undefined") xml=str;
      }
      */
      
    
      var xmlObj=httpReq.responseXML.documentElement;
      alert(xmlObj.childNodes.length);
      
      var parts = xmlObj.selectNodes("part");

      if (parts) {
        for (var i = 0; i < parts.length; i++)
        {
          var target = parts[i].selectSingleNode("target").text;
          var content = parts[i].selectSingleNode("content/*").xml;
          document.getElementById(target).innerHTML = content;
        }
      }
    }
  }
  catch (e) {
    // trigger probably doesn't exist;  
    alert(e.message);
  }
}  

function setInnerHTML(elt,code) {
  if (!elt || elt == null) return;
  elt.innerHTML = code;
}

function setOuterHTML(elt,outerHTML) {
  if(elt) {
    if(elt.outerHTML) {
      //ie5+
      elt.outerHTML = outerHTML;
      return;
    }
    else if(elt.innerHTML != undefined) {
      //what is the tag we are trying to replace?
      var innerHTML = '';
      var endtagname = outerHTML.indexOf(' ');
      var tag = outerHTML.substr(1,(endtagname-1));
      var newNode = document.createElement(tag);
      var firstCloseTag = outerHTML.indexOf('>');
      //put the new tag out there
      elt.parentNode.replaceChild(newNode,elt);
      //set the attributes
      //alert('parsing:' + strParse + '.');
      while(strParse.length > 0) {
      var strParse = outerHTML.substr(endtagname+1,firstCloseTag-(endtagname+1));
        if(strParse.substr(0,1) == ' ') {
          strParse = strParse.substr(1,strParse.length);
        }
        else {
          var start = strParse.indexOf('="');
          var attributeName = strParse.substr(0,start);
          var end = (strParse.indexOf('"',(start + 2))) - (start + 2);
          var attributeValue = strParse.substr(start + 2, end);
          newNode.setAttribute(attributeName,attributeValue);
          strParse = strParse.substr(start + end + 4, strParse.length);
        }
      }
      //set the innerHTML
      if(outerHTML.substr(firstCloseTag-1,1) == '/') {
        innerHTML = outerHTML.substr(firstCloseTag +1, outerHTML.length);
      }
      else {
        var i = outerHTML.length - 2;
        var strStartClose = '';
        while(strStartClose != "<" && i>0) {
          strStartClose = outerHTML.substr(i,1);
          i--;
        }
        innerHTML = outerHTML.substr(firstCloseTag +1,i - firstCloseTag);
      }
    newNode.innerHTML = innerHTML;
    return;
    }
  }
}

function getOuterHTML(elt) {
  if(elt.outerHTML) {
    return elt.outerHTML;
  }
  else {
    var strOuter = "";
    var iEmpty = /^(img|embed|input|br|hr)$/i;
    switch(elt.nodeType){
        case 1 :
            strOuter += "<" + elt.nodeName.toLowerCase();
            strOuter += getAttributes(elt);
            if(elt.nodeName.match(iEmpty)){
                strOuter += " />";
            } else {
                strOuter += ">" + getInsideNodes(elt);
                strOuter += "</" + elt.nodeName.toLowerCase() + ">";
            }
            break;
        case 3 :
            strOuter += elt.nodeValue;
            break;
        case 8 :
            cNodesStr += "<!--" + elt.nodeValue + "-->";
            break;
    }
    return strOuter;
  }
}

function getAttributes(elt) {
  var attStr = "";
  if(elt && elt.attributes.length > 0){
      for(a = 0; a < elt.attributes.length; a ++){
          attStr += " " + elt.attributes.item(a).nodeName + "=\"";
          attStr += elt.attributes.item(a).nodeValue + "\"";
      }
  }
  return attStr;
}

function getInsideNodes(elt) {
  if(elt){
      var cNodesStr = "", i = 0;
      var iEmpty = /^(img|embed|input|br|hr)$/i;
      var cNodes = elt.childNodes;
      for(i = 0; i < cNodes.length; i ++){
          switch(cNodes.item(i).nodeType){
              case 1 :
                  cNodesStr += "<" + cNodes.item(i).nodeName.toLowerCase();
                  if(cNodes.item(i).attributes.length > 0){
                      cNodesStr += getAttributes(cNodes.item(i));
                  }
                  cNodesStr += (cNodes.item(i).nodeName.match(iEmpty))? "" : ">";
                  if(cNodes.item(i).childNodes.length > 0){
                      cNodesStr += getInsideNodes(cNodes.item(i));
                  }
                  if(cNodes.item(i).nodeName.match(iEmpty)){
                      cNodesStr += " />";
                  } else {
                      cNodesStr += "</" + cNodes.item(i).nodeName.toLowerCase() + ">";
                  }
                  break;
              case 3 :
                  cNodesStr += cNodes.item(i).nodeValue;
                  break;
              case 8 :
                  cNodesStr += "<!--" + cNodes.item(i).nodeValue + "-->";
                  break;
          }
      }
      return cNodesStr;
  }
}

/**
 *
 * XML DOM-object terugsturen
 *
 */
function loadXML(text) {
  var doc = null;
  // code for IE
  if (window.ActiveXObject) {
    var doc = new ActiveXObject("Microsoft.XMLDOM");
    doc.async = "false";
    doc.loadXML(text);
  }
  // code for Mozilla, Firefox, Opera, etc.
  else {
    var parser = new DOMParser();
    var doc = parser.parseFromString(text,"text/xml");
  }
  
  return doc;
}

/**
 *
 * Select nodes
 *
 */
function SelectNodes(xmlDoc, elementPath) {
  if(window.ActiveXObject) {
    return xmlDoc.selectNodes(elementPath);
  } else {
    //var xpe = new XPathEvaluator();
    var nsResolver = xmlDoc.createNSResolver(xmlDoc.ownerDocument == null?xmlDoc.documentElement:xmlDoc.ownerDocument.documentElement);
    var results = xmlDoc.evaluate(elementPath, xmlDoc, nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

    var nodes = new Array();
    if (results != null) {
      var element = results.iterateNext();
      while(element) {
        nodes.push(element);
        element = results.iterateNext();
      }
    }
    return nodes;
  }
}

/**
 *
 * Select single node
 *
 */
function SelectSingleNode(xmlDoc, elementPath) {
  if(window.ActiveXObject) {
    return xmlDoc.selectSingleNode(elementPath);
  } else {
    //var xpe = new XPathEvaluator();
    // FIRST_ORDERED_NODE_TYPE returns the first match to the xpath.
    var nsResolver = xmlDoc.createNSResolver( xmlDoc.ownerDocument == null ? xmlDoc.documentElement : xmlDoc.ownerDocument.documentElement);
    var result = xmlDoc.evaluate(elementPath,xmlDoc,nsResolver,XPathResult.FIRST_ORDERED_NODE_TYPE, null);
    if (result != null) {
      return result.singleNodeValue;
    } else {
      return null;
    }              
  }
}

/**
 *
 * Get XML output
 *
 */
function getXML(xmlDoc) {
  if(window.ActiveXObject) {
    return xmlDoc.xml;
  } else {
    try {
      var xmls = new XMLSerializer(); 
      var output = xmls.serializeToString(xmlDoc); 
      return output;
    } catch(e) {
      alert(e);
    }
  }
}

function setAttr(element, name, value) {  
  var attribute=element.getAttributeNode(name);  
  if (attribute) {  
    element.removeAttributeNode(attribute);  
  }  
  attribute=document.createAttribute(name);  
  attribute.nodeValue=value;  
  element.setAttributeNode(attribute);  
}   
