// functions to synchronize and manage datefields
// 2007 MHEI

CalendarControl = Class.create();
CalendarControl.prototype = {
      version : "1.0",
      type : "calendarcontrol",

      value: "",
      today : "",
      periodS: "",
      periodE: "",
      fieldName: "",
      returnFormname: "",
      returnPathDay: "",
      returnPathYear: "",
      returnHiddenField: "",
      viewPeriodS: "",
      viewPeriodE: "",
      dataPeriodS: "",
      dataPeriodE: "",
      monthsTexts: "",
      weekdaysTexts:"",
      calendars : new Array(),

      initialize:function(calconfig) {
         inherits(new Observer(), this );
         inherits(calconfig, this);
      },

    getNewCalendar:function(calendar_config) {
       if (calendar_config != "") {
         var temp = new Calendar(calendar_config);
       } else {
         var temp = new Calendar(this.calendar_config);
       }

          this.returnHiddenField = calendar_config.returnHiddenField;
          temp.viewPeriodS = this.viewPeriodS;
          temp.viewPeriodE = this.viewPeriodE;
          temp.dataPeriodS = this.dataPeriodS;
          temp.dataPeriodE = this.dataPeriodE;
          temp.monthsTexts = this.monthsTexts;
          temp.weekdaysTexts = this.weekdaysTexts;
          temp.returnHiddenField = this.fieldName;
          temp.value = this.value;
          temp.today = this.today;
          temp.parent = this;

          temp.setOneMonthOnly(true);
          inherits(calendar_config, temp);
          makeObservable(temp, this);
          temp.addObserver(this);
          this.calendars.push(temp);
          return temp;
      },

      getStartDateFrom:function(ioField) {
         eval("userInput = "+this.returnWindow+"."+this.returnForm+"."+ioField+".value;");
         this.getStartDateFromString(userInput);
      },

      getStartDateFromString:function(datestring) {
         if (datestring == "today") {
            this.viewPeriodS = new Date();
         } else {
            this.viewPeriodS = parseUserDateInput(datestring);
            if (this.viewPeriodS == undefined) {
               this.viewPeriodS = new Date();
            }
         }
      },

      getEndDateFrom:function (ioField) {
         eval("userInput = "+this.returnWindow+"."+this.returnForm+"."+ioField+".value;");
         this.getEndDateFromString(userInput);
      },


      getEndDateFromString:function(datestring) {
         this.viewPeriodE = parseUserDateInput(datestring);
      },

      formatDate: function(date, showShortYear, showDayNames) {
         // prepare for display
         if (isDate(date)) {

            var day = date.getDate();
            var month = date.getMonth() + 1;
            var year = date.getFullYear();

            if (day < 10) {
               day = "0"+day;
            }
            if (month < 10) {
               month = "0"+month;
            }

            // has to be after the previous step for interpreting purposes
            if (showShortYear) {
               year -= 2000;
               if (year < 10) {
                  year = "0"+year;
               }
            }
            if (showDayNames) {
              var dayT = date.getDay()-1;
              dayT = (dayT == -1) ? dayT = 6 : dayT;
              return this.weekdaysTexts[dayT]+", "+day+"."+month+"."+year;
            }
            else {
               return day+"."+month+"."+year;
            }
         } else {
            return null;
         }
      },

      printMonths: function (field, preselection) {
         var input = e(field);
         var dateS = new Date(this.periodS);
         var dateE = new Date(this.periodE);

         while (dateS.getTime() <= dateE.getTime()) {
            if ( (dateS.getMonth() == preselection.getMonth()) && (dateS.getFullYear() == preselection.getFullYear()) ) {
               input.options[input.options.length] = new Option(monthsTextsShort[dateS.getMonth()]+' '+dateS.getFullYear(),dateS.getMonth()+"_"+dateS.getFullYear(),true,true);
               input.options[input.options.length-1].selected = true;
            } else {
               input.options[input.options.length] = new Option(monthsTextsShort[dateS.getMonth()]+' '+dateS.getFullYear(),dateS.getMonth()+"_"+dateS.getFullYear());
             }
             dateS.setDate(1);
            dateS.setMonth(dateS.getMonth()+1);
         }
      },

      setDate:function(date) {
          this.value = date;
      },

      // synchronizes day with days of month and period.
      syncDays:function (field,value,firstcall) {

          if (isString(value)) {
             value = value.split("_");
             var tempdate = new Date(value[1],value[0],1);
          } else if (isDate(value)) {
             var tempdate = new Date(value);
          } else {
             return;
          }

          var input = e(field);
          var saveit = (firstcall) ? tempdate.getDate() : input.value;

          if((this.periodS) && (this.periodE)) {
             this.periodS = parseUserDateInput(this.periodS);
             this.periodE = parseUserDateInput(this.periodE);

             var monthS = this.periodS.getMonth();
             var yearS = this.periodS.getFullYear();

             var monthE = this.periodE.getMonth();
             var yearE = this.periodE.getFullYear();

             var thismonth = tempdate.getMonth();
             var thisyear = tempdate.getFullYear();
             var dayS = 1;
             var dayE = tempdate.getDaysInMonth();

             var mydate = new Date(tempdate);
             mydate.setDate(1);

             // wenn der aktuelle Tag im Monat des this.periodEnanfangs liegt:
             if ( ( (thismonth == monthS) && (thisyear == yearS) ) && (this.periodS.getDate() > 1 )) {
               dayS = this.periodS.getDate();
             }

             // wenn der aktuelle Tag im Monat des this.periodEnendes liegt:
             if ( ( (thismonth == monthE) && (thisyear == yearE)) && (this.periodE.getDate() < mydate.getDaysInMonth() ) ) {
               dayE = this.periodE.getDate();
               saveit = (this.periodE.getDate() < saveit) ? this.periodS.getDate() : saveit;
             }
          }
          var d = -1;
          // empty options
          var o = input.options;
          var anz = o.length;
          for (var i = 0; i < anz;i++) {
             o[0] = null;
          }

          for (var i = 1; i <= tempdate.getDaysInMonth(); i++) {
            if( (i >= dayS) && (i <= dayE) ) {
              d++;
              o[d] = new Option(i,i);
              if (i == saveit) {
                 o[d].selected = true;
              }
            }
          }
      },

      // Synchronizes select "fields" with hidden date filed
      syncToHidden:function (calid) {
          var temp2 = e("REQ"+calid+"JourneyDate")[0];
          temp2.value = this.formatDate(this.value);
      },

      setDateSelects:function (calid,date,twoway) {
          var inputday = e("input_day"+calid);
          var inputyear = e("input_year"+calid);
          // Opera safe way...
          var value = date.getMonth()+'_'+date.getFullYear();
          for (var i = 0; i < inputyear.options.length; i++) {
             if (value == inputyear.options[i].value) {
                inputyear.options[i].selected = true;
             }
          }
          value = date.getDate();
          for (var i = 0; i < inputday.options.length; i++) {
             if (value == inputday.options[i].value) {
                inputday.options[i].selected = true;
             }
          }
          if (twoway) {
             this.syncToHidden(calid);
          }
      },

      getDateSelects:function(calid) {
          if (
               (!e("input_day"+calid)) &&
               (!e("input_year"+calid))
             ) {
            return;
          }
          var day = e("input_day"+calid).value;
          var temp = e("input_year"+calid).value;
          temp = temp.split("_");
          var month = temp[0];
          month *= 1;
          month++;
          var year = temp[1];
          var date = new Date(year,month-1,day);
          if (isDate(date)) {
             return date;
          } else {
             return null;
          }
      },

      // sets return journey date >= departure
      correctReturnSelection:function(calid,twoway) {
          var depdate = this.getDateSelects("0");
          var retdate = this.getDateSelects("1");

          if (calid == 0) {
             if (undefined != depdate) {

                var td = new Date(depdate);
                td.setDate(td.getDate());

                if (undefined != retdate) {

                  if (depdate.getTime() >= retdate.getTime()) {
                    this.setDateSelects("1",td,twoway);
                    this.syncDays('input_day1',td,false);
                  }
                  if (td.getTime() > this.periodE.getTime()) {
                    this.setDateSelects("1",depdate,twoway);
                    this.syncDays('input_day1',depdate,false);
                  }
                  this.syncToHidden(1);
                }
             }
          }
          if (calid == 1) {
             if (undefined != retdate) {
               this.syncDays('input_day1',retdate,false);
             }
          }
      }

}

function toggleDivCal (calid, topflip, shadow) {

          var distyle = "";

          var div = e("calendar"+calid);
          var iframe = e("calendar_iframe"+calid);
          var elem = e("callink"+calid);
          div.style.position="absolute";

          if (!topflip) {
            div.style.top = (getPosY(elem)-1)+"px";
            div.style.left = (getPosX(elem)-1)+"px";
            div.style.display = (div.style.display != "none") ? "none" : distyle;

            iframe.style.top = (getPosY(elem)-1)+"px";
            iframe.style.left = (getPosX(elem)-1)+"px";
            //iframe.style.top = div.top+"px";
            //iframe.style.left = div.left+"px";
            iframe.style.height = div.offsetHeight+"px";
            iframe.style.width = div.offsetWidth+"px";
            iframe.style.border = "0px;";
            iframe.setAttribute("frameborder","no",false);
            iframe.style.display = (iframe.style.display != "none") ? "none" : distyle;
            iframe.style.position="absolute";

        if ( (typeof (shadow) != "undefined") && (shadow) ){
          var div = e("calendarshadow"+calid);
          div.style.position="absolute";
          div.style.top = (getPosY(elem)+1)+"px";
          div.style.left = (getPosX(elem)+1)+"px";

          div.style.display = (div.style.display != "none") ? "none" : distyle;
        }
          } else {
             div.style.top = (getPosY(elem)+13-div.clientHeight)+"px";
             div.style.left = (getPosX(elem)-1)+"px";
             div.style.display = (div.style.display != "none") ? "none" : distyle;

             iframe.style.top = (getPosY(elem)+13-iframe .clientHeight)+"px";
             iframe.style.left = (getPosX(elem)-1)+"px";
             iframe.style.display = (iframe .style.display != "none") ? "none" : distyle;

         if ( (typeof (shadow) != "undefined") && (shadow) ){
           var div = e("calendarshadow"+calid);
           div.style.position="absolute";
           div.style.left = (getPosX(elem)+1)+"px";

           div.style.display = (div.style.display != "none") ? "none" : distyle;
           div.style.top = (getPosY(elem)+15-div.clientHeight)+"px";
         }
          }
      }

CalendarManager = Class.create();
CalendarManager.prototype = {
      calcons: new Array(),

      initialize: function() {
      },

      getNewCalCon: function(calcon_config) {
        this.calcons.push(new CalendarControl(calcon_config));
        return this.calcons[this.calcons.length-1];
      }
}

// initialize global CalendarManager
calman = new CalendarManager();
