/*
 
 Javascript DOM Calendar v1.3 - (2004) by Lukas "Emka" Zeman (www.proteus.cz)
 ----------------------------------------------------------------------------
 - big thanks to Riki "Fczbkk" Fridrich (www.fczbkk.com)
 - this.fixOffsetLeft and this.fixOffsetTop by Peter-Paul Koch (http://www.quirksmode.org/js/findpos.html)

*/

// IE nezvlada setAttribute pro class
// Opera zas neaplikuje cls.add
// proto pouzivam obj.className :-(

// constructor objektu calendar
function calendar () {
 
 var calDivClass  = 'calendar-div';
 var parent       = this;
 var timer								= null;
 var isIE         = ((document.all)&&(!window.opera)) ? true : false;
 var dateFormat 		= /^\d{1,2}(\.)\d{1,2}\1\d{4}$/;  // testuje zda je v inputu datum ve spravnem formatu DD.MM.YYYY
 
 // THIS.REMOVE
 this.remove = function() {
  document.getElementsByTagName("body")[0].removeChild(this.div);
  if (isIE) {document.getElementsByTagName("body")[0].removeChild(this.iframe);}  
 }

 // THIS.CREATE - vytvori zabalovaci <div> celeho kalendare 
 this.create = function() {
  //predpoklada, ze v documentu je tag body :-)  
  this.div = document.getElementsByTagName("body")[0].appendChild(document.createElement("div")); 
  this.div.className = calDivClass;
  evt.add(parent.div, "mouseout", parent.mouseOut); 			// po 2s schova calendar if mouseout
  evt.add(parent.div, "mouseover", parent.mouseOver); // smaze timeOut pri mouseover
  
  if (isIE) {
   this.iframe = document.getElementsByTagName("body")[0].appendChild(document.createElement("iframe")); 
   this.iframe.style.position = "absolute";  
   this.iframe.style.visibility = "hidden";    
  } 
  
  if (!this.days)   {this.days   = new Array("Po","Út", "St", "Čt", "Pá", "So", "Ne");}
  if (!this.months) {this.months = new Array("leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec");}
  if (!this.closeMsg) {this.closeMsg  = "zavřít";}
 }  

 // THIS.RETURN.DATE - vlozi datum do <input> boxu (pouzije se hodnota title z <td> kalendare)
 this.returnDate = function(e) {
  e = evt.fix(e);
  var target = (e.currentTarget) ? e.currentTarget : e.target;
		this.input.value = target.getAttribute("title");
		parent.validate();
  this.hide();
 }

 // THIS.DRAW - vykresli cely kalendar vcetne navigace
 this.draw = function(month, year) {
  
  this.x = (this.x) ? this.x : this.fixOffsetLeft(this.input);
  this.y = (this.y) ? this.y : this.fixOffsetTop(this.input) + this.input.offsetHeight;

  this.remove();
  this.create();

  // this.draw.navigationBottom - vykresli spodni navigaci
  this.draw.navigationBottom = function () {
   var divN = document.createElement('div');
   divN.className = 'navigation';
   var divC = document.createElement('div');
   divC.className = "navClose";
   divC.appendChild(document.createTextNode(parent.closeMsg));
   divN.appendChild(divC);
   var divD = document.createElement('div');
   divD.className = "actDate";
   divD.appendChild(document.createTextNode("\u00a0"));
   parent.divDate = divD;
   divN.appendChild(divD);
   var divR = document.createElement('div');
   divR.className = "reset";
   divN.appendChild(divR.appendChild(document.createTextNode("\u00a0")));
   
   evt.add(divC, "click", function(){parent.hide();});
   return divN;
  }

  // this.draw.navigationBottom - vykresli horni navigaci
  this.draw.navigationTop = function (month, year) {
   // this.navigationTop.link - zjednodusuje vypis navigacnich odkazu
   this.navigationTop.link = function(cl, month, year) {
    var a = document.createElement('a');
    a.className = cl;
    var span = document.createElement('span');
    span.appendChild(document.createTextNode("..."));
    a.appendChild(span);
    evt.add(a, "click", function() {parent.draw(month, year);})
    return a;    
   }
  
   var divN = document.createElement('div');
   divN.className = 'navigation';
   
   var mSub = parseInt(month)-1; var mAdd = parseInt(month)+1;
   var ySub = parseInt(year)-1;  var yAdd = parseInt(year)+1;
   
   divN.appendChild(this.navigationTop.link("left-year",  month, ySub));
   divN.appendChild(this.navigationTop.link("left-month", mSub, year));
   divN.appendChild(this.navigationTop.link("right-year", month, yAdd));
   divN.appendChild(this.navigationTop.link("right-month", mAdd, year));
   divN.appendChild(document.createElement('div').appendChild(document.createTextNode(parent.months[month-1] + " " + year)));
   
   return divN;
  }
  
  // this.draw.td - vypise jednu bunku kalendare  
  this.draw.td = function (day, title) {
   
   this.td.showDate = function (e) {
    e = evt.fix(e);  
    var target = (e.currentTarget) ? e.currentTarget : e.target;
    parent.divDate.replaceChild(document.createTextNode(target.title), parent.divDate.firstChild);
   }

   this.td.hideDate = function (e) {
    parent.divDate.replaceChild(document.createTextNode("\u00a0"), parent.divDate.firstChild);
   }

   this.td.highlight = function (e) {
    e = evt.fix(e);  
    var target = (e.currentTarget) ? e.currentTarget : e.target;
    cls.replace(target, "day", "day-hover");
   }
   
   this.td.unHighlight = function (e) {
    e = evt.fix(e);  
    var target = (e.currentTarget) ? e.currentTarget : e.target;
    cls.replace(target, "day-hover", "day");
   }

   td = document.createElement("td");
   // rozliseni prazdneho a plneho TD
   if (!title) {
    td.appendChild(document.createTextNode("\u00a0")); // "&nbsp;" to nebere...
   }
   else {
    td.appendChild(document.createTextNode(i)); 		  
    td.className = 'day';
    
    td.setAttribute("title", actVal);

		  var initDate = new Date();
		  var day   = initDate.getDate();
		  var month = initDate.getMonth()+1;
		  var year  = initDate.getYear();
		  if (year<1000)
    {
			  if (year<70){year=2000+year;}
			  else {year=1900+year;}
		  }

		  today = day + '.' + month + '.' + year;

    if (today == title) {cls.add(td, 'today');}

    evt.add(td, "click", function(e) {parent.returnDate(e);});
    evt.add(td, "mouseover", function(e) {parent.draw.td.highlight(e);}); // ie nepodporuje td:hover
    evt.add(td, "mouseout", function(e) {parent.draw.td.unHighlight(e);});  // ie nepodporuje td:hover
    evt.add(td, "mouseover", function(e) {parent.draw.td.showDate(e);});
    evt.add(td, "mouseout", function(e) {parent.draw.td.hideDate(e);});
   }
   return td;
  }
  

  if (month > 12) {month = 1; year++;}
  if (month < 1)  {month = 12; year--;}
	
  var table = document.createElement("table");
  // tak tohle me stalo par hodin zivota...v IE musi byt radky zabaleny v tbody ci thead jinak se nic nezobrazi
  var thead = document.createElement("thead"); 
  var tbody = document.createElement("tbody"); 
  var tr    = document.createElement("tr"); 

  for (i = 0; i < this.days.length; i++) {
   var th = document.createElement("th");
   th.appendChild(document.createTextNode(this.days[i]));
   tr.appendChild(th);
  }
	 
  thead.appendChild(tr);

  var firstDay = new Date(year, month-1, 1).getDay();
  if (firstDay ==0) {firstDay = 7;}
  var lastDay = new Date(year, month, 0).getDate();

  var lastRow = 1; // zamezi osklivym zmenam vysky tabulky pokud ma mesic 5 ci 6 radku
  
  tr = document.createElement("tr");
	
  dayInWeek = 0;	
  for (i = 1; i < firstDay; i++) {
	  tr.appendChild(this.draw.td());
   dayInWeek++;
  }                
	
  for (i = 1; i <= lastDay; i++) {
	  if (dayInWeek == 7) {
    tbody.appendChild(tr);
    tr = document.createElement("tr");
		  lastRow++;
    dayInWeek = 0;
	  }
	  dayInWeek++;
	  // vypise TD se dnem
   actVal = parent.dateString(i, month, year);

	  tr.appendChild(this.draw.td(i, actVal));
  }

  for (i = dayInWeek; i < 7; i++) {
	  tr.appendChild(this.draw.td());
  }
  
  tbody.appendChild(tr);
  
  for (j = lastRow;j < 6; j++) {  // zobrazi vzdy 6 radku, aby kalendar neposkakoval
   tr = document.createElement("tr");
   for (i = 0; i < 7; i++) {
 	  tr.appendChild(this.draw.td());
   }
   tbody.appendChild(tr);
  }

  table.appendChild(thead);
  table.appendChild(tbody);
  
  table.cellPadding = "0"; // kvuli Safari a OmiWebu na Macu
  table.cellSpacing = "0";  
  
  this.div.appendChild(this.draw.navigationTop(month, year));
  this.div.appendChild(table);
  this.div.appendChild(this.draw.navigationBottom());

  this.div.style.zIndex  = 1000;
  this.div.style.left    = this.x + "px";
  this.div.style.top     = this.y + "px";
  this.div.style.display = "block";
  if (isIE) {
   this.iframe.style.left        = this.x;
   this.iframe.style.top         = this.y;
   this.iframe.style.width       = this.div.offsetWidth;
   this.iframe.style.height      = this.div.offsetHeight;
   this.iframe.style.visibility  = 'visible';
   this.iframe.style.zIndex      = 999;
  }

 }


 this.dateTestIt = function(dateString) {
  parent.dateFormate();
		var date = parent.dateSplitIt(parent.input.value);
  if ((date.length == 3) && (!isNaN(date[0]) && !isNaN(date[1]) && !isNaN(date[2])) && (dateFormat.test(parent.dateString(date[0], date[1], date[2])))) {
			var day	 = date[0]; var month = date[1]; var year = date[2];		
			// mesiac
			if ((month > 12) || (month < 1)) {return false;}
			
			// dni
			if (day < 1) {return false;}
			
			var maxDays = 31;
			if (month == 2) {maxDays = (year%4 == 0) ? 29 : 28;} // kontrola prestupneho roku
			if ((month == 4) || (month == 6) || (month == 9) || (month == 11)) {maxDays = 30;}

			if (day > maxDays) {return false;}
			
			return date;
		}
		else {
			return false;
		}  
 }

 this.dateFormate = function() {
		parent.input.value = parent.input.value.replace(/-/g,".");
		parent.input.value = parent.input.value.replace(/\//g,".");
	}
 
	this.dateSplitIt = function(dateString) {
	 var date = dateString.split(".");
  return date;
 }

 this.dateString = function(day, month, year) {
  var dateString = day + "." + month + "." + year;
  return dateString;
 }

 // THIS.SHOW
 this.show = function() {
  if (this.div.style.display!="block") {
   var date = this.dateTestIt(parent.input.value);
			if (date) {
    var day = date[0]; var month = date[1]; var year = date[2];
   }
   else {
	   var initDate = new Date();
	   var day   = initDate.getDate();
	   var month = initDate.getMonth()+1;
	   var year  = initDate.getYear();
	   if (year<1000) {
	 	  if (year<70){year=2000+year;} else {year=1900+year;}
	   }
	  }

   this.draw(month, year);
  } 
 }

 // THIS.HIDE
 this.hide = function(e) {
		parent.div.style.display = "none";
  if (isIE) {parent.iframe.style.visibility = "hidden";}
 }

 // THIS.MOUSEOUT - schova kalendar, pokud ho opusti mys :-)
 this.mouseOut = function(e) {
		e = evt.fix(e);
		if (e.toElement) {var p = e.toElement;} else {var p = e.relatedTarget;}
		while ((p.className != calDivClass)&&(p.tagName != "BODY")) {
			p = p.parentNode;
		}
		if (p.tagName == "BODY") {timer = setTimeout(parent.hide, 1000);}
	}
 
 this.mouseOver = function(e) {
		e = evt.fix(e);
		clearTimeout(timer);
	}
	
	this.validate = function() {
  if (this.dateTestIt(parent.input.value)) 
			{
				if (cls.has(parent.input, "invalid")) {
					cls.remove(parent.input, "invalid");
					parent.hide();
				}
			}
		else
		 {
				cls.add(parent.input, "invalid");
			}	
	}

// tyto dve funkce napsal Peter-Paul Koch viz http://www.quirksmode.org/js/findpos.html
// upravi offsetTop a offsetLeft pro Operu viz vyse uvedeny odkaz
 this.fixOffsetLeft = function(obj) {
	 var curleft = 0;
	 if (obj.offsetParent) {
		 while (obj.offsetParent)	{
			 curleft += obj.offsetLeft
			 obj = obj.offsetParent;
		 }
	 }
	 else if (obj.x)	curleft += obj.x;
	 return curleft;
 }

 this.fixOffsetTop = function(obj) {
	 var curtop = 0;
	 if (obj.offsetParent) {
		 while (obj.offsetParent) {
			 curtop += obj.offsetTop
			 obj = obj.offsetParent;
		 }
	 }
	 else if (obj.y) curtop += obj.y;
	 return curtop;
 }
 
}

function initCalendars(inputClass) {
 if (document.createElement) {

  // nahrada getElementsByClassName
  var tags   = document.getElementsByTagName("input");
		var calendarInputs = new Array;
  for (var i = 0; i < tags.length; i++) {
		 if (cls.has(tags[i],inputClass)) calendarInputs.push(tags[i]);
  }

  for(var cn = 0;cn < calendarInputs.length;cn++) {
   calendarInputs[cn].calendar = new calendar();
   calendarInputs[cn].calendar.input = calendarInputs[cn];
   calendarInputs[cn].calendar.create();
   evt.add(calendarInputs[cn], "mouseover", function (e) {e = evt.fix(e); e.target.calendar.show();}); 
   //evt.add(calendarInputs[cn], "keyup", function (e) {e = evt.fix(e); e.target.calendar.validate();}); 
  }
 }  
}
