/*********************************************
*
*  dateDayOfMonth ()
*  dateDayOfWeek ()
*  dateFormat ()
*  dateMonth ()
*  dateYear ()
*
*  Copyright (c) 2000, The OutCoding Group. All rights reserved.
*
**********************************************
*
*  Description  : Formats a Date object into a string. Supports English, Spanish, French & German
*  Author       : Damian Leroux
*  Filename     : date.js
*  Language     : JavaScript 1.4, JScript 5
*
**********************************************/

/***********************************************
*	arrayFind () - Finds an element within an Array object
*	IN		values - Array of objects, value - item to find within Array (must be same type)
*	OUT		n/a
*	RETURN	Index of value within values or -1 for not found
************************************************/

function arrayFind  (values, value) {
	for (var index = 0; index < values.length; index++)
		if (values [index] == value)
			return index;

	return -1;
}	

/***********************************************
*	dateDayOfMonth () - Substitues part of date corresponding to recognized token
*	IN		value - Date object, token - ["dd" | "DD"]
*     token:
*         dd   = 1 or 2-digit Day
*         DD   = 2-digit Day
*	OUT		n/a
*	RETURN	String - Substitued part of date
************************************************/

function dateDayOfMonth (value, token) {
	var return_value = "";
	var dom = -1;

	if (typeof (value) == "number")
		dom = value;
	else
		dom = value.getDate ();

	return_value = dom.toString ();

	// Does day require "0" padding?
	if (return_value.length == 1 && token.charAt (0) == "D" )
		return_value = ("0" + return_value);
	
	return return_value;
}

/***********************************************
*	dateDayOfWeek () - Substitues part of date corresponding to recognized token
*	IN		value - Date object, token - ["Wk" | "wk" | "WK" | "Wkd" | "wkd" | "WKD" | "Weekday" | "weekday" | "WEEKDAY"]
*     token:
*         weekday = name of week in lowercase letters
*         Weekday = name of week in initial caps
*         WEEKDAY = name of week in uppercase letters
*         wkd     = 3-letter weekday abbreviation in lowercase letters
*         Wkd     = 3-letter weekday abbreviation in initial caps
*         WKD     = 3-letter weekday abbreviation in uppercase letters
*         wk      = 2-letter weekday abbreviation in initial caps
*         Wk      = 2-letter weekday abbreviation in uppercase letters
*         WK      = 2-letter weekday abbreviation in uppercase letters
*      language:
*         [dr | en | es | fr]
*	OUT		n/a
*	RETURN	String - Substitued part of date
************************************************/

function dateDayOfWeek (value, token, language) {
	var return_value = "";
	var dow = -1;

	// value may be of date or number type:
	if (typeof (value) == "number")
		dow = value;
	else 
		dow = value.getDay ();
	
	if (dow >= 0 && dow < 7) {
		// Select language:
		switch (language) {
		case "es":
			dayArray = new Array ('Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado');
			break;
		case "de":
			dayArray = new Array ('Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag');
			break;
		case "fr":
			dayArray = new Array ('Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi');
			break;
		default:
			dayArray = new Array ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
		}

		return_value = dayArray [dow];

		// Abreviate day ?
		if (token.length == 2 || token.length == 3)
			return_value = dayArray [dow].substring (0, token.length);
	
		// Lowercase?
		if (token.charAt (0) == "w")
			return_value = return_value.toLowerCase ();

		// Uppercase?
		if (token.charAt (1) == "E" || token.charAt (1) == "K")
			return_value = return_value.toUpperCase ();
	}
	return return_value;
}

/***********************************************
*	dateformat (value, formatString, language) - Format date according to formatString
*	IN value - Date object
*      formatString - on or more of:
*         dd   = 1 or 2-digit Day
*         DD   = 2-digit Day
*         mm   = 1 or 2-digit Month
*         MM   = 2-digit Month
*         yy   = 2-digit Year
*         YY   = 2-digit Year
*         yyyy = 4-digit Year
*         YYYY = 4-digit Year
*         month   = Month name in lowercase letters
*         Month   = Month name in initial caps
*         MONTH   = Month name in captital letters
*         mon     = 3-letter month abbreviation in lowercase letters
*         Mon     = 3-letter month abbreviation in initial caps
*         MON     = 3-letter month abbreviation in uppercase letters
*         weekday = name of week in lowercase letters
*         Weekday = name of week in initial caps
*         WEEKDAY = name of week in uppercase letters
*         wkd     = 3-letter weekday abbreviation in lowercase letters
*         Wkd     = 3-letter weekday abbreviation in initial caps
*         WKD     = 3-letter weekday abbreviation in uppercase letters
*         wk      = 2-letter weekday abbreviation in initial caps
*         Wk      = 2-letter weekday abbreviation in uppercase letters
*         WK      = 2-letter weekday abbreviation in uppercase letters
*      language [dr | en | es | fr]
*
*	OUT		n/a
*	RETURN	String - Formatted date
*	EXAMPLE message = dateformat (today, "Today's date is: Weekday Month dd, YYYY");
************************************************/

function dateFormat (value, formatString, language) {
	// Array of recognized formats and corresponding function pointer array
	var aFormats      = new Array ("dd", "mm", "yy", "yyyy", "month", "mon", "weekday", "wkd", "wk");
	var aFunctions    = new Array (dateDayOfMonth, dateMonth, dateYear, dateYear, dateMonth, dateMonth, dateDayOfWeek, dateDayOfWeek, dateDayOfWeek);

	var return_exp = new String ();		// Expression return by this function
	var token = new String ();			// Token being parsed
	var ch;								// Current character being processed
	var i = 0;							// Index of token in formats array

	// Check for language, making English default if not specified:
	if (language == null)
		language = "en";
		
	if (value == null)
		return "";

	// Try processing value and formatString. Any errors returns value, unprocessed:
	try {
		// Parse each token in formatString and compare against formats array.
		for (var index = 0; index <= formatString.length; index++) {
			// Is current character part of format string?
			ch = formatString.charAt (index);

			if (! ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))) {
				// Look for recognized format strings in formats array:
				i = arrayFind (aFormats, token.toLowerCase());

				// If token is a format, substitute date part,
				// Otherwise, add token to ouptut string:
				if (i >= 0)
					return_exp += aFunctions [i] (value, token, language);
				else
					return_exp += token;	
				return_exp += ch;
				token = "";
			} else
				token += ch;
		} 
	} catch (e) {
		return_exp = value;
	}
	return return_exp;
}

/***********************************************
*	dateMonth () - Substitues part of date corresponding to recognized token
*	IN		value - Date object, token - ["mm" | "MM" | "Mon" | "mon" | "MON" | "Month" | "month" | "MONTH"], language
*      token:
*         month   = Month name in lowercase letters
*         Month   = Month name in initial caps
*         MONTH   = Month name in captital letters
*         mon     = 3-letter month abbreviation in lowercase letters
*         Mon     = 3-letter month abbreviation in initial caps
*         MON     = 3-letter month abbreviation in uppercase letters
*      language:
*         [dr | en | es | fr]
*	OUT		n/a
*	RETURN	String - Substitued part of date
************************************************/

function dateMonth (value, token, language) {
	var return_value = "";
	var month   = -1;
	
	// value may be of date or number type:
	if (typeof (value) == "number")
		month = value;
	else 
		month = value.getMonth();

	// Is token "mm" or "MM"?
	if (token.length == 2) {
		month++;
		return_value = month.toString ();

		// Does month require "0" padding?
		if (return_value.length == 1 && token.charAt (0) == "M" )
			return_value = ("0" + return_value);
	} else {
		if (month >= 0 && month < 12) {
			// Select language:
			switch (language) {
			case "es":
				monthArray = new Array ('Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre');
				break;
			case "de":
				monthArray = new Array ('Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember');
				break;
			case "fr":
				monthArray = new Array ('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aout', 'Septembre', 'Octobre', 'Novembre', 'Décembre');
				break;
			default:
				monthArray = new Array ('January', 'February', 'March', 'April', 'May', 'June','July', 'August', 'September', 'October', 'November', 'December');
			}

			return_value = monthArray [month];

			// Abreviate month ?
			if (token.length == 3)
				return_value = return_value.substring (0, token.length);

			// Lowercase?
			if (token.charAt (0) == "m")
				return_value = return_value.toLowerCase ();

			// Uppercase?
			if (token.charAt (1) == "O")
				return_value = return_value.toUpperCase ();
		}
	}
	return return_value;
}

/***********************************************
*	dateYear () - Substitues part of date corresponding to recognized token
*	IN		value - Date object, token - ["yy" | "YYYY"]
*      token:
*         yy   = 2-digit Year
*         YY   = 2-digit Year
*         yyyy = 4-digit Year
*         YYYY = 4-digit Year
*	OUT		n/a
*	RETURN	String - Substitued part of date
************************************************/

function dateYear (value, token) {
	var return_value = "";
	var year = -1;
	
	// value may be of date or number type:
	if (typeof (value) == "number")
		year = value;
	else 
		year = value.getFullYear();

	return_value = year.toString ();
	
	// Remove century?
	if (token.length == 2 && year.length > 2)
		return_value = return_value.substr (2, 2);
			
	return return_value;
}


