function xmlobj (tagid, partner) {
	this.ins = xmlR24.ins;
	this.partner = partner;
	this.tagid = tagid;
	this.query = xmlR24.query;
	this.modul = xmlR24.modul;
	this.jsurl = '';
//	this.test2 = [];
//	this.test1 = function() { alert(1); }
	}

var xmlR24origin = 'http://th.R24.org/xml/';
//var xmlR24origin = 'http://192.168.2.11/xml/v3/';
var xmlR24 = new function xmlR24 (){};
xmlR24.ins = 0;
xmlR24.obj = [];
xmlR24.scripts = [];
xmlR24.partner = '';
xmlR24.thepage = '';
xmlR24.href    = window.location.href;
xmlR24.classID = '.R24hotellist';
xmlR24.cssFile = xmlR24origin + 'xmlR24.css';	
xmlR24.wrapper = xmlR24origin + 'xmlR24toJS.php';
xmlR24.modul   = xmlR24origin + 'R24module1.php';
xmlR24.query   = '&r=bangkok';
xmlR24.tagid   = '';


//	create a new hotellist object
xmlR24.hotellist = function (tagid, partner) {
	xmlR24.ins++; 
	xmlR24.tagid   = tagid; 
	xmlR24.partner = partner; 
	var  css = xmlR24.testcssfile (xmlR24.classID);
    if (!css)  xmlR24.loadcssfile (xmlR24.cssFile, "css");
    xmlR24.obj[xmlR24.ins] = new xmlobj (tagid, partner);
    xmlR24.java2PHP  (xmlR24.ins);
    return xmlR24.obj[xmlR24.ins];
}


//	core function to load hotellist with PHP/JS wrapper
xmlR24.java2PHP = function (ins) {
	var xml = xmlR24.obj[ins ? ins : 1];
	var dwNode = document.getElementById(xml.tagid); 
	blendOpacity(xml.tagid,100,20,200);
//	if (dwNode) dwNode.innerHTML = '<div class="R24loading">Loading hotels ...</div>';
//alert('set '+xml.tagid);

	var qry = '&p=' + xml.partner + xml.query + '&jsurl=' + xmlR24.href;
	var url = xmlR24.wrapper + "?url=" + xml.modul + "&ins=" + ins + "&qry=" + encodeURIComponent(qry);
	xml.jsurl = url;
	xmlR24.loadjavafile(url); // implement the javascript: sync.loading start
	return xml;
}


// calls from the dropdown navigation menus (form with r,v,l)
xmlR24.reloading = function (theform) {
//	if (theform == null) return false; 
	var ins = theform.ins.value;
	var xml = xmlR24.obj[ins ? ins : 1];
	var r,v,l,qry = '';
	try { r = theform.r.value; } catch (err) { r = null; }
	try { v = theform.v.value; } catch (err) { v = null; }
	try { l = theform.l.value; } catch (err) { l = null; }
	if (r) qry += '&r=' + r; 
	if (v) qry += '&v=' + v;
	if (l) qry += '&l=' + l;
	if (qry.length > 0) xml.query = qry;
	xml.query += "&sid="+Math.random(); // don't cache if fading
	xmlR24.removejscssfile(xml.jsurl, "js"); // remove old javascript
	xmlR24.java2PHP (xml.ins); 				 // create new javascript
	return false;
}


// calls from the sorting links (onClick)
xmlR24.resorting = function (ins,qry) {
	var xml = xmlR24.obj[ins ? ins : 1];
	if (qry.length > 0) xml.query = qry;
	xml.query += "&sid="+Math.random(); // don't cache if fading
	xmlR24.removejscssfile(xml.jsurl, "js"); // remove old javascript
	xmlR24.java2PHP (xml.ins); 				 // create new javascript
	return false;
}


// called by the PHP/JS wrapper when sync.loading completed (xmlR24.thepage)
xmlR24.createNode = function (ins) {
		var xml = xmlR24.obj[ins];
		var dwNode = document.getElementById(xml.tagid); 
		if (!dwNode) return;
		dwNode.innerHTML = xmlR24.thepage;
		// Script nodes in innerHTML won't run unless we eval them
    	var runScripts = function(e) {
    	    if (e.nodeType != 1) return;
	        if (e.tagName.toLowerCase() == 'script') { 
	        eval(e.text); 
	        if (e.src) { 
			    xmlR24.removejscssfile(e.src,"js");	// cleanup dup scripts
	        	xmlR24.loadjavafile(e.src);  		// add new script to header
	        	}
	        }  else {
	            var n = e.firstChild;
	            while (n) {
	                if (n.nodeType == 1) runScripts(n);
	                n = n.nextSibling;
	            }
	        }
	    };
		runScripts(dwNode);
		setOpacity(100,xml.tagid);
//alert('reset '+xml.tagid);
}


xmlR24.loadjavafile = function (filename){
	var fileref=document.createElement('script');
	fileref.setAttribute("type","text/javascript");
	fileref.setAttribute("src", filename);
//    fileref.onreadystatechange= function () { if (this.readyState == 'complete') setOpacity(100,xmlR24.tagid); }
//    fileref.onload = function () { setOpacity(100,xmlR24.tagid); }
	if (typeof fileref!="undefined") document.getElementsByTagName("head")[0].appendChild(fileref);
}


xmlR24.loadcssfile = function (filename){
	var fileref=document.createElement("link")
	fileref.setAttribute("rel", "stylesheet")
	fileref.setAttribute("type", "text/css")
	fileref.setAttribute("href", filename)
	if (typeof fileref!="undefined") document.getElementsByTagName("head")[0].appendChild(fileref)
}


xmlR24.removejscssfile = function (filename, filetype){
	var targetfile = [];
	if (filename.indexOf("?") < 0) { targetfile[0] = filename; } else { targetfile = filename.split("\?"); } // ignore things after '?'
	var targetelement = (filetype=="js")? "script" : (filetype=="css")? "link" : "none";  //determine element type to create nodelist from
	var targetattr    = (filetype=="js")? "src"    : (filetype=="css")? "href" : "none";  //determine corresponding attribute to test for
	var allsuspects   = document.getElementsByTagName(targetelement);
	for (var fn,i=allsuspects.length; i>=0; i--) 				  //search backwards within nodelist for matching elements to remove
	     if (allsuspects[i] && allsuspects[i].getAttribute(targetattr)!=null) {   
		    fn = allsuspects[i].getAttribute(targetattr);
		if (fn.substr(0,targetfile[0].length) == targetfile[0])
		    allsuspects[i].parentNode.removeChild(allsuspects[i]) //remove element by calling parentNode.removeChild()
//			alert('found '+fn);
	}
}


xmlR24.testcssfile = function (selector) {
    var rules;
    var haveRule = false;
    if (typeof document.styleSheets != "undefined") {   //is this supported
        var cssSheets = document.styleSheets;
        outerloop:
        for (var i = 0; i < cssSheets.length; i++) {
		try {	//using IE or FireFox/Standards Compliant
				rules =  (typeof cssSheets[i].cssRules != "undefined") ? cssSheets[i].cssRules : cssSheets[i].rules;
		} catch(err) 		// catch FireFox security error for cross-domain stylesheet
		{ return true; }	// assume style is present in that case.
             for (var j = 0; j < rules.length; j++) {
                 if (rules[j].selectorText == selector) {
                         haveRule = true;
                        break outerloop;
                 }
            }//innerloop
        }//outer loop
    }//endif
    return haveRule;
}


function setOpacity (opacity, tag) { 
	try { 	p = document.getElementById(tag).style; 
			p.opacity = (opacity / 100); 
			p.MozOpacity = (opacity / 100); 
			p.KhtmlOpacity = (opacity / 100); 
			p.filter = "alpha(opacity=" + opacity + ")"; 
	} catch (err) {}
} 


function blendOpacity (tag, opacStart, opacEnd, millisec) {
	//speed for each frame
	var speed = Math.round(millisec / 100);
	var timer = 0;
	//determine the direction for the blending, if start and end are the same nothing happens
	if(opacStart > opacEnd) {
		for(i = opacStart; i >= opacEnd; i--) {
			setTimeout("setOpacity (" + i + ",'" + tag + "')",(timer * speed));
			timer++;
		}
	} else if(opacStart < opacEnd) {
		for(i = opacStart; i <= opacEnd; i++)
			{
			setTimeout("setOpacity (" + i + ",'" + tag + "')",(timer * speed));
			timer++;
		}
	}
}


// code run immidately when THIS javafile is load: for moduls in PHP-mode (call5)
//if (typeof xmlMOD != 'undefined') {
	try {
		var tagid = xmlMOD.call5ID.parentNode.id;	
		xmlR24.ins++; 
		xmlR24.modul   = xmlMOD.modul;
		xmlR24.query   = xmlMOD.filter;
		xmlR24.partner = xmlMOD.partner; 
		xmlR24.loadcssfile (xmlR24.cssFile, "css");
	    xmlR24.obj[xmlR24.ins] = new xmlobj (tagid, xmlR24.partner);
		xmlMOD.attachEvents(xmlR24.ins);
	} catch(err) {;}



