// Title: Tigra Calendar
// URL: http://www.softcomplex.com/products/tigra_calendar/
// Version: 3.3 (European date format)
// Date: 09/01/2005 (mm/dd/yyyy)
// Note: Permission given to use this script in ANY kind of applications if
//    header lines are left unchanged.
// Note: Script consists of two files: calendar?.js and calendar.html
/* Modification History: 
   Date           Reason/By
   ------------   -----------------------------------------------------------
   Jan 14, 2006   Output and read dates in "mmm d, yyyy" format for multiple
                  languages and allow a Start Date Limit to be set to prevent
                  selection of dates before the specified Start date. When the
                  Calendar files are stored in a different directory to the
                  activating page the path pointing to these files is only
                  required when Calendar.html, and the Calendar Object, is
                  opened the first time (making the directory they reside in
                  the active directory) and not when it is "re-opened" when
                  navigating to another month or year.
                  Michael Holberton
                  Hospedaje Macha Wasi & Sacred Valley Mountain Bike Tours
                  Cusco Database Development and Cycling Services
                  http://www.machawasi.com
                  http://machawasi.blogspot.com/
                  http://databaseservices.blogspot.com*/

// if two digit year input dates after this year considered 20th century.
var NUM_CENTYEAR = 30;
// is time input control required by default
var BUL_TIMECOMPONENT = false;
// are year scrolling buttons required by default
var BUL_YEARSCROLL = true;
var fUseStartDateLimit = false;

var calendars = [];
var RE_NUM = /^\-?\d+$/;

// Array variable to store months as they appear in the calendar's title
var ARR_MONTHS = [];
// Array variable to store week day titles as they appear on the calendar
var ARR_WEEKDAYS = [];
// day week starts from (normally 0-Su or 1-Mo)
var NUM_WEEKSTART = 0;
var dtStartDateLimit = new Date(), fCalendarFilesPathSet = false;

function calendar1(obj_target) {

	// assigning methods
	this.gen_date = cal_gen_date1;
	this.gen_time = cal_gen_time1;
	this.gen_tsmp = cal_gen_tsmp1;
	this.prs_date = cal_prs_date1;
	this.prs_time = cal_prs_time1;
	this.prs_tsmp = cal_prs_tsmp1;
	this.popup    = cal_popup1;

	// validate input parameters
	if (!obj_target)
		return cal_error("Error calling the calendar: no target control specified");
	if (obj_target.value == null)
		return cal_error("Error calling the calendar: parameter specified is not valid target control");
	this.target = obj_target;
	this.time_comp = BUL_TIMECOMPONENT;
	this.year_scroll = BUL_YEARSCROLL;
	this.CalMonths = ARR_MONTHS;
	this.CalDays = ARR_WEEKDAYS;
	this.CalWeekStartDay = NUM_WEEKSTART;
	this.CalUseStartDateLimit = fUseStartDateLimit;
	this.CalendarFilesPathSet = fCalendarFilesPathSet;

  if (this.CalUseStartDateLimit)
	  this.CalStartDateLimit = dtStartDateLimit;
	
	// register in global collections
	this.id = calendars.length;
	calendars[this.id] = this;
}

function cal_popup1 (str_datetime) {
	if (str_datetime) {
		this.dt_current = this.prs_tsmp(str_datetime);
	}
	else {
		this.dt_current = this.prs_tsmp(this.target.value);
		this.dt_selected = this.dt_current;
	}
	if (!this.dt_current) return;

	/*Determine if the Calendar is being opened for the first time to allow the Path to be set so the
	  Calendar.html file can be located*/
  var strPath = "";

  if (this.CalendarFilesPathSet)
    this.CalendarFilesPathSet = false;
  else
    strPath = "../JavaScripts/Calendar/Tigra/";
    
	var obj_calwindow = window.open(
		strPath + 'calendar.html?datetime=' + this.dt_current.valueOf()+ '&id=' + this.id,
		'Calendar', 'width=325,height=250,scrollbars=yes,status=no,resizable=no,top=200,left=200,dependent=yes,alwaysRaised=yes'
	);
	obj_calwindow.opener = window;
	obj_calwindow.focus();
}

// timestamp generating function
function cal_gen_tsmp1 (dt_datetime) {
	return(this.gen_date(dt_datetime) + ' ' + this.gen_time(dt_datetime));
}

// date generating function (mmm d, yyyy)
function cal_gen_date1 (dt_datetime) {
  return (this.CalMonths[dt_datetime.getMonth()] + " " + dt_datetime.getDate() + ", " + dt_datetime.getFullYear());
}

// time generating function
function cal_gen_time1 (dt_datetime) {
	return (
		(dt_datetime.getHours() < 10 ? '0' : '') + dt_datetime.getHours() + ":"
		+ (dt_datetime.getMinutes() < 10 ? '0' : '') + (dt_datetime.getMinutes()) + ":"
		+ (dt_datetime.getSeconds() < 10 ? '0' : '') + (dt_datetime.getSeconds())
	);
}

// timestamp parsing function
function cal_prs_tsmp1 (str_datetime) {
	// if no parameter specified return current timestamp
	if (!str_datetime)
		return (new Date());

	// if positive integer treat as milliseconds from epoch
	if (RE_NUM.exec(str_datetime))
		return new Date(str_datetime);
		
	// else treat as date in string format
	//var arr_datetime = str_datetime.split(' ');
	var arr_datetime = str_datetime.split('/');
	return this.prs_time(arr_datetime[1], this.prs_date(arr_datetime[0]));
}

// date parsing function for Date retrieved from Text Box associated with the use of the calendar.
function cal_prs_date1 (str_date) {
  var i;
  // month abbreviations in English to allow use of the Date.parse function which is not Locale sensitive.
  var aMonthsEng = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
	var aDate = str_date.split(' ');
	var dt_date = new Date();
	
	// Determine English equivalent of Month abbreviation, retrieved from Text Box, and initialise the Date of the Calendar.
	for (i=0; i<12; i++)
	{
	  if (aDate[0] == this.CalMonths[i])
	  {
	    dt_date.setTime(Date.parse(aMonthsEng[i] + " " + aDate[1] + " " +  aDate[2]));
	    break;
	  }
	}

	return (dt_date)
}

// time parsing function
function cal_prs_time1 (str_time, dt_date) {

	if (!dt_date) return null;
	var arr_time = String(str_time ? str_time : '').split(':');

	if (!arr_time[0]) dt_date.setHours(0);
	else if (RE_NUM.exec(arr_time[0]))
		if (arr_time[0] < 24) dt_date.setHours(arr_time[0]);
		else return cal_error ("Invalid hours value: '" + arr_time[0] + "'.\nAllowed range is 00-23.");
	else return cal_error ("Invalid hours value: '" + arr_time[0] + "'.\nAllowed values are unsigned integers.");
	
	if (!arr_time[1]) dt_date.setMinutes(0);
	else if (RE_NUM.exec(arr_time[1]))
		if (arr_time[1] < 60) dt_date.setMinutes(arr_time[1]);
		else return cal_error ("Invalid minutes value: '" + arr_time[1] + "'.\nAllowed range is 00-59.");
	else return cal_error ("Invalid minutes value: '" + arr_time[1] + "'.\nAllowed values are unsigned integers.");

	if (!arr_time[2]) dt_date.setSeconds(0);
	else if (RE_NUM.exec(arr_time[2]))
		if (arr_time[2] < 60) dt_date.setSeconds(arr_time[2]);
		else return cal_error ("Invalid seconds value: '" + arr_time[2] + "'.\nAllowed range is 00-59.");
	else return cal_error ("Invalid seconds value: '" + arr_time[2] + "'.\nAllowed values are unsigned integers.");

	dt_date.setMilliseconds(0);
	return dt_date;
}

function cal_error (str_message) {
	alert (str_message);
	return null;
}
