﻿function Pet(passportcode,username,password,petname, pettype){
	// local variables
	var me = this;
	var bgimg ="images/background.jpg";
	this.petimg = null;				// the main santa object (what the user seas from this class)
	var pics = Array(), pc=0, cp=0; // pictures, picture count, current picture
	// main Class Objects
	this.passport = new Passport(passportcode,username,password,petname,pettype, constructor);
	this.menu = null;
	this.petobjects = null;
	this.mood = null;
	this.brain = null;
	this.running = false;
	// local file information
	this.dirslash="/";
	this.rootfolder="";
	this.webfolder = ""; 
	this.lifetime=0;
	this.defaultname="";
	this.lblpetname = appendHTMLElement(view,"<label y='20' >Loading...</label>");	
	this.compatible=false;
	if(compat_window) this.lblpetname.style.backgroundColor="#FFFFFF";
	/*---------------------
		Constructor
		work out the pets rootfolder and webfolder
	  ---------------------*/	
	function constructor(worked){
		if(!worked){
			loadOptions();
			showOptions();
			return;	
		}
		debug.trace("PP:"+me.passport.passport+" "+me.passport.appid+" "+me.passport.pettype);	
		debug.trace("entering constructor");	
		saveSettings();

		me.webfolder= "http://www.mydigipet.com/pets/"+me.passport.pettype+"/";
		if(fso==null){ 	// no access to harddrive use website
			me.rootfolder = me.webfolder;
			loadxmlfiles(xmlFileLoaded);
		}else{ 			// running local on hd
			me.dirslash="\\";
			if(!fso.FolderExists(fso.getSpecialFolder(2)+"\\digipet\\")) 
				fso.CreateFolder(fso.getSpecialFolder(2)+"\\digipet\\"); // create the digipet tmp folder
			me.rootfolder =fso.getSpecialFolder(2)+"\\digipet\\"+me.passport.pettype+"\\";
			openXMLfile(me.webfolder+"version.php", download);
		}
		debug.trace("left constructor");
	}
	
	function saveSettings(){
		if(compat_window){
			openXMLfile(
			"http://www.mydigipet.com/app/pet.php?j=s&pp="
			+me.passport.passport+"&u="+me.passport.username+"&p="+me.passport.password
			,settingSaved);			
		}else{
			options.putValue("passport", me.passport.passport);
			options.putValue("username", me.passport.username);
			options.putValue("password", me.passport.password);
		}
	}
	function settingSaved(xmlobj){
	}
	/*--------------------
		Main Functions
	  --------------------*/
	this.getPic = getPic;
	function getPic(index){
		//debug.trace(index);
		return pics[index].src;	
	}
	function xmlFileLoaded(xmldom,id){
		debug.trace("loaded xml "+id);
		if(id==3) loadSettings(xmldom);
		if(id==1) me.petobjects = new PetObjects(me, xmldom);
		if(id==2) me.menu = new PetMenu(me, xmldom); 
		if(id==4) preload(xmldom, preloaded); 
	}
	
	function loadxmlfiles(callback){
		debug.trace("loading xml files");
		statusimg.src="images/loading.JPG";
		var xmlid=0;	
		loadnext();
		function loadnext(){
			var date = new Date();
			xmlid++;
			switch(xmlid){
				case 4: openXMLfile(me.rootfolder+"tasks.xml?cb="+date.getTime(), xmlLoaded); break;
				case 2: openXMLfile(me.rootfolder+"menu.xml?cb="+date.getTime(), xmlLoaded); break;
				case 1: openXMLfile(me.rootfolder+"objects.xml?cb="+date.getTime(), xmlLoaded); break;
				case 3: openXMLfile(me.rootfolder+"pet.xml?cb="+date.getTime(), xmlLoaded); break;
			}
		}
		function xmlLoaded(xmldom){ callback(xmldom,xmlid); xmldom=null; loadnext(); }
	}

	function loadSettings(xmlobj){
		var settings = xmlobj.getElementsByTagName('setting');	
		for(var i=0; i<settings.length; i++){
			switch(settings[i].getAttribute("name")){
				case 'background':
					bgimg=me.rootfolder+settings[i].getAttribute("value");
				case 'lifetime':
					me.lifetime=parseInt(settings[i].getAttribute("value"))*24*60*60;
				case 'defaultname':
					me.defaultname=settings[i].getAttribute("value");
				case 'version':
					if(settings[i].getAttribute("value")==VERSION) me.compatible=true;
				break;
			}
		}		
		me.mood = new PetMood(me, xmlobj);	
	}
	
	function preloaded(worked,xmlobj){
		if(compat_window){
			width = parseInt(view.style.width.replace("px",""));
			height= parseInt(view.style.height.replace("px",""));
		}else{
			width = view.width; height = view.height;
		}
		loadOptions(width,height);
		if(!me.compatible){ 
			stopPet(me.rootfolder+"images"+me.dirslash+"peterror.gif","pet is incompatible with framework. Or does not exist, Get an updated framework at: http://www.mydigipet.com","pet is incompatible with framework"); 
			return; 
		}
		if(!worked){ 
			stopPet(me.rootfolder+"images"+me.dirslash+"peterror.gif","loading some images failed, please refresh.","loading some images failed"); 
			return; 
		}
		me.petimg = me.petobjects.getObjectByName("petimg");
		if(me.petimg==null){
			stopPet("peterror.gif","failed to load pet objects, please try refreshing.","failed to load petimg"); 
			return; 
		}
		resizePet();
		statusimg.onmouseover=me.menu.hideMenu;
		me.petimg.element.onmouseover=me.menu.showMenu;
		statusimg.src=bgimg;	
		me.running=true;
		me.brain = new Brain(me,xmlobj);
		// make all objects visible (easier for user to use pet)
		me.petimg.setVisible(true);		
		for(var i=0; i<me.petobjects.getObjectCount();i++){
			me.petobjects.getObject(i).setValue(10);	
		}
		// write pets name		
		if(me.passport.petname=="") me.passport.petname=me.defaultname;
		if(compat_window)
			me.lblpetname.innerHTML = me.passport.petname;
		else
			me.lblpetname.innerText = me.passport.petname;
	}

	this.stopPet = stopPet;
	function stopPet(img, msgtext, dbgtext){
		if(me.petimg!=null && img!="") me.petimg.setImage(me.rootfolder+"images"+me.dirslash+img);
		if(msgtext!="") alert(msgtext);
		if(dbgtext!="") debug.error(dbgtext);
		if(me.brain!=null) me.brain.running=false;
		if(me.petimg==null) showOptions();
	}
	
	this.resizePet = resizePet;
	function resizePet(){
		imgX = parseInt((width/2)-(me.petimg.getWidth()/2));
		imgY = parseInt(height-me.petimg.getHeight()-10);
		me.petimg.setX(imgX); me.petimg.setY(imgY);
		me.mood.setPos(me.petimg); me.menu.setPos(me.petimg);
	}

	this.destroy = destroy;
	function destroy(){
		statusimg.onmouseover="";
		me.running=false;
		if(me.brain!=null) me.brain.destroy();
		if(me.menu!=null) me.menu.destroy();
		if(me.petobjects!=null) me.petobjects.destroy();
		if(me.mood!=null) me.mood.destroy();
		if(compat_window) view.removeChild(me.lblpetname); else view.removeElement(me.lblpetname);
		me.lblpetname=null;
	}


	/*----------------------------------- 
		preload and download class handlers
			downloads and or preloads all files
			into memory.
    -----------------------------------*/
	function preload(xmldom,callback){
		var j=0, ELEMENT_NODE = 1
		var ele, tmpNode;
		var tasks = xmldom.getElementsByTagName('tasks');
		var loadcount=0,inloop=true;
		var objNewNode=null, objNewText=null;
		var progressback = appendHTMLElement(view,"<div x='20%' y='90%' width='60%' height='5%' background='#000000' />");
		var progressbar  = appendHTMLElement(progressback,"<div x='0' y='0' height='100%' width='50%' background='#6666FF' />");

		for(var i=0; i<tasks.length; i++){
			for (j=0; j < tasks[i].childNodes.length; j++){
				if (tasks[i].childNodes[j].nodeType != ELEMENT_NODE) continue;
				ele = tasks[i].childNodes[j];
				tmpNode = ele.getElementsByTagName("pic")[0];
				if(tmpNode!=null&&tmpNode.childNodes.length > 0) pic = tmpNode.firstChild.nodeValue; else pic="";
				tmpNode = ele.getElementsByTagName("frames")[0];
				if(tmpNode!=null&&tmpNode.childNodes.length > 0) picframes = tmpNode.firstChild.nodeValue;	else picframes=0;			
				objNewNode = xmldom.createElement("picid") 
				objNewText = xmldom.createTextNode(pc) 
				objNewNode.appendChild(objNewText) 
				tasks[i].childNodes[j].appendChild(objNewNode) 

				for(p=1; p<=picframes; p++){
					if(compat_image){
						pics[pc] = new Image();
						pics[pc].onload=imgLoaded; pics[pc].onerror=imgError; pics[pc].onabort=imgAbort;
						pics[pc].src=me.rootfolder+"images/"+pic+p+".gif";
					}else{
						pics[pc] = appendHTMLElement(view,"<img visible='false' />");
						pics[pc].src=me.rootfolder+"images\\"+pic+p+".gif";
						imgLoaded();
					}
					pc++;
				}
			}
		}
		inloop=false; checkComplete();
		function checkComplete(){
			if(inloop) return;
			if(compat_window)	
				progressbar.style.width=parseInt(loadcount/pc*100)+"%";
			else
				progressbar.width=parseInt(loadcount/pc*100)+"%";

			if(loadcount==pc){
				if(compat_window)
					progressback.style.visibility="hidden";
				else
					progressback.visible=false;

				callback(true,xmldom);
			}
		}
		// image loaded events
		function imgLoaded(){ loadcount++; checkComplete(); }
		function imgError(){ callback(false,xmldom); }
		function imgAbort(){ callback(false,xmldom); }	
	}

	function download(xmlobj){
		statusimg.src="images\\downloading.JPG";
		if(fso.FolderExists(me.rootfolder)){
			// check if pet up to date?
			//init();
			loadxmlfiles(xmlFileLoaded);
			return;
		}
		fso.CreateFolder(me.rootfolder);
		// constructor
		var progressback = appendHTMLElement(view,"<div x='20%' y='90%' width='60%' height='5%' background='#000000' />");
		var progressbar  = appendHTMLElement(progressback,"<div x='0' y='0' height='100%' width='50%' background='#6666FF' />");
		var curfile="",files = Array(), fc =0,cd=0; 
		var xmlhttp = null,xmlfiles = xmlobj.getElementsByTagName('files');
		downloadFolder(xmlfiles[0],"");	// create download file list
		downloadNext();									// begin downloading from file list
		// functions to update download list
			// add all files in folder to download list
			function downloadFolder(parentnode,folder){
				if(!fso.FolderExists(me.rootfolder+folder)) fso.CreateFolder(me.rootfolder+folder);

				for(var i=0; i<parentnode.childNodes.length; i++){
				if(parentnode.childNodes[i].tagName=="file")
					appendFile(folder+parentnode.childNodes[i].firstChild.nodeValue);
				else
					downloadFolder(parentnode.childNodes[i],folder+parentnode.childNodes[i].tagName+"/");
				}
			}
			// add file to download list
			function appendFile(filename){ files[fc] = filename; fc++; }
		// functions to download from download list
			function downloadNext(){
				debug.trace(cd+" "+fc);
				if(cd==fc){
					progressback.removeElement(progressbar);
					view.removeElement(progressback);
					//init();
					loadxmlfiles(xmlFileLoaded);
				}else{
					progressbar.width = parseInt((cd/fc)*100)+"%"
					xmlhttp = new getXMLHTTP();
					curfile = files[cd].replace("/","\\");
					xmlhttp.open ("GET", me.webfolder+files[cd], true);
					cd++;
					xmlhttp.onreadystatechange = gotdownloaddata;
					xmlhttp.send();
				}
			}
			// got file data
			function gotdownloaddata(){
				if(xmlhttp.readyState!=4) return;	// is download complete?
				var strHDLocation = me.rootfolder+curfile;
				// fso doesn't do binary, so we save it in a database first
				var objADOStream = new ActiveXObject("ADODB.Stream");
				 objADOStream.Open()
				 objADOStream.Type = 1; // 'adTypeBinary	 
				 objADOStream.Write(xmlhttp.ResponseBody);
				 objADOStream.Position = 0;//    'Set the stream position to the start
				// cannot replace files so delete first
				 if(fso.Fileexists(strHDLocation)) fso.DeleteFile(strHDLocation);
				// save database to disk (file)
				 objADOStream.SaveToFile(strHDLocation);
				 objADOStream.Close();
				 objADOStream = null;
				// move on to next file
				 xmlhttp=null;
				 downloadNext();
			}
	}
}
