//**************************************************
// Utilities
// -B.Liddell
// GSI
//
// Dependencies: mm.js
//
//**************************************************
function writeYear() {
	var d = new Date()
	document.write(d.getFullYear());
}
function writeFullDate() {
	var d = new Date()
	var mos = ["January","February","March","April","May","June","July","August","September","October","November","December"];
	var mo = mos[d.getMonth()];
	document.write(mo+" "+d.getDate()+", "+d.getFullYear());
}
function popup(strpage, strwinname, strwidth, strheight) {
	var OpenWin = window.open(strpage, strwinname, 'toolbar=no,menubar=no,location=no,scrollbars=yes,width='+strwidth+',height='+strheight+',resizable=yes,status=no');
	OpenWin.focus();
}
var numWins = 0;
function openCenteredWindow(myUrl, myWidth, myHeight){
	var urlx = myUrl;
	var twidth = myWidth, theight = myHeight;
	var tposx = (screen.width-twidth)/2;
	var tposy = (screen.height-theight)/2;
	var newWin1 = window.open(urlx,"newWin"+numWins,"toolbar=no,width="+twidth+",height="+theight+",directories=no,status=no,scrollbars=no,resizable=no,menubar=no")
	newWin1.moveTo(tposx,tposy);
	newWin1.focus();
	numWins++;
}

//GetElementByID replacement
function getDOMElementByID(eid){
	var docElem;
	if (typeof eid == "string"){
		docElem =  MM_findObj(eid);
	}
	return docElem;
}

//Get/Set Element visible state (fundamentally the same as MM_showHideLayers, i have realized)
function getElementState(elemID){
	var elemState, myElem = getDOMElementByID(elemID);
	//
	if(myElem){
		if((!myElem.style.visibility || myElem.style.visibility == 'visible') && (!myElem.style.display || myElem.style.display == 'block')) {
			elemState = "show";
		} else {
			elemState = "hide";
		}
	}
	//
	return elemState;
}
function setElementState(elemID, state){
	var myElem = getDOMElementByID(elemID);
	//
	if(myElem){
		switch(state){
			case "show":
				myElem.style.visibility = 'visible';
				myElem.style.display = 'block';
				break;
			case "hide":
				myElem.style.visibility = 'hidden';
				myElem.style.display = 'none';
				break;
			default:
				break;
		}
	}
}
/*
Create a delegate chain
Usage:
setTimeout((sayHi.invoke).andThen(sayBye.invoke),2000);
*/
//**************************************************
//
// Dependencies: none
//
//**************************************************
Function.prototype.andThen=function(g) {
  var f=this;
  return function() {
    f();g();
  }
};
/*
Delegates implementation
make it easy to create an object that allows several other objects to register callbacks.
Usage:
var manager=new Manager();
manager.registerCallback(sayHi.invoke);
manager.registerCallback(sayBye.invoke);
manager.callback();
*/
function Manager() {
  // do nothing
  this.callback=function () {}; 
  this.registerCallback=function(callbackFunction) {
    this.callback=(this.callback).andThen(callbackFunction);
  }
}

//Event Framework Interface
function addEvent(obj, evType, fn, useCapture){
  if (obj.addEventListener){
    obj.addEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn);
    return r;
  } else {
    alert("Handler could not be attached");
  }
}
//
function removeEvent(obj, evType, fn, useCapture){
  if (obj.removeEventListener){
    obj.removeEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.detachEvent){
    var r = obj.detachEvent("on"+evType, fn);
    return r;
  } else {
    alert("Handler could not be removed");
  }
}

function getQueryVariable(variable) {
	var query = window.location.search.substring(1);
	var vars = query.split("&");
	for (var i=0;i<vars.length;i++) {
		var pair = vars[i].split("=");
		if (pair[0] == variable) {
			return pair[1];
		}
	}
}
function intRand(max, min) {
  return Math.floor(Math.random() * (((!max) ? 1 : max) - ((!min) ? 0 : min) + 1) + ((!min) ? 0 : min));
}

