/*######################################################################
#                      Javascript Calendar                             #
#    (based on Calendar JavaScript [DOM] v3.10 by Michael Loesler)     #
########################################################################
#       Autor:        Frank Herrmann                                   #
#       Homepage:     www.codeking.eu                                  #
########################################################################
# This program is free software; you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation; either version 3 of the License, or    #
# (at your option) any later version.                                  #
#                                                                      #
# This program is distributed in the hope that it will be useful,      #
# but WITHOUT ANY WARRANTY; without even the implied warranty of       #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        #
# GNU General Public License for more details.                         #
#                                                                      #
# You should have received a copy of the GNU General Public License    #
# along with this program; if not, see <http://www.gnu.org/licenses/>  #
# or write to the                                                      #
# Free Software Foundation, Inc.,                                      #
# 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.            #
#######################################################################*/
  
  var calendarID = 0, calObj, inputObj, tempObj;

  var cal = new Array();
      cal['date'] = null; cal['month'] = null; cal['year'] = null; cal['mm'] = null; cal['yy'] = null;
    	cal['now']       = new Date();
    	cal['dayname']   = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'];
    	cal['monthname'] = ['Januar', 'Februar', unescape('M%E4rz'), 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'];
    	cal['monthCell'] = d.createElement('th');

  var calendar = {
  
// INIT CALENDAR
    init: function(inputID, initDate) {
      cal['now']   = initDate ? initDate : new Date();
			cal['date']  = cal['now'].getDate();
			cal['month'] = cal['mm'] = cal['now'].getMonth();
			cal['year']  = cal['yy'] = cal['now'].getFullYear();
			if(!cal['monthCell'].firstChild) cal['monthCell'].appendChild(d.createTextNode( cal['monthname'][cal['mm']] + ' ' + cal['yy'] ));
      cal['monthCell'].colSpan = 5;

      var icon = d.createElement('img');
          icon.setAttribute('rel', inputID);
          icon.setAttribute('rev', 'calendar' + calendarID);
          icon.setAttribute('title', 'Kalender');
          icon.className = 'icon';
          icon.style.cursor = 'pointer';
          icon.setAttribute('src', baseURL + '/scripts/calendar/images/calendar.gif');
          icon.onclick = function() {
            var c = calendar.getElementsByClassName('calendarContainer');
            for(var e=0; e<c.length;e++) c[e].style.display = 'none';

            calObj = document.getElementById(this.getAttribute('rev'));
            inputObj = document.getElementById(this.getAttribute('rel'));
            calendar.show();
          }
      calendar.insertAfter(icon, document.getElementById(inputID));

      var span = d.createElement('span');
          span.setAttribute('id', 'calendar' + calendarID);
          span.setAttribute('class', 'calendarContainer');
          span.className = 'calendarContainer';
      calendar.insertAfter(span, document.getElementById(inputID));

      calendarID++;
    },

    insertAfter: function(newElement, targetElement) {
      var parent = targetElement.parentNode;
      if(parent.lastchild == targetElement) parent.appendChild(newElement);
      else parent.insertBefore(newElement, targetElement.nextSibling);
    },
    
    getElementsByClassName: function(className, tag, elm){
    	var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
    	var tag = tag || "*";
    	var elm = elm || d;
    	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
    	var returnElements = [];
    	var current;
    	var length = elements.length;
    	for(var i=0; i<length; i++) if(testClass.test(elements[i].className)) returnElements.push(elements[i]);

    	return returnElements;
    },

		removeElements: function(obj) {
			for(var i=0; i<obj.childNodes.length; i++)
				obj.removeChild(obj.childNodes[i]);
			return obj;
		},

// SHOW CALENDAR
    show: function() {
      calendar.removeElements(calObj);
      calObj.style.display = 'inline';

		  cal['monthCell'].firstChild.replaceData(0, cal['monthCell'].firstChild.nodeValue.length, cal['monthname'][cal['mm']] + ' ' + cal['yy']);
			var table = d.createElement('table');
			    table.appendChild(calendar.buildTableBody());
			    table.appendChild(calendar.buildTableHead());
          table.cellSpacing = 1; table.cellPadding = 0;
          table.onmouseover = function() { calendar.clearKeys(); }
          table.onmouseout  = function() { calendar.hideOnClick(); }
			calObj.appendChild(table);

      calendar.hideOnClick();
    },

// BUILD CALENDAR HEADER
		buildTableHead: function() {
			var thead = d.createElement('thead');
			var tr = d.createElement('tr');
			var th = calendar.getCell('th', '\u00AB', 'last_month')
			th.onclick = function() { calendar.switchMonth('prev'); };
			th.style.cursor = 'pointer';
			tr.appendChild(th);
			cal['monthCell'].onclick = function() { calendar.switchMonth('current'); };
			cal['monthCell'].style.cursor = 'pointer';
			tr.appendChild(cal['monthCell']);
			th = calendar.getCell('th', '\u00BB', 'next_month');
			th.onclick = function() { calendar.switchMonth('next'); };
			th.style.cursor = 'pointer';
			tr.appendChild(th);
			thead.appendChild(tr);
			tr = document.createElement('tr');
			for(var i=0; i<cal['dayname'].length; i++) tr.appendChild(calendar.getCell('th', cal['dayname'][i], 'weekday') );
			thead.appendChild( tr );
			return thead;
		},

// BUILD CALENDAR
		buildTableBody: function() {
			var dayspermonth = [31,28,31,30,31,30,31,31,30,31,30,31];
			var sevendaysaweek = 0;
			var begin = new Date(cal['yy'], cal['mm'], 1);
			var firstday = begin.getDay()-1;
			if(firstday < 0) firstday = 6;
			if((cal['yy'] % 4 == 0) && ((cal['yy'] % 100 != 0) || (cal['yy'] % 400 == 0))) dayspermonth[1] = 29;
			var tbody = d.createElement('tbody');
			var tr = d.createElement('tr');
			if (firstday == 0) {
				for (var i=0; i<cal['dayname'].length; i++) {
					var prevMonth = (cal['mm'] == 0) ? 11 : cal['mm'] - 1;
					tr.appendChild(calendar.getCell('td', dayspermonth[prevMonth] - 6 + i, 'last_month'));
				}
				tbody.appendChild( tr );
				tr = d.createElement('tr');
			}

			for(var i=0; i<firstday; i++, sevendaysaweek++) {
				var prevMonth = (cal['mm'] == 0) ? 11 : cal['month'] - 1;
				tr.appendChild(calendar.getCell('td', dayspermonth[prevMonth] - firstday + i + 1, 'last_month'));
			}

			for(var i=1; i<=dayspermonth[cal['mm']]; i++, sevendaysaweek++) {
				if(cal['dayname'].length == sevendaysaweek) {
					tbody.appendChild(tr);
					tr = d.createElement('tr');
					sevendaysaweek = 0;
				}

				var td = null;
				if(i == cal['date'] && cal['mm'] == cal['month'] && cal['yy'] == cal['year'] && (sevendaysaweek == 5 || sevendaysaweek == 6)) td = calendar.getCell('td', i, 'today weekend');
                                       		         else if(i == cal['date'] && cal['mm'] == cal['month'] && cal['yy'] == cal['year']) td = calendar.getCell('td', i, 'today');
                                                                          				else if(sevendaysaweek == 5 || sevendaysaweek == 6) td = calendar.getCell('td', i, 'weekend');
                                                                                                                          			 else td = calendar.getCell('td', i, null);
				td.dd = i;
				td.mm = cal['mm'];
				td.yy = cal['yy'];

        td.style.cursor = 'pointer';
        td.onmouseover = function() { this.style.textDecoration = 'underline' }
        td.onmouseout  = function() { this.style.textDecoration = 'none' }
				td.onclick = function(e) {
          this.onmouseout = function() { return true; }
          this.parentNode.parentNode.parentNode.onmouseout = function() { return true; }
          calendar.clearKeys();
          inputObj.value = calendar.zero(this.dd) + '.' + calendar.zero(this.mm + 1) + '.' + this.yy;
          calObj.style.display = 'none';
				};
				tr .appendChild( td );
			}

			var daysNextMonth = 1;
			for (var i=sevendaysaweek; i<cal['dayname'].length; i++)
				tr.appendChild(calendar.getCell('td', daysNextMonth++, 'last_month'));

			tbody.appendChild( tr );

			while(tbody.getElementsByTagName('tr').length < 6) {
				tr = d.createElement('tr');
				for(var i=0; i<cal['dayname'].length; i++)
					tr.appendChild(calendar.getCell('td', daysNextMonth++, 'last_month'));
				tbody.appendChild(tr);
			}

			return tbody;
		},

    zero: function(i) {
      return (i < 10) ? '0' + i : i;
    },

		getCell: function(tag, str, cssClass) {
			var cell = d.createElement( tag );
			cell.appendChild(d.createTextNode( str ));
			if (cssClass != null)
				cell.className = cssClass;
			return cell;
		},

// SWITCH MONTHS
		switchMonth: function(s) {
			switch(s) {
				case 'prev':
					cal['yy'] = (cal['mm'] == 0) ? cal['yy'] - 1 : cal['yy'];
					cal['mm'] = (cal['mm'] == 0) ? 11 : cal['mm'] - 1;
				break;
				case 'next':
					cal['yy'] = (cal['mm'] == 11) ? cal['yy'] + 1 : cal['yy'];
					cal['mm'] = (cal['mm'] == 11) ? 0 : cal['mm'] + 1;
				break;
				case 'current':
					cal['yy'] = cal['year'];
					cal['mm'] = cal['month'];
				break;
			}
			calendar.show();
		},
    
// KEY MANIPULATIONS
    listenKey: function(action) {
      document.body.onclick = function(event) {
        var c = calendar.getElementsByClassName('calendarContainer');
        for(var e=0; e<c.length;e++) c[e].style.display = 'none';
        calendar.clearKeys();
      }
    },

    clearKeys: function() {
      if(tempObj) clearTimeout(tempObj);
      document.body.onclick = function() {};
    },

    hideOnClick: function() {
      tempObj = window.setTimeout("calendar.listenKey('closeCalendar');", 100);
    }

  }