// Title: Tigra Calendar
// URL: http://www.softcomplex.com/products/tigra_calendar/
// Version: 3.3 (American 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
/******************************************************************************
$Workfile: calendar1.js $
$Revision: 18 $
$Author: Nfeller $

Generates a client-side american calendar control.

Copyright © 2006 OSIsoft, Inc. All rights reserved.
Unpublished - rights reserved under the copyright law of the United States.
USE OF A COPYRIGHT NOTICE IS PRECAUTIONARY ONLY AND DOES NOT
IMPLY PUBLICATION OR DISCLOSURE.
THIS SOFTWARE CONTAINS CONFIDENTIAL INFORMATION AND TRADE SECRETS OF OSIsoft, Inc. USE, DISCLOSURE, OR REPRODUCTION IS PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF OSIsoft, Inc.
RESTRICTED RIGHTS LEGEND
Use, duplication, or disclosure by the Government is subject to restrictions as set forth in subparagraph (c)(1)(ii) of the Rights in Technical Data and Computer Software clause at DFARS 252.227.7013

OSIsoft, Inc.
777 Davis St., San Leandro CA 94577
*******************************************************************************/
// if two digit year input dates after this year considered 20 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 calendars = [];
var RE_NUM = /^\-?\d+$/;

function calendar1(obj_target) {

	// accessing 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");
		return cal_error(errCalendarNoCtl);
	if (obj_target.value == null)
//		return cal_error("Error calling the calendar: parameter specified is not valid target control");
		return cal_error(errCalendarInvalidCtl);
	this.target = obj_target;
	this.time_comp = BUL_TIMECOMPONENT;
	this.year_scroll = BUL_YEARSCROLL;
	
	// register in global collections
	this.id = calendars.length;
	calendars[this.id] = this;
}

function cal_popup1 (vdir, str_datetime) {
	this.dt_current = this.prs_tsmp();
	if (str_datetime != 0) {
		this.dt_current = this.prs_tsmp(str_datetime ? str_datetime : this.target.value);
	}
	if (!this.dt_current) return;

	if (vdir != "") {
	  var obj_calwindow = window.open(
		  vdir + '/calendar.html?datetime=' + this.dt_current.valueOf()+ '&id=' + this.id,
		  'Calendar', 'width=200,height='+(this.time_comp ? 215 : 190)+
		  ',status=no,resizable=no,top=200,left=200,dependent=yes,alwaysRaised=yes');
	}
	else {
	  var obj_calwindow = window.open(
		  'calendar.html?datetime=' + this.dt_current.valueOf()+ '&id=' + this.id,
		  'Calendar', 'width=200,height='+(this.time_comp ? 215 : 190)+
		  ',status=no,resizable=no,top=200,left=200,dependent=yes,alwaysRaised=yes');
	}
	obj_calwindow.opener = window;
	obj_calwindow.focus();
}

// formatUTCDateTime() found in RtWPv2_0.js
// dateTimeFormatString, dateFormatString, timeFormatString are output by the RtWebPart base class

// timestamp generating function
function cal_gen_tsmp1 (dt_datetime) {
	return formatUTCDateTime(dt_datetime.getTime() - (dt_datetime.getTimezoneOffset() * 60 * 1000), dateTimeFormatString);
//	return( formatUTCDateTime(dt_datetime, dateFormatString) + ' ' + this.gen_time(dt_datetime));
//	return( formatUTCDateTime(dt_datetime, dateFormatString) + ' ' + formatUTCDateTime(dt_datetime, timeFormatString) );
//	return(this.gen_date(dt_datetime) + ' ' + this.gen_time(dt_datetime));
}

// date generating function
function cal_gen_date1 (dt_datetime) {
	return formatUTCDateTime(dt_datetime, dateFormatString);
/*
	return (
		(dt_datetime.getDate() < 10 ? '0' : '') + dt_datetime.getDate() + "-"
		+ (dt_datetime.getMonth() < 9 ? '0' : '') + (dt_datetime.getMonth() + 1) + "-"
		+ dt_datetime.getFullYear()
	);
*/
}
// time generating function
function cal_gen_time1 (dt_datetime) {
    return dt_datetime.toLocaleTimeString();
}

// 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(' ');
	return this.prs_time(arr_datetime[1], this.prs_date(arr_datetime[0]));
}

// date parsing function
function cal_prs_date1 (str_date) {

	var arr_date = str_date.split('-');

//	if (arr_date.length != 3) return cal_error ("Invalid date format: '" + str_date + "'.\nFormat accepted is dd-mm-yyyy.");
	if (arr_date.length != 3) return cal_error (CreateLocalizedString(errCalendarInvalidDate,str_date,dateFormatString));
//	if (!arr_date[0]) return cal_error ("Invalid date format: '" + str_date + "'.\nNo day of month value can be found.");
	if (!arr_date[0]) return cal_error (CreateLocalizedString(errCalendarNoDayMthFnd,str_date));
//	if (!RE_NUM.exec(arr_date[0])) return cal_error ("Invalid day of month value: '" + arr_date[0] + "'.\nAllowed values are unsigned integers.");
	if (!RE_NUM.exec(arr_date[0])) return cal_error (CreateLocalizedString(errCalendarInvalidDay,arr_date[0]));
//	if (!arr_date[1]) return cal_error ("Invalid date format: '" + str_date + "'.\nNo month value can be found.");
	if (!arr_date[1]) return cal_error (CreateLocalizedString(errCalendarInvalidDateNoMth,str_date));
//	if (!RE_NUM.exec(arr_date[1])) return cal_error ("Invalid month value: '" + arr_date[1] + "'.\nAllowed values are unsigned integers.");
	if (!RE_NUM.exec(arr_date[1])) return cal_error (CreateLocalizedString(errCalendarInvalidMth,arr_date[1]));
//	if (!arr_date[2]) return cal_error ("Invalid date format: '" + str_date + "'.\nNo year value can be found.");
	if (!arr_date[2]) return cal_error (CreateLocalizedString(errCalendarInvalidFmt,str_date));
//	if (!RE_NUM.exec(arr_date[2])) return cal_error ("Invalid year value: '" + arr_date[2] + "'.\nAllowed values are unsigned integers.");
	if (!RE_NUM.exec(arr_date[2])) return cal_error (CreateLocalizedString(errCalendarInvalidYr,arr_date[2]));

	var dt_date = new Date();
	dt_date.setDate(1);

//	if (arr_date[1] < 1 || arr_date[1] > 12) return cal_error ("Invalid month value: '" + arr_date[1] + "'.\nAllowed range is 01-12.");
	if (arr_date[1] < 1 || arr_date[1] > 12) return cal_error (CreateLocalizedString(errCalendarInvalidMth,arr_date[1]));
	dt_date.setMonth(arr_date[1]-1);
	 
	if (arr_date[2] < 100) arr_date[2] = Number(arr_date[2]) + (arr_date[2] < NUM_CENTYEAR ? 2000 : 1900);
	dt_date.setFullYear(arr_date[2]);

	var dt_numdays = new Date(arr_date[2], arr_date[1], 0);
	dt_date.setDate(arr_date[0]);
//	if (dt_date.getMonth() != (arr_date[1]-1)) return cal_error ("Invalid day of month value: '" + arr_date[0] + "'.\nAllowed range is 01-"+dt_numdays.getDate()+".");
	if (dt_date.getMonth() != (arr_date[1]-1)) return cal_error (CreateLocalizedString(errCalendarInvalidDayOfMth,arr_date[0],dt_numdays.getDate()));

	return (dt_date)
}

// time parsing function
function cal_prs_time1 (str_time, dt_date)
{
	var dtstring = dt_date.toDateString() + " " + str_time;
	
	try {
	  dt_date = new Date(Date.parse(dtstring));
	}
	catch (e) {
	  return cal_error(e.description);
	}
	if (isNaN(dt_date)) {
//	 return cal_error("Invalid time : " + dtstring);
	 return cal_error(CreateLocalizedString(errCalendarInvalidTime,dtstring));
	}
	return dt_date;
}

function cal_error (str_message) {
	alert (str_message);
	return null;
}
