var MONTH_NAMES = new Array( 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' );
var DAY_NAMES = new Array( 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' );
var SHORT_DAY_NAMES = new Array( 'Su.', 'Mo.', 'Tu.', 'We.', 'Th.', 'Fr.', 'Sa.' );


function LZ( x )
{
    var returnValue = "";
    
    if ( x >= 0 && x <= 9 )
    {
        returnValue += "0";
    }
    
    returnValue += x;
    
    return returnValue;
}

// ------------------------------------------------------------------
// isDate ( date_string, format_string )
// Returns true if date string matches format of format string and
// is a valid date. Else returns false.
// It is recommended that you trim whitespace around the value before
// passing it to this function, as whitespace is NOT ignored!
// ------------------------------------------------------------------
function myIsDate( val, format )
{
	var date = myGetDateFromFormat( val, format );
	if ( date == 0 )
    {
        return false;
    }
	return true;
}

// -------------------------------------------------------------------
// compareDates(date1,date1format,date2,date2format)
//   Compare two date strings to see which is greater.
//   Returns:
//   1 if date1 is greater than date2
//   0 if date2 is greater than date1 of if they are the same
//  -1 if either of the dates is in an invalid format
// -------------------------------------------------------------------
function myCompareDates( date1, dateformat1, date2, dateformat2 )
{
    var returnValue = 0;
	var d1 = myGetDateFromFormat( date1, dateformat1 );
	var d2 = myGetDateFromFormat( date2, dateformat2 );
    
	if ( d1 == 0 || d2 == 0 )
    {
		returnValue = -1;
    }
	else if ( d1 > d2 )
    {
        returnValue = 1;
    }
    
	return returnValue;
}

// ------------------------------------------------------------------
// formatDate (date_object, format)
// Returns a date in the output format specified.
// The format string uses the same abbreviations as in myGetDateFromFormat()
// ------------------------------------------------------------------
function myFormatDate( date, format )
{
	format = format + "";
	var result = "";
	var i_format = 0;
	var c = "";
	var token = "";
	var y = date.getYear() + "";
	var M = date.getMonth() + 1;
	var d = date.getDate();
	var E = date.getDay();
	var H = date.getHours();
	var m = date.getMinutes();
	var s = date.getSeconds();
	var yyyy, yy, MMM, MM, dd, hh, h, mm, ss, ampm, HH, H, KK, K, kk, k;
    
	// Convert real date parts into formatted versions
	var value = new Object();
	if ( y.length < 4 )
    {
        y = "" + ( y - 0 + 1900 );
    }
    
	value["y"]= "" + y;
	value["yyyy"] = y;
	value["yy"] = y.substring( 2, 4 );
	value["M"] = M;
	value["MM"] = LZ( M );
	value["MMM"] = MONTH_NAMES[M-1];
	value["NNN"] = MONTH_NAMES[M+11];
	value["d"] = d;
	value["dd"] = LZ( d );
	value["E"] = DAY_NAMES[E+7];
	value["EE"] = DAY_NAMES[E];
	value["H"] = H;
	value["HH"] = LZ( H );
    
	if ( H == 0 )
    {
        value["h"] = 12;
    }
	else if ( H > 12 )
    {
        value["h"] = H - 12;
    }
	else
    {
        value["h"] = H;
    }
    
	value["hh"] = LZ( value["h"] );
    
	if ( H > 11 )
    {
        value["K"] = H - 12;
    }
    else
    {
        value["K"] = H;
    }
	
    value["k"] = H + 1;
	value["KK"] = LZ( value["K"] );
	value["kk"] = LZ( value["k"] );
	
    if ( H > 11 )
    {
        value["a"] = "PM";
    }
	else
    {
        value["a"] = "AM";
    }
    
	value["m"] = m;
	value["mm"] = LZ( m );
	value["s"] = s;
	value["ss"] = LZ( s );
    
	while ( i_format < format.length )
    {
		c = format.charAt( i_format );
		token = "";
		while ( ( format.charAt( i_format ) == c ) && ( i_format < format.length ) )
        {
			token += format.charAt( i_format++ );
        }
        
		if ( value[token] != null )
        {
            result = result + value[token];
        }
		else
        {
            result = result + token;
        }
    }
    
	return result;
}
	
// ------------------------------------------------------------------
// Utility functions for parsing in myGetDateFromFormat()
// ------------------------------------------------------------------
function myIsInteger( val )
{
	var digits="1234567890";
    
	for ( var i = 0; i < val.length; i++ )
    {
		if ( digits.indexOf( val.charAt( i ) ) == -1 )
        {
            return false;
        }
    }
    
	return true;
}

function myGetInt( str, i, minlength, maxlength )
{
	for ( var x = maxlength; x >= minlength; x-- )
    {
		var token = str.substring( i, i + x );
		if ( token.length < minlength )
        {
            return null;
        }
		if ( myIsInteger( token ) )
        {
            return token;
        }
    }
    
	return null;
}
	
// ------------------------------------------------------------------
// myGetDateFromFormat( date_string , format_string )
//
// This function takes a date string and a format string. It matches
// If the date string matches the format string, it returns the 
// getTime() of the date. If it does not match, it returns 0.
// ------------------------------------------------------------------
function myGetDateFromFormat( val, format )
{
	val = val + "";
	format = format + "";
	var i_val = 0;
	var i_format = 0;
	var c = "";
	var token = "";
	var token2 = "";
	var x, y;
	var now = new Date();
	var year = now.getFullYear();
	var month = now.getMonth() + 1;
	var date = 1;
	var hh = now.getHours();
	var mm = now.getMinutes();
	var ss = now.getSeconds();
	var ampm = "";
	
	while ( i_format < format.length )
    {
		// Get next token from format string
		c = format.charAt( i_format );
		token = "";
		while ( ( format.charAt( i_format ) == c ) && ( i_format < format.length ) )
        {
			token += format.charAt( i_format++ );
        }
        
		// Extract contents of value based on format token
		if (token == "yyyy" || token == "yy" || token == "y" )
        {
			if ( token == "yyyy" )
            {
                x = 4;
                y = 4;
            }
            
			if ( token=="yy" )
            {
                x = 2;
                y = 2;
            }
			if ( token == "y" )
            {
                x = 2;
                y = 4;
            }
            
			year = myGetInt( val, i_val, x, y );
            
			if ( year == null )
            {
                return 0;
            }
            
			i_val += year.length;
			if ( year.length == 2 )
            {
				if ( year > ( now.getFullYear() - 1990 ) )
                {
                    year = 1900 + ( year - 0 );
                }
				else
                {
                    year = 2000 + ( year - 0 );
                }
            }
        }
		else if ( token == "MMM" || token == "NNN" )
        {
			month = 0;
			for ( var i = 0; i < MONTH_NAMES.length; i++ )
            {
				var month_name = MONTH_NAMES[i];
				if ( val.substring( i_val, i_val + month_name.length ).toLowerCase() == month_name.toLowerCase() )
                {
					if ( token == "MMM" || ( token == "NNN" && i > 11 ) )
                    {
						month = i + 1;
						if ( month > 12 )
                        {
                            month -= 12;
                        }
						i_val += month_name.length;
						break;
                    }
                }
            }
			if ( ( month < 1 ) || ( month>12 ) )
            {
                return 0;
            }
        }
		else if ( token == "EE" || token == "E" )
        {
			for (var i = 0; i < DAY_NAMES.length; i++ )
            {
				var day_name = DAY_NAMES[i];
				if ( val.substring( i_val, i_val + day_name.length ).toLowerCase() == day_name.toLowerCase() )
                {
					i_val += day_name.length;
					break;
                }
            }
        }
		else if ( token == "MM" || token == "M" )
        {
			month = myGetInt( val, i_val, token.length, 2 );
			if( month == null || ( month < 1 ) || ( month > 12 ) )
            {
                return 0;
            }
			i_val += month.length;
        }
		else if ( token == "dd" || token == "d" )
        {
			date = myGetInt( val, i_val, token.length, 2 );
			if( date == null || ( date < 1 ) || ( date > 31 ) )
            {
                return 0;
            }
			i_val += date.length;
        }
		else if ( token == "hh" || token == "h" )
        {
			hh = myGetInt( val, i_val, token.length, 2 );
			if( hh == null || ( hh < 1 ) || ( hh > 12 ) )
            {
                return 0;
            }
			i_val += hh.length;
        }
		else if ( token == "HH" || token == "H" )
        {
			hh = myGetInt( val, i_val, token.length, 2 );
			if( hh == null || ( hh < 0 ) || ( hh > 23 ) )
            {
                return 0;
            }
			i_val += hh.length;
        }
		else if ( token == "KK" || token == "K" )
        {
			hh = myGetInt( val, i_val, token.length, 2 );
			if( hh == null || ( hh < 0 ) || ( hh > 11 ) )
            {
                return 0;
            }
			i_val += hh.length;
        }
		else if ( token == "kk" || token == "k" )
        {
			hh = myGetInt( val, i_val, token.length, 2 );
			if( hh == null || ( hh < 1 ) || ( hh > 24 ) )
            {
                return 0;
            }
			i_val += hh.length;
            hh--;
        }
		else if ( token == "mm" || token == "m" )
        {
			mm = myGetInt( val, i_val, token.length, 2 );
			if( mm == null || ( mm < 0 ) || ( mm > 59 ) )
            {
                return 0;
            }
			i_val += mm.length;
        }
		else if ( token == "ss" || token == "s" )
        {
			ss = myGetInt( val, i_val, token.length, 2 );
			if( ss == null || ( ss < 0 ) || ( ss > 59 ) )
            {
                return 0;
            }
			i_val += ss.length;
        }
		else if ( token == "a" )
        {
			if ( val.substring( i_val, i_val + 2 ).toLowerCase() == "am" )
            {
                ampm = "AM";
            }
			else if ( val.substring( i_val, i_val + 2 ).toLowerCase() == "pm" )
            {
                ampm = "PM";
            }
			else
            {
                return 0;
            }
			i_val+=2;
        }
		else
        {
			if ( val.substring( i_val, i_val + token.length ) != token )
            {
                return 0;
            }
			else
            {
                i_val += token.length;
            }
        }
    }
    
	// If there are any trailing characters left in the value, it doesn't match
	if ( i_val != val.length )
    {
        return 0;
    }
    
	// Is date valid for month?
	if ( month == 2 )
    {
		// Check for leap year
		if ( ( ( year % 4 == 0 ) && ( year % 100 != 0 ) ) || ( year % 400 == 0 ) )
        {
            //leap year
			if ( date > 29 )
            {
                return 0;
            }
        }
		else
        {
            if ( date > 28 )
            {
                return 0;
            }
        }
    }
	else if ( ( month == 4 ) || ( month == 6 ) || ( month == 9 ) || ( month == 11 ) )
    {
		if ( date > 30 )
        {
            return 0;
        }
    }
    else
    {
        if ( date > 31 )
        {
            return 0;
        }
    }
    
	// Correct hours value
	if ( hh < 12 && ampm == "PM" )
    {
        hh = hh - 0 + 12;
    }
	else if ( hh > 11 && ampm == "AM" )
    {
        hh -= 12;
    }
	
    var newdate = new Date( year, month - 1, date, hh, mm, ss );
	return newdate.getTime();
}

// ------------------------------------------------------------------
// parseDate( date_string [, prefer_euro_format] )
//
// This function takes a date string and tries to match it to a
// number of possible date formats to get the value. It will try to
// match against the following international formats.
// A second argument may be passed to instruct the method to search
// for formats like d/M/y (european format) before M/d/y (American).
// Returns a Date object or null if no patterns match.
// ------------------------------------------------------------------
function myParseDate( val )
{
    var preferEuro = false;
    if ( arguments.length == 2 )
    {
        preferEuro = arguments[1];
    }
    
    val = val.replace( /,/g, "." );
    
	generalFormats = new Array( 'y-M-d', 'MMM d, y', 'MMM d,y', 'y-MMM-d', 'd-MMM-y', 'MMM d' );
	generalFormatsWithHours = new Array( 'y-M-d H', 'MMM d, y H', 'MMM d,y H', 'y-MMM-d H', 'd-MMM-y H', 'MMM d H' );
    generalFormatsWithHoursAndMinutes = new Array( 'y-M-d H:m', 'MMM d, y H:m', 'MMM d,y H:m', 'y-MMM-d H:m', 'd-MMM-y H:m', 'MMM d H:m', 'y-M-d H.m', 'MMM d, y H.m', 'MMM d,y H.m', 'y-MMM-d H.m', 'd-MMM-y H.m', 'MMM d H.m' );
    generalFormatsWithHoursAndMinutesAnsSeconds = new Array( 'y-M-d H:m:s', 'MMM d, y H:m:s', 'MMM d,y H:m:s', 'y-MMM-d H:m:s', 'd-MMM-y H:m:s', 'MMM d H:m:s', 'y-M-d H.m.s', 'MMM d, y H.m.s', 'MMM d,y H.m.s', 'y-MMM-d H.m.s', 'd-MMM-y H.m.s', 'MMM d H.m.s', 'y-M-d H:m.s', 'MMM d, y H:m.s', 'MMM d,y H:m.s', 'y-MMM-d H:m.s', 'd-MMM-y H:m.s', 'MMM d H:m.s', 'y-M-d H.m:s', 'MMM d, y H.m:s', 'MMM d,y H.m:s', 'y-MMM-d H.m:s', 'd-MMM-y H.m:s', 'MMM d H.m:s' );
    generalFormatsWithHoursAndMinutesAnsSecondsAndMillis = new Array( 'y-M-d H:m:s:S', 'MMM d, y H:m:s:S', 'MMM d,y H:m:s:S', 'y-MMM-d H:m:s:S', 'd-MMM-y H:m:s:S', 'MMM d H:m:s:S', 'y-M-d H:m:s.S', 'MMM d, y H:m:s.S', 'MMM d,y H:m:s.S', 'y-MMM-d H:m:s.S', 'd-MMM-y H:m:s.S', 'MMM d H:m:s.S', 'y-M-d H.m.s.S', 'MMM d, y H.m.s.S', 'MMM d,y H.m.s.S', 'y-MMM-d H.m.s.S', 'd-MMM-y H.m.s.S', 'MMM d H.m.s.S' );
    
    monthFirst = new Array( 'M/d/y', 'M-d-y', 'M.d.y', 'MMM-d', 'M/d', 'M-d' );
    monthFirstWithHours = new Array( 'M/d/y H', 'M-d-y H', 'M.d.y H', 'MMM-d H', 'M/d H', 'M-d H' );
    monthFirstWithHoursAndMinutes = new Array( 'M/d/y H:m', 'M-d-y H:m', 'M.d.y H:m', 'MMM-d H:m', 'M/d H:m', 'M-d H:m', 'M/d/y H.m', 'M-d-y H.m', 'M.d.y H.m', 'MMM-d H.m', 'M/d H.m', 'M-d H.m' );
    monthFirstWithHoursAndMinutesAndSeconds = new Array( 'M/d/y H:m:s', 'M-d-y H:m:s', 'M.d.y H:m:s', 'MMM-d H:m:s', 'M/d H:m:s', 'M-d H:m:s', 'M/d/y H.m.s', 'M-d-y H.m.s', 'M.d.y H.m.s', 'MMM-d H.m.s', 'M/d H.m.s', 'M-d H.m.s', 'M/d/y H:m.s', 'M-d-y H:m.s', 'M.d.y H:m.s', 'MMM-d H:m.s', 'M/d H:m.s', 'M-d H:m.s', 'M/d/y H.m:s', 'M-d-y H.m:s', 'M.d.y H.m:s', 'MMM-d H.m:s', 'M/d H.m:s', 'M-d H.m:s' );
    monthFirstWithHoursAndMinutesAndSecondsAndMillis = new Array( 'M/d/y H:m:s:S', 'M-d-y H:m:s:S', 'M.d.y H:m:s:S', 'MMM-d H:m:s:S', 'M/d H:m:s:S', 'M-d H:m:s:S', 'M/d/y H:m:s.S', 'M-d-y H:m:s.S', 'M.d.y H:m:s.S', 'MMM-d H:m:s.S', 'M/d H:m:s.S', 'M-d H:m:s.S', 'M/d/y H.m.s.S', 'M-d-y H.m.s.S', 'M.d.y H.m.s.S', 'MMM-d H.m.s.S', 'M/d H.m.s.S', 'M-d H.m.s.S' );
	
    dateFirst = new Array( 'd/M/y', 'd-M-y', 'd.M.y', 'd.M.yyyy', 'd-MMM', 'd/M', 'd-M' );
    dateFirstWithHours = new Array( 'd/M/y H', 'd-M-y H', 'd.M.y H', 'd.M.yyyy H', 'd-MMM H', 'd/M H', 'd-M H' );
    dateFirstWithHoursAndMinutes = new Array( 'd/M/y H:m', 'd-M-y H:m', 'd.M.y H:m', 'd.M.yyyy H:m', 'd-MMM H:m', 'd/M H:m', 'd-M H:m', 'd/M/y H.m', 'd-M-y H.m', 'd.M.y H.m', 'd.M.yyyy H.m', 'd-MMM H.m', 'd/M H.m', 'd-M H.m' );
    dateFirstWithHoursAndMinutesAndSeconds = new Array( 'd/M/y H:m:s', 'd-M-y H:m:s', 'd.M.y H:m:s', 'd.M.yyyy H:m:s', 'd-MMM H:m:s', 'd/M H:m:s', 'd-M H:m:s', 'd/M/y H.m.s', 'd-M-y H.m.s', 'd.M.y H.m.s', 'd.M.yyyy H.m.s', 'd-MMM H.m.s', 'd/M H.m.s', 'd-M H.m.s', 'd/M/y H:m.s', 'd-M-y H:m.s', 'd.M.y H:m.s', 'd.M.yyyy H:m.s', 'd-MMM H:m.s', 'd/M H:m.s', 'd-M H:m.s', 'd/M/y H.m:s', 'd-M-y H.m:s', 'd.M.y H.m:s', 'd.M.yyyy H.m:s', 'd-MMM H.m:s', 'd/M H.m:s', 'd-M H.m:s' );
    dateFirstWithHoursAndMinutesAndSecondsAndMillis = new Array( 'd/M/y H:m:s:S', 'd-M-y H:m:s:S', 'd.M.y H:m:s:S', 'd.M.yyyy H:m:s:S', 'd-MMM H:m:s:S', 'd/M H:m:s:S', 'd-M H:m:s:S', 'd/M/y H:m:s.S', 'd-M-y H:m:s.S', 'd.M.y H:m:s.S', 'd.M.yyyy H:m:s.S', 'd-MMM H:m:s.S', 'd/M H:m:s.S', 'd-M H:m:s.S', 'd/M/y H.m.s.S', 'd-M-y H.m.s.S', 'd.M.y H.m.s.S', 'd.M.yyyy H.m.s.S', 'd-MMM H.m.s.S', 'd/M H.m.s.S', 'd-M H.m.s.S' );
    
	var generalFormatsList = new Array( 'generalFormats','generalFormatsWithHours','generalFormatsWithHoursAndMinutes','generalFormatsWithHoursAndMinutesAnsSeconds','generalFormatsWithHoursAndMinutesAnsSecondsAndMillis' );
    var monthFirstList = new Array( 'monthFirst', 'monthFirstWithHours', 'monthFirstWithHoursAndMinutes', 'monthFirstWithHoursAndMinutesAndSeconds', 'monthFirstWithHoursAndMinutesAndSecondsAndMillis' );
    var dateFirstList = new Array( 'dateFirst', 'dateFirstWithHours', 'dateFirstWithHoursAndMinutes', 'dateFirstWithHoursAndMinutesAndSeconds', 'dateFirstWithHoursAndMinutesAndSecondsAndMillis' );
	
    var d = null;
    
	for ( var i = 0; i < generalFormatsList.length; i++ )
    {
		var l = window[generalFormatsList[i]];
		for ( var j = 0; j < l.length; j++ )
        {
			d = myGetDateFromFormat( val, l[j] );
			if ( d != 0 )
            {
                return new Date( d );
            }
        }
    }
    
    if ( preferEuro )
    {
        for ( var i = 0; i < dateFirstList.length; i++ )
        {
            var l = window[dateFirstList[i]];
            for ( var j = 0; j < l.length; j++ )
            {
                d = myGetDateFromFormat( val, l[j] );
                if ( d != 0 )
                {
                    return new Date( d );
                }
            }
        }
        for ( var i = 0; i < monthFirstList.length; i++ )
        {
            var l = window[monthFirstList[i]];
            for ( var j = 0; j < l.length; j++ )
            {
                d = myGetDateFromFormat( val, l[j] );
                if ( d != 0 )
                {
                    return new Date( d );
                }
            }
        }
    }
    else
    {
        for ( var i = 0; i < monthFirstList.length; i++ )
        {
            var l = window[monthFirstList[i]];
            for ( var j = 0; j < l.length; j++ )
            {
                d = myGetDateFromFormat( val, l[j] );
                if ( d != 0 )
                {
                    return new Date( d );
                }
            }
        }
        for ( var i = 0; i < dateFirstList.length; i++ )
        {
            var l = window[dateFirstList[i]];
            for ( var j = 0; j < l.length; j++ )
            {
                d = myGetDateFromFormat( val, l[j] );
                if ( d != 0 )
                {
                    return new Date( d );
                }
            }
        }
    }
    
    
    
	return null;
}

function myGetFormattedDate ( val, format, preferEuro, errMsg )
{
    var returnValue = val;
    
    if ( val != "" )
    {
        var date = myParseDate( val, preferEuro );
        if ( date != null )
        {
            returnValue = myFormatDate( date, format );
        }
        else if ( errMsg && typeof(errMsg) != "undefined" && errMsg != null && errMsg != "" )
        {
            alert( errMsg );
        }
    }
    
    return returnValue;
}

function myChangeDate ( inputobj, format, changeindays )
{
	var myDate = ( new Date () ).getTime ();
	if ( inputobj.value != "" )
	{
		myDate = myGetDateFromFormat ( inputobj.value, format );
	}
	myDate = myDate + ( changeindays * 86400000 );
	var tmpDate = new Date ( myDate );
	inputobj.value = myFormatDate ( tmpDate, format );
	inputobj.onblur();
}

function myUpdateWeekDay ( weekdayobj, inputobj , format )
{
	if ( weekdayobj != null) {
		var myDate = ( new Date () ).getTime ();
		if ( inputobj.value != "" )
		{
			myDate = myGetDateFromFormat ( inputobj.value, format );
		}
		var tmpDate = new Date ( myDate );
		//alert('xxx');
		//weekdayobj.firstChild.nodeValue = "$dict-calendar.getString(\"txtCalendar\")";
		weekdayobj.firstChild.nodeValue =  SHORT_DAY_NAMES[tmpDate.getDay()];
	}
}

function setDateMonthNames ()
{
    for ( var i = 0; i < arguments.length; i++ )
    {
        this.SHORT_DAY_NAMES[i] = arguments[i];
    }
}
