/*******************************************************************************************
CREATION: SiteJS.js
CREATOR: George Hernandez
NOTES: This script should be included in most pages on this site
TOC:
	Site Variables
	flipImage(url)
	inNewWindow(pstrFile, pstrWindowName, pstrWindowFeatures)
	formatDtm(myDate,format)
	gPad(intData,intPlaces)
	gSearch(form)
	ncr(iDec)
	function gExpandCollapse(Button,TargetList)
MOD LOG:
	2007-07-13 10:13:12
		Tidied up TOC.
		Added MOD LOG.
		Removed wholeDaysUntil(yr, mo, dy).
	200711061650 Added gExpandCollapse(Button,TargetList)
*******************************************************************************************/


//Site Variables

var csSECONDinMS= 1000; // the number of milliseconds in a second
var csMINUTEinMS= csSECONDinMS * 60;
var csHOURinMS= csMINUTEinMS * 60;
var csDAYinMS= csHOURinMS * 24;
var csWEEKinMS= csDAYinMS * 7;

var csDAYNAME= ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
var csDAYNAME2= ["Su","Mo","Tu","We","Th","Fr","Sa"];
var csDAYNAME3= ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
var csMONTHNAME= ["January","February","March","April","May","June","July","August","September","October","November","December"];
var csMONTHNAME3= ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];

var csNOW= new Date(); //Date at time of page load
var csYEARoftheNOW= csNOW.getFullYear();
var csMONTHoftheNOW= csNOW.getMonth();
var csDAYOFMONTHoftheNOW= csNOW.getDate();
var csDAYOFWEEKoftheNOW= csNOW.getDay();
var csHOURoftheNOW= csNOW.getHours();
var csMINUTEoftheNOW= csNOW.getMinutes();
var csSECONDoftheNOW= csNOW.getSeconds();
var csMILLISECONDoftheNOW= csNOW.getMilliseconds();
var csNOWinMS= csNOW.getTime();
var csVALUEOFtheNOW= csNOW.valueOf();
var csSEEDoftheNOW= csNOW.getTime() % 0xfffffff;
var csTZDHOURSoftheNOW= csNOW.getTimezoneOffset()/60;
var csTZDMINUTESoftheNOW= csNOW.getTimezoneOffset()%60;
var csTZD;
if (csTZDHOURSoftheNOW>0) {
	csTZD="-"+ gPad(csTZDHOURSoftheNOW,2) +":"+ gPad(csTZDMINUTESoftheNOW,2);
} else if (csTZDHOURSoftheNOW<0) {
	csTZD="+"+ gPad(-csTZDHOURSoftheNOW,2) +":"+ gPad(csTZDMINUTESoftheNOW,2);
}else csTZD="Z";

//Changes an image with another.
function flipImage(url) {	
	window.event.srcElement.src = url;
}

//Opens a file in a new window with provided features.
function inNewWindow(pstrFile, pstrWindowName, pstrWindowFeatures) {
	var intName;
	var intFeatures;
	var strWindowName = new String(pstrWindowName);
	var strWindowFeatures = new String(pstrWindowFeatures);
	intName = strWindowName.length;
	intFeatures = strWindowFeatures.length;
	if ((intName == 0) && (intFeatures == 0)) {
		window.open(pstrFile);
	} else if (intName == 0) {
		window.open(pstrFile, '', strWindowFeatures);
	} else if (intFeatures == 0) {
		window.open(pstrFile, strWindowName);
	} else {
		window.open(pstrFile, strWindowName, strWindowFeatures);
	}
	return false;
}

//Returns a formatted string given "now" or a JS Date object
function formatDtm(myDate,format) {
	var strDate = "";
	if (myDate=="now") {
		var jsdate = new Date();
	} else {
		var jsdate = myDate;
		//myDate EGs: new Date("Oct 22, 1968"), new Date(), dtmX
	}
	var fullyear = jsdate.getFullYear();
	var jsmonth = jsdate.getMonth(); //0-11
	var dayofthemonth = jsdate.getDate();
	var dayoftheweek = jsdate.getDay();
	var hour = jsdate.getHours();
	var minute = jsdate.getMinutes();
	var second = jsdate.getSeconds();
	var millisecon = jsdate.getMilliseconds();
	var dtminms = jsdate.getTime();
	var valueofthedtm = jsdate.valueOf();
	var tzdhour = jsdate.getTimezoneOffset()/60;
	var tzdminute = jsdate.getTimezoneOffset()%60;
	var tzd; 
	if (tzdhour>0) {
		tzd = "-"+ gPad(tzdhour,2) +":"+ gPad(tzdminute,2);
	} else if (tzdhour<0) {
		tzd="+"+ gPad(-tzdhour,2) +":"+ gPad(tzdminute,2);
	} else tzd = "Z";
	switch (format) {
	case "Mmmm d, yyyy":
		strDate = csMONTHNAME[jsmonth]+" "+dayofthemonth+", "+fullyear; break;
	case "Mmmm d, yyyy Z":
		strDate = csMONTHNAME[jsdate.getUTCMonth()] +" "+ jsdate.getUTCDate() +", "+ jsdate.getUTCFullYear(); break;
	case "MM/DD/YYYY":
		strDate = gPad(jsmonth+1,2)+"/"+gPad(dayofthemonth,2)+"/"+fullyear; break;
	case "MM/DD/YYYY Z":
		strDate = gPad(jsdate.getUTCMonth()+1,2) +"/"+ gPad(jsdate.getUTCDate(),2) +"/"+ jsdate.getUTCFullYear(); break;
	case "YYYY":
		strDate = fullyear; break;
	case "MM":
		strDate = gPad(jsmonth+1,2); break;
	case "DD":
		strDate = gPad(dayofthemonth,2); break;
	case "Mmmm":
		strDate = csMONTHNAME[jsmonth]; break;
	case "Mmm":
		strDate = csMONTHNAME3[jsmonth]; break;
	case "Dddd":
		strDate = csDAYNAME[dayoftheweek]; break;
	case "Ddd":
		strDate = csDAYNAME3[dayoftheweek]; break;
	case "YYYY Z":
		strDate = jsdate.getUTCFullYear(); break;
	case "YYYY-MM":
		strDate = fullyear+"-"+gPad(jsmonth+1,2); break;
	case "YYYY-MM Z":
		strDate = jsdate.getUTCFullYear() +"-"+ gPad(jsdate.getUTCMonth()+1,2); break;
	case "YYYY-MM-DD":
		strDate = fullyear+"-"+gPad(jsmonth+1,2)+"-"+gPad(dayofthemonth,2); break;
	case "YYYY-MM-DD Z":
		strDate = jsdate.getUTCFullYear() +"-"+ gPad(jsdate.getUTCMonth()+1,2) +"-"+ gPad(jsdate.getUTCDate(),2); break;
	case "hh:mm":
		strDate = gPad(hour,2)+":"+gPad(minute,2); break;
	case "hh:mm tzd":
		strDate = gPad(hour,2)+":"+gPad(minute,2)+tzd; break;
	case "hh:mm Z":
		strDate = gPad(jsdate.getUTCHours(),2) +":"+ gPad(jsdate.getUTCMinutes(),2) +"Z"; break;
	case "hh:mm:ss":
		strDate = gPad(hour,2)+":"+gPad(minute,2)+":"+gPad(second,2); break;
	case "hh:mm:ss tzd":
		strDate = gPad(hour,2)+":"+gPad(minute,2)+":"+gPad(second,2)+tzd; break;
	case "hh:mm:ss Z":
		strDate = gPad(jsdate.getUTCHours(),2) +":"+ gPad(jsdate.getUTCMinutes(),2) +":"+ gPad(jsdate.getUTCSeconds(),2) +"Z"; break;
	case "LocaleString":   //Usual EG: Tuesday, June 10, 2003 08:25:22 PM
		strDate = jsdate.toLocaleString(); break;
	case "Ddd, dd Mmm YYYY hh:mm:ss": //RFC 822
		strDate = 
			csDAYNAME3[dayoftheweek]+", "+gPad(dayoftheweek,2)+" "+csMONTHNAME3[jsmonth]+" "+dayofthemonth+" "+
			gPad(hour,2)+":"+gPad(minute,2)+":"+gPad(second,2); break;
	case "Ddd, dd Mmm YYYY hh:mm:ss tzd":
		//strDate = jsdate.toUTCString();		//Don't use because lousy JS puts "UTC" on end by default.
		strDate = 
			csDAYNAME3[dayoftheweek]+", "+gPad(dayoftheweek,2)+" "+csMONTHNAME3[jsmonth]+" "+dayofthemonth+" "+
			gPad(hour,2)+":"+gPad(minute,2)+":"+gPad(second,2)+" "+tzd; break;
	case "Ddd, dd Mmm YYYY hh:mm:ss GMT": //GMT is preferred over Z or UTC for rss.
		strDate =
			csDAYNAME3[jsdate.getUTCDay()]+", "+gPad(jsdate.getUTCDate(),2)+" "+csMONTHNAME3[jsdate.getUTCMonth()]+" "+jsdate.getUTCFullYear()+" "+
			gPad(jsdate.getUTCHours(),2)+":"+gPad(jsdate.getUTCMinutes(),2)+":"+gPad(jsdate.getUTCSeconds(),2)+" GMT"; break;
	case "Ddd, dd Mmm YYYY hh:mm:ss Z":
		strDate =
			csDAYNAME3[jsdate.getUTCDay()]+", "+gPad(jsdate.getUTCDate(),2)+" "+csMONTHNAME3[jsdate.getUTCMonth()]+" "+jsdate.getUTCFullYear()+" "+
			gPad(jsdate.getUTCHours(),2)+":"+gPad(jsdate.getUTCMinutes(),2)+":"+gPad(jsdate.getUTCSeconds(),2)+" Z"; break;
	case "YYYY-MM-DDthh:mm:ss": //ISO 8601
		strDate = 
			fullyear+"-"+gPad(jsmonth+1,2)+"-"+gPad(dayofthemonth,2)+"t"+gPad(hour,2)+":"+gPad(minute,2)+":"+gPad(second,2); break;
	case "YYYY-MM-DDthh:mm:ss tzd":
		strDate = 
			fullyear+"-"+gPad(jsmonth+1,2)+"-"+gPad(dayofthemonth,2)+"t"+gPad(hour,2)+":"+gPad(minute,2)+":"+gPad(second,2)+tzd; break;
	case "YYYY-MM-DD hh:mm:ss":
		strDate = //'hi ISO';
			jsdate.getUTCFullYear() +"-"+ gPad(jsdate.getUTCMonth()+1,2) +"-"+ gPad(jsdate.getUTCDate(),2) +" "+
			gPad(jsdate.getUTCHours(),2) +":"+ gPad(jsdate.getUTCMinutes(),2) +":"+ gPad(jsdate.getUTCSeconds(),2); break;
	case "YYYYMMDDhhmmss":
		strDate = //'hi ISO';
			jsdate.getUTCFullYear() +""+ gPad(jsdate.getUTCMonth()+1,2) +""+ gPad(jsdate.getUTCDate(),2) +""+
			gPad(jsdate.getUTCHours(),2) +""+ gPad(jsdate.getUTCMinutes(),2) +""+ gPad(jsdate.getUTCSeconds(),2); break;
	case "YYYY-MM-DDthh:mm:ss Z":
		strDate = //'hi ISO';
			jsdate.getUTCFullYear() +"-"+ gPad(jsdate.getUTCMonth()+1,2) +"-"+ gPad(jsdate.getUTCDate(),2) +"t"+
			gPad(jsdate.getUTCHours(),2) +":"+ gPad(jsdate.getUTCMinutes(),2) +":"+ gPad(jsdate.getUTCSeconds(),2) +"Z"; break;
	case "YYYY-MM-DD Ddd hh:mm:ss Z":
		strDate = //'hi ISO';
			jsdate.getUTCFullYear() +"-"+ gPad(jsdate.getUTCMonth()+1,2) +"-"+ gPad(jsdate.getUTCDate(),2) +" "+
			csDAYNAME3[dayoftheweek] +" "+
			gPad(jsdate.getUTCHours(),2) +":"+ gPad(jsdate.getUTCMinutes(),2) +":"+ gPad(jsdate.getUTCSeconds(),2) +"Z"; break;
	}
	return strDate;
}

//Pad ID (str or int) with zeros on its left.
function gPad(ID,intPlaces) {
	//assumes that places >= length
	var str = String(ID);
	var intLength = str.length;
	var intDifference = intPlaces-intLength;
	while (intDifference>0) {
		str = "0"+str;
		intDifference--;
	}
	return str;
}

//Used for Google search.
function gSearch(form) {
	if (form.searched[0].checked) form.q.value = form.q1.value+" site:www.georgehernandez.com";
	else if (form.searched[1].checked) form.q.value = form.q1.value+" site:www.georgehernandez.com"+location.pathname.substring(0,location.pathname.lastIndexOf('/')+1);
	else if (form.searched[2].checked) form.q.value = form.q1.value+" site:en.wikipedia.org";
	else form.q.value = form.q1.value;
}

//Fills prompt with CER and NCR for HTML
function ncr(iDec){
	switch(iDec){
		case 20: prompt('The CER for _ _ (0x20) is:','&nbsp;'); break;
		case 34: prompt('The CER for _"_ (0x22) is:','&quot;'); break;
		case 38: prompt('The CER for _&_ (0x26) is:','&amp;'); break;
		case 39: prompt('The CER for _\'_ (0x27) is:','&apos;'); break;
		case 60: prompt('The CER for _<_ (0x3C) is:','&lt;'); break;
		case 62: prompt('The CER for _>_ (0x3E) is:','&gt;'); break;
		default: prompt('The decimal NCR for _'+String.fromCharCode(iDec)+'_  (0x'+(iDec-0).toString(16).toUpperCase()+') is:', '&#'+String(iDec)+';');
	}
}

//Expands or Collapses an aqtree
function gExpandCollapse(Button,TargetList){
	var List=document.getElementById(TargetList);
	if (Button.innerHTML == "Expand All") {
		Button.innerHTML = "Collapse All";
		List.className="";
	} else {
		Button.innerHTML = "Expand All";
		List.className="aqtree3";
	}
	return false;	
}

// 2011-11-04 Added this for Google +1 buttons:
(function() {
    var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
    po.src = 'https://apis.google.com/js/plusone.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
  })();
