var LANGUAGE = "DE";
var HANDLING_DAYS = 5;
var TIMETABLE_CAPTION = new Array("HINFAHRT","R&uuml;CKFAHRT","Reisedatum");
var DATE_FORMAT_INPUT = "TT.MM.JJJJ";
var ERROR_DATE_INPUT = "Falsches Datumsformat. Erwartet wird " + DATE_FORMAT_INPUT + ".";
var MONTH_COUNT = 2;

var monthActiv;
var yearActiv;
var fLandSelected = 0;

function viewCalendar(iType){
    if((new routeCalendar(iType)).isOpen()) return;
   (new routeCalendar(iType)).view();
}

function routeCalendar(iType){
    iType = parseInt(iType); // ensure to use as integer and not as string!
    
    var sFromId = 'timetable.outboundTripDate_3';
    var sThruId = 'timetable.inboundTripDate_3';
    var dNow;
    var dMoveMin;    
    var dBookMinDay;
    var dBookMin;    
    var dRun;
    var dFrom;
    var dThru;
    var bIsFrom;
    var bIsThru;
    var sTargetId;
    var dhFrom;
    var dhThru;
    var dhFrom2;
    var dhThru2;

    if(iType==1){
      sTargetId = sThruId;
    }
    else{
      sTargetId = sFromId;
    }
  var oCalendar = byId(sTargetId+'Select');
  var oTarget = byId(sTargetId);
 
  var isDateOK = function (YYYY, M, D){
    var d = new Date(YYYY, M, D);
    return (d.getDate()==D)&&(d.getMonth()==M)&&(d.getFullYear()==YYYY);
  }
  var getLastMonthDay =function (YYYY, M){
    if(isDateOK(YYYY, M, 31)) return 31;
    if(isDateOK(YYYY, M, 30)) return 30;
    if(isDateOK(YYYY, M, 29)) return 29;
    return 28;
  }
  var getMonthFirstDayX = function (d,x)
    {return (new Date(d.getFullYear(), d.getMonth()+x, 1));}
  var getMonthFirstDay = function (d)
    {return (new Date(d.getFullYear(), d.getMonth(), 1));}


   var getDaysHtml = function(){
    var aDays = new Array();
    for(var iMonthCount=0; iMonthCount<MONTH_COUNT; iMonthCount++){
      aDays[iMonthCount] = new Array();
      for (var iWeek=0;iWeek<6;iWeek++){
        aDays[iMonthCount][iWeek] = new Array();
      }
  
      var dMonthFirstDay = getMonthFirstDayX(dRun,iMonthCount);
      var iMonth = dMonthFirstDay.getMonth();
      var iFullYear = dMonthFirstDay.getFullYear();
      var iMonthLastDay = getLastMonthDay(iFullYear,iMonth);
      
      var iFirstWeekDay = getGermanWeekDay(dMonthFirstDay);
    
      for (var iMonthDay = 0;iMonthDay<iMonthLastDay;iMonthDay++){
        var iWeek = 0;
        var iWeekDay = iMonthDay + iFirstWeekDay;
        while(iWeekDay > 6){
          iWeekDay-=7;
          iWeek++
        }
        aDays[iMonthCount][iWeek][iWeekDay]=new Array(iFullYear,iMonth+1,iMonthDay+1);
      }
    }
    var htm = "";
    for (var iWeek=0;iWeek<6;iWeek++){
      htm += "<tr class='calendar-days'>";
      for(var iMonthCount=0; iMonthCount<MONTH_COUNT; iMonthCount++){
        for(var iWeekDay=0;iWeekDay<7;iWeekDay++){
          var aDay = aDays[iMonthCount][iWeek][iWeekDay]
          if(aDay){
            var dDay = new Date(aDay[0],aDay[1]-1,aDay[2])
            if((dDay < dNow)||(dDay >= dBookMax)){                                                //not available
                if(((dDay >= dhFrom) && (dDay <= dhThru)) ||
                   ((dDay >= dhFrom2) && (dDay <= dhThru2))) {
                htm += "<td><a href='#' class='days-hdoff'>"+aDay[2]+"</a></td>";
               } else {
                htm += "<td><a href='#' class='days-off'>"+aDay[2]+"</a></td>";
               }
            }
            else{
              if(dDay < manipulateDate( dBookMinDay )){                                                                //not allowed
                if(((dDay >= dhFrom) && (dDay <= dhThru)) ||
                   ((dDay >= dhFrom2) && (dDay <= dhThru2))){
                  htm += "<td><a href='#' class='days-hdnot'>"+aDay[2]+"</a></td>";
                } else {
                  htm += "<td><a href='#' class='days-not'>"+aDay[2]+"</a></td>";
                }
              }
              else{
                if((bIsFrom)&&(dDay.toGMTString()==dFrom.toGMTString())){                            //selected from
                  htm += "<td onClick='"+getSelectClick(aDay[0],aDay[1],aDay[2])+"'><a href='#' class='days-sel'>"+aDay[2]+"</a></td>";
                }
                else{
                  if((bIsThru)&&(dDay.toGMTString()==dThru.toGMTString())){                            //selected thru
                    htm += "<td onClick='"+getSelectClick(aDay[0],aDay[1],aDay[2])+"'><a href='#' class='days-sel'>"+aDay[2]+"</a></td>";
                  }
                  else{
                    //if((bIsFrom)&&(bIsThru)&&(dDay>dFrom)&&(dDay<dThru)){
                    if(((dDay >= dhFrom) && (dDay <= dhThru)) ||
                       ((dDay >= dhFrom2) && (dDay <= dhThru2))) {
                      htm += "<td onClick='"+getSelectClick(aDay[0],aDay[1],aDay[2])+"'><a href='#' class='days-hdsel'>"+aDay[2]+"</a></td>";
                      }
                    else{
                      htm += "<td onClick='"+getSelectClick(aDay[0],aDay[1],aDay[2])+"'><a href='#' class='days-on'>"+aDay[2]+"</a></td>";
                    }
                  }
                }
              }
            }
          }
          else{
            htm += "<td><span class='days-empty'>&nbsp;</span></td>";
          }
        }
        if((iMonthCount==0)||(iMonthCount==1)){
          htm += "<td></td>";
        }
      }
      htm += "</tr>";
    }
    return htm;
  }

   var getDayCaptionHtml = function(){
    var htm = "";
    var htm2 = "";
    for(var i=0;i<7;i++){
      htm2 += "<th>"+DATE_WD[i]+"</th>";
    }
    htm += "<tr>";
    switch(MONTH_COUNT){
      case 1:
        htm += "<td colspan='7' style='background-color: rgb(25, 52, 119); padding-right: 2px;' height='1'></td>";
        htm += "<td height='1'></td>";
        htm += "</tr>";
        htm += "<tr class='calendar-days'>";
        htm += htm2;
        break;
      case 2:
        htm += "<td colspan='7' style='background-color: rgb(25, 52, 119); padding-right: 2px;' height='1'></td>";
        htm += "<td height='1'></td>";
        htm += "<td colspan='7' style='background-color: rgb(25, 52, 119); padding-right: 2px;' height='1'></td>";
        htm += "<td height='1'></td>";
        htm += "</tr>";
        htm += "<tr class='calendar-days'>";
        htm += htm2;
        htm += "<th>&nbsp;</th>";
        htm += htm2;
        break;
      case 3:
        htm += "<td colspan='7' style='background-color: rgb(25, 52, 119); padding-right: 2px;' height='1'></td>";
        htm += "<td height='1'></td>";
        htm += "<td colspan='7' style='background-color: rgb(25, 52, 119); padding-right: 2px;' height='1'></td>";
        htm += "<td height='1'></td>";
        htm += "<td colspan='7' style='background-color: rgb(25, 52, 119); padding-right: 2px;' height='1'></td>";
        htm += "</tr>";
        htm += "<tr class='calendar-days'>";
        htm += htm2;
        htm += "<th>&nbsp;</th>";
        htm += htm2;
        htm += "<th>&nbsp;</th>";
        htm += htm2;
        break;
    }
    htm += "</tr>";
    return htm;
  }

   var getMonthCaptionHtml = function(){
    var htm = "";
    htm += "<table style='width: 354px;' border='0' cellpadding='0' cellspacing='0'>";
    htm += "<tr>";
    if(getMonthFirstDayX(dRun,-1)<dMoveMin){
      htm += "<td></td>";
    }
    else{
      htm += "<td class='btn-back' onClick='"+getNavigationClick(getMonthFirstDayX(dRun,-1).getFullYear(),getMonthFirstDayX(dRun,-1).getMonth())+"' ><a href='#'><img border='0' src='"+site+"resources/images/btn_calendar_back.png' alt='zur&uuml;ck'></a></td>";
    }
    switch(MONTH_COUNT){
        case 1:
          htm += "<td class='month'><strong>"+DATE_MMMM[dRun.getMonth()]+" "+dRun.getFullYear()+"</strong></td>";
          break;
        case 2:
          htm += "<td class='month'><strong>"+DATE_MMMM[dRun.getMonth()]+" "+dRun.getFullYear()+"</strong></td>";
          htm += "<td class='month'><strong>"+DATE_MMMM[getMonthFirstDayX(dRun,1).getMonth()]+" "+getMonthFirstDayX(dRun,1).getFullYear()+"</strong></td>";
          break;
        case 3:
          htm += "<td class='month'><strong>"+DATE_MMMM[dRun.getMonth()]+" "+dRun.getFullYear()+"</strong></td>";
          htm += "<td class='month'><strong>"+DATE_MMMM[getMonthFirstDayX(dRun,1).getMonth()]+" "+getMonthFirstDayX(dRun,1).getFullYear()+"</strong></td>";
          htm += "<td class='month'><strong>"+DATE_MMMM[getMonthFirstDayX(dRun,2).getMonth()]+" "+getMonthFirstDayX(dRun,2).getFullYear()+"</strong></td>";
          break;
    }
    if(getMonthFirstDayX(dRun,1)<dMoveMax ){
      htm += "<td class='btn-forward' onClick='"+getNavigationClick(getMonthFirstDayX(dRun,1).getFullYear(),getMonthFirstDayX(dRun,1).getMonth())+"' ><a href='#'><img border='0' src='"+site+"resources/images/btn_calendar_forward.png' alt='weiter'></a></td>";
    }
    else{
      htm += "<td></td>";
    }
    htm += "</tr>";
    htm += "</table>";
    return htm;
  }

   var getMonthBarHtml = function(){
    var htm = "";
    htm += "<table summary='Kalender Monate' border='0' cellpadding='0' cellspacing='0'>";
    htm += "<tr>";
    for(var i=0; i<12; i++){
      var d = getMonthFirstDayX(dRun,i-3);
      var iFullYear = d.getFullYear();
      var iMonth = d.getMonth();
      switch(i){
        case 0:
        case 1:
        case 2:
          if(getMonthFirstDayX(dRun,i-3)>=dMoveMin){
            htm += "<td onClick='"+getNavigationClick(iFullYear,iMonth)+"'><a href='#' class='month-n'>" + DATE_MMM[iMonth] + " " + iFullYear + "</a></td>";
          }
          else{
            htm += "<td><a href='#' class='month-no'>" + DATE_MMM[iMonth] + " " + iFullYear + "</td>";
          }
          break;
        case 3:
          htm += "<td><a href='#' class='month-a'>" + DATE_MMM[iMonth] + " " + iFullYear + "</td>";
          break;
        case 4:
          if(getMonthFirstDayX(dRun,i-3)<dMoveMax){
            htm += "<td onClick='"+getNavigationClick(iFullYear,iMonth)+"'><a href='#' class='month-an'>" + DATE_MMM[iMonth] + " " + iFullYear + "</b></td>";
          }
          else{
            htm += "<td><a href='#' class='month-a'>" + DATE_MMM[iMonth] + " " + iFullYear + "</b></td>";
          }
          break;
        case 5:
          if(getMonthFirstDayX(dRun,i-3)<dMoveMax){
            htm += "<td onClick='"+getNavigationClick(iFullYear,iMonth)+"'><a href='#' class='month-n'>" + DATE_MMM[iMonth] + " " + iFullYear + "</td>";
          }
          else{
            htm += "<td><a href='#' class='month-no'>" + DATE_MMM[iMonth] + " " + iFullYear + "</td>";
          }
          break;
        case 6:
        	htm += "</tr><tr>";
          if(getMonthFirstDayX(dRun,i-3)<dMoveMax){
            htm += "<td onClick='"+getNavigationClick(iFullYear,iMonth)+"'><a href='#' class='month-n'>" + DATE_MMM[iMonth] + " " + iFullYear + "</td>";
          }
          else{
            htm += "<td><a href='#' class='month-no'>" + DATE_MMM[iMonth] + " " + iFullYear + "</td>";
          }
          break;
       default:
          if(getMonthFirstDayX(dRun,i-3)<dMoveMax){
            htm += "<td onClick='"+getNavigationClick(iFullYear,iMonth)+"'><a href='#' class='month-n'>" + DATE_MMM[iMonth] + " " + iFullYear + "</td>";
          }
          else{
            htm += "<td><a href='#' class='month-no'>" + DATE_MMM[iMonth] + " " + iFullYear + "</td>";
          }
          break;
      }
    }
    htm += "</tr>";
    htm += "</table>";
    return htm;
  }
  
   var getDescriptionHtml = function(){
    var htm = "";
    htm += "<table border='0' cellpadding='0' cellspacing='0' width='100%'>";
    htm += "<tr>";
    htm += "<td class='caption'>"+CALENDAR_CAPTION[iType]+"</td>";
    htm += "<td class='hide' align='right' onClick='"+getHideClick()+"'>X</td>";
    htm += "</tr>";
    htm += "</table>";
    return htm;
  }

  var getFederalLandHTML = function(){
     var htm = "";
     var attSelected = "";
     htm += "<select id='federalLand' onchange='" + getHolidaysClick('this.value') + "'>";
     for(var i=0; i<HOLIDAY.length; i++){
       if(i == fLandSelected) {
         attSelected = "selected='selected'";
       } else {
         attSelected = "";
       }
       htm += "<option value='" + i + "'" + attSelected + ">" + HOLIDAY[i][0] + "</option>";
     }
     htm += "</select>";

     return htm;
  } 

   var getCalendarHtml = function(){
    var htm = "";
    
    htm += "<div class='calendarIE'><iframe frameborder='0' marginheight='0' marginwidth='0' style='width: 100%; height: 100%;' class='backgroundIE'></iframe></div>";
    htm += "<div class='calendar'>";
    htm += "<table border='0' cellpadding='0' cellspacing='0'>";
    htm += "<tr><td colspan='23'>" + getDescriptionHtml() + "</td></tr>";
    htm += "<tr><td height='8'></td></tr>";
    htm += "<tr><td colspan='23'>" + getMonthCaptionHtml() + "</td></tr>";
    htm += "<tr><td height='2'></td></tr>";
    htm += getDayCaptionHtml();
    htm += getDaysHtml();
    htm += "<tr><td colspan='23'>" + getMonthBarHtml() + "</td></tr>";
    htm += "</table>";
    
    if(display && HOLIDAY != null){    	
   	 	htm += "<div class='holidays'><table border='0' cellpadding='0' cellspacing='0'><tr><td class='caption'>" + HOLIDAY_CAPTION + "</td>";
    	htm += "<td>" + getFederalLandHTML() + "</td></tr></table></div>";
    }
    
    htm += "</div>";

    return htm;
  }
  var getNavigationClick = function(iFullYear,iMonth){  
    return "(new routeCalendar("+iType+")).view(new Date("+iFullYear+","+iMonth+",1))";
  }
  var getHideClick = function(){  
    return "(new routeCalendar("+iType+")).hide()";
  }
  var getSelectClick = function(iFullYear,iMonth,iDay){  
    return "(new routeCalendar("+iType+")).select("+iFullYear+","+iMonth+","+iDay+")";
  }
  var getHolidaysClick = function(iLand){
    return "(new routeCalendar("+iType+")).getHolidays(" + iLand + ")";
  }

  this.view = function (dRun_){  
  	getCalendarHeadlines();	
    if(!oCalendar) return;
    if(!oTarget) return;
    dNow = new Date();
    dMoveMin = getMonthFirstDay(dNow);
    dBookMinDay = new Date(dNow.getFullYear(), dNow.getMonth(), dNow.getDate() + HANDLING_DAYS);
    dBookMin = getMonthFirstDay(dBookMinDay);    
    dRun = dBookMin;
    dFrom = readDate(sFromId);
    dThru = readDate(sThruId);
    bIsFrom = !(!dFrom);
    bIsThru = !(!dThru);
    if(dRun_){
        dRun = dRun_;                                //move
    }
    else{
        switch(iType){
            case 0:
                if(dFrom){
                    dRun = getMonthFirstDay(dFrom);                                //from? run = from
                }
                else{
                    if(dThru){
                        dRun = getMonthFirstDayX(dThru,-1);                      //thru? run = thru-1
                        if(dRun < dBookMin) dRun = getMonthFirstDayX(dRun,1);
                    }
                }
                break;
                
            case 1:
                if(dThru){
                    dRun = getMonthFirstDayX(dThru,0);                          //thru? run = thru-1
                    if(dRun < dBookMin) dRun = getMonthFirstDayX(dRun,1);
                }
                else{
                    if(dFrom){
                        dRun = getMonthFirstDay(dFrom);                            //from? run = from
                    }
                }
                break;
                
            case 2:
                if(dFrom){
                    dRun = getMonthFirstDay(dFrom);                                //from? run = from
                }
                break;
        }
    }                
	monthActiv = dRun.getMonth();
	yearActiv = dRun.getFullYear();
	if(fLandSelected != 0) {
	  showHolidays(fLandSelected);
	} else {
      oCalendar.innerHTML = getCalendarHtml();
	}

  }

  this.select = function (iFullYear,iMonth,iDay){
	fLandSelected = 0;
    var dDay = new Date(iFullYear,iMonth-1,iDay);
    var sDay = (dDay.getDate()+100+"").substr(1,2)+"."+(dDay.getMonth()+1+100+"").substr(1,2)+"."+(dDay.getFullYear()+"").substr(2,2);
    if(oCalendar){oCalendar.innerHTML="";}
    if(oTarget){
        if(oTarget ==  byId(sFromId)) {
            var dDayThru = readDate(sThruId);
            if(dDay - dDayThru > 0){
              dDayThru = new Date(iFullYear,iMonth-1,iDay + DEFAULT_DURATION);
              var sDayThru = (dDayThru.getDate()+100+"").substr(1,2)+"."+(dDayThru.getMonth()+1+100+"").substr(1,2)+"."+(dDayThru.getFullYear()+"").substr(2,2);
              oThru = byId(sThruId);
              oThru.value = sDayThru;
            }
        } 
        oTarget.value = sDay;
 //       oTarget.onchange();
    }

  }
  this.hide = function (){
	fLandSelected = 0;
    if(oCalendar){oCalendar.innerHTML="";}
  }
  this.isOpen = function (){
    if(oCalendar){return (oCalendar.innerHTML!="");}
  }

  this.getHolidays = function(iLand){
	    fLandSelected = iLand;
	    if(monthActiv >= 0 && yearActiv > 0) {
	        dRun = new Date(yearActiv,monthActiv, 1);
	    }

	    if(iLand > 0) {
		  showHolidays(iLand);
	    } else {
	      new routeCalendar(iType).view(dRun);
	    }
	  } 

	  var showHolidays = function(iLand){
	    var countHoliday = 0;
	    var isHoliday;
	    for(var j=0; j<HOLIDAY[iLand][1].length; j++){
		  isHoliday = false;
	      if(HOLIDAY[iLand][1][j] != "" && HOLIDAY[iLand][1][j] != "-1|-1") {
	        var hdSpan = HOLIDAY[iLand][1][j].split("|");

		var hdStart = new Date(hdSpan[0]*1000);
		var hdEnd = new Date(hdSpan[1]*1000);
	        var hdStartDay = hdStart.getDate();
		var hdStartMonth = hdStart.getMonth();
		var hdStartYear = hdStart.getFullYear();
	        var hdEndDay = hdEnd.getDate();
	        var hdEndMonth = hdEnd.getMonth();
		var hdEndYear = hdEnd.getFullYear();

	        switch(hdStartMonth-hdEndMonth){
	          case 0: // span 1 month 
	            if((hdStartMonth == monthActiv || hdStartMonth == monthActiv+1) && hdStartYear == yearActiv) {
	              countHoliday++;
				  isHoliday = true;
	              break;
	            }
	            break;
	          case -1: // span 2 month
	            if((hdStartMonth >= monthActiv-1) && (hdStartMonth <= monthActiv+1)) {
	              countHoliday++;
				  isHoliday = true;
	              break;
	            }
	            break;
	          case -2: // span 3 month
	            if((hdStartMonth >= monthActiv-2) && (hdStartMonth < monthActiv+2)) {
	              countHoliday++;
				  isHoliday = true;
	              break;
	            }
	            break;
	          case 11: // span turn of the year
	            if((hdStartMonth == monthActiv) || 
	               (hdStartMonth == monthActiv+11 && hdStartYear < yearActiv) ||
	               (hdStartMonth == monthActiv+10 && hdStartYear < yearActiv)) {
	              countHoliday++;
				  isHoliday = true;
	              break;
	            }
	            break;
	          default:
	            alert("call developer");
	        }
			if(isHoliday) {
				switch(countHoliday){
				case 1: // 1 holiday in 2 active months 
					dhFrom = new Date(hdStartYear, hdStartMonth, hdStartDay);
					dhThru = new Date(hdEndYear, hdEndMonth, hdEndDay);
					break;
				case 2: // 2 holidays in 2 active months 
					dhFrom2 = new Date(hdStartYear, hdStartMonth, hdStartDay);
					dhThru2 = new Date(hdEndYear, hdEndMonth, hdEndDay);
					break;
				}
			}
	      }
	    }
		markHolidays();   
	}


	  var markHolidays = function (){
	    if(!oCalendar) return;
	    if(!oTarget) return;

	    dNow = new Date();
	    dMoveMin = getMonthFirstDay(dNow);
	    dBookMinDay = new Date(dNow.getFullYear(), dNow.getMonth(), dNow.getDate() + HANDLING_DAYS);
	    dBookMin = getMonthFirstDay(dBookMinDay);

	    dFrom = readDate(sFromId);
	    dThru = readDate(sThruId);
	    bIsFrom = !(!dFrom);
	    bIsThru = !(!dThru);

	    oCalendar.innerHTML = getCalendarHtml();
	  }

}

 this.getCalendarHeadlines = function(){
 	var textStart = '';
 	var textEnd ='';
 	
 	var startDateTextElement = document.getElementById("startDateText");
 	if(startDateTextElement!= null){
  		textStart = startDateTextElement.innerHTML; 		
 	}else{
 		textStart = 'Anreise:'; 
 	}
  	
  	var startEndTextElement = document.getElementById("startEndText");
  	if(startEndTextElement != null){  		
	  	textEnd = startEndTextElement.innerHTML;
  	}else{
  		textEnd = 'Abreise:';
  	}
 	CALENDAR_CAPTION =  new Array(textStart, textEnd);
 }

/* ************************ common ******************************* */

function byId(id){return document.getElementById(id)}
function parseInt10(i){return parseInt(i,10)}

function readDate(id) {
    if(byId(id).value!=""){
      var aDay = (byId(id).value).split(".");
      var iYear = parseInt10(aDay[2]);
      
      return new Date((iYear < 2000)? iYear + 2000 : iYear, parseInt10(aDay[1])-1, parseInt10(aDay[0]));
    }
}

function getGermanWeekDay(d){
    return d.getDay();
    var w = d.getDay();
    w--;
    return (w < 0)? 6 : w;
}

function calculateDBookMax(dBookMax){	
	 newDate = new Date( dBookMax );	
     day = newDate.getDate();
     newDate.setDate( day + 1  );     
     return newDate;	
}	

function manipulateDate(dBookMinDay){
	newDate = new Date( dBookMinDay );
	day = newDate.getDate();
	newDate.setDate( day - 1);
	return newDate;	
}	