﻿/* basic google desktop emulator
   gadgets designed to use this class can run on IE,FIREFOX and Google desktop, although with limited functionality
   
   use:
   	appendElement(div,xml)
   instead of:
   	div.appendElement(xml)
*/
var compat_window = false;
var compat_document = false;
var compat_activex = false;
var compat_image = false;
var fso = null;

// init the google desktop emulator
function browserHook(debugging){
	view = document.getElementById("htmlview");
	view.innerHTML="";
	debug = new Debug(debugging);
}
// create a new element
function appendHTMLElement(parentdiv,xml){
	if(compat_window){
		var tmpEle =createHTMLelement(xml);
		parentdiv.appendChild(tmpEle);
	}else{
		return parentdiv.appendElement(xml);	
	}
	return tmpEle;
}

function removeHTMLElement(parentdiv,childdiv){
	if(compat_window)
		parentdiv.removeChild(childdiv);		
	else
		parentdiv.removeElement(childdiv);
	return null;
}
// moves xml parameters into the 'style' tag so it works accross browsers!
function createHTMLelement(xml){
												//<div id='test'>test text</div> //
		var pos = xml.indexOf(">");			 	//------------->                 //
		var params = xml.substr(1,pos-1); 		// <----------->				 // get node attributes
		var rest = xml.substr(pos+1); 			//               <-------------> // 
		var pos = rest.indexOf("<");			//               -------->		 // 
		if(pos > 0) rest = rest.substr(0,pos);  //               <------->		 // get nodetext
		
		var p = params.split(" ");
		var css = "";
		params =p[0]+" ";	
		var tmpEle = document.createElement(p[0]);		
		tmpEle.style.position="absolute";
		tmpEle.style.left="0px";
		tmpEle.style.top="0px";
		tmpEle.style.padding="0px";
		if(rest!="") tmpEle.innerHTML = rest;
		for(var i=1; i<p.length;i++){
			p2 = p[i].split("=");
			switch(p2[0]){
				case 'src': 
					tmpEle.setAttribute("src",rembrace(p2[1])); break;
				case 'name': tmpEle.setAttribute("name",rembrace(p2[1])); break;
				case 'type': tmpEle.setAttribute("type",rembrace(p2[1])); break;
				case 'value': tmpEle.setAttribute("value",rembrace(p2[1])); break;				
				case 'background': 	tmpEle.style.backgroundColor= rembrace(p2[1]); break;
				case 'x':		 	tmpEle.style.left 			= rembrace(p2[1]); break;
				case 'y': 			tmpEle.style.top 			= rembrace(p2[1]); break;
				case 'width': 		tmpEle.style.width			= rembrace(p2[1]); break;
				case 'height': 		tmpEle.style.height			= rembrace(p2[1]); break;
				case 'visible':		if(rembrace(p2[1])=="true") 
										tmpEle.style.visibility="visible" 
									else 
										tmpEle.style.visibility="hidden"; 
				break;  
			}
		}
		return tmpEle;
}

// remove surrounding speach marks from string
function rembrace(str){
	if(str.length>=2)
		return str.substr(1,str.length-2);
	else
		return "";
}

// hemulate the Debug object from google desktop
function Debug(debugging){
	divdebugger = document.getElementById("htmldebugger");
	//divdebugger = appendHTMLElement(view, "<div width='80%' height='30%' background='#999999' />");
	this.trace = trace;
	function trace(message){
		if(debugging==0) return;
		if(divdebugger.innerHTML.length > 1000) divdebugger.innerHTML="";
		divdebugger.innerHTML=gettmpdate()+": "+message+"</br>"+divdebugger.innerHTML;
	}
	
	this.error = error;
	function error(message){
		if(debugging==0) return;
		if(divdebugger.innerHTML.length > 1000) divdebugger.innerHTML="";
		divdebugger.innerHTML=gettmpdate()+": <b><font color='#FF000000'>"+message+"</font></b></br>"+divdebugger.innerHTML;		
	}
	
	this.warning = warning;
	function warning(message){
		if(debugging==0) return;
		if(divdebugger.innerHTML.length > 1000) divdebugger.innerHTML="";
		divdebugger.innerHTML=gettmpdate()+": <i>"+message+"</i></br>"+divdebugger.innerHTML;		
	}
	
	function gettmpdate(){
		var date = new Date();
		return date.getHours()+":"+date.getMinutes()+" "+date.getSeconds();
	}
}

function openXMLfile(filename, callback){
	//Instantiate the XMLDOM Object that will hold the XML file.
 	var objXML = getXMLDOM(); // new?
	//Turn on asyncronous file loading.
	objXML.async = true;
	if(compat_activex)
		objXML.onreadystatechange = activeXcallback;
	else
		objXML.onload = mozillacallback;
	//Load the XML file.
	objXML.load(filename);
	
	function mozillacallback(){
		callback(objXML);
	}
	function activeXcallback(){
		if(objXML.readyState!=4) return;
		callback(objXML);
	}
}
/*-----------------------
  load external libraries
  -----------------------*/

function checkCompatibility(){
	if (typeof document != 'undefined') 		compat_document=true; 
	if (typeof window != 'undefined') 			compat_window=true;
	if (typeof ActiveXObject != 'undefined') 	compat_activex=true; 
	if (typeof Image != 'undefined') compat_image=true;
}

function checkXMLHTTP(){
	var tmpXML=null, tmpHTTP=null;
	tmpHTTP = getXMLHTTP();
	tmpXML	= getXMLDOM();
	if(tmpHTTP==null){
		//TODO give some nice friendly download message....
		debug.error("ActiveX Microsoft XMLHTTP failed");
		return false;
	}
	if(tmpXML==null){
		//TODO give some nice friendly download message.....
		debug.error("ActiveX Microsoft XMLDOM failed");
		return false;
	}
	tmpXML=null;
	tmpHTTP=null;
	return true;
}

function getFSO(){
	var tmpFSO = null;
	if(compat_activex){
		try{
		tmpFSO = new ActiveXObject("Scripting.FileSystemObject");
		}catch(e){ return null;	}
	}
	return tmpFSO;
}

function getXMLHTTP(){
	var tmpHTTP=null;
	if (compat_activex) {
		try{
			tmpHTTP = new ActiveXObject("Microsoft.XMLHTTP");
		}catch(e){ return null; }
	}else{
		try{
			tmpHTTP=new XMLHttpRequest();
		}catch(e){ return null; }
	}
	return tmpHTTP;
}

function getXMLDOM(){
	var tmpXML=null;
	if(compat_activex){
		try{
			tmpXML= new ActiveXObject("Microsoft.XMLDOM");
		}catch(e){ return null; }
	}else{
		try{
			tmpXML=document.implementation.createDocument("","",null);
		}catch(e){ return null;	}
	}
	return tmpXML;
}
