
//---------------------------------------------------------------------------
function dateFormat(format, dateobj){
//---------------------------------------------------------------------------

	months = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
	mons = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug", "Sep","Oct","Nov","Dec");
	days = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");

	dys = new Array("Sun","Mon","Tues","Wed","Thurs","Fri","Sat");

	// Build vars
	m = dateobj.getMonth() + 1;
	d = dateobj.getDate();
	h = dateobj.getHours();
	n = dateobj.getMinutes();
	if(dateobj.getYear() > 1900)
		yyyy = dateobj.getYear();
	else
  		yyyy = 1900 + dateobj.getYear();

	yy = yyyy - 2000;

	Day = days[dateobj.getDay()];
	Dy = dys[dateobj.getDay()];
	Month = months[m-1];
	Mon = mons[m-1];

	if(m.toString().length < 2){
		mm = "0" + m + "";
	}
	else {
		mm = m;
	}

	if(d.toString().length < 2){
		dd = "0" + d + "";
	}
	else {
		dd = d;
	}

	if(h.toString().length < 2){
		hh = "0" + h + "";
	}
	else {
		hh = h;
	}

	if(n.toString().length < 2){
		nn = "0" + n + "";
	}
	else {
		nn = n;
	}


	codes = new Array("Month","Mon","mm","m","Day","Dy","dd","d","yyyy","yy");

	lastmstring = format;

	replaceOld("!Month",Month);
	replaceOld("!Mon",Mon);
	replaceOld("!mm",mm);
	replaceOld("!m",m);
	replaceOld("!Day",Day);
	replaceOld("!Dy",Dy);
	replaceOld("!dd",dd);
	replaceOld("!d",d);
	replaceOld("!yyyy",yyyy);
	replaceOld("!yy",yy);
	replaceOld("!hh",hh);
	replaceOld("!nn",nn);
	
	return lastmstring;
}


//---------------------------------------------------------------------------
function replaceOld(before,after){
//---------------------------------------------------------------------------
	indexOfIt = lastmstring.indexOf(before);
	if(indexOfIt >= 0) {
		beforeIt = lastmstring.substring(0, indexOfIt);
		afterIt = lastmstring.substring(indexOfIt + before.length, lastmstring.length);
		lastmstring = beforeIt + after + afterIt;
		replaceOld(before,after);
		return true;
	}
	return false;
}
   
//---------------------------------------------------------------------------
function dateDiff(p_Interval, dt1, dt2){
//---------------------------------------------------------------------------
	//if(!isDate(p_Date1)){return "invalid date: '" + p_Date1 + "'";}
	//if(!isDate(p_Date2)){return "invalid date: '" + p_Date2 + "'";}
	//var dt1 = new Date(p_Date1);
	//var dt2 = new Date(p_Date2);

	// get ms between dates (UTC) and make into "difference" date
	var iDiffMS = dt2.valueOf() - dt1.valueOf();
	var dtDiff = new Date(iDiffMS);

	// calc various diffs
	var nYears  = dt2.getUTCFullYear() - dt1.getUTCFullYear();
	var nMonths = dt2.getUTCMonth() - dt1.getUTCMonth() + (nYears!=0 ? nYears*12 : 0);
	var nQuarters = parseInt(nMonths/3);	//<<-- different than VBScript, which watches rollover not completion
	
	var nMilliseconds = iDiffMS;
	var nSeconds = parseInt(iDiffMS/1000);
	var nMinutes = parseInt(nSeconds/60);
	var nHours = parseInt(nMinutes/60);
	var nDays  = parseInt(nHours/24);
	var nWeeks = parseInt(nDays/7);


	// return requested difference
	var iDiff = 0;		
	switch(p_Interval.toLowerCase()){
		case "yyyy": return nYears;
		case "q": return nQuarters;
		case "m": return nMonths;
		case "y": 		// day of year
		case "d": return nDays;
		case "w": return nDays;
		case "ww":return nWeeks;		// week of year	// <-- inaccurate, WW should count calendar weeks (# of sundays) between
		case "h": return nHours;
		case "n": return nMinutes;
		case "s": return nSeconds;
		case "ms":return nMilliseconds;	// millisecond	// <-- extension for JS, NOT available in VBScript
		default: return "invalid interval: '" + p_Interval + "'";
	}
}

//---------------------------------------------------------------------------
function dateAdd(p_Interval, p_Number, dt){
//---------------------------------------------------------------------------
	//if(!isDate(p_Date)){return "invalid date: '" + p_Date + "'";}
	//if(isNaN(p_Number)){return "invalid number: '" + p_Number + "'";}	

	//p_Number = new Number(p_Number);
	//var dt = new Date(p_Date);
	switch(p_Interval.toLowerCase()){
		case "yyyy": {// year
			dt.setFullYear(dt.getFullYear() + p_Number);
			break;
		}
		case "q": {		// quarter
			dt.setMonth(dt.getMonth() + (p_Number*3));
			break;
		}
		case "m": {		// month
			dt.setMonth(dt.getMonth() + p_Number);
			break;
		}
		case "y":		// day of year
		case "d":		// day
		case "w": {		// weekday
			dt.setDate(dt.getDate() + p_Number);
			break;
		}
		case "ww": {	// week of year
			dt.setDate(dt.getDate() + (p_Number*7));
			break;
		}
		case "h": {		// hour
			dt.setHours(dt.getHours() + p_Number);
			break;
		}
		case "n": {		// minute
			dt.setMinutes(dt.getMinutes() + p_Number);
			break;
		}
		case "s": {		// second
			dt.setSeconds(dt.getSeconds() + p_Number);
			break;
		}
		case "ms": {		// second
			dt.setMilliseconds(dt.getMilliseconds() + p_Number);
			break;
		}
		default: {
			return "invalid interval: '" + p_Interval + "'";
		}
	}
	return dt;
}


