/*
  
              ___.                                        ___.     ___.   .__        
  ____ ___.__.\_ |__   ___________          __  _  __ ____\_ |__   \_ |__ |__|_______
_/ ___<   |  | | __ \_/ __ \_  __ \  ______ \ \/ \/ // __ \| __ \   | __ \|  \___   /
\  \___\___  | | \_\ \  ___/|  | \/ /_____/  \     /\  ___/| \_\ \  | \_\ \  |/    / 
 \___  > ____| |___  /\___  >__|              \/\_/  \___  >___  / /\___  /__/_____ \
     \/\/          \/     \/                             \/    \/  \/   \/         \/

  <=======[ www.cyber-web.biz 2004-2007 ]================[ Code:Vidar Larsen ]===========>


  backward browser compatibility abolished to boost speed 
  performance ( and to avoid external function lookups )
  

		Please not that this javascript gametool has undergone  some radical changes in 2007
		and is  no  more compatible with old browsers. Some functions are gone  and it could 
		seem for a trained eye that code is being repeated unesserily, but this is only done 
		to increase the speed of games using this tool.




*/
//window.onerror = stopError;
/************[This function stop most errors when enabled]********/
function stopError(msg, url, lno) { 
	alert(msg+"  "+url+"  "+lno);
	return true; 
}//	(S)Smart solutions international::.

var errFuncNm  = new Array();
var errMessage = new Array();
var errCount   = 0;
var errOpen    = false;
var showErr	   = true;
function error(functionNm,message) {
	errFuncNm[errCount] = functionNm;
	errMessage[errCount] = message;
	if (errCount==0) {
		makeDiv("errDiv",2,2,'<a href="javascript:viewErr();" onClick="viewErr();">[ERR]</a><br>',40,16,"auto");
		setZ("errDiv",99);
		if (!showErr) hide("errDiv");
	}
	errCount++;
	return true;
}

function viewErr() {
	if (!errOpen) {
	
		resize("errDiv",300,300);
		setZ("errDiv",10);
		setBgColor("errDiv","#0072bc");
		
		buff = '<a href="javascript:viewErr();" >[ERR]</a><br>';
		for (t=0;t<errCount;t++) buff+='Error in function ['+errFuncNm[t]+'(...)] <br> '+errMessage[t]+'<br><hr><br>';
		newContent("errDiv",buff);
		errOpen = true;
		
	} else {
		
		resize("errDiv",40,16);
		newContent("errDiv",'<a href="javascript:viewErr();" >[ERR]</a>');
		errOpen = false;
		
	}

}

ns6 = document.getElementById; ns  = document.layers; ie  = document.all;

if (!ns6) alert("Sorry, this site is using latest javascript technologies and your browser does not support it!");


                




/*******************[AccessCSS]***********************************/
function accessCSS(layerID)	{
  if(ns6){ try {return document.getElementById(layerID).style} catch(err) { error("accessCSS",'layernm = ['+layerID+']'); }  }     //
   else if(ie){ return document.all[layerID].style; }         //
    else if(ns){ return document.layers[layerID]; }          //
}/***********************************************************/



function moveRelative(layer,x,y)  { 
	//accessCSS(layer).left=x; accessCSS(layer).top = y;
	accessCSS(layer).moveBy(x,y);
	 
} 

function wr(stringToWrite) {document.write(stringToWrite);}
function move(layer,x,y)  { document.getElementById(layer).style.left=x; document.getElementById(layer).style.top = y; } 
function imgResize(imgnm,x,y) { accessCSS(imgnm).width=x;accessCSS(imgnm).height=y; } // Only IE for fast imageresize ( old function )
function imgCrossResize(layer,imgnm,x,y) {newContent(layer,'<img src="'+imgnm+'" width="'+x+'" height="'+y+'">');}   

/*********[MOUSE]**********/
var mouseX=0;var mouseY=0;	
var onSpacebarPressed="";
/*========================================================================*/
	if (ns6 && !ie) {document.addEventListener('mousemove', mouseMove, true);}
 	else if (ns) document.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP);
 	document.onmousemove = mouseMove;

function mouseMove(evt) {  // CrossBrowser 
  mouseX = document.all ? event.clientX+document.body.scrollLeft : document.layers ? evt.x+window.pageXOffset : evt.clientX+window.pageXOffset;
  mouseY = document.all ? event.clientY+document.body.scrollTop : document.layers ? evt.y+window.pageYOffset : evt.clientY+window.pageYOffset;
}

//>~~~~<[Change content of layer]>~~~~~~~~~~~~~~~~~~~~>
function newContent(layernm,content) { 

try { document.getElementById(layernm).innerHTML=content; } catch(err) { error("newContent",'layernm = ['+layernm+']  content= ['+content+']'); }

}


function makeDiv(objName,x,y,content,w,h,overfl,parentDiv) {	  

		var oDiv = document.createElement ("DIV");
		oDiv.id = objName;
		if (w) oDiv.style.width = w;
		if (h) oDiv.style.height= h;
		if (content) oDiv.innerHTML=content;
		oDiv.style.position = "absolute";
		if (x!=null) oDiv.style.left=x; else oDiv.style.left=-2000;
		if (y!=null) oDiv.style.top=y; else oDiv.style.top=-2000;
		if (overfl) oDiv.style.overflow=overfl; else oDiv.style.overflow="hidden";

		if (parentDiv) document.getElementById(parentDiv).appendChild (oDiv);
		 else document.body.appendChild(oDiv);
	
		
		delete oDiv;
}

function removeElement(divName,parentDiv) {
  if (parentDiv) var d = document.getElementById(parentDiv);
   else d = document.body;
  var olddiv = document.getElementById(divName);

  document.body.removeChild(olddiv);
}

function scrollWindow(x,y) {
	//gamewindow.scrollTo(x,y);
	gamewindow.scrollTop = y;
		gamewindow.scrollLeft = x;
}

function randomize(maxNumber) { var r=Math.random()*maxNumber; r=Math.floor(r); return r; }
function scrollWindowLeft(howMuch) {	window.scrollBy(howMuch,0); }
function scrollWindowRight(howMuch) {	window.scrollBy(-howMuch,0); }
function setBgColor(layernm,bcol) {if (document.layers) accessCSS(layernm).bgColor=bcol;else accessCSS(layernm).backgroundColor=bcol;}
function setHeight(layernm,nyHoyde) {	accessCSS(layernm).height=nyHoyde; }
function setWidth(layernm,nyBredde) {	accessCSS(layernm).width=nyBredde; }
function resize(layernm,w,h) {setWidth(layernm,w);setHeight(layernm,h);}
function setZ(layer,zNR) { accessCSS(layer).zIndex=zNR; }
function hide(layer) { try {accessCSS(layer).visibility= "hidden"; } catch(err) {error("hide",'layernm = ['+layer+']');} }
function show(layer) { if (ns) accessCSS(layer).visibility="show";else accessCSS(layer).visibility="visible"; }
function setAlpha(layername,filterCount) { eval(' accessCSS("'+layername+'").filter="alpha(opacity='+filterCount+')";   ');}
function mouseUp(){}
function setOverflow(layernm,scrollit) { accessCSS(layernm).overflow=scrollit; }
function setOverflowX(layernm,scroll) { accessCSS(layernm).overflowX=scroll; }
function setOverflowY(layernm,scroll) { accessCSS(layernm).overflowY=scroll; }
function getWidth(layernm) { return parseInt((accessCSS(layernm).width));}
function getHeight(layernm) { return parseInt((accessCSS(layernm).height));}

function getX(obj) { return parseInt(document.getElementById(obj).style.left); }
function getY(obj) { return parseInt(document.getElementById(obj).style.top); }

function setPosition(layernm,pos) { accessCSS(layernm).position=pos; }
function setBodyBGcolor(color) {document.bgColor=color;}

function setBodyBackground(imgNm) { if (document.body) document.body.background = imgNm; }
function addContent(layernm,content) {if (ns6) { document.getElementById(layernm).innerHTML+=content; } }
function clipObj(layerName,Ctop,Cright,Cbottom,Cleft) { document.getElementById(layerName).style.clip='rect('+Ctop+','+Cright+','+Cbottom+','+Cleft+')'; }
function getHTML(obj) { return document.getElementById(obj).innerHTML; }


function divInsideDiv(parentDiv,childDiv) { document.getElementById(parentDiv).appendChild (childDiv); }

function getScrollY() {
	if (window.pageYOffset) return window.pageYOffset;
	 else return  document.body.scrollTop;
}

function getScrollX() {
	if (window.pageXOffset ) return window.pageXOffset;
	 else return  document.body.scrollLeft;
}


//>-----------------------------------=::[ Doc -> Iframe -> Div ]::=-------------------------------->
var activeBuffer = 0;
var divNm = new Array();
var docNm = new Array();
var maxMemBuff = 20;

for (t=0;t<maxMemBuff;t++) wr('<iframe onLoad=fromBufferToDiv('+t+'); name="frameBuffer'+t+'" id="frameBuffer'+t+'" style="visibility:hidden;height:0px;width:0px;left:-1000;top:-1000;"></iframe>');

function divLoadDoc(divID,docUrl) {  
	var alreadyBuffered = false;
	
	if (activeBuffer>0) {
		for (t=0;t<docNm.length;t++) {
			if (docNm[t] == docUrl) {//already in another iframe buffer -> no need to load it from server again - just buffering instead
				fromBufferToDiv(t);
				alreadyBuffered = true;
			}
		}
	
	}
	if (!alreadyBuffered) {
		if (activeBuffer>maxMemBuff) activeBuffer = 1;
		docNm[activeBuffer] = docUrl;
		divNm[activeBuffer] = divID;
		document.getElementById("frameBuffer"+activeBuffer).src=docUrl;
		activeBuffer++;
	}
}
function fromBufferToDiv(nr) {//Finish load doc - external url = permission denied
	//if (activeBuffer>1) {// preventing outoload Bug on startup
	
	 var buff = window.frames["frameBuffer"+nr].document.body.innerHTML;
	 
	 //if (window.frames["frameBuffer"+nr].document.body.innerHTML=="") <-- this doesnt work in opera, so I made a work around below. It works in all browsers
	 // this is because Opera puts in 3 chars?? in the innerhtml of the empty loaded page when the browser loads the website 
	if (buff.length>3) setTimeout('newContent(divNm['+nr+'],window.frames["frameBuffer"+'+nr+'].document.body.innerHTML);',2);

	
	/*
		if (window.frames["frameBuffer"+nr].document.body.innerHTML==null) alert("null");
		 else if (window.frames["frameBuffer"+nr].document.body.innerHTML=="") alert("tom"); 
		 else if (window.frames["frameBuffer"+nr].document.body.innerHTML==undefined) alert("undefined"); 
	*/
	//if(window.frames["frameBuffer"+nr].document.body.innerHTML.length>4) {
	
			//}
		//need this to flush buffer -> No double sound on tv-channels
		//setTimeout('window.frames["frameBuffer'+nr+'"].document.body.innerHTML="EMPTY";',2000);//FireFox bug sometimes, too short time, not fully loaded??
	//}
}


//>-------------------------------------------------------------------------------------------------->

function getAbsX(obj) {
	// Get an object left position from the upper left viewport corner
	// Tested with relative and nested objects
	o = document.getElementById(obj)
	oLeft = o.offsetLeft;            // Get left position from the parent object
	while(o.offsetParent!=null) {   // Parse the parent hierarchy up to the document element
		oParent = o.offsetParent;    // Get parent object reference
		oLeft += oParent.offsetLeft; // Add parent left position
		o = oParent;  // its correct with "=" dont change later
	}
	return oLeft;
}

function getAbsY(obj) {
	// Get an object top position from the upper left viewport corner
	// Tested with relative and nested objects
	o = document.getElementById(obj);
	oTop = o.offsetTop;            // Get top position from the parent object
	while(o.offsetParent!=null) { // Parse the parent hierarchy up to the document element
		oParent = o.offsetParent;  // Get parent object reference
		oTop += oParent.offsetTop; // Add parent top position
		o = oParent; // its correct with "=" dont change later
	}
	return oTop;
}




function browserWidth() {
	if (window.innerWidth) return window.innerWidth;
	 else if (document.body.clientWidth) return document.body.clientWidth;
	  else return 1024;
}

function browserHeight() {
	if (window.innerHeight) return window.innerHeight;
     else if (document.body.clientHeight) return document.body.clientHeight;
      else return 800;
}


function centerDivBrowser(divNm,wi,he) {
	if (wi) var w = wi; else var w = getWidth(divNm);
	if (he) var h = he; else var h = getHeight(divNm);
	var bw = browserWidth();
	var bh = browserHeight();
	var scrollY = getScrollY();
	
	var newX = Math.round((bw/2)-(w/2));
	var newY = Math.round((bh/2)-(h/2))+scrollY;
	if (newX<0) newX = 0; // failsafe
	if (newY<0) newY = 0;
	
	
	move(divNm,newX,newY);
	//alert(divNm+" x="+newX+" y="+newY);
}



/* ONLY USE MAKEDIV FROM NOW ON
function createElementInsideDiv(parentDiv,childDiv,content,x,y,overfl) {
		var oDiv_inside= document.createElement("DIV");
		oDiv_inside.id=childDiv;
		oDiv_inside.style.position = "absolute";
		oDiv_inside.style.left=x;
		oDiv_inside.style.top=y;
		if (overfl) oDiv_inside.style.overflow=overfl;
		if (content) oDiv_inside.innerHTML=content;
		document.getElementById(parentDiv).appendChild (oDiv_inside);
		delete oDiv_inside;
}
*/

function getDistance(x1,y1,x2,y2) {	var distance = Math.sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));	return distance;}
function getAngle(fromX,fromY,toX,toY) {// ooh Yeah baby!
	  var diffX = fromX-toX;
	  var diffY = toY-fromY;
	  var tanx  = diffX/diffY;
		var  atanx = Math.atan(tanx); // (result in radians)
		var anglex = atanx * 180 / Math.PI; // converted to degrees
		if (diffY>0) anglex+=270; else anglex+=90;
		return Math.round(anglex);
}



//takes inputTxt and writes out in graphics lettering gifs [ you need folder with gif letters ]  www.cyber-web.biz
function writeGraphicTxt(x,y,txt,w,h,dirNm,totW) {// x-pos,y-pos,text,letter-width,letter-height,graphics directory,total horizontal width
	var buffer='<table cellpadding="0" cellspacing="0" border="1" height="'+h+'" width="'+totW+'"><tr>';var cX = 0;
	for (var t=0;t<txt.length;t++) {
		    cX+=w;if ((cX>totW && txt.charAt(t)==' ') || (t==(txt.length-1))) {
		    	buffer+='</tr></table>';
			  makeDiv("introTxtGr"+y,x,y,buffer);setZ("introTxtGr"+y,3);
				cX=0;t++;y+=h;buffer='<table cellpadding="0" border="1" cellspacing="0" height="'+h+'" width="'+totW+'"><tr>';
		} else if (t!=0) buffer+='<td width="60px">..</td>';
		buffer+='<td width="'+w+'" bgcolor="#ff0000">';
		 if (txt.charAt(t)==' ') buffer+='<img src="'+dirNm+'/32.gif" width="'+w+'" height="'+h+'">';
		  else if (txt.charAt(t)=='.') buffer+='<img src="'+dirNm+'/dott.gif" width="100%" height="'+h+'">';
		   else if (txt.charAt(t)=='"') buffer+='<img src="'+dirNm+'/ii.gif" width="100%" height="'+h+'">';
		 	  else if (txt.charAt(t)=='/') buffer+='<img src="'+dirNm+'/zz.gif" width="100%" height="'+h+'">';
		 	   else if (txt.charAt(t)==':') buffer+='<img src="'+dirNm+'/e3.gif" width="100%" height="'+h+'">';	
		       //else if (txt.charAt(t)=='1' || txt.charAt(t)=='i') buffer+='<img src="'+dirNm+'/'+txt.charAt(t)+'.gif" width="'+(Math.round(w/2))+'" height="'+h+'">'; 
		        else buffer+='<img src="'+dirNm+'/'+txt.charAt(t)+'.gif" width="'+w+'" height="'+h+'">';
		buffer+='</td>';
		
	}
	
	
}


function bookmarksite(title, url) {
   if (window.external) window.external.AddFavorite(url, title);
   else if (window.sidebar) window.sidebar.addPanel(title, url, "")
}





/*

function onBodyLoadDo(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}
*/

String.prototype.stripTags = function(aRep)
{
return this.replace(/<[^>]+(?:\/[^>]*)?>/g,aRep);
}
/*
var mystring = "<b>test</b<i>second test</i>";
alert(mystring.stripTags(" "));
*/


/*
	latest fixes :
	29.03.2008 :  maxmem buffer bug fixed



*/



