
function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft - (obj.scrollLeft || 0);
			obj = obj.offsetParent;
		}
	}
	return curleft;
}


 function findPosY(obj)
  {
    var curtop = 0;
    if(obj.offsetParent)
        while(1)
        {
          curtop += obj.offsetTop;
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.y)
        curtop += obj.y;
    return curtop;
  }


function mouseX(evt) {
evt = evt || window.event;
if (evt.pageX) return evt.pageX;
else if (evt.clientX)
   return evt.clientX + (document.documentElement.scrollLeft ?
   document.documentElement.scrollLeft :
   document.body.scrollLeft);
else return null;
}

function mouseY(evt) {
evt = evt || window.event;
if (evt.pageY) return evt.pageY;
else if (evt.clientY)
   return evt.clientY + (document.documentElement.scrollTop ?
   document.documentElement.scrollTop :
   document.body.scrollTop);
else return null;
}



function findScrollX() {
	var x;
	if (self.pageYOffset) // all except Explorer
	{
		x = self.pageXOffset;
	}
	else if (document.documentElement && document.documentElement.scrollTop)
		// Explorer 6 Strict
	{
		x = document.documentElement.scrollLeft;
	}
	else if (document.body) // all other Explorers
	{
		x = document.body.scrollLeft;
	}
	
	return x;
}

function findScrollY() {
	var y;
	if (self.pageYOffset) // all except Explorer
	{
		y = self.pageYOffset;
	}
	else if (document.documentElement && document.documentElement.scrollTop)
		// Explorer 6 Strict
	{
		y = document.documentElement.scrollTop;
	}
	else if (document.body) // all other Explorers
	{
		y = document.body.scrollTop;
	}
	
	return y;
}


function AttachEvent(obj,evt,fnc,useCapture){
	if (obj.addEventListener){
		obj.addEventListener(evt,fnc,useCapture);
		return true;
	} else if (obj.attachEvent) return obj.attachEvent("on"+evt,fnc);
	else obj['on'+evt]=fnc;
	return true;
}



function getWinDim(dim)
{
	var w = 0;
	var h = 0;
	//IE
	if(!window.innerWidth){
		//strict mode
		if(!(document.documentElement.clientWidth == 0)) {
			w = document.documentElement.clientWidth;
			h = document.documentElement.clientHeight;
		} else //quirks mode
		{
			w = document.body.clientWidth;
			h = document.body.clientHeight;
		}
	} else //w3c
	{
		w = window.innerWidth;
		h = window.innerHeight;
	}
	
	if(dim == "w") return w;
	else if(dim == "h") return h;	
	else return [w, h];
	
}


var bodySize100 = 140;

function bodySize(percent){
	//access globals
	var actual = (percent * .01) * bodySize100;
	var actual = actual + "%";
	document.body.style.fontSize = actual;
}


//looks for all tagName in container
//for each tagName, if tries to find another item (any tagname) with the id of the tagName + "Tee"
// for example, in container "my_toggles", searching for "spans", if there's a span with an id "list"
//		and also another element with id "listTee", "list" will toggle "listTee"
//sets initState "On" = expanded "Off" = closed
//exclusive set to true: only one tog can be open at a time
//target id to show/hide is this.id + "Tee"; target display is block unless indexOf reveals "IL" for inline
//To enable toggle CSS, add this custom attr "togcls": if finds togcls="toggleClass", alterns "toggleClassOn" "toggleClassOff"
function simpleToggler(containerID,tagName,initState,exclusive){

//On is expand all, Off is collapse
	this.simpleTogAll = function(state){
		for(var j =0; j< this.simpleTogArray.length; j++){
			this.simpleTog(this.simpleTogArray[j],state);
		}
	}

	this.simpleTog = function(thg, state){
		if(typeof(thg) == 'string') {
			var th = document.getElementById(thg);
		}
		else var th = this;
	//	if(state && state == "Off") state = "Off";
	//	else state = "ON";
	
		if(!state) {
			state = "On"; var tog = true;
		} else { var tog = false;}
	
		var tid = th.id;
		var tar = document.getElementById(tid + "Tee");
		if(tar && tid.indexOf("IL") > 0) var disp = "inline";
		else var disp = "block";
	
		if(tar){
			var tat = th.getAttribute('togcls');
			if(tog && (tar.style.display == disp || state == "Off")){
				tar.style.display = "none";
				if(tat) th.className = tat + "Off";
			} else if (tog) {
				tar.style.display = disp;
				if(tat) th.className = tat + "On";
			} else {
				if(state == "Off") {
					tar.style.display = "none";
					if(tat) th.className = tat + "Off";
				} else {
					tar.style.display = disp;
					if(tat) th.className = tat + "On";
				}
			}
		}
	}
	

	this.simpleTogExcl = function(iid){
		if(typeof(iid) == 'string') {
			var tid = document.getElementById(iid);
		}
		else var tid = this.id;
		for(var t=0; t< this.momTog.simpleTogArray.length;t++){
			if(this.momTog.simpleTogArray[t] != tid){
				this.momTog.simpleTog(this.momTog.simpleTogArray[t],"Off");
			}
		}
		this.momTog.simpleTog(tid);
	}
	
	
	
	
	this.simpleTogArray = new Array();

	this.container = document.getElementById(containerID);
	var set = this.container.getElementsByTagName(tagName);
	var t=0;
	for(var j=0;j<set.length;j++){
		var tid = set[j].id;
		var eid = document.getElementById(tid + "Tee");
		if(eid) {
			set[j].momTog = this;
			if(exclusive) set[j].onclick = this.simpleTogExcl;
			else set[j].onclick = this.simpleTog;
			
			this.simpleTogArray[t] = tid;
			t++;

			if(tid.indexOf("IL") > 0) var disp = "inline";
			else var disp = "block";
			var cls =  set[j].getAttribute('togcls');
			if(initState == "On") {
				eid.style.display = disp;
				if(cls)	set[j].className = cls + "On";
			} else {
				eid.style.display = "none";
				if(cls)	set[j].className = cls + "Off";
			}
		}
	}


}



function popitup(url, W, H, params, winname) {
	var IEtopUIH = 125; var IEbotUIH = 32; var IEUIW = 24;
	var clientW = screen.width;
	var clientH = screen.height;
	if(!params) var params = '';
	if(!H) var H = 300;
	if(!W) var W = 400;
	if(!winname) var winname = 'mhspop';
	
	var nuparams = "width=" + W + ",height=" + H;
	if(params != '') nuparams = nuparams + "," + params;
	
	var nx = Math.floor((clientW - W) * .5);
	var ny = Math.floor((clientH - H) * .5);

	if(!newwindow) var newwindow = '';
	if (!newwindow.closed && newwindow.location) {
		newwindow.location.href = url;
	} else {
		newwindow=window.open(url,winname, nuparams);
		if (!newwindow.opener) newwindow.opener = self;
	}

	newwindow.moveTo(nx,ny);
	
	if (window.focus) {newwindow.focus()}

	return false
}




function divOvers(parentID, parseClass, overOrClick, divOverClass, follow, dist, useShadow) {
	this.follow = follow;
	this.dist = dist || 15;
	this.shDist = 3;
	
	if(useShadow) {
		this.shadow = document.createElement('div');
		this.shadow.id = divOverClass + "Shadow";
		this.shadow.style.display = "none";
		this.shadow.innerHTML = "shadow";
		document.body.appendChild(this.shadow);
	}
	
	this.init = function(parentID, parseClass){
		
		//parse objs 
		
		var children = document.getElementById(parentID).getElementsByTagName('*');
		for(var j=0; j< children.length; j++){
			if(children[j].className == parseClass){
				//grab content and store
				if(children[j].id.length > 0){
					var con = document.getElementById(children[j].id + "Content");
					if(con){
							//hide content
							con.style.display = "none";
							//new style
							con.className = divOverClass;
							children[j].divOverContent = con;
							children[j].divOverContent.divOver = this; //content ref to master obj
							children[j].divOverContent.par = children[j]; //content ref to trigger
					}
				} else {
					var set = children[j].getElementsByTagName('*');
					for (var i=0; i < set.length; i++){
						if(set[i].className == (parseClass + "Content")){
							
							//hide content
							set[i].style.display = "none";
							//new style
							set[i].className = divOverClass;
							children[j].divOverContent = set[i]; //trigger ref to content
							children[j].divOverContent.divOver = this; //content ref to master obj
							children[j].divOverContent.par = children[j]; //content ref to trigger
						}
					}
				}
				
				//ref to divOver w/in obj
				children[j].divOver = this;
				
				//assign eventHandlers
				if(overOrClick == "click") {
					children[j].onclick = function() {this.divOver.toggleContent(this);}
				} else {
					children[j].onmouseover = function() {this.divOver.showContent(this);}
					children[j].onmouseout = function() {this.divOver.hideContent(this);}
					children[j].divOverContent.onclick = function() {this.divOver.toggleContent(this.par);}
				}
			}
		}
		
		this.overState = "hidden";
	}

	//toggle
	this.toggleContent = function(evt){
		if(this.overState == "hidden") this.showContent(evt);
		else this.hideContent(evt);
	}
		
	//mouseover
	this.showContent = function(evt){
		
		var dDis = 15; //default w,h

		//glean top, left of this
		var t = findPosY(evt);
		var l = findPosX(evt);
		//glean viewport dims
		var VPh = getWinDim('h');
		var VPw = getWinDim('w');
		//where to put?
		
		this.overState = "visible";
		if(this.follow){
			var dist = this.dist;
			var box = evt.divOverContent;
			var par = this;
			evt.onmousemove = function(e) {
				plY = mouseY(e);
				plX = mouseX(e);
				box.style.left =  plX + dist + "px";
				box.style.top = plY + dist + "px";
				box.style.display = "block";
				
				if(par.shadow) {
					par.shadow.style.left = plX + dist + par.shDist + "px";
					par.shadow.style.top = plY + dist + par.shDist + "px";
					var temp = box.offsetHeight;
					par.shadow.style.height = temp + "px";
					par.shadow.style.display = "block";
				}
			}
		} else {
			evt.divOverContent.style.left =  l  + "px";
			evt.divOverContent.style.top = t + "px";
			evt.divOverContent.style.display = "block";
			if(this.shadow) {
				this.shadow.style.left = l + this.shDist + "px";
				this.shadow.style.top = t + this.shDist + "px";
				var temp = evt.divOverContent.offsetHeight; 
				this.shadow.style.height = temp + "px";
				this.shadow.style.display = "block";
			}
			//evt.divOverContent.onclick = function() {this.divOver.hideContent(this.par);}
		}
	}
		
	//mouseout
	this.hideContent = function(evt){
		if(this.overState != "hidden"){
			this.overState = "hidden";
			evt.divOverContent.style.display = "none";
			evt.onmousemove = null;
			
			if(this.shadow) this.shadow.style.display = "none";
		}
	}
	
	this.closeContent = function(evt){
		
		
	}
	
	this.init(parentID,parseClass);
}


function messageBox(mcontent, newClass, parentObj, closeOn, useShadow) {

	this.close = function(){
		if(this.par) this.par.removeChild(this.div);
		else document.removeChild(this.div);

		if(this.shadow){
			if(this.par) this.par.removeChild(this.shadow);
			else document.removeChild(this.shadow);
			delete(this.shadow);
		}
		delete(this.div);
	}

	this.div = document.createElement('div');
	this.div.par = this;
	this.div.innerHTML = mcontent;
	this.div.className = newClass;

	//place
	if(parentObj) {
		this.par = parentObj;
		parentObj.appendChild(this.div);
	}
	else document.body.appendChild(this.div);
	
	//optionals
	if(useShadow){
		this.shadow = document.createElement('div');
		this.shadow.className = newClass + "Shadow";
		this.shadow.innerHTML = "[shadow]";
		this.shadow.style.height = this.div.offsetHeight + "px";
		if(parentObj) parentObj.appendChild(this.shadow);
	}

	if(closeOn == "click") this.div.onclick = function(){this.par.close();}
	
}



	function mysql_esc(str){
		var temp1 = str.replace(/"/g, "%22");
		var temp2 = temp1.replace(/'/g, "%27");
		var temp1 = temp2.replace(/\r/g, "");
		var temp2 = temp1.replace(/\n/g, "<br>");
		var temp1 = temp2.replace(/&/g, "%26");
		return temp1;
	}



	function ajDBpull(url, HTMLid, timeoutMS){
		this.url = url;
		this.HTMLid = HTMLid;
		this.timeoutMS = timeoutMS;
		this.onDone = function(){
			return false;
		};

		this.workingMsg = "<b>working...</b>";
		
		this.params = new Array();
		
		this.cleanParams = function(){
			this.params = null;
			this.params = new Array();
		}
		
		this.addNameVal = function(inputID){
			var inp = document.getElementById(inputID);
			var nam = inp.name;
			var val = inp.value;
			var ob = {'name': nam, 'value': val};
			this.params.push(ob);
		}


		this.addNameValDirectly = function(nam, val){
			var ob = {'name': nam, 'value': val};
			this.params.push(ob);
		}
		
		
		this.queue = function(newMS){
			var thisO = this;
			if(newMS) this.timeoutMS = newMS;
			if(this.twsack) this.twsack = null;
			if(this.timeoutID) clearTimeout(this.timeoutID);
			
			this.timeoutID = setTimeout(function(){thisO.doAJAX();}, this.timeoutMS);
		}
		
		this.doAJAX = function(){
			var me = this;

			var box = document.getElementById(this.HTMLid);
			box.innerHTML = this.workingMsg;
			
			var response = "";
			this.twsack = new sack();
			var TW = this.twsack;
			TW.requestFile = this.url;
			TW.method = 'POST';
			TW.onLoading = function(){};
			TW.onCompletion = function(){
				box.innerHTML = TW.response;
				delete(TW);
				me.onDone();
			};
			TW.onError = function(){
				alert('Ajaxian goodness has failed ... I wanna cry.'); delete(TW);
			};
			var temp = "";
			for(var j=0; j<this.params.length; j++){
				temp += this.params[j].name + "=" + this.params[j].value + "&";
			}
			TW.runAJAX(temp);
		}
	}
