// 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
/******************************************************************************
$Workfile: calendar2.js $
$Revision: 21 $
$Author: Nfeller $

Generates a european client-side 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 calendar2(obj_target) {

	// accessing methods
	this.gen_date = cal_gen_date2;
	this.gen_time = cal_gen_time2;
	this.gen_tsmp = cal_gen_tsmp2;
	this.prs_date = cal_prs_date2;
	this.prs_time = cal_prs_time2;
	this.prs_tsmp = cal_prs_tsmp2;
	this.popup    = cal_popup2;

	// 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_popup2 (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_tsmp2 (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_date2 (dt_datetime) {
	return formatUTCDateTime(dt_datetime, dateFormatString);
/*
	return (
		(dt_datetime.getMonth() < 9 ? '0' : '') + (dt_datetime.getMonth() + 1) + "/"
		+ (dt_datetime.getDate() < 10 ? '0' : '') + dt_datetime.getDate() + "/"
		+ dt_datetime.getFullYear()
	);
*/
}
// time generating function
function cal_gen_time2 (dt_datetime) {
    return dt_datetime.toLocaleTimeString();
}

// timestamp parsing function
function cal_prs_tsmp2 (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_date2 (str_date) {

	var arr_date = str_date.split('/');

	if (arr_date.length != 3) return;
	if (!arr_date[1]) return;
	if (!RE_NUM.exec(arr_date[1])) return;
	if (!arr_date[0]) return;
	if (!RE_NUM.exec(arr_date[0])) return;
	if (!arr_date[2]) return;
	if (!RE_NUM.exec(arr_date[2])) return;

	var dt_date = new Date();
	dt_date.setDate(1);

	if (arr_date[0] < 1 || arr_date[0] > 12) return;
	dt_date.setMonth(arr_date[0]-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[0], 0);
	dt_date.setDate(arr_date[1]);
	if (dt_date.getMonth() != (arr_date[0]-1)) return;

	return (dt_date)
}

// time parsing function
function cal_prs_time2 (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;
}
