﻿/*
 *  calendar.js
 *
 *  Autor: Norman Walter
 *  Datum: 6.3.2009
 *
 *  Letzte Änderung: 22.9.2009
 *
 */

// Konstruktor von calendar_class
function calendar_class(calendar_id)
{
	// Attribute
	var id = calendar_id;
	var text_id = "text_" + id;
	var visibility = false;
	var month;
	var year;

	var language_string = "english";
	
	var selected_day;
	var selected_month;
	var selected_year;
	
	var callback = function() { };
	var visibility_callback = function() { return 0; };

	// öffentliche Methoden
	
	this.getCalendar = function(input_date)
	{
		month = input_date.getMonth() + 1;
		year = input_date.getFullYear();
	
		selected_day = input_date.getDate();
		selected_month = month;
		selected_year = year;
	
		var calendar_span = document.createElement("span");
		
		calendar_span.appendChild(createCalendarText());
		calendar_span.appendChild(createCalendarIcon());
	
		var calendar_div = document.createElement("div");
		calendar_div.id = id;
		
		if (visibility == true)
		{
			calendar_div.style.display = "";
		}
		else
		{
			calendar_div.style.display = "none"
		}
		
		calendar_div.style.position = "absolute";
		//calendar_div.style.left = "30px";
		//calendar_div.style.top = "100px;";
		
		calendar_div.appendChild(createCalendar());
		calendar_span.appendChild(document.createElement("br"));
		calendar_span.appendChild(calendar_div);
				
		return calendar_span;
	};
 
	this.setLanguage = function(language)
	{
		language_string = language;
	};
 
	this.setCallback = function(handler)
	{
		callback = handler;
	};
	
	this.setVisibilityCallback = function(handler)
	{
		visibility_callback = handler;
	};
 
	this.toggleVisibility = function()
	{
		toggleVisibility();
	};

	this.getSelectedDay = function()
	{
		return selected_day;
	};

	this.getSelectedMonth = function()
	{
		return selected_month;
	};

	this.getSelectedYear = function()
	{
		return selected_year;
	};
	
	this.getSelectedDateString = function()
	{
		return selected_day + "." + selected_month + "." + selected_year;
	};
	
	// private Methoden
 
 	function toggleVisibility()
	{
		visibility = !visibility;
		visibility_callback();
		
		var node = document.getElementById(id);
	
		if (node != null)
		{
			var style = "none";
	
			if (visibility == true)
			{
				style = "";
			}

			node.style.display = style;
		}
	};
 
	function createCalendarText()
	{
		var calendar_text = document.createElement("input");
		var date_string = selected_day + "." + selected_month + "." + selected_year;
		
		calendar_text.type = "text";
		calendar_text.id = text_id;
		calendar_text.size = "10";
		calendar_text.value = date_string;
		calendar_text.readOnly = "true";
		calendar_text.onclick = toggleVisibility;
		calendar_text.onfocus = function() { this.blur(); };

		return calendar_text;
	}
 
	function createCalendarIcon()
	{
		/*
		var calendar_icon = document.createElement("span");

		calendar_icon.className = "calendar_icon";
		calendar_icon.onclick = toggleVisibility;
		calendar_icon.innerHTML = "&nbsp;";
		*/
		
		var calendar_image = document.createElement("img");
		calendar_image.src = "http://www.easymailing.eu/Hotelprojekt/ajax/calendar_icon.png";
		//calendar_image.src = "calendar_icon.png";
		calendar_image.alt = "calendar";
		calendar_image.height = "22";
		calendar_image.width = "22";
		calendar_image.vspace = "0";
		calendar_image.hspace = "3";
		calendar_image.align = "absmiddle";
		calendar_image.border = "0";
		
		var calendar_icon = document.createElement("a");
		calendar_icon.href = "javascript:void(0)";
		calendar_icon.onclick = toggleVisibility;
		calendar_icon.appendChild(calendar_image);
		
		return calendar_icon;
	}
 
	function insertCalendarCell(row,text,className)
	{
		var cell = document.createElement("td");
		cell.className = className;

		if (text == "")
		{
			cell.innerHTML = "&nbsp;";
		}
		else
		{
			var textNode = document.createTextNode(text);
			cell.appendChild(textNode);
		}
		
		row.appendChild(cell);
	}

	function setDateField()
	{
		var date_string = selected_day + "." + selected_month + "." + selected_year;
		document.getElementById(text_id).value = date_string;
	}
	
	function selectDate(day,month,year)
	{
		toggleVisibility();
		
		selected_day = day;
		selected_month = month;
		selected_year = year;
		
		setDateField(day,month,year);
	
		callback();
	}

	function removeChildrenId(id)
	{
		var element = document.getElementById(id);
	
		if (element != null)
		{
			if (element.childNodes)
			{
				while (element.hasChildNodes())
				{
					element.removeChild(element.firstChild);
				}
			}
		}
	}
	
	function refresh()
	{
		removeChildrenId(id);
		document.getElementById(id).appendChild(createCalendar());
	}
	
	function nextMonth()
	{
		if (month == 12)
		{
			month = 1;
			year++;
		}
		else
		{
			month++;
		}
		
		refresh();
	}
	
	function prevMonth()
	{
		if (month == 1)
		{
			month = 12;
			year--;
		}
		else
		{
			month--;
		}
		
		refresh();
	}
	
	function insertCalendarDayCell(row,day,month,year,className)
	{
		var cell = document.createElement("td");
		cell.className = className;
	
		if (!(day == "" || isNaN(day)))
		{
			cell.onclick = function() { selectDate(day,month,year); };
		}

		var textNode = document.createTextNode(day);		
		cell.appendChild(textNode);
		
		row.appendChild(cell);
	}

	function insertCalendarHead (table,monthname)
	{
		var monthname_row = table.insertRow(table.rows.length);
		var monthname_cell = document.createElement("td");
		monthname_cell.className = "title_bar";
		monthname_cell.colSpan = "7";
		
		var backNode = document.createElement("span");
		backNode.className = "back";
		backNode.innerHTML = "&lt;";
		backNode.onclick = function() { prevMonth(); };
		monthname_cell.appendChild(backNode);

		var textNode = document.createElement("span");
		textNode.className = "month";
		textNode.appendChild(document.createTextNode(monthname));
		monthname_cell.appendChild(textNode);

		var nextNode = document.createElement("span");
		nextNode.className = "next";
		nextNode.innerHTML = "&gt;";
		nextNode.onclick = function() { nextMonth(); };		
		monthname_cell.appendChild(nextNode);
		
		monthname_row.appendChild(monthname_cell);
		
		var weekdays_row = table.insertRow(table.rows.length);
  
		for (var i = 0; i <= 6; i++)
		{
			insertCalendarCell(weekdays_row,day[i],"weekday");
		}
	}

	function createCalendar()
	{
		switch (language_string)
		{
			case 'italian':
				monthname = new Array("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio",
				"Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre",
				"Dicembre");

				day = new Array("Lu", "Ma", "Me", "Gi", "Ve", "Sa", "Do");			
			break;
		
			case 'german':
				monthname = new Array("Januar", "Februar", "März", "April", "Mai", "Juni", "Juli",
									  "August", "September", "Oktober", "November", "Dezember");
			
				day = new Array("Mo", "Di", "Mi", "Do", "Fr", "Sa", "So");
			break;
			
			default:
				monthname = new Array("January", "February", "March", "April", "May", "June", "July",
									  "August", "September", "October", "November", "December");
			
				day = new Array("Mo", "Tu", "We", "Th", "Fr", "Sa", "Su");
			break;
		}
			
		var jetzt = new Date();
		var DieserMonat = jetzt.getMonth() + 1;
		var DiesesJahr = jetzt.getYear();
		
		if (DiesesJahr < 999) DiesesJahr += 1900;
		
		var DieserTag = jetzt.getDate();
		var Zeit = new Date(year, month - 1, 1);
		var start = Zeit.getDay();
		
		if (start > 0)
		{
			start--;
		} 
		else
		{
			start = 6;
		}
		
		var stopp = 31;
	  
		if (month == 4 || month == 6 || month == 9 || month == 11) --stopp;
	  
		if (month == 2)
		{
			stopp -= 3;
			
			if (year % 4 == 0) stopp++;
			if (year % 100 == 0) stopp--;
			if (year % 400 == 0) stopp++;
		}

		var calendar = document.createElement("table");
		calendar.className = "calendar";
		calendar.cellPadding = "3";

		var month_title = monthname[month - 1] + " " + year;
		insertCalendarHead(calendar,month_title);
		
		var Tageszahl = 1;
	  
		for (var i = 0; i <= 5; i++)
		{
			var row = calendar.insertRow(calendar.rows.length);
			row.className = "week";
		
			for (var j = 0; j <= 5; j++)
			{
				if ((i == 0) && (j < start))
				{
					insertCalendarCell(row,"","day");
				}
				else
				{
					if (Tageszahl > stopp)
					{
						insertCalendarCell(row,"","day");
					}
					else
					{
						if ((year == DiesesJahr) && (month == DieserMonat) && (Tageszahl == DieserTag))
						{
							insertCalendarDayCell(row,Tageszahl,month,year,"now");
						}
						else
						{
							insertCalendarDayCell(row,Tageszahl,month,year,"day");
						}
					
						Tageszahl++;
					}
				}
			}
		
			if (Tageszahl > stopp)
			{
				insertCalendarCell(row,"","weekend");
			}
			else
			{
				if ((year == DiesesJahr) && (month == DieserMonat) && (Tageszahl == DieserTag))
				{
					insertCalendarDayCell(row,Tageszahl,month,year,"now");
				}
				else
				{
					insertCalendarDayCell(row,Tageszahl,month,year,"weekend");
				}

				Tageszahl++;
			}

		}
	  
		return calendar;
	}

}
