/*  ==================================================================================================================
FILE 				: XMLXSLTparser.js
DESCRIPTION 		: This javascript fille provides parsing for  XML files.  After the parsing of an XML and an XSL file , an XSLT transformation can be performed on client side.
COMPATIBILITY 		: IE6+ ; NN  ; FF
ATTENTION 			: url 's are provided for local testing as  "file ://"
AUTHOR 				: J.Vannieuwenhuyse  - Feb , 2007
==================================================================================================================*/

function XMLXSLTparser (sFileName){
   var _FileName = sFileName;
   this.FileName = function() {
      return _FileName
   }
   ;
}

XMLXSLTparser.prototype = {
   parseXML:function(sFileName) {
      if (navigator.userAgent.indexOf("MSIE") != -1) {
         //1A. IE : een instantie van het DOM document aanmaken
         oDomDoc =  new ActiveXObject("Msxml2.FreeThreadedDOMDocument");
         oDomDoc.validateOnParse=true		//default : true
      }

      if ( (navigator.appName =='Netscape') && ( navigator.userAgent.indexOf('Opera') == -1) ) {
         //1B.Mozilla:een instantie van het DOM document aanmaken
         oDomDoc = document.implementation.createDocument("MijnNS", "rootElement", null);
         //voor snelheid van parsing: een eventlistener toevoegen
         oDomDoc.addEventListener("load", documentLoaded, false);
         //NN alternatief op oDom.async
      }

      //2.opladen in het geheugen
      oDomDoc.async = false;
      // true = wacht niet op volledige parsing
      oDomDoc.validateOnParse=true	;
      oDomDoc.load(sFileName);
      documentLoaded("");
      clean(oDomDoc.documentElement)
      return oDomDoc
   }
   ,

   transformXML:function(xmlURL, xslURL , arrParam){
      //5. Parsen van de  XML file :
      oDomDocXML = this.parseXML(xmlURL) ;
      //6. Parsen van de XSL file  :
      oDomDocXSL = this.parseXML(xslURL) ;
      //7. transformatie uitvoeren
      var processor ;
      var  sNewDocument ;

      if ( (navigator.appName =='Netscape') && ( navigator.userAgent.indexOf('Opera') == -1) ) {
         processor = new XSLTProcessor();
         processor.importStylesheet(oDomDocXSL);
         //8. parameters toevoegen binnen Mozilla
         if ( arguments.length > 2) {
            for ( i=0 ; i<arguments.length-2 ; i++)  {
               sParamTxt ='param'+i  //param0 ; param1 ...
               sParamValue = arguments[2+i] ;
               //alert(sParamTxt + ":" + sParamValue) // Moz.debugging purposes only
               processor.setParameter( null, sParamTxt, sParamValue) ;
               //namespace, localName , value
            }
         }
         oNewDocument = processor.transformToDocument(oDomDocXML);
         var oSerializer = new XMLSerializer();
         // blijft anders een (HTML) object .
         sNewDocument = oSerializer.serializeToString(oNewDocument);
      }
      else {
         var xslt = new ActiveXObject("Msxml2.XSLTemplate");
         xslt.stylesheet = oDomDocXSL;
         var xslProc = xslt.createProcessor();
         xslProc.input = oDomDocXML;
         //8. parameters toevoegen binnen IE
         if ( arguments.length > 2) {
            for ( i=0 ; i<arguments.length-2 ; i++)  {
               sParamTxt ='param'+i  //param0 ; param1 ...
               sParamValue = arguments[2+i] ;
               //alert(sParamTxt + ":" + sParamValue) // IE debugging purposes only
               xslProc.addParameter( sParamTxt, sParamValue);
            }
         }
         //9. transformatie uitvoeren
         xslProc.transform();
         sNewDocument = xslProc.output	// prerendering noodzakelijk alvorens return
         //		sNewDocument = oDomDocXML.transformNode(oDomDocXSL)
      }
      //test and debugging purposes only
      //alert ( sNewDocument)  // transformed document
      return sNewDocument
   }

}

function documentLoaded(e) {
   var sXML ;
   var  sErrorXML ;
   //3A. foutdetectie IE
   if (navigator.userAgent.indexOf("MSIE") != -1) {
      sErrorXML = oDomDoc.parseError;
      if (sErrorXML.errorCode != 0 ) {
         alert( sErrorXML.reason + '\n Line ' + sErrorXML.line ) ;
      }
      else {
         sXML =oDomDoc.xml
      }
   }
   // 3B.foutdetectie NN
   if ( (navigator.appName =='Netscape') && ( navigator.userAgent.indexOf('Opera') == -1) ) {
      //Mozilla voorziet actueel geen XML validatie (DTD/Schema)
      if (oDomDoc.documentElement.nodeName == "parsererror") {
         var oXMLSerializer = new XMLSerializer();
         sErrorXML= oXMLSerializer.serializeToString(oDomDoc);
         alert (sErrorXML);
      }
      else {
         // test purposes only- object naar string convertor
         var oSerializer = new XMLSerializer();
         var sXML = oSerializer.serializeToString(oDomDoc);
         //alert (sXML)
      }
   }
   //4. test  en dugging purposes only : show loaded XML file
   //window.alert (sXML);
   //window.alert (oDomDoc.documentElement.nodeName + " is  loaded .") ;
}

function showInWindow(sNewDocument, iWidth, iHeight , iLeft , iTop  ) {
   var newWindow = window.open("", "XSL_Transformation", 'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=auto, resizable=yes,copyhistory=yes,width='+iWidth+',height='+iHeight+', left='+iLeft+', top='+iTop+'');
   newWindow.document.write(sNewDocument);
   newWindow.document.close();
}

function  getAppLocation() {
   //FF verwacht het fullpath bij local rendering
   applicationLocation= unescape(document.location.href.substring(0 , location.href.lastIndexOf("/")+1));
   // substring 10 wo disk
   return applicationLocation
}

function clean(oNode) {
	for (var i=0 ; i<oNode.childNodes.length ; i++) {
		if ((oNode.childNodes[i].nodeType==3)&& oNode.childNodes.length>1&& oNode.childNodes[i].nodeValue.charCodeAt(0)==10) {
			oNode.removeChild(oNode.childNodes.item(i));
		}
	}
	
	var children = oNode.childNodes;
	for (var z=0;z<children.length;z++){
		if (children[z].nodeType==1 && children[z].hasChildNodes) {
			clean(children.item(z));
		}
	}
}
