	function addEvent(obj, ev, handler) {
		if(obj.addEventListener) {
			obj.addEventListener(ev, function(e){handler(e);},true);
		} else if (obj.attachEvent) {
			obj.attachEvent("on"+ev, function(){handler(window.event);});
		} else return false;
		return true;
	}
	
	/*
	function AddEvent(obj, ev, handler) {
		try{
			obj.addEventListener(ev, function(e){handler(e);});
		} catch(e) {
			try {
				obj.attachEvent("on"+ev, function(){handler(window.event);});
			} catch (e) {
				return false;
			}
		}
		return true;
	}
	*/
	
	var alertgiven=false;
    function makeRequest(url, handler, async, xmlhttp) {
		if(typeof async=="undefined") async=true;
		
		if(!xmlhttp){
			xmlhttp=null;
			var success = false;
			
			try {
				xmlhttp = new XMLHttpRequest();
				success=true;
			} catch (e) {
				var MSXML_XMLHTTP_PROGIDS = new Array(
					'MSXML2.XMLHTTP.5.0'
					,'MSXML2.XMLHTTP.4.0'
					,'MSXML2.XMLHTTP.3.0'
//					,'MSXML2.XMLHTTP'
//					,'Microsoft.XMLHTTP'
				);
				
				xmlhttp = null;
				for (var i=0;i < MSXML_XMLHTTP_PROGIDS.length && !success; i++) {
					try {
						xmlhttp = new ActiveXObject(MSXML_XMLHTTP_PROGIDS[i]);
						success = true;
					} catch (e) {}
				}
			}
			
			if(!success){
					if(!alertgiven)
						alert("The page has failed to create the necessery objects for displaying dynamic contents.\nMake sure you have the latest Internet Explorer or Mozilla version.");
					alertgiven=true;
					return false;
			 }
		}

		//alert("opening request "+url);
        xmlhttp.open('GET',url,async);
		
        var myhandler=function() {
            if ( xmlhttp.readyState == 4 ) {
                handler(xmlhttp);
            }
        }
		
		if (async)
			xmlhttp.onreadystatechange = myhandler;
		
        // xmlhttp.setRequestHeader('Accept-Charset','UTF-8');
        // xmlhttp.setRequestHeader('Accept-Language','en-us');
        // xmlhttp.setRequestHeader('Connection','Close');
		
		xmlhttp.setRequestHeader("Cache-Control", "no-cache");
		xmlhttp.setRequestHeader('If-Modified-Since','Wed, 15 Nov 1995 04:58:08 GMT');
	

		try{
			xmlhttp.send(null);
		} catch (e) {}
		
		if (!async)
			myhandler();
			
		return true;
    }

	/*
	//sample request handler
	
    function acceptResponse(xmlhttp) {
        var result
        result = xmlhttp.responseText;
        result += '<b>Response Headers</b><br>';
        var headers = xmlhttp.getAllResponseHeaders();
        result += '<pre>'+headers+'</pre>';
		alert(result);
    }
	
    makeRequest("http://reklami.etaligent.net/elana test/currency.php?",acceptResponse);
	// */
	
	function createProcessor(xmlhttp){
		try{
			var o=new Object;
			o.xsl=xmlhttp.responseText;
			o.xsldoc=xmlhttp.responseXml;
			o.xslproc=new XSLTProcessor();
			o.xslproc.importStylesheet(xmlhttp.responseXML);
			
			o.parsedoc=function(doc){
				var r = this.xslproc.transformToFragment(doc,document);
				try{
					return (new XMLSerializer()).serializeToString(r);
				} catch(e){
					return "Error: "+(e.description?e.description:e);
				}
			}
			
			return o;
		} catch(e) {
			try{
			
			/*
				var o=new Object;
				o.xsl=xmlhttp.responseText;
				o.xslt = new ActiveXObject("Msxml2.XSLTemplate.3.0");
				o.xsldoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.3.0");
				if(!o.xsldoc.loadXML(o.xsl)) return null;
				o.xslt.stylesheet=o.xsldoc;
				o.xslproc=o.xslt.createProcessor();
				
				o.parsedoc=function(doc,target){
					o.xslproc.input=doc;
					try{
						if(!o.xslproc.transform()) return false;
					} catch(e){
						return false;
					}
					return o.xslproc.output;
				};
				
				return o;
				
			///*/ //
			///*
				var o=new Object;
				o.xsl=xmlhttp.responseText;
				o.xsldoc=xmlhttp.responseXML;
				
				o.parsedoc=function(doc){
					try{
						return doc.documentElement.transformNode(this.xsldoc);
					} catch (e) {
						return "Error: "+(e.description?e.description:e);
					}
				}
				return o;
			////*/ ///

			
			} catch (e2) {
				if(!alertgiven){
					alert(e+" "+e.description+"\n"+e2.description);
				}
			}
		}
		return null;
	}


	function selectNode(doc, path){
		try{
			return doc.evaluate(path, doc, null, XPathResult.ANY_TYPE,null).iterateNext();
		} catch (e) {
			try{
				return doc.selectSingleNode(path);
			}catch (e){
				return null;
			}
		}
	}
	
	function pushToArray(el, arr){
		arr[arr.length]=el;
	}
	
	var reloader_ts={};
	
	function addreloader(div){
		var hrefxml=div.getAttribute("hrefxml");
		var hrefxsl=div.getAttribute("hrefxsl");
		var hrefts=div.getAttribute("hrefts");
		var tsnode=div.getAttribute("tsnode");
		
		var r={"div":div, "hrefxml":hrefxml, "hrefxsl":hrefxsl, "hrefts":hrefts, "tsnode":tsnode,  "ts":""};
		
		if (typeof(reloader_ts[hrefts])=="undefined")
			reloader_ts[hrefts]=[];
		
		pushToArray(r,reloader_ts[hrefts]);
		
		makeRequest(hrefxsl,function(xmlhttp){
			r["parser"]=createProcessor(xmlhttp);
			r["xmlhttp"]=xmlhttp;
		},false);
		
		//div.style.background="green"; // for debug, to see the dynamic divs
	}
	
	function updatereloader(r){
		makeRequest(r.hrefxml,function(xmlhttp){
			r.div.innerHTML=r.parser.parsedoc(xmlhttp.responseXML);
		},true,r.xmlhttp);
	}
	
	function reloadertimer(){
		var ts;
		for(ts in reloader_ts) {
			makeRequest(ts,function(xmlhttp){
				var tsdoc=xmlhttp.responseXML;
				//alert("("+tsdoc+"):\n"+xmlhttp.responseText);
				var i;
				for(i=0;i<reloader_ts[ts].length;i++){
					var r=reloader_ts[ts][i];
					
					var tsnode=selectNode(tsdoc,r.tsnode);
					
					if (tsnode && r.parser && r.ts!=tsnode.getAttribute("value")){
						r.ts=tsnode.getAttribute("value");
						updatereloader(r);
					};
				}
			});
		}
	
	/*
		var i;
		for(i=0;i<reloaderscount;i++) {
			var r=reloaders[i];
			if(r["parser"]){
				makeRequest(r["div"].getAttribute("hrefxml"),function(xmlhttp){
					if(r["parser"].parsedoc(xmlhttp.responseXML)!=r["div"].innerHTML)
						r["div"].innerHTML=r["parser"].parsedoc(xmlhttp.responseXML);
				});
			}
		}
	*/
	
		window.setTimeout(reloadertimer,6000);
	}
	
	function initreloaders(){
		ddd=document.getElementsByTagName("div");
		var i;
		for(i=0;i<ddd.length;i++)
			if(ddd[i].getAttribute("hrefxml"))
				addreloader(ddd[i]);
				
		reloadertimer();
	}
	
	addEvent(window,"load",initreloaders);


	
	/*
	var dd;
	try{
		dd=document.implementation.createDocument("","temp",null);
		alert("good");
	} catch(e){
		try{
			dd=new ActiveXObject("Msxml2.DOMDocument.3.0");
			alert("bad");
		} catch(e){
			alert("ugly");
		}
	}
	
	dd.async=true;
	addEvent(dd,"load", function(){alert(42);});
	addEvent(window,"readystatechange", function(){alert(42);});
	
	alert(dd.onreadystatechange);
	dd.onreadystatechange=function(){alert(41);};
	
	dd.load("http://reklami.etaligent.net/elana test/blank.xsl");
	alert(dd.documentElement);
	*/
