/**
* @Author: Xanthos Innovative Solutions
* @Version: 1.5
* @dtp.class.js -> The calendar itselfs.
**/
function dtp() {
	
  	// global variables
		var config = new Array();
		var cal_initDate;
		var calendarMonthNumeric;
		var calendarMonthName;
		var cal_amountDays;
		var cal_day;
		var cal_year;
		var cal_weekday;
		var mHasDays;
		var Name;
		var weekdays; 
		var months;
		var curYear;
		var arrCal = Array();
		var calendar;
		var cal_target;
		var cal_placeHolder;
		
		var cal_target_hours;
		var cal_target_minutes;
		var cal_target_seconds;
		var cal_target_day;
		var cal_target_month;
		var cal_target_year;
		var cal_target_dayname;
		var a;
		var b;
		var timer_date,str,hours,minutes,seconds;
		var timerID = new Array();
		var timerRunning = new Array();
		var tooltipstate = true;
		dtp.current_instance;

		
		this.dtp = function() {
		}
		
		
		this.setTooltipDisabled = function(bool) {
			if (bool == false) this.tooltipstate = false;
			else this.tooltipstate = true;
		}
		
		this.getTooltip = function(id,date) {
			if(this.tooltipstate == true) {
			var date = date;
			var time = this.getTime();
			var format = lang[config['calendar_language']]['tooltip_format'];

			var displayString = this.ResultStringReplaces(date.split("."),time.split(":"),format);
			var arrDS = displayString.split(" ");
					displayString = arrDS[0]+"<br/>"+arrDS[1]+"<br/>"+arrDS[2];
		
			var c = document.getElementById("dtp_cell"+id);
			
			var x = dateTimePicker.getElementX(document.getElementById("dtp_cell"+id));
			var y = dateTimePicker.getElementY(document.getElementById("dtp_cell"+id));
			
			tt = document.getElementById("dtp_tooltip");
		
			tt.style.top = y+20;
			tt.style.left = x+20;
			tt.innerHTML = displayString;
			tt.style.display = "inline";
			}
		}
		
		this.unsetTooltip = function() {
			if(this.tooltipstate == true) {
			var c = document.getElementById("dtp_tooltip");
			c.style.display = "none";
			}
		}

		/**
		* Setting <div> tag wich should contain the calendar
		**/		
		this.setDisplayAreaDIVElement = function(DIVTag) {
			  this.cal_placeHolder = DIVTag;
		}
		
		/**
		* Setting the general result field
		**/
		this.setResultTextField = function(ResultTextField,format) {
				this.cal_target = ResultTextField;
				config["date_format"] = format;
		}
		
		/**
		* Setting the initial date the calendar should display
		**/
		this.setInitDate = function(InitDate) {
			cal_initDate = new Date(InitDate);
		}
		
		/**
		* Setting the config params
		**/
		this.setConfig = function(configparam,value) {
			config[configparam] = value;
		}
		
		/**
		* Closing the calendar
		**/
		this.close = function() {
			document.getElementById(this.cal_placeHolder).innerHTML="";
			document.getElementById(this.cal_placeHolder).style.display = "none";
			delete this;
		}
		
		
		/**
		* Setting the calendar language from parameter
		**/
		this.setLanguage = function(language) {
			config['calendar_language'] = language;
			months = lang[language]['months'];	
			weekdays = lang[language]['weekdays'];
		}
		
		/**
		* Calculating the calendar week
		**/		
		this.calendarWeek = function(jahr,monat,tag) {
			var datum=new Date(jahr,monat-1,tag); 
			var jh=jahr+1; 
			var kalwo=this.kaldiff(datum,jh);
			while(kalwo<1) { jh--; kalwo=this.kaldiff(datum,jh); }
			return kalwo;
		}
		
		this.kaldiff = function(datum,jahr) {
			var d4j=new Date(jahr,0,4);
			var wt4j=(d4j.getDay()+6)%7; // Anm. 3
			var m1wjT=Math.floor(0.01+d4j.getTime()/864e5-wt4j); // Anm. 4
			var datumT=Math.floor(0.01+datum.getTime()/864e5); // Anm. 5
			return Math.floor(1+(datumT-m1wjT)/7); // Anm. 6
		}
		
		/**
		* Stop the clock
		**/
		dtp.stopclock = function(){
				if(timerRunning)
				clearTimeout(timerID);
				timerRunning = false;
		}
		/**
		* Start the clock
		**/
		dtp.startclock = function(objname){
				dtp.stopclock();
				dtp.showtime(objname);
		}
		
		/**
		* Display the time
		**/
		dtp.showtime = function(objectname){
				var now = new Date();
				var hours = now.getHours();
				var minutes = now.getMinutes();
				var seconds = now.getSeconds();
				var timeValue = "" + ((hours > 12) ? hours - 12 : hours);
				var timeValue1 = "" + ((hours < 10) ? "0" : "") + hours;
				timeValue  += ((minutes < 10) ? ":0" : ":") + minutes;
				timeValue1 += ((minutes < 10) ? ":0" : ":") + minutes;
				timeValue  += ((seconds < 10) ? ":0" : ":") + seconds;
				timeValue1 += ((seconds < 10) ? ":0" : ":") + seconds;
				timeValue  += (hours >= 12) ? " P.M." : " A.M.";
				var n = "xis_timer"+objectname;
				
				if (document.getElementById(n)) {
				
				document.getElementById(n).innerHTML = timeValue;
				document.getElementById(n).innerHTML = timeValue1;
				}
				
				timerID[objectname] = setTimeout("dtp.showtime('"+objectname+"')",1000);
				timerRunning[objectname] = true;
		}
		

		/**
		* Getting the calendar displayed or updated
		**/
		this.getCalendar = function() {
			calendarMonthNumeric=null;
			calendarMonthName=null;
			cal_amountDays=null;
			cal_day=null;
			cal_year=null;
			cal_weekday=null;
			mHasDays=null;	
			curYear=null;
			arrCal = Array();
			calendar=null;
			

			// getting the amount of days for each month of the year
			mHasDays = this.getMonthDays(this.cal_initDate);	
			// Default settings for displaying the calendar of the current month
			curYear = this.cal_initDate.getFullYear();
			// --- Calculations ---
			calendarMonthNumeric = this.cal_initDate.getMonth()+1;
			cal_amountDays = mHasDays[calendarMonthNumeric-1];
			calendarMonthName = months[calendarMonthNumeric-1];
			cal_day = this.cal_initDate.getDate();
			cal_weekday = weekdays[this.cal_initDate.getDay()-1];
			cal_year = this.cal_initDate.getFullYear();
			var firstday = this.cal_initDate;
			firstday.setDate(1);
			var firstweekday=firstday.getDay()-1;
			var i,a,x,weekday,c,counter;
			var day = 0;
			counter = 1;
			week = -1;
			x=0;
			var arrKW = Array();
			// Setting up an array containing the days in the correct order
			for (day=firstweekday;day<=(cal_amountDays+firstweekday)-1;day++) {

						if (day==firstweekday || day%7==0) {
								week++;
								arrCal[week]= Array();
						}
						if (week == 0) {
							if (day==-1) {arrCal[week][6] = counter;  if(arrKW[week]==null) arrKW[week]=this.calendarWeek(curYear,calendarMonthNumeric,counter);}
								else { arrCal[week][day] = counter; if(arrKW[week]==null) arrKW[week]=this.calendarWeek(curYear,calendarMonthNumeric,counter);}

						}
						else {
							if (x==7) x=0;
							arrCal[week][x] = counter;	
							if(arrKW[week]==null) arrKW[week]=this.calendarWeek(curYear,calendarMonthNumeric,counter);
							x++;
						}
					counter++;
					
			}
		
		
		
		// setting the days of the preceeding month
		buf1 = this.cal_initDate;	
		if (buf1 <1 )
		{
			buf1.setMonth(11);
			buf1.setFullYear((this.cal_initDate.getFullYear()-1));
		}
		else daysOfPreviousMonth = mHasDays[calendarMonthNumeric-2];	
		
		daysOfPreviousMonth = mHasDays[buf1.getMonth()];	
		count = 1;
		var s = this.in_array(1,arrCal[0])-1;

		for (x=s;x>=0;x--) {
			arrCal[0][x] = daysOfPreviousMonth;
			daysOfPreviousMonth--;
		}

		// setting the days of the next month

		var a = this.in_array((mHasDays[(calendarMonthNumeric-1)]),arrCal[(arrCal.length-1)])+1;
		for (	x= a;
					x<=(15-((arrCal[(arrCal.length-1)].length)-1));
					x++
				) 
				{
						arrCal[(arrCal.length-1)][x] = count;
						count++;
				}
		
		
		// Getting the calendar header
		calendar = this.getTableHeader(weekdays,this.cal_initDate);
		ob = new Date();
		// Formatting the calendar array to HTML
		for (week=0;week<=(arrCal.length-1);week++) {
			calendar+="<tr><td class=\"calendar_week\">"+arrKW[week]+"</td>";
			for (weekday=0;weekday<=6;weekday++) {
	
			if (arrCal[week][weekday] == ob.getDate())  formatcurrday = "today"; else formatcurrday = "month_day";
			
			if ((week==(arrCal.length-1)	&& arrCal[week][weekday]<=7 && arrCal[week][weekday]>=1) || (week==0 && arrCal[week][weekday]>20))
			{
					calendar+="<td class=\"other_month_day\">"+arrCal[week][weekday]+"</td>";
			}	
				else calendar+="<td onmouseout=\"dateTimePicker.unsetTooltip('"+this.Name+"');\" id=\"dtp_cell"+arrCal[week][weekday]+"\"onmouseover=\"dateTimePicker.getTooltip('"+this.Name+"','"+arrCal[week][weekday]+"','"+cal_year+"-"+calendarMonthNumeric+"-"+arrCal[week][weekday]+"');\" class=\""+formatcurrday+"\"><a class=\""+formatcurrday+"\" href=\"javascript:dateTimePicker.pickDate('"+this.Name+"','"+cal_year+"-"+calendarMonthNumeric+"-"+arrCal[week][weekday]+"');\">"+arrCal[week][weekday]+"</a></td>";
			}
			calendar+="</tr>";
		}
		calendar+="<tr>";
		calendar+="<td colspan=\"8\">";
		calendar+="<table style=\"border:0px;width:100%;height:100%;\" class=\"xis_footer\" cellpadding=\"0\" cellspacing=\"0\">";
		calendar+="<tr>";
		calendar+="<td><a id=\"xis_editTime"+this.Name+"\" title=\""+lang[config['calendar_language']]['edit_time_tooltip']+"\" href=\"javascript:dateTimePicker.editTime('"+this.Name+"');\">"+lang[config['calendar_language']]['label_time']+"</a>&nbsp;</td>";
		calendar+="<td><span id=\"xis_timer_container"+this.Name+"\"></span></td>";
		calendar+="<td align=\"right\"colspan=\"4\"><a title=\"Copyright\" id=\"xis_c_mark"+this.Name+"\" href=\"javascript:dateTimePicker.CopyRight('"+this.Name+"');\">| &copy; |</a>&nbsp;&nbsp;<a href=\"javascript:dateTimePicker.close('"+this.Name+"');\">"+lang[config['calendar_language']]['close_link'];+"</a></td>";
		calendar+="</tr></table>";
		calendar+="</td></tr>";
		calendar+="</table><div style=\"padding:10px;background-color:#ffffff;border: 2px solid darkred; font-family:Arial;font-size:12px;color:#000000;display:none;\" id=\"xis_copyright"+this.Name+"\"></div>";
		
		// Displaying the calendar in page
		document.getElementById(this.cal_placeHolder).innerHTML="";
		document.getElementById(this.cal_placeHolder).innerHTML = calendar;
		//default
		document.getElementById("xis_timer_container"+this.Name).innerHTML = "<span id=\"xis_timer"+this.Name+"\" value=\"\" class=\"timer\"></span>";
		dtp.startclock(this.Name);
  	document.getElementById(this.cal_placeHolder).style.display = "inline";	
		}
		
		this.resetTimer = function() {
			document.getElementById("xis_editTime"+this.Name).href="javascript:dateTimePicker.editTime('"+this.Name+"');";
			document.getElementById("xis_timer_container"+this.Name).innerHTML = "<span id=\"xis_timer"+this.Name+"\" value=\"\" class=\"timer\"></span>";
			dtp.startclock(this.Name);
			

		}
		
		this.editTime = function() {
			var buf;
			buf = document.getElementById("xis_timer"+this.Name).innerHTML;
			document.getElementById("xis_timer_container"+this.Name).innerHTML = "<input type=\"text\" id=\"xis_timer"+this.Name+"\" class=\"xis_timer\" value=\""+buf+"\"/>";
			document.getElementById("xis_editTime"+this.Name).href="javascript:dateTimePicker.resetTimer('"+this.Name+"');";
			document.getElementById("xis_editTime"+this.Name).title=lang[config['calendar_language']]['reset_time_tooltip'];

		}
		
	
		this.getTime = function() {
			var b;

				if (document.getElementById("xis_timer"+this.Name).innerHTML) {
					b = document.getElementById("xis_timer"+this.Name).innerHTML;
					if (b.search("<input>")!=-1) b=b.replace("<input>","");
				} 
				else b = document.getElementById("xis_timer"+this.Name).value
			
			return b;
			
		}
		
		/**
		* Getting the selected date from the calendar and send it to the target html element
		**/
		this.pickDate = function(str) {
			
			b = this.getTime();
			
			a = str.split("-");
			b = b.split(":");
			dtp.stopclock();
		
			//Sets the result datetime string into one single field
			if (config["date_format"]!=null) {

				  
					res = this.ResultStringReplaces(a,b,config["date_format"]);
					document.getElementById(this.cal_target).value = res;
					
			}
			//Sets the result datetime string into separated fields
			else {

					if (config["date_format_day_external"]!=null) { 
						if (document.getElementById(this.cal_target_day)) document.getElementById(this.cal_target_day).value = this.ResultStringReplaces(a,b,config["date_format_day_external"]);
						else alert("Day result input field is not defined");
					}
					if (config["date_format_month_external"]!=null) {
						if (document.getElementById(this.cal_target_month)) document.getElementById(this.cal_target_month).value = this.ResultStringReplaces(a,b,config["date_format_month_external"]);
						else alert("Month result input field is not defined");
					}
					if (config["date_format_hours_external"]!=null) {
						if (document.getElementById(this.cal_target_hours)) document.getElementById(this.cal_target_hours).value = this.ResultStringReplaces(a,b,config["date_format_hours_external"]);
						else alert("Hour result input field is not defined");
					}
					if (config["date_format_minutes_external"]!=null) {
						if (document.getElementById(this.cal_target_minutes)) document.getElementById(this.cal_target_minutes).value = this.ResultStringReplaces(a,b,config["date_format_minutes_external"]);
						else alert("Minutes result input field is not defined");
					}
					if (config["date_format_seconds_external"]!=null) {
						if (document.getElementById(this.cal_target_seconds)) document.getElementById(this.cal_target_seconds).value = this.ResultStringReplaces(a,b,config["date_format_seconds_external"]);
						else alert("Second result input field is not defined");
					}
					if (config["date_format_year_external"]!=null) {
						if (document.getElementById(this.cal_target_year)) document.getElementById(this.cal_target_year).value = this.ResultStringReplaces(a,b,config["date_format_year_external"]);
						else alert("Year result input field is not defined");
					}
					if (config["date_format_dayname_external"]!=null) {
						if (document.getElementById(this.cal_target_dayname)) document.getElementById(this.cal_target_dayname).value = this.ResultStringReplaces(a,b,config["date_format_dayname_external"]);
						else alert("Day name result input field is not defined");
					}
				
			}
			this.unsetTooltip();
			this.close();
			
		}
		
		this.ResultStringReplaces = function (date,time,formatstring) {
		var daywNull = date[2];
		// YEAR
		if (formatstring.search("YYYY")!=-1) formatstring = formatstring.replace("YYYY",date[0]);
			else if (formatstring.search("YY")!=-1) formatstring = formatstring.replace("YY",date[0].sutimestring(2,4));
		// MONTH
		if (formatstring.search("MM")!=-1) {
				 if (parseInt(date[1])<10) date[1]="0"+date[1];			
				 formatstring	= formatstring.replace("MM",date[1]);		
		}
		// DAY
		if (formatstring.search("DD")!=-1) {
				 if (parseInt(date[2])<10) date[2]="0"+date[2];			
				 formatstring	= formatstring.replace("DD",date[2]);		
		}
		
		var bufdate = new Date();
		bufdate.setFullYear(date[0]);
		bufdate.setMonth(date[1]);
		bufdate.setDate(daywNull-4);
	
		var week_day_full = lang[config['calendar_language']]['week_days_full'][bufdate.getDay()];
	
		if (formatstring.search("dd")!=-1) formatstring = formatstring.replace("dd",week_day_full);	
		
		// HOURS
		if (formatstring.search("hh")!=-1) formatstring = formatstring.replace("hh",time[0]);	
		// MINUTES
		if (formatstring.search("mm")!=-1) formatstring = formatstring.replace("mm",time[1]);	
		// SECONDS
		if (formatstring.search("ss")!=-1) formatstring = formatstring.replace("ss",time[2]);	


		return formatstring;			
		}
		
		/**
		* Checking the year on leap year
		**/
		this.isLeapYear = function(year) {
			Jhr = year; 
			Jahr = (Jhr >= 2000) ? Jhr : ((Jhr< 80) ? Jhr + 2000 : Jhr + 1900) 
			SJahr = Jahr%4; 
			SHJahr = Jahr%100; 
			S4Jahr = Jahr%400; 
			STag = ((S4Jahr == "0") ? (1) : ((SHJahr == "0") ? (0) : ((SJahr == "0") ? (1) : (0))));
			if (STag == 1) return true;
			else return false;
		}
		
		/**
		* Getting the amount of days for each month
		**/
		this.getMonthDays = function () {
			var am;
			if (this.isLeapYear(this.cal_initDate.getFullYear()))
						am = Array(31,28,31,30,31,30,31,31,30,31,30,31);
			 else am = Array(31,29,31,30,31,30,31,31,30,31,30,31);
		
		return am;
			
		}
		
		/**
		* Getting the name of the integer month in parameter
		**/
		this.getMonthName = function(month) {
			var months   = lang[config['calendar_language']]['months'];
			return months[month-1];
		}
		
		/**
		* Getting the heades of the calendar
		**/
		this.getTableHeader = function(weekdays,date) {
		
			var res;	
					
			res ="<table cellspacing=\"0\" cellpadding=\"0\" class=\"calendar\">";
			res+="<tr>";
			res+="<td title=\"previous Month\" class=\"calendar_header\" align=\"center\"><a href=\"javascript:dateTimePicker.previousPeriod('"+this.Name+"',"+(date.getMonth())+","+date.getFullYear()+");\">"+
					 "&lt;&lt;</a></td>"+
					 "<td title=\"previous Year\" class=\"calendar_header\" align=\"center\"><a href=\"javascript:dateTimePicker.previousPeriod('"+this.Name+"',"+(date.getMonth()+1)+","+(date.getFullYear()-1)+");\">&lt;</a>"+
					 "</td><td class=\"calendar_header_year_display\" colspan=\"4\" align=\"center\">"+this.getMonthName((date.getMonth()+1))+" "+date.getFullYear()+"</td>"+
					 "<td title=\"next Year\" class=\"calendar_header\" align=\"center\"><a href=\"javascript:dateTimePicker.nextPeriod('"+this.Name+"',"+(date.getMonth()+1)+","+(date.getFullYear()+1)+");\">&gt;</a></td>"+
					 "<td title=\"next Month\" class=\"calendar_header\" align=\"center\"><a href=\"javascript:dateTimePicker.nextPeriod('"+this.Name+"',"+(date.getMonth()+2)+","+date.getFullYear()+");\">&gt;&gt;</a></td>";
			res+="	</tr><tr>";
			res+="		<td class=\"header_weekday\">"+lang[config['calendar_language']]['calendar_week']+"</td>";
			res+="		<td class=\"header_weekday\">"+weekdays[0]+"</td>";
			res+="		<td class=\"header_weekday\">"+weekdays[1]+"</td>";
			res+="		<td class=\"header_weekday\">"+weekdays[2]+"</td>";
			res+="		<td class=\"header_weekday\">"+weekdays[3]+"</td>";
			res+="		<td class=\"header_weekday\">"+weekdays[4]+"</td>";
			res+="		<td class=\"header_weekday\">"+weekdays[5]+"</td>";
			res+="		<td class=\"header_weekday\">"+weekdays[6]+"</td>";
			res+="	</tr>";
		
		return res;
		}
		
		
		/**
		* Inits the calendar
		**/
		this.init = function () {
			if (this.cal_initDate == null) this.cal_initDate = new Date();
			this.getCalendar();
			
		}
				/**
		* Array search
		**/
		this.in_array = function (lookfor,arr) {
			var r;
			var res=-1;
			for (r=0;r<arr.length;r++) {
				if (arr[r]==lookfor) res = r;
			}
			return res;
		}
		
	
		

}





