
var xpath_checker = {};

xpath_checker = {

init: function()
 {
// document.getElementById("query").onclick = function() { xpath_checker.reset_field('query') };
// document.getElementById("xml").onclick = function() { xpath_checker.reset_field('xml') };
 xpath_checker.check();
 }

,reset_field: function(id)
 {
 var el = document.getElementById(id);
 if (el.value && !el.getAttribute('reset'))
  {
  el.value = "";
  el.setAttribute('reset',true);
  document.getElementById("result").value="";
  }
 }

,check: function(e)
 {

 xpath_checker.xmlString = "";

 var xPath = document.getElementById("query").value;

 var xmlString = document.getElementById("xml").value;

 if (xmlString!=xpath_checker.xmlString)
  {
  xpath_checker.xmlString = xmlString;
  xpath_checker.xmlDoc = xpath_checker.createXMLDoc(xmlString);
  }

 var e = e || event;

 if(!xpath_checker.isSpecialKey(e.keyCode) && xPath!="" && xmlString!="")
  {
  
  e.cancelBubble = true;

  document.getElementById("result").value = "";

  var nodes = xpath_checker.selectNodes(xpath_checker.xmlDoc, xPath)

//  alert(nodes.length)

  if (nodes)
   {
   var result = "";
   for (var i=0;i<nodes.length;i++)
    {
    result+=xpath_checker.getNodeView(xpath_checker.selectSingleNode(nodes[i],"."))+"\n";
    }
   document.getElementById("result").value = result;
   }
  
  }
 else 
  return true;
  
 }

,getNodeView: function(node)
 {
 var result = "";
 
 var attr = "";

 if (node.attributes && node.attributes.length>0)
  {
  attr = " ";
  for (var i=0;i<node.attributes.length;i++)
   attr+=node.attributes[i].nodeName+"=\""+node.attributes[i].nodeValue+"\" ";
  }

 var internal = (node.childNodes[0] && node.childNodes[0].nodeValue)?node.childNodes[0].nodeValue.substr(0,30):"";
 result =  "<"+node.tagName+attr+">"+internal+"...</"+node.tagName+">";

 return result;
 }

,selectNodes: function(DomElement, XPathPattern)
 {

 if (window.ActiveXObject)
  DomElement.setProperty("SelectionLanguage", "XPath");

//alert([DomElement, XPathPattern])
    
    if ((XPathPattern ==  null) || (DomElement == null) || (XPathPattern == ""))
        return null;
        
    if (window.ActiveXObject)
     {
        var result;
        try {
        result = DomElement.selectNodes(XPathPattern)
        }
        catch(ex) { return false; }
        return result;
     }
    else
    {
//    alert('here')
//        alert(new XPathEvaluator().evaluate(XPathPattern, DomElement))
        var theParentDoc = (DomElement.nodeName == '#document') ? DomElement : DomElement.ownerDocument;       
        var iterator = theParentDoc.evaluate(XPathPattern, DomElement, null, XPathResult.ANY_TYPE, null);       
        var relayArr = new Array();
        var index=0 
        while(item = iterator.iterateNext()) 
        {
           relayArr [index] = item;
           index++
        }         
        return  relayArr;      
    }        
}

,selectSingleNode: function(DomElement, XPathPattern)
 {
    if ((XPathPattern ==  null) || (DomElement == null))
     {
     return null;
     }

    if (window.ActiveXObject)
     {
     return  DomElement.selectSingleNode(XPathPattern);
     }
    else
     {
        var theParentDoc = (DomElement.nodeName == '#document') ? DomElement : DomElement.ownerDocument;
        var iterator = theParentDoc.evaluate(XPathPattern, DomElement, null, XPathResult.ANY_TYPE, null);
         var theNode = iterator.iterateNext();
         if (theNode != null)
         {      
             return theNode;
        }
        else
        {            
            return null;
        }
    }        
 }  

,createXMLDoc: function(xmlString)
  {

  if (window.ActiveXObject)
   {
   var xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" );
   xmlDoc.async = false;
   xmlDoc.loadXML(xmlString); 
   }
  else
   {
   var xmlDoc = new DOMParser().parseFromString( xmlString, "text/xml" );
   }

  return xmlDoc;
  }

,getNodeText: function (node)
 {
	if (typeof(node) != "object")
		return ''; 
	
	if (!node)
		return '';
	
	if (!node.hasChildNodes())
		return '';
		
	return node.childNodes[0].nodeValue;
}

,isSpecialKey: function(k)
 {
            return k == 9 || k == 13  || k == 40 || k == 27 ||
            (k == 16) || (k == 17) ||
            (k >= 18 && k <= 20) ||
            (k >= 33 && k <= 35) ||
            (k >= 36 && k <= 39) ||
            (k >= 44 && k <= 45);
 }

,help: function()
 {
 var h = document.getElementById('help');
 if (h.style.visibility == "visible")
  {
  h.style.visibility = "hidden";
  }
 else
  {
  var dw = document.body.clientWidth;
  h.style.left = parseInt(dw/2);
  h.style.visibility = "visible";
  }
 }



}