/********************************************************************************
 */
var fMozilla	= (typeof document.implementation != 'undefined') && (typeof document.implementation.createDocument != 'undefined') && (typeof HTMLDocument!='undefined');
var fSafari		= navigator.userAgent.toLowerCase().indexOf("safari") != -1;
var ifrOverlay;

function calcAbsolutePos(el)
{
	var o = new Object;
	
	o.width		= el.offsetWidth;
	o.height	= el.offsetHeight;
	
	o.x = 0;
	o.y = 0;
	while(el != null)
	{
		o.x += el.offsetLeft;
		o.y += el.offsetTop;
		
		el = el.offsetParent;
	}
	
	return o;
}

// Positions an element absolutely, positions an iframe underneath to hide selects
function setElementPos(el, x,y,width,height,z)
{
	if (!ifrOverlay)
	{
		ifrOverlay = document.body.appendChild(document.createElement("iframe"));
		ifrOverlay.style.zIndex = 1000;
		ifrOverlay.style.position = "absolute";
	}
	
	el.style.pixelLeft		= x;
	el.style.pixelTop		= y;
	if (width)
		el.style.pixelWidth		= width;
	if (height)
		el.style.pixelHeight	= height;
	
	if (z != undefined)
		el.style.zIndex		= z;   
	else
		el.style.zIndex		= 1001;  
		
	el.style.display		= "block";
	
	ifrOverlay.style.pixelLeft		= el.style.pixelLeft;
	ifrOverlay.style.pixelTop		= el.style.pixelTop;
	ifrOverlay.style.pixelWidth		= el.style.pixelWidth;
	ifrOverlay.style.pixelHeight	= el.style.pixelHeight;
	ifrOverlay.style.display		= "block";
}

function createCallback(fnc)
{
	var args = [];
	for(var i=1; i < arguments.length; i++)
		args.push(arguments[i]);
		
	return function()
	{
		for(var i=0; i < arguments.length; i++)
			args.push(arguments[i]);
			
		return fnc.apply(undefined, args);
	}
}

function createDoc(str)
{
	if (fMozilla)
	{
		//create a DOMParser
		var objDOMParser = new DOMParser();
	        
		//create new document from string
		var objDoc = objDOMParser.parseFromString(str, "text/xml");
 
		return objDoc;
	}
	else
	{
		var myxml = new ActiveXObject("Microsoft.XMLDOM")
		myxml.async = false;
		myxml.loadXML(str);
	
		return myxml;
	}
}

function loadDoc(url, fnc)
{
	var xmlhttp;
	
	if (window.XMLHttpRequest)
	{
		xmlhttp=new XMLHttpRequest();
		xmlhttp.onreadystatechange = createCallback(xmlhttpChange, xmlhttp, fnc);
		xmlhttp.open("GET",url,true);
		xmlhttp.send(null);
	}
	else if (window.ActiveXObject)
	{
		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
		if (xmlhttp)
		{
			xmlhttp.onreadystatechange = createCallback(xmlhttpChange, xmlhttp, fnc);
			xmlhttp.open("GET",url,true);
			xmlhttp.send();
		}
	}
}

function xmlhttpChange(xmlhttp, fnc)
{
	if (xmlhttp.readyState==4)
	{
		if (xmlhttp.status==200)
		{
			fnc(xmlhttp.responseText);
	    }
		else
		{
			fnc();
		}
	}
}

function transformDoc(strDoc, strURLXSL, fnc)
{
	if (fMozilla)
	{
	    var objDOMParser = new DOMParser();
        
	    var objDoc = objDOMParser.parseFromString(strDoc, "text/xml");

		var processor = new XSLTProcessor();
		
		var testTransform = document.implementation.createDocument("", "test", null);
		
		function onload()
		{
			processor.importStylesheet(testTransform);
			
			var newDocument = processor.transformToDocument(domToBeTransformed);
			
		    var xmlSerializer = new XMLSerializer();
		    
			fnc(xmlSerializer.serializeToString( newDocument ));
		}
		
		testTransform.addEventListener("load", onload, false);
		
		testTransform.load(strURLXSL);
		
	}
	else
	{
		var myxml = new ActiveXObject("Microsoft.XMLDOM")
		myxml.async = false;
		myxml.loadXML(strDoc);

		var myxsl = new ActiveXObject("Microsoft.XMLDOM")
		myxsl.async = true;
		myxsl.load(strURLXSL);

		myxsl.onreadystatechange = function ()
		{
			if (myxsl.readyState != 4)
				return;
				
			fnc(myxml.transformNode(myxsl));
		};
	}
}
