///////////////////////////////////////////////////////////////////////
//                                                                   //
//    Kim Bak Sep. 2002                                              //
//    Last update 16-02-2009                                         //
//                                                                   //
///////////////////////////////////////////////////////////////////////

/*
Ny objektorienteret udgave

Opret et kalenderobjekt fra hjemmesiden:
var myCal = new ECal("myCal");

Attributes:
   fieldID str
      ID på et inputfield der skal tage mod datoen når der klikkes i kalenderen
   
   firstActiveDay dtm
      Datoer før denne dag kan ikke vælges
      
   lastActiveDay dtm
      Datoer efter denne dag kan ikke vælges
   
   onDateSelect str
      Pseudo-eventhandler - hvis script skal udføres når der vælges dato
      
   submitTo str
      Hvis den valgte dato skal sendes til en adresse ved klik i kalenderen
      Datoen sendes som get med det valgte objektnavn
      OBS - submitTo skal ende med & eller ? da kalenderen ikke tester for evt eksisterende querystring
      Hvis onDateSelect != "" udføres dette script før der sendes (kan bruges til validering)
   
   language str
      "da" eller "en" - default er "da"
      
   isPopup bl
      
      
Methods:
   showMonth(m, y);
      Vis kalenderen for den angivne måned
   
   selectDate(strDate);
      Vælg den angivne dato
   
   create(divID);
      Opretter kalenderen i den valgte div

   show();
      Kun ved popup kalender
   
   hide();
      Kun ved popup kalender
   
*/


function ECal(oName){
   this.fieldID = '';
   this.oField;
   this.firstActiveDate = '';
   this.lastActiveDate = '';
   this.dateSelected;
   this.monthSelected;
   this.yearSelected;
   this.onDateSelect = '';
   this.objectName = oName;
   this.submitTo = '';
   this.language = '';
   this.isPopup = false;
   this.oDiv = null;
   this.paintCalendar = paintCalendar;
   this.removeCal = removeCal;
   
   // Initialistering - sæt valgt dag til dags dato

   this.monthnamesDa = ["Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December"];
   this.monthnamesEn = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
   this.shortMonthnames = ["J","F","M","A","M","J","J","A","S","O","N","D"];

   this.create = create;
   this.showMonth = showMonth;
   this.selectDate = selectDate;
   this.strActiveCell = strActiveCell;
   this.strPassiveCell = strPassiveCell;   
   this.strDateSelected = strDateSelected;
}

// *************************** 

function create(divID){
   this.dateSelected = new Date();
   this.monthSelected = this.dateSelected.getMonth();
   this.yearSelected = this.dateSelected.getFullYear();

   this.oDiv = document.getElementById(divID);
   if(this.fieldID != ''){
      this.oField = document.getElementById(this.fieldID);      
   }
   this.paintCalendar();
}

// *************************** 

function removeCal(){
   if(this.oDiv != null)
      this.oDiv.innerHTML = "";
}

// *************************** 
   
function dateAdd(strDate, i) {
   // Lægger i dage til dtmDate
   var count = i * 3600000 * 24;
   var tempDate = new Date(strDate);
   var buffer = Date.parse(tempDate);
   buffer += count;
   var newDate = new Date(buffer);
   return newDate;
}

function dateFromStrDate(str){
   var dateArray = str.split("-");
   if(dateArray.length == 3){
      return new Date(dateArray[2], dateArray[1]-1, dateArray[0]);
   }
}

function strDateSelected(){
   return strDate(this.dateSelected);
}

function selectDate(strDtm){
   this.dateSelected = dateFromStrDate(strDtm);
   this.monthSelected = this.dateSelected.getMonth();
   this.yearSelected = this.dateSelected.getFullYear();      
      
   var doSomething = true;
      
   if(this.onDateSelect != ''){
      if(!eval(this.onDateSelect)){
         doSomething = false;
      }
   }
   if(doSomething){
      if(this.oField != null){
         this.oField.value = strDtm;
         this.oField.select();
      }
      
      if(this.submitTo != ''){
         document.location.href = this.submitTo + this.objectName + "=" + strDtm;
      }
   }
      
   if(this.isPopup){
      hide();
   }      
}


function showMonth(m, y){
   this.dateSelected = new Date(y, m, 1);
   this.monthSelected = this.dateSelected.getMonth();
   this.yearSelected = this.dateSelected.getFullYear();      
   this.paintCalendar();
   return true;
}    

// ********************************************************
   
function strDate(dtmDate){
   return dtmDate.getDate() + "-" + (dtmDate.getMonth() + 1) + "-" + dtmDate.getFullYear();
}
   
isSameDate = function(dtmDate1, dtmDate2){
   if(dtmDate1.getDate() == dtmDate2.getDate() && dtmDate1.getMonth() == dtmDate2.getMonth() && dtmDate1.getFullYear() == dtmDate2.getFullYear()){
      return true;
   }
   else{
      return false;
   }
}

// ***********************************************

function strActiveCell(dtmDate, obj, m){
   var str = '';
   var myStrDate = strDate(dtmDate);
   
   if(m == dtmDate.getMonth()){
      if(isSameDate(new Date(), dtmDate)){
         str += "<td class='calCellToday' ";
         str += "onMouseover='this.className=" + '"calCellTodayActive"' + "' ";
         str += "onMouseOut='this.className=" + '"calCellToday"' + "' ";
      }
      else{
         str += "<td class='calCell' ";
         str += "onMouseover='this.className=" + '"calCellActive"' + "' ";
         str += "onMouseOut='this.className=" + '"calCell"' + "' ";
      }
   }
   else{
      str += "<td class='calCellPrevMonth' ";
      str += "onMouseover='this.className=" + '"calCellPrevMonthActive"' + "' ";
      str += "onMouseOut='this.className=" + '"calCellPrevMonth"' + "' ";
   }
            
   str += "onClick ='" + obj + ".selectDate(" + '"' + myStrDate + '"' + ");'>" + dtmDate.getDate() + "</td>";
   return str;
}


function strPassiveCell(dtmDate){
   var str = '';
           
   if(isSameDate(new Date(), dtmDate)){
      str += "<td class='calCellTodayPassive' ";
   }
            
   else{
      str += "<td class='calCellPassive' ";
   }
            
   str += ">" + dtmDate.getDate() + "</td>";
   return str;
   
}


function paintCalendar(){
   var obj = this.objectName;
   var m = this.monthSelected;
   var y = this.yearSelected;
   var monthnames;
   var oFirstDate = null;
   
   if(this.firstActiveDate != ''){
      oFirstDate = dateFromStrDate(this.firstActiveDate);
   } 

   if(this.language == "en"){
      monthnames = this.monthnamesEn;
   }
   else{
      monthnames = this.monthnamesDa;
   }
   
   var str =  "<table style='border:0;border-collapse:collapse;width:100%;' cellspacing='0' margin='0'>";
       str += "<tr><td style='padding:0px;' colspan='7'><table width='100%' style='width:100%;border-collapse:collapse;border:0;'><tr>";

   // overskrift med måneder
   for(var i = 0; i < 12; i++){
      str += "<td class='ecalHead'><a class='ecalHeadLink' title='" + monthnames[i] + "' href='#' ";
      str += "onClick='" + obj + ".showMonth(" + i + "," + y + ");return false;'>" + this.shortMonthnames[i] + "</a></td>";
   }

   str += "</tr></table></td></tr>";
   str += "<tr><td class='calHead'>";

   // Pil til venstre - gå en måned tilbage
   str += "<a class='calHeadLink' href='#' onClick='" + obj + ".showMonth("
   if(m > 0){
      str += (m - 1) + "," + y;
   }
   else{
      str += "11," + (y - 1);
   }
   str += ");return false;'>&laquo;</a></td>";
      
   // Overskrift - måned
   str += "<td style='width:70px;' class='calHead'>" + monthnames[m] + "</td><td class='calHead'>";

   // Pil til højre - gå en måned frem
   str += " <a class='calHeadLink' href='#' onClick='" + obj + ".showMonth(";
   if(m < 11){
      str += (m + 1) + "," + y;
   }
   else{
      str += "0," + (y + 1)
   }
      str += ");return false;'>&raquo;</a></td>";

      // skift år
      str += "<td class='calHead'>";
      str += "<a class='calHeadLink' href='#' onClick='" + obj + ".showMonth(" + m + "," + (y - 1) + ");return false;'>";
      str += "&raquo;</a></td>";
      str += "<td style='width:30px;' class='calHead'>" + y + "</td><td class='calHead'>";
      str += "<a class='calHeadLink' href='#' onClick='" + obj + ".showMonth(" + m + "," + (y + 1) + ");return false;'>";
      str += "&raquo;</a></td>";
      str += "<td class='calHead'></td>";
      str += "</tr></table>";

      // *************************
      // *** Slut på hoved **************
      
      // *** Vis kalender ***************

      var myCal = "";
      var myStrDate;
      var startDate = new Date(y, m, 1);   // første  dag i den valgte måned
      var myWeekday = startDate.getDay();
      if(myWeekday == 0){
         myWeekday = 7;
      }

      // Find mandag i månedens første uge
      var nextDate = dateAdd(startDate,-(myWeekday - 1));

      myCal = "<table width='100%' style='border:0;border-collapse:collapse;width:100%;'>";
      
      for(var u = 0; u < 6 ; u++ ){   // tegn 6 uger
         myCal += "<tr>";
         for(var i = 0; i < 7; i++ ){  // tegn 7 dage i hver uge
            if(oFirstDate != null){
               if(nextDate >= oFirstDate){
                  
                  myCal += strActiveCell(nextDate, obj, m);
               }
               else{
                  myCal += strPassiveCell(nextDate);
               }
            }
            else{
               myCal += strActiveCell(nextDate, obj, m);
            }

            nextDate = dateAdd(nextDate, 1);
         }
         myCal += "</tr>";
         if(nextDate.getMonth() > m){ break; }
      }
      myCal += "</table>";
      this.oDiv.innerHTML = str + myCal;
   }
