     //  _  __ __  __ _____ __    _____ __  __ _____ 
    //  / |/ // / / //_  _// /   / ___// /_/ // ___/
   //  /    // /_/ /  / / / /__ / _/  /___  //__  /
  //  /_/|_/ |____/  /_/ /____//____/ /____//____/
 // Copyright (c) Nutley and Nutley 2006
// date.js
//

LONG_DATE_FORMAT = '%A %d %B %Y';
LONG_DATETIME_FORMAT = '%A %d %B %Y %H:%M';
SHORT_DATE_FORMAT = '%a %d %b %y';
SHORT_DATETIME_FORMAT = '%a %d %b %y %H:%M';
TIME_FORMAT = '%H:%m';

var longDayNames = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
var longMonthNames = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
var shortDayNames = new Array('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
var shortMonthNames = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');


function ConvertDate(date, format)
// Pass date as seconds since the epoch or date object
// Format contains how the string is wanted.
//	See http://www.die.net/doc/linux/man/man3/strftime.3.html for format string.
//	Also: format = "date" - returns the date object
//		  format = "secs" - returns the number of seconds since the epoch
//		  format = "msecs" - returns the number of milliseconds since the epoch
// language depends on select phrases.js file.
{
	if (typeof(date) == 'string') {
		if (date.indexOf('-') == -1) date = parseInt(date); // Not database format, assume its a second format expressed as a string
		else {
			if (format == DB_DATE_FORMAT) return date; // No conversion to perform...
			// Assume a database string
			if (date == '') date = new Date(0);
			else {
				var parts = date.split(' ');
				var d = parts[0].split('-');
				var t = parts[1].split(':');
				date = new Date(d[0], d[1] - 1, d[2], t[0], t[1], t[2], 0);
			}
		}
	}
	if (typeof(date) == 'number') date = new Date(date * 1000); 
	if (format == 'date') return date;
	if (format == 'secs') return Math.floor(date.getTime() / 1000);
	if (format == 'msecs') return date.getTime();
	var ret = '';
	for (var x = 0; x < format.length; x++) {
		if (format.charAt(x) == '%') {
			switch (format.charAt(x + 1)) {
				case 's' : return date.getTime() - (date.getTime() % 1000); break;
				
				case 'a' : ret += shortDayNames[date.getUTCDay()]; break;
				case 'A' : ret += longDayNames[date.getUTCDay()]; break;
				case 'b' : ret += shortMonthNames[date.getUTCMonth()]; break;
				case 'B' : ret += longMonthNames[date.getUTCMonth()]; break;
				case 'c' : ret += date.toLocaleString(); break;
				case 'C' : ret += sprintf('%2#d', date.getUTCFullYear()); break;
				case 'd' : ret += sprintf('%2#d', date.getUTCDate()); break;
				case 'e' : ret += sprintf('%2d', date.getUTCDate()); break;
				case 'H' : ret += sprintf('%2#d', date.getUTCHours()); break;
				case 'I' : ret += sprintf('%2#d', (date.getUTCHours() % 12) + 1); break;
				case 'm' : ret += sprintf('%2#d', (date.getUTCMonth() + 1)); break;
				case 'M' : ret += sprintf('%2#d', date.getUTCMinutes()); break;
				case 'S' : ret += sprintf('%2#d', date.getUTCSeconds()); break;
				case 'y' : ret += sprintf('%2#d', (date.getUTCFullYear()  % 100)); break;
				case 'Y' : ret += sprintf('%d', date.getUTCFullYear()); break;
				case '%' : ret += '%'; break;
				default : ret += '%' + format.charAt(x + 1);
			}
			x++;
		} else ret += format.charAt(x);
	}
	return ret;
}


function sprintf()
{
	var str = arguments[0];
	var arg = 1, ret = '';
	for (var x = 0; x < str.length; x++) {
		var c = str.charAt(x);
		if (c != '%') ret += c;
		else {
			c = str.charAt(++x);
			if (c == '%') ret += c;
			else {
				var fillZeros = false, group = false, numStr = '';
				
				while ((c >= '0' && c <= '9') || c == '.') {
					numStr += c;
					c = str.charAt(++x);
				}
				while (c == '#' || c == ',') {
					if (c == '#') fillZeros = true;
					if (c == ',') group = true;
					c = str.charAt(++x);
				}
				if (c == 'd') ret += GetDecimalStr(numStr, arguments[arg++], fillZeros, group);
				if (c == 'f') ret += GetFloatStr(numStr, arguments[arg++], fillZeros, group);
				if (c == 's') ret += GetString(numStr, arguments[arg++]);
			}
		}
	}	
	return ret;
}

function GetString(numStr, val)
{
	if (numStr == '') return val; // Dump out as-is
	var space = parseInt(numStr); 
	if (val.length >= space) return val.substr(0,space);
	var front = '';
	for (var x = 0; x < space - val.length; x++) front += ' ';
	return front + val;
}

function GetDecimalStr(numStr, val, fillZeros, group)
{
	val = val.toString();
	if (group) val = GroupNum(val);
	if (numStr == '') return val;
	var space = parseInt(numStr);
	var gap = space - val.length;
	for (var x = 0; x < gap; x++) 
		val = ' ' + val;
	if (fillZeros) {
		val = val.replace(/ /g, '0');
		if (group) return GroupNum(val);
	}
	return val;
}

function GetFloatStr(numStr, val, fillZeros, group)
{
	if (numStr == '' && !group) return val;
	
	iVal = parseInt(val);
	fVal = val - iVal;
	
	var parts = numStr.split('.');
	iVal = GetDecimalStr(parts[0], iVal, fillZeros, group);
	if (parts[1] == '0') return iVal;
	var m = Math.pow(10, parseInt(parts[1]));
	fVal = Math.round(m * fVal);
	fVal = GetDecimalStr(parts[1], fVal, true, false);
	return iVal + '.' + fVal;
}

function GroupNum(val)
{
	val = val.toString();
	val = val.replace(',',''); // Remove any existing commas
	var ret = '';
	var x = val.length - 1;
	for (;;) {
		for (var i = 0; i < 3; i++) {
			ret = val.charAt(x--) + ret;
			if (x < 0) return ret;
		}
		if (x >= 0) ret = ',' + ret;
	}
}