var client_date_info = {};
client_date_info.tz_region = getClientTimeZoneRegion();

function getClientTimeZoneRegion() {
	var date = new Date();
	var date_string = date.toString();
	
	var tzs = [
					 {"patterns": ["PST", "PDT", "Pacific Standard Time", "Pacific Daylight Time"], "region": "US/Pacific"},
					 {"patterns": ["MST", "MDT", "Mountain Standard Time", "Mountain Daylight Time"], "region": "US/Mountain"},
					 {"patterns": ["CST", "CDT", "Central Standard Time", "Central Daylight Time"], "region": "US/Central"},
					 {"patterns": ["EST", "EDT", "Eastern Standard Time", "Eastern Daylight Time"], "region": "US/Eastern"},
					 {"patterns": ["HST", "HDT", "Hawaii Standard Time", "Hawaii Daylight Time"], "region": "US/Hawaii"},
					 {"patterns": ["AKST", "AKDT", "Alaska Standard Time", "Alaska Daylight Time"], "region": "US/Alaska"}
					];
					
	var tz_region = "US/Unknown";
	
	tz_loop: for (var i in tzs) {
		for (var j in tzs[i].patterns) {
			if (date_string.indexOf(tzs[i].patterns[j]) >= 0) {
				tz_region = tzs[i].region;
				break tz_loop;
			}
		}
	}

	return tz_region;
}

function timeZoneFromOffsetHours(offset_hours) {
	var tz_region = (client_date_info.tz_region)? client_date_info.tz_region: getClientTimeZoneRegion();

	var tzs = {
							4: {"US/Eastern": "EDT"},
							5: {"US/Eastern": "EST", "US/Central": "CDT"},
						 	6: {"US/Central": "CST", "US/Mountain": "MDT"},
						 	7: {"US/Mountain": "MST", "US/Pacific": "PDT"},
						 	8: {"US/Pacific": "PST", "US/Alaska": "AKDT"},
						 	9: {"US/Alaska": "AKST", "US/Hawaii": "HDT"},
						 	10: {"US/Hawaii": "HST"}
						};
	
	var tz_abbrev = "N/A";
	
	if (offset_hours >= 4 && offset_hours <= 10) { //can only provide tz abbrev for certain range
		if (tz_region in tzs[offset_hours]) tz_abbrev = tzs[offset_hours][tz_region];
	}
	
	return tz_abbrev;
}

/*
function getClientTimeZoneAbbrev() {
	var date = new Date();
	var date_string = date.toString();
	
	var tzs = [
					 {"patterns": ["PST", "Pacific Standard Time"], "abbrev": "PST"},
					 {"patterns": ["PDT", "Pacific Daylight Time"], "abbrev": "PDT"},
					 {"patterns": ["MST", "Mountain Standard Time"], "abbrev": "MST"},
					 {"patterns": ["MDT", "Mountain Daylight Time"], "abbrev": "MDT"},
					 {"patterns": ["CST", "Central Standard Time"], "abbrev": "CST"},
					 {"patterns": ["CDT", "Central Daylight Time"], "abbrev": "CDT"},
					 {"patterns": ["EST", "Eastern Standard Time"], "abbrev": "EST"},
					 {"patterns": ["EDT", "Eastern Daylight Time"], "abbrev": "EDT"},
					 {"patterns": ["HST", "Hawaii Standard Time"], "abbrev": "HST"},
					 {"patterns": ["HDT", "Hawaii Daylight Time"], "abbrev": "HDT"},
					 {"patterns": ["AKST", "Alaska Standard Time"], "abbrev": "AKST"},
					 {"patterns": ["AKDT", "Alaska Daylight Time"], "abbrev": "AKDT"}
					];

	var tz_abbrev = "AAA";
	
	tz_loop: for (var i in tzs) {
		for (var j in tzs[i].patterns) {
			if (date_string.indexOf(tzs[i].patterns[j]) >= 0) {
				tz_abbrev = tzs[i].abbrev;
				break tz_loop;
			}
		}
	}

	return tz_abbrev;
}
*/

function verifyDateValid(year, month, day, hours, mins, secs) {
	//need to subtract 1 for month
	var valDate = new Date(year, (parseInt(month) - 1), day, hours, mins, secs, 0);
	
	var isValidDate = (valDate.getFullYear() == parseInt(year) && valDate.getMonth() == (parseInt(month) - 1) && valDate.getDate() == parseInt(day) && valDate.getHours() == parseInt(hours) && valDate.getMinutes() == parseInt(mins) && valDate.getSeconds() == parseInt(secs))? true: false;

	return isValidDate;
}

function getNumDaysInMonth(month, year) {
	var numDaysArr = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	var numDays = numDaysArr[month - 1];
	if (month == 2 && isLeapYear(year)) numDays = 29;
	return numDays;
}

function isLeapYear(year) {
	if ( (year % 4) == 0) { // It is exactly divisible by 4
		if ( (year % 100) == 0) { // It is exactly divisible by 100
			var result = ((year % 400) == 0); //Is it also exactly divisible by 400?
		} else {
			var result = 1;
		}
	} else { // It is not exactly divisible by 4 - It is not a leap year
		var result = 0;
	}

	return result;
}

function intToMonth(intVal, mode) { // mode = [null/long | short], 1 = January
	intVal = (1 * intVal) - 1;

	var monthArr = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
	var monthShortArr = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");

	if (mode == "short") {
		return monthShortArr[intVal];
	} else {
		return monthArr[intVal];
	}
}

function monthToInt(monthString, mode) { // mode = [null | padZero]
	var monthInt;

	switch (monthString) {
		case "Jan":
		case "January":
				monthInt = 1;
				break;
		case "Feb":
		case "February":
				monthInt = 2;
				break;
		case "Mar":
		case "March":
				monthInt = 3;
				break;
		case "Apr":
		case "April":
				monthInt = 4;
				break;
		case "May":
				monthInt = 5;
				break;
		case "Jun":
		case "June":
				monthInt = 6;
				break;
		case "Jul":
		case "July":
				monthInt = 7;
				break;
		case "Aug":
		case "August":
				monthInt = 8;
				break;
		case "Sep":
		case "September":
				monthInt = 9;
				break;
		case "Oct":
		case "October":
				monthInt = 10;
				break;
		case "Nov":
		case "November":
				monthInt = 11;
				break;
		case "Dec":
		case "December":
				monthInt = 12;
				break;
	}

	//if (mode == "padZero" && monthInt < 10) monthInt = "0"+monthInt;
	if (mode == "padZero") monthInt = calPad(monthInt);

	return monthInt;
}

function abbrevMonthToLongMonth(month_abbrev) {
	month_abbrev = month_abbrev.toLowerCase();

	var month_long = "Unknown-Month";
	
	switch (month_abbrev) {
		case "jan":
				month_long = "January";
				break;
		case "feb":
				month_long = "February";
				break;
		case "mar":
				month_long = "March";
				break;
		case "apr":
				month_long = "April";
				break;
		case "may":
				month_long = "May";
				break;
		case "jun":
				month_long = "June";
				break;
		case "jul":
				month_long = "July";
				break;
		case "aug":
				month_long = "August";
				break;
		case "sep":
				month_long = "September";
				break;
		case "oct":
				month_long = "October";
				break;
		case "nov":
				month_long = "November";
				break;
		case "dec":
				month_long = "December";
				break;
	}
	
	return month_long;
}

function getDateFormat(date, format) {
	var date_string = "";
	
	if (format == "default" || isEmpty(format)) {
		date_string = date.getDate()+" "+intToMonth(date.getMonth() + 1, "short")+" "+date.getFullYear()+" "+calPad(date.getHours())+":"+calPad(date.getMinutes())+" "+timeZoneFromOffsetHours(date.getTimezoneOffset() / 60);
	}
	
	return date_string;
}

function createDateISO8601(iso_string) {
	//valid strings = 2010-11-17T16:13Z, 2010-11-17T16:13:25Z, 2010-11-17T16:13-0800, 2010-11-17T16:13:25-0800
	
	var year = iso_string.substr(0, 4);
	var month = parseFloat(iso_string.substr(5, 2)) - 1;
	var day = iso_string.substr(8, 2);
	var hours = iso_string.substr(11, 2);
	var minutes = iso_string.substr(14, 2);
	
	var has_seconds = (iso_string.substr(16, 1) == ":")? true: false;
	var seconds = (has_seconds)? iso_string.substr(17, 2): 0;
	
	var date = new Date(year, month, day, hours, minutes, seconds);
	
	var offset_indicator_index = (has_seconds)? 19: 16;
	var offset_indicator = iso_string.substr(offset_indicator_index, 1);
	
	if (offset_indicator == "-" || offset_indicator == "+") {
		var offset_mins_from_utc = (parseFloat(iso_string.substr((offset_indicator_index + 1), 2)) * 60) + parseFloat(iso_string.substr((offset_indicator_index + 3), 2));
		if (offset_indicator == "-") offset_mins_from_utc = offset_mins_from_utc * -1;
	} else {
		var offset_mins_from_utc = 0;
	}
	var local_offset_mins = date.getTimezoneOffset() * -1;
	
	var offset_mills = (local_offset_mins + (offset_mins_from_utc * -1)) * 60 * 1000;

	return new Date(date.getTime() + offset_mills);
}

/*
function createDateISO8601(iso_string) {
	var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
        "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
        "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
	var d = iso_string.match(new RegExp(regexp));

	var offset = 0;
	var date = new Date(d[1], 0, 1);

	if (d[3]) { date.setMonth(d[3] - 1); }
	if (d[5]) { date.setDate(d[5]); }
	if (d[7]) { date.setHours(d[7]); }
	if (d[8]) { date.setMinutes(d[8]); }
	if (d[10]) { date.setSeconds(d[10]); }
	if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
	if (d[14]) {
			offset = (Number(d[16]) * 60) + Number(d[17]);
			offset *= ((d[15] == '-') ? 1 : -1);
	}

	offset -= date.getTimezoneOffset();
	time = (Number(date) + (offset * 60 * 1000));

	return new Date(time);
}
*/

/*
Date.prototype.setISO8601 = function (string) {
    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
        "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
        "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
    var d = string.match(new RegExp(regexp));

    var offset = 0;
    var date = new Date(d[1], 0, 1);

    if (d[3]) { date.setMonth(d[3] - 1); }
    if (d[5]) { date.setDate(d[5]); }
    if (d[7]) { date.setHours(d[7]); }
    if (d[8]) { date.setMinutes(d[8]); }
    if (d[10]) { date.setSeconds(d[10]); }
    if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
    if (d[14]) {
        offset = (Number(d[16]) * 60) + Number(d[17]);
        offset *= ((d[15] == '-') ? 1 : -1);
    }

    offset -= date.getTimezoneOffset();
    time = (Number(date) + (offset * 60 * 1000));
    this.setTime(Number(time));
}
*/


