// Title: Tigra Calendar
// URL: http://www.softcomplex.com/products/tigra_calendar/
// Version: 3.2 (European date format)
// Date: 10/14/2002 (mm/dd/yyyy)
// Language: Francais
// 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

// 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 = true;
// are year scrolling buttons required by default
var BUL_YEARSCROLL = false;

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

//by reto!
// week day titles as they appear on the calendar
var ARR_WEEKDAYS = ["Di", "Lu", "Ma", "Me", "Je", "Ve", "Sa"];

function calendar1(obj_targetDate, obj_targetTime) {

	// 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_targetDate)
		return cal_error("Error calling the calendar: no target control specified");
	if (obj_targetDate.value == null)
		return cal_error("Error calling the calendar: parameter specified is not valid target control");
	this.targetDate = obj_targetDate;

	// validate input parameters
	if (!obj_targetTime)
		return cal_error("Error calling the calendar: no target control specified");
	if (obj_targetTime.value == null)
		return cal_error("Error calling the calendar: parameter specified is not valid target control");
	this.targetTime = obj_targetTime;
	
	
	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 (str_datetime) {
	//alert(this.targetDate.value)
	this.dt_current = this.prs_tsmp(str_datetime ? str_datetime : this.targetDate.value+" "+this.targetTime.value);
	if (!this.dt_current) this.dt_current = new Date(); //return;

	var obj_calwindow = window.open(
		'http://mct.sbb.ch/mct/fr/calendar.htm?datetime=' + this.dt_current.valueOf()+ '&id=' + this.id,
		'Calendar', 'width=215,height='+(this.time_comp ? 260 : 230)+
		',status=no,resizable=yes,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
function cal_gen_date1 (dt_datetime) {
	var dayInWeek = dt_datetime.getDay();
	var fullYear = dt_datetime.getFullYear();
	var shortYear = fullYear.toString().substring(2,4); // short Year with just 2 chars - 04 instead of 2004
		
	return (
		(ARR_WEEKDAYS[dayInWeek]) + ', ' +
		(dt_datetime.getDate() < 10 ? '0' : '') + dt_datetime.getDate() + "."
		+ (dt_datetime.getMonth() < 9 ? '0' : '') + (dt_datetime.getMonth() + 1) + "."
		+ shortYear
	);
}
// 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(' ');
	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[0]) return cal_error ("Invalid date format: '" + str_date + "'.\nNo day of month value can be found.");
	if (!RE_NUM.exec(arr_date[0])) return cal_error ("Invalid day of month value: '" + arr_date[0] + "'.\nAllowed values are unsigned integers.");
	if (!arr_date[1]) return cal_error ("Invalid date format: '" + str_date + "'.\nNo month value can be found.");
	if (!RE_NUM.exec(arr_date[1])) return cal_error ("Invalid month value: '" + arr_date[1] + "'.\nAllowed values are unsigned integers.");
	if (!arr_date[2]) return cal_error ("Invalid date format: '" + str_date + "'.\nNo year value can be found.");
	if (!RE_NUM.exec(arr_date[2])) return cal_error ("Invalid year value: '" + arr_date[2] + "'.\nAllowed values are unsigned integers.");

	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.");
	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()+".");

	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;
}

/* Set Date by JavaScript */
function getjsDate(type){
var ndate = new Date();
var t = ndate.getDate();
var m = 1+(1*ndate.getMonth());
var g = "g"+ndate.getYear();
var j = g.substring(3,5);
if(t<10) t = "0"+t;
if(m<10) m = "0"+m;
if(j<10) j = "0"+1*j;
if(type=="full"){var date = t+"."+m+"."+j; return date;}
else{var date = new Array(t,m,j); return date;}}
function checkWeekday(count,journeyType,returnDateOnly){
var getcDate = eval("document.formcalendrier.REQ"+journeyType+"JourneyDate.value.toLowerCase();");
if(getcDate == ""){var nix = 0;} else
if((getcDate.length > 2) || (getcDate.indexOf("+")!= -1)) /* Abfrage auf '+' ben&#246;tigt ??? */
{changeDate(count,journeyType,returnDateOnly);}else
{doWeekday(journeyType,getcDate,returnDateOnly);}}
function useOutwardDate(wDay){
var getcDate = eval("document.formcalendrier.REQ0JourneyDate.value.toLowerCase();");
var reg = eval("/^ *("+wDay+")\, */");
var cDate = getcDate.replace(reg,"");
var date = cdate.split(".");
return date;}
function doWeekday(journeyType,getcDate,returnDateOnly){
var wDayOri = eval("document.formcalendrier.wDayExt"+journeyType+".value;");
var wDay = eval("document.formcalendrier.wDayExt"+journeyType+".value.toLowerCase();");
if(journeyType == 0 && returnDateOnly == "yes")
{var dateField = getjsDate('field');}
else if(journeyType == 1 && returnDateOnly == "yes")
{var dateField = useOutwardDate(wDay);}
else /* if(journeyType == 1 && returnDateOnly == "no") */
{var dateField = getjsDate('field');}
var reg = eval("/^ *("+wDay+") */");
var test = getcDate.match(reg);
if(test!=null){
var days = getDaysSince1980((1*("20"+dateField[2])),(1*dateField[1]),(1*dateField[0]));
var cwd = (wDay.substr((3*(1*days%7)),2));
var nwd = test[0];
var nwdidx  = (wDay.indexOf(test[0])/3);
var cwdidx  = (wDay.indexOf(cwd)/3);
if(nwdidx < cwdidx)
{nwdidx = nwdidx + 7 - cwdidx;}
else
{nwdidx = nwdidx - cwdidx;}
var newDay = nwdidx;
var gDate = gregDate(1*newDay+1*(getDaysSince1980((1*("20"+dateField[2])),(1*dateField[1]),(1*dateField[0]))));
var days = (1*+newDay+1*getDaysSince1980((1*("20"+dateField[2])),(1*dateField[1]),(1*dateField[0])));
setNewDate(journeyType,gDate,getcDate,wDayOri,days);}}

/* Get and Calculate new date */
function changeDate(count,journeyType,returnDateOnly) {
var wDay = eval("document.formcalendrier.wDayExt"+journeyType+".value;");
var getcDate = eval("document.formcalendrier.REQ"+journeyType+"JourneyDate.value;");
var reg = eval("/^ *("+wDay+")\, */");
if(getcDate=="" && journeyType==1 && returnDateOnly=="no")  {var getcDate = getjsDate('full');}
if(getcDate=="" && journeyType==1 && returnDateOnly=="yes") {var getcDate = eval("document.formcalendrier.REQ0JourneyDate.value;");}
var cDate = getcDate.replace(reg,"");
var ctg = 1*(cDate.substring(0,cDate.indexOf(".")));
var cmt = 1*(cDate.substring((cDate.indexOf(".")+1),cDate.lastIndexOf(".")));
var cjr = (cDate.substring((cDate.lastIndexOf(".")+1),cDate.length));
if(ctg=="" || cmt=="" || cjr==""){/* NIX */}
else{
if(cjr.length==4){cjr = cjr.substring(2,4);};
var gDate = gregDate(1*count+1*(getDaysSince1980((1*("20"+cjr)),cmt,ctg)));
var days = (1*count+1*(getDaysSince1980((1*("20"+cjr)),cmt,ctg)));
setNewDate(journeyType,gDate,cDate,wDay,days);}}
function setNewDate(journeyType,gDate,cDate,wDay,days){
var nwd = (wDay.substr((3*(1*days%7)),2));
if(gDate[0]<10){gDate[0]="0"+gDate[0];}
if(gDate[1]<10){gDate[1]="0"+gDate[1];}
var nDate = nwd+", "+gDate[0]+"."+gDate[1]+"."+gDate[2];
if(nDate.indexOf("NaN")!=-1) var nDate = cDate;
eval("document.formcalendrier.REQ"+journeyType+"JourneyDate.value =\""+nDate+"\";");}
function getDaysSince1980(y, m, d){
var daysInMonth = new Array(0,31,59,90,120,151,181,212,243,273,304,334);
var returnDays = (y-1980)*365;
returnDays    += (y-1980+3)/4;
returnDays    += daysInMonth[m-1];
if(m>2 && isLeapYear(y)==true) returnDays ++;
returnDays += 1*d;
returnDays = parseInt(returnDays);
return returnDays;
}

function isLeapYear(y){if((y%4)==0 && (y%100)!=0 || (y%400)==0) return true;}
function gregDate(daysSince1980){
var daysSince1980 = parseInt(daysSince1980);
var daysInMonth = new Array(0,31,59,90,120,151,181,212,243,273,304,334);
var daysInYear = 366;
var years      = 0;
var february_29;
var n = 11;
if(daysSince1980 < 0) daysSince1980 = 0;
while(daysSince1980> daysInYear){
years ++;
daysSince1980 -= daysInYear;
if((years%4)==0) {daysInYear = 366;} else {daysInYear = 365;}}
if((years%4)==0 && daysSince1980>=60)
{february_29 = true; daysSince1980 --;} else
{february_29 = false;}
while(n>0 && daysInMonth[n]>=daysSince1980) n--;
if(february_29==true && daysSince1980 == 59) daysSince1980 ++;
var d = (daysSince1980-daysInMonth[n]);
var m = n+1;
var ty = (years + 1980).toString();
var y = ty.substring(2,4);
var gDate = new Array(d,m,y);
return gDate;}

/* get current time and calculate new time */
function changeTime(count,journeyType){
var getTime = eval("document.formcalendrier.REQ"+journeyType+"JourneyTime.value;");
var jsTime = getTime.split(":");
var jsHours = jsTime[0];
var jsMinutes = jsTime[1];
var jsNewHours = (1*jsHours) + (1*count);
if(jsNewHours >= 24)
jsNewHours -= 24;
else if(jsNewHours <0)
jsNewHours += 24;
var newTime = "\""+jsNewHours +":"+jsMinutes+"\"";
var output = "document.formcalendrier.REQ"+journeyType+"JourneyTime.value ="+newTime;
eval(output);}

/* insert as plan text the date in x days based on baseDate. */
function insertNewDate (baseDate, dayIncrement){
var splitDate = baseDate.split(".");
var baseDay   = splitDate[0];
if (baseDay.charAt(0) == '0')
baseDay = baseDay.charAt(1);
var baseMonth = splitDate[1];
if (baseMonth.charAt(0) == '0')
baseMonth = baseMonth.charAt(1);
var baseYear = eval('20'+splitDate[2]);
var days = getDaysSince1980(baseYear, baseMonth, baseDay);
days += dayIncrement;
var newDate = gregDate(1*days);
if (newDate[0] < 10)
newDate[0] = "0"+newDate[0];
if (newDate[1] < 10)
newDate[1] = "0"+newDate[1];
var strDate = newDate[0]+"."+newDate[1]+".20"+newDate[2];
document.write(strDate);}
function decodeApostrophe (string){
var tokens = string.split("***");
var length = tokens.length;
var result = "";
var index;
if (length > 1){
for (index = 0; index < length; index++){
result += tokens[index];
result += "%27";}}
else {result = string;}
return result;}
function encodeApostrophe (string){
var tokens = string.split("%27");
var length = tokens.length;
var result = "";
var index;
for (index = 0; index < length; index++){
result += tokens[index];
result += "***";}
return result;}


function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_validateForm() { //v4.0
  var i,p,q,nm,test,num,min,max,errors='',args=MM_validateForm.arguments;
  for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; val=MM_findObj(args[i]);
    if (val) { nm=val.name; if ((val=val.value)!="") {
      if (test.indexOf('isEmail')!=-1) { p=val.indexOf('@');
        if (p<1 || p==(val.length-1)) errors+='- '+nm+' must contain an e-mail address.\n';
      } else if (test!='R') { num = parseFloat(val);
        if (isNaN(val)) errors+='- '+nm+' doit contenir un nombre.\n';
        if (test.indexOf('inRange') != -1) { p=test.indexOf(':');
          min=test.substring(8,p); max=test.substring(p+1);
          if (num<min || max<num) errors+='- '+nm+' must contain a number between '+min+' and '+max+'.\n';
    } } } else if (test.charAt(0) == 'R') errors += '- '+nm+' obligatoire.\n'; }
  } if (errors) alert(''+errors);
  document.MM_returnValue = (errors == '');
}
