// 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:"",
      def_dateFormat: "%d.%m.%Y",
      calendars : new Array(),

      initialize:function(calconfig) {
         inherits(new Observer(), this );
         inherits(calconfig, this);
         if (this.weekdaysTexts == "") {
            this.weekdaysTexts = weekdayTexts;
         }
         if (this.monthsTexts == "") {
            this.monthsTexts = monthsTexts;
         }
      },

      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 format = (this.dateFormat.length >= 0) ? this.dateFormat : this.def_dateFormat;

            if (showDayNames) {
               var dayT = date.getDay()-1;
               dayT = (dayT == -1) ? dayT = 6 : dayT;
               format = this.weekdaysTexts[dayT]+", "+format;
            }

            if (showShortYear) {
               format = format.replace("%Y", "%y");
            } else {
               format = format.replace("%y", "%Y");
            }

            var month = date.getMonth()+1;
            format = format.replace("%m",month.toString().leftPad(2,"0"));
            if (format.indexOf("%Y") > -1)
               format = format.replace("%Y",date.getFullYear().toString());
            else if (format.indexOf("%y") > -1)
               format = format.replace("%y",date.getFullYear().toString().substr(2,2));
            format = format.replace("%d",date.getDate().toString().leftPad(2,"0"));

            return format;
          }
      },

      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 = "inline";

          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;

            putIFrameBehind(div, "calendar_iframe"+calid);

            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;

             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";
             }
          }
          return false;
      }

function putIFrameBehind(div, iframeid) {
   if (typeof(iframeid) == "undefined") {
       iframeid = div.id+"_iframe";
   }
   if (isObject(div)) {
     var iframe = document.getElementById(iframeid);
     if (iframe == null) {
        iframe = document.createElement("iframe");
        document.body.appendChild(iframe);
        iframe.id = iframeid;
     }
     iframe.className = div.className;
     iframe.style.position = "absolute";

     // geänder von psa
     calUtils = new CalUtils();

     // geänder von psa
     var divDim = calUtils.getDimensions(div);

     iframe.width = divDim.w + "px";
     iframe.height = (divDim.h - div.style.border)+ "px";
     iframe.style.top = divDim.y + "px";
     iframe.style.left = divDim.x + "px";
     iframe.style.border = "none";
     iframe.style.display = div.style.display;
   }
}

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();

