/**
 * $Id: jquery.datepickerController.js 2522 2010-02-10 09:41:33Z bjoern.moenikes $
 **/

(function($){

  $.fn.extend({
    popup3 : function(content, options)
    {
      if (!$.event._p3Cache) $.event._p3Cache = [];

      // initialise the date picker controller with the relevant settings...
      options = $.extend(
      {
        id : '',
        $context : ''
      }
      , options
      );

      return this.each(
        function()
        {
          var $this = $(this);
          var alreadyExists = true;

          if (!this._p3Id) {
            this._p3Id = $.event.guid++;
            $.event._p3Cache[this._p3Id] = new Popup3(this);
            alreadyExists = false;
          }

          var controller = $.event._p3Cache[this._p3Id];

          controller.init(options, content);
        }
        )
    },

    p3Show : function()
    {
      return _w.call(this, 'show');
    },

    p3Hide : function()
    {
      return _w.call(this, 'hide');
    },



    p3GetTravelDate : function()
    {
      var c = _getController(this[0]);
      if (c) {
        return c.getTravelDate();
      }
      return null;
    },

    p3SetTravelDate : function(dateString)
    {
      return _w.call(this, 'setTravelDate', dateString);
    },
    
    p3UpdateGUI : function()
    {
      return _w.call(this, 'updateGUI');
    },

    p3GetAge : function()
    {
      var c = _getController(this[0]);
      if (c) {
        return c.getAge();
      }
      return null;
    },

    p3ValidDate : function()
    {
      var c = _getController(this[0]);
      if (c) {
        return c.validateDate();
      }
      return null;
    },


    p3GetData : function()
    {
      var c = _getController(this[0]);
      if (c) {
        return c.getData();
      }
      return null;
    },

    p3UpdateItem : function()
    {
      return _w.call(this, 'updateItem');
    },



    _p3Destroy : function()
    {
    // TODO - implement this?
    }
  });

  // private internal function to cut down on the amount of code needed where we forward
  // dp* methods on the jQuery object on to the relevant DatePicker controllers...
  var _w = function(f, a1, a2, a3)
  {
    return this.each(
      function()
      {
        var c = _getController(this);
        if (c) {
          c[f](a1, a2, a3);
        }
      }
      );
  };

  function Popup3(ele)
  {
    this.ele = ele;
    // initial values...
    this.$context			=	$(ele);
    this.id				=	this.$context.attr("id");

    this.input = undefined;
    this.popupContent  = undefined;
    this.cfg = undefined;
    this.dataController = undefined;
    this.$selectedItem = undefined;
    this.popupId = this.id+"Popup";
    this.travelDate = undefined;
    this.addYears = undefined;
    this.popupButtonId = this.id+"PopupButton";

  };
  $.extend(
    Popup3.prototype,
    {
      init : function(s,content)
      {
        //        this.id = s.id;
        //        this.$context = $(s.id);
        this.input = $(this.ele);
        this.popupContent = content;
        this.popupId = this.id+"Popup";
        this.input.attr("readonly", "readonly");
        this.bindMethodsToObj("show", "hide", "selectItem");
        this.$selectedItem = Array();
        this.cfg = {};
        if (s)
        {
          this.cfg = s;
        }

        this.addYears =  isNaN(this.cfg.addYears) ?  0 : this.cfg.addYears;
        this.myId = this.cfg.id+"";
        this.myId = this.myId.replace(/#/,"");
        this.travelDate = this.cfg.travelDate;
        this.dataController = this.cfg.dataController;
        this.build(this.ele);
        this.selectItem();
        this.hide();
      },
      build: function(el) {

        this.$close = $('<a class="close" href="#" onfocus="blur();">close</a>').click(this.bindToObj(function(event) {
          this.hide();
          return false;
        }));

        this.$button = $('<a id="'+this.popupButtonId+'" class="popupButton" href="#">toggle</a>').click(this.bindToObj(function(event) {
          this.toggle();
          return false;
        }));

        this.input.after (this.$button);
        this.popupController = $('<div class="popupController"></div>').append(this.$close);
        this.popupContent = $('<div class="popupContent"></div>').append(this.popupContent);

        var additionalClassName =
        this.cfg.additionalClassName ? this.cfg.additionalClassName : '';
        this.popupPanel = this.rootLayers = $('<div id="'+this.myId+'Popup" class="popupPanel ' + additionalClassName + '"></div>')
        .css({
          display: "none",
          position: "absolute",
          zIndex: 100
        })
        .append(this.popupController, this.popupContent)
        .appendTo(document.body);

        if ($.browser.msie && $.browser.version < 7) {
          this.ieframe = $('<iframe class="popupPanel_ieframe" frameborder="0"></iframe>')
          .css({
            position: "absolute",
            display: "none",
            zIndex: 99
          })
          .insertBefore(this.popupPanel);
          this.rootLayers = this.rootLayers.add(this.ieframe);
        }


        this.$popupButtonContext = $("#"+this.popupButtonId);
        this.$popupContext = $("#"+this.popupId);
        this.input.blur(this.bindToObj(function(ev){
          this.input.p3Hide();
        }));
        //        this.$popupButtonContext.blur(this.bindToObj(function(ev){
        //          this.input.p3Hide();
        //        }));



        var $emptySelectItem = this.selectItem;
        //      console.log($(el));
        $(el).bind("emptySelectItem", function() {
          $emptySelectItem();
        });   // WORK AROUND TO TRIGGER SELECT


        $(el).bind("updateGUI", this.updateGUI);   // WORK AROUND TO TRIGGER SELECT

        
        var year = this.getSysdate().getFullYear();
//        var year = this.travelDate.getFullYear();
        var mA = parseInt( this.cfg.maxAge, 10 );

        if (this.cfg.maxAge)
          this.rebuildYearTable(year-mA,  mA);


        if (!this.cfg.noLinks)
        {
          $("a", this.popupContent).click(this.bindToObj(function(event) {
            this.selectItem($(event.target));
            if (!this.cfg.noHide)
              if (this.$selectedItem["dayTable"]
                && this.$selectedItem["monthTable"]
                && this.$selectedItem["yearTable"])
                {
                if (this.validateDate())
                  this.hide();
                else
                {
                  var back = function()
                  {
                    getSlideManager().slideShow("#modifySearch");
                  }
                  $("#errorMessageBox").emcShow(getText('txt.singleDatePickerPopup.invalidDate.head'),
                    getText('txt.singleDatePickerPopup.invalidDate.text'), undefined, back);
                  this.input.val("");
                  this.input.attr("data","");
                }
              }
            return false;

          }));
        }
      },

      validateDate : function()
      {
        var erg = false;
        var date = this.input.attr("data");
        var items = date.split(".");
        items[1] = items[1] -1; // month are indexed by 0.11
        var check = new Date(items[2],items[1],items[0]);
        if (check.getDate() == parseInt(items[0],10)
          && check.getMonth() == parseInt(items[1],10)
          && check.getFullYear() == parseInt(items[2],10)
          && this.getAgeInYears(this.getTravelDate()) >= 0 )
          erg = true;
        return erg;
      },

      getTravelDate : function()
      {
        return(this.travelDate);
      },
      setTravelDate : function(dateString)
      {
        this.travelDate = dateString;
      },

      getAgeInYears : function()
      {
        var date = this.input.attr("data");
        var items = date.split(".");
        items[1] = items[1] -1; // month are indexed by 0.11

        var check = new Date(items[2],items[1],items[0]);
        var travelDate = this.getDate(this.getTravelDate());

        var travelDate = travelDate.getTime();
        var check = check.getTime();
        var delta = travelDate - check;
        var delta = new Date(travelDate - check);
        return (delta.getYear()-70);
      },

      getSysdate : function ()
      {
        return(parseDate(sysDate));
      },


      getData : function()
      {
        return $(this.id).attr("data");
      },


      rebuildYearTable : function(startYear, span)
      {
        startYear++; //span++;
        var numRows = Math.ceil( span / 4.0 );
        var name = this.popupId;
        var $table = $("#"+name + " .yearTable tbody");
        var delta = startYear-this.addYears;
        span = span + this.addYears;
        var count = 0;
        var $tbody = $("<tbody/>");

        //        C.log("rebuildYearTable");
        //        C.log(startYear);
        //        C.log(span);
        //        C.log($table);
        //        C.log(name);

        for (var j = 0; j < numRows; j++)
        {
          var $row = $("<tr/>");

          for (var i = 0 ; i < 4; i++)
          {
            if (count < span)
              $row.append("<td data='"+delta+"'><a href='#'>"+delta+"</a></td>");
            delta++;
            count++;
          }

          $tbody.append($row);
        }
        $table.replaceWith($tbody);
      },


      updateItem: function() {
        var data = this.input.attr ('data');
        var pc = this;
        if (data)
        {
          var fnSelectItem = this.selectItem;
          $("a", this.popupContent).each (function (index, domElement) {
            var $el = $(domElement);
            var $this = pc;
            if (data == $el.attr('data'))
            {
              /*             C.log("***updateItem");
        C.log(pc);
        C.log($this);
        C.log($el);
        C.log($this.$selectedItem);
        C.log("---");
*/
              if (pc.$selectedItem == $el)
              {
                //                C.log("selecting nothing new!");
                return;
              }
              if (pc.$selectedItem)
              {
                pc.$selectedItem.removeClass('selected');
                pc.$selectedItem = null;
              }
              pc.$selectedItem = $el;
              pc.$selectedItem.addClass('selected');
            }
          });
        }
      },


      selectItem: function($item) {
        //        C.log("ÜÜÜÜ");
        var hideMe = false;
        var parentName = $item ? $item.parent().parent().parent().parent().attr("class") : null;

        var val = '';
        if (!this.cfg.noLinks)
        {
          if (parentName && this.$selectedItem[parentName])
          {
            this.$selectedItem[parentName].toggleClass('selected');
            this.$selectedItem[parentName] = null;
          }

          if ($item)
          {
            this.$selectedItem[parentName] = $item;
            this.$selectedItem[parentName].toggleClass('selected');
            this.updateGUI();
            $(this.input).trigger("customChange"); // SEND CUSTOM CHANGE MESSAGE
          }
        }/*
        else
        {
          var data = this.input.attr ('data');
          if (data)
          {
            var fnSelectItem = this.selectItem;
            $("a", this.popupContent).each (function (index, domElement) {
              var $el = $(this);
              if (data == $el.attr('data'))
              {

                fnSelectItem ($el);
              }
            });
          }
        }*/

        if (this.cfg.onSelect)
        {
          this.cfg.onSelect.apply (this.input, $item);
        }
        if (!this.cfg.noHide)
        {
          if (this.$selectedItem["dayTable"]
            && this.$selectedItem["monthTable"]
            && this.$selectedItem["yearTable"])
            {
            this.hide();
            this.updateGUI();
          }

        }
      },

      updateGUI : function()
      {
        if (this.$selectedItem
          && this.$selectedItem["dayTable"]
          && this.$selectedItem["monthTable"]
          && this.$selectedItem["yearTable"])
          {
          var day = this.$selectedItem["dayTable"].parent().attr("data");
          var month = this.$selectedItem["monthTable"].parent().attr("data");
          var year = this.$selectedItem["yearTable"].parent().attr("data");
          var travelDate = this.getDate(this.getTravelDate());

          var dateString  = day+"."+month+"."+year;
          var current_date = this.getDate(dateString);

          var delta = travelDate.getTime() - current_date.getTime();
          var txt = this.getAgeInYears(this.getTravelDate()) == 1 ? 'txt.common.year' :'txt.common.years';
          this.input.val(getText(txt,this.getAgeInYears(this.getTravelDate())));
          this.input.attr("data",dateString);

//          if ($.isFunction(this.onUpdateFn)
//            this.onUpdateFn();
        }
      },

      show: function() {
        this.setPosition();
        this.rootLayers.css("display", "block");
        this.$button.addClass ('popupButton_minus');
        this.input.unbind("focus", this.show);
        $(document).bind ('mousedown', this.bindToObj(this.hideIfClickOutside));
      },

      hide: function() {
        this.$button.removeClass ('popupButton_minus');
        this.rootLayers.css("display", "none");
        $(document.body).unbind("mousedown", this.bindToObj(this.hideIfClickOutside));
        this.input.focus(this.show);
      },

      toggle: function() {
        var shown = this.rootLayers.css("display");
        shown == 'none'? this.show () : this.hide ();
      },

      hideIfClickOutside: function(event) {
        if (event.target != this.input[0] && event.target != this.$button[0] && !this.insideSelector(event))
        {
          this.hide();
        }
      },

      setPosition: function() {
        var offset = this.input.offset();
        this.rootLayers.css({
          top: offset.top + 22,
          left: offset.left
        });

        if (this.ieframe) {
          this.ieframe.css({
            width: this.popupPanel.outerWidth(),
            height: this.popupPanel.outerHeight()
          });
        };
      },

      insideSelector: function(event) {
        var offset = this.popupPanel.offset();
        offset.right = offset.left + this.popupPanel.outerWidth();
        offset.bottom = offset.top + this.popupPanel.outerHeight();

        return event.pageY < offset.bottom &&
        event.pageY > offset.top &&
        event.pageX < offset.right &&
        event.pageX > offset.left;
      },

      bindToObj: function(fn) {
        var self = this;
        return function() {
          return fn.apply(self, arguments)
        };
      },

      bindMethodsToObj: function() {
        for (var i = 0; i < arguments.length; i++) {
          this[arguments[i]] = this.bindToObj(this[arguments[i]]);
        };
      }
    }
    );

  function _getController(ele)
  {
    if (ele._p3Id) return $.event._p3Cache[ele._p3Id];
    return false;
  };

  // make it so that no error is thrown if bgIframe plugin isn't included (allows you to use conditional
  // comments to only include bgIframe where it is needed in IE without breaking this plugin).
  if ($.fn.bgIframe == undefined) {
    $.fn.bgIframe = function() {
      return this;
    };
  };


  // clean-up
  $(window)
  .bind('unload', function() {
    var els = $.event._p3Cache || [];
    for (var i in els) {
      $(els[i].ele)._p3Destroy();
    }
  });


})(jQuery);



/**
 * $Id: jquery.datepickerController.js 2522 2010-02-10 09:41:33Z bjoern.moenikes $
 **/


(function($){

  $.fn.extend({
    datepickerController : function(options)
    {
      if (!$.event._dpcCache) $.event._dpcCache = [];

      // initialise the date picker controller with the relevant settings...
      options = $.extend(
      {
        id : '',
        $context : '',
        onUpdateFn : undefined,
        input : undefined
      }
      , options
      );

      return this.each(
        function()
        {
          var $this = $(this);
          var alreadyExists = true;

          if (!this._dpcId) {
            this._dpcId = $.event.guid++;
            $.event._dpcCache[this._dpcId] = new DatepickerController(this);
            alreadyExists = false;
          }

          var controller = $.event._dpcCache[this._dpcId];
          controller.init(options);
        }
        )
    },

    dpcUpdateView : function($tgt)
    {
      return _w.call(this, 'updateView', $tgt);
    },


    dpcSetMonth : function(year, month)
    {
      //      C.log("dpcSetMonth " + year + " - " + month);
      return _w.call(this, 'rebuildMonthTables', year, month);
    },
    dpcGetDate : function()
    {
      var c = _getController(this[0]);
      if (c) {
        return c.getDate();
      }
      return null;
    },
    _dpcDestroy : function()
    {
    // TODO - implement this?
    }
  });

  // private internal function to cut down on the amount of code needed where we forward
  // dp* methods on the jQuery object on to the relevant DatePicker controllers...
  var _w = function(f, a1, a2, a3)
  {
    return this.each(
      function()
      {
        var c = _getController(this);
        if (c) {
          c[f](a1, a2, a3);
        }
      }
      );
  };

  function DatepickerController(ele)
  {
    this.ele = ele;

    // initial values...
    this.$context			=	$(ele);
    this.id				=	this.$context.attr("id");
    this.popupId = this.$context.attr("id") + "Popup";
    this.$popupContext = undefined;
    this.popupHeadline = undefined;
    this.minDate = undefined;
    this.maxDate = undefined;
    this.selectDate = undefined;
    this.onUpdateFn = undefined;

  };
  $.extend(
    DatepickerController.prototype,
    {
      init : function(s)
      {
        //        C.log("DatepickerController");
        //        C.log(this.id);
        if (s.minDate)
          this.minDate = s.minDate;
        if (s.maxDate)
          this.maxDate = s.maxDate;
        if (s.popupHeadline)
          this.popupHeadline = s.popupHeadline;
        this.selectDate = this.minDate;
        if (s.selectDate)
          this.selectDate = s.selectDate;
        if (s.onUpdateFn)
          this.onUpdateFn = s.onUpdateFn;

        var initDate = XdateStr(new Date());
        if (s.selectDate)
          initDate = s.selectDate;
        var dat = initDate.split(".");
        // dat[1] range is 1..12 but should be 0..11 => -1
        // show previous month => -1
        dat[1] = parseInt(dat[1], 10) - 1 - 1;
        dat[2] = parseInt(dat[2], 10);
        if ( dat[1] < 0 )
        {
          dat[1] += 12;
          dat[2]--;
        }
        this.buildPopup();
        this.buildHolidaySelector();

//        C.log("INIT Datepicker Controller");
//        C.log(dat[2] + "  "+ dat[1]);

        this.rebuildMonthTables(dat[2], dat[1]);




      },

      buildHolidaySelector : function()
      {
        var prepRender = function(arr)
        {
          var res = [];
          for (var it in arr)
          {
            var item = function(a, b, c)
            {
              this.txtValue = a;
              this.styleClass = b;
              this.data = c;
            }
            res.push(new item(arr[it],"",it));
          }
          return(res);
        }

        var directive = {
          '[class]' : 'className',
          'li' : 'item <- items',
          'li a' : 'item.txtValue',
          'li[class]' : 'item.styleClass',
          'li a[class]' : 'item.styleClass',
          'li a[data]' : function (arg) {
            return arg.item.data;
          }
        };

        var prepDat = prepRender(initParams.holiday[phpConst.holiday.aStateDesc]);
        var len = prepDat.length;
        var left = prepDat.splice(0, len/2);
        var right = prepDat; 

        var dataLeft = {
          className : 'holidayList',
          items : left
        };
        var dataRight = {
          className : 'holidayList',
          items : right
        };

        var $hs = $("#holidaySelector");
        var $hsp = $("#holidaySelectorPopup");

        var $left = renderObjFromTemplate ('#templates ul.selectorList', directive,
          dataLeft);
        var $right = renderObjFromTemplate ('#templates ul.selectorList', directive,
          dataRight);

        var $data = ($("<div class='holidayLeft'>")
          .append($left))
        .append($("<div class='holidayRight'>")
          .append($right));

        $("div.col1", $hsp).replaceWith($data);

        $hs.pResetEvents();
        $hs.attr("data", initParams.holiday[phpConst.holiday.defaultSelection]);
        $hs.change();
      },

      buildPopup : function()
      {
        var $popupData = $('#travelDatePickerT').remove(); // $('<div class="col1"/>').append($data);
        var $con = $('<div class="'+ this.popupId +'"/>').append(
          $("<h3>"+this.popupHeadline+"</h3>")).append($popupData);

        this.$context.popup3($con, {
          "additionalClassName" : "travelDatePickerPopup",
          //"maxAge" : (this.getMaxAge()+1),
          "addYears" : 0, // 3 additional years
//          "travelDate" : this.selectDate,
          "id" : this.id
        //          "multiSelect" : "dayTable monthTable yearTable"
        });

        this.$popupContext = $("#"+this.popupId);


        $("#holidaySelector").ulPopup({
          popupId : "#holidaySelector",
          popupHeadline : getText('txt.modifySearch.holiday'),
          onChangeCallback : function() {
          //$("#modifySearch").updateOKButtonStatus();
          },
          data:[{
            className : 'bundesLaenderList',
            items : {} //data.data
          }]
        }). bind("customChange",this.bindToObj(function(event){
          //          C.log("CHANGED BUNDESLAND");
          //          C.log(this);
          var hol = $("#holidaySelector").attr("data");
          //          C.log(hol);
          //          C.log(initParams.holiday[phpConst.holiday.aHoliday][hol]);
          this.updateHolidays();
        }));



      },


      selectItem: function($item) {
        //        C.log("selectItem");
        //        C.log(this.popupId);
        $(this.popupId).trigger("emptySelectItem");
      },

      rebuildMonthTables : function(year, startMonth)
      {
        //C.log("rebuildMonthTables: "+year+" - "+ startMonth)
        //        C.log(this);
        var m0 = startMonth - 1;
        var y0 = year;
        if (m0 < 0)
        {
          m0 += 12;
          y0--;
        }

        var y1 = year;
        var m1 = startMonth;
        var m1str = Date.monthNames[m1];

        var y2 = year;
        var m2 = startMonth + 1;
        if (m2 > 11)
        {
          y2++;
          m2 -= 12;
        }
        var m2str = Date.monthNames[m2];

        var y3 = year;
        var m3 = startMonth + 2;
        if (m3 > 11)
        {
          y3++;
          m3 -= 12;
        }
        var m3str = Date.monthNames[m3];

        var m4 = startMonth + 3;
        var y4 = year;
        if (m4 > 11)
        {
          m4 -= 12;
          y4++;
        }

//        C.log("Star Month: "+startMonth+ ", Year: "+year);
//        C.log("0. Month: "+m0+ ", Year: "+y0);
//        C.log("1. Month: "+m1+ ", Year: "+y1);
//        C.log("2. Month: "+m2+ ", Year: "+y2);
//        C.log("3. Month: "+m3+ ", Year: "+y3);
//        C.log("4. Month: "+m4+ ", Year: "+y4);

        var $emptyNR = $('<div class="ui-datepicker-one-month ui-datepicker-new-row">');
        var $empty = $('<div class="ui-datepicker-one-month">');
        var $mt = $("<div class='monthdata ui-datepicker ui-datepicker-inline ui-datepicker-multi' style='width: 575px;'>");

        //var i = this.id.replace(/#/,"");
        var backId = this.id+"Back";
        var forwId = this.id+"Forward";
        var $inp = this.$context;

        $mt.append($emptyNR
          .clone()
          .append('<div class="ui-datepicker-header"><div id="'+backId+'" class="ui-datepicker-prev" /><span>'+ m1str +" " + y1 + '</span></div>')
          .append(this.buildMonthTable(y1, m1, "cal1")));
        $mt.append($empty
          .clone()
          .append('<div class="ui-datepicker-header">'+ m2str +" " + y2 + '</div>')
          .append(this.buildMonthTable(y2, m2, "cal2")));
        $mt.append($empty
          .clone()
          .append('<div class="ui-datepicker-header"><div id="'+forwId+'"  class="ui-datepicker-next" /><span>'+ m3str +" " + y3 + '</span></div>')
          .append(this.buildMonthTable(y3, m3, "cal3")));


        //        C.log("ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ");
        //        C.log(this.popupId);
        //        C.log(this.$popupContext);
        $("div.monthdata", this.$popupContext).replaceWith($mt);


        if ($("table.cal2").hasClass("isBorder"))
          $("#"+backId).hide();
        else
          $("#"+backId).show();

        if ($("table.cal3").hasClass("isBorder"))
          $("#"+forwId).hide();
        else
          $("#"+forwId).show();


        $("#"+backId).click(this.bindToObj(function(){

          //        $inp.attr("data", $tgt.attr("data"));

          $inp.dpcSetMonth(y0,m0);
          $inp.dpcUpdateView();
        }));
        $("#"+forwId).click(this.bindToObj(function(){
          //          $inp.attr("data", $tgt.attr("data"));
          //          C.log("---------------");
          //          C.log($inp);
          //          C.log("click");
          $inp.dpcSetMonth(y2,m2);
          //          C.log("click2");
          $inp.dpcUpdateView();
        }));


        //        C.log("################################################################");
        //        C.log(backId);
        //        C.log(forwId);
        //        C.log($inp);
        //        C.log(this.$context);
        //        C.log(this);
        $("a", $mt).bind("click", this.bindToObj(function(event) {
          this.clickOnDate(event);
        }));

      //$("a", $mt).bind("click", this.clickOnDate);
      //        C.log("ENDE");
      },


      bindToObj: function(fn) {
        var self = this;
        return function() {
          return fn.apply(self, arguments)
        };
      },

      updateSelection : function($tgt, overrideDays)
      {

        var $in = this.$context;
        //$in.attr("data", $tgt.attr("data"));

        if ($tgt.attr("data").length < 1)
          return;

        var dat = parseDate($tgt.attr("data"));
        var datStr = dat.getDayName(true)+", "+$tgt.attr("data");
        //var one_day=1000*60*60*24;
        var days = parseInt($("#travelDuration").attr("data"),10);
        if (overrideDays != undefined)
          days = overrideDays;


        var dat2 = dateAddDays(dat, days); // new Date(dat.getTime() + (one_day*days));
        $in.attr("data2", XdateStr(dat2));


        $("div.start input", this.$popupContext).val(this.$context.attr("data"));
        $("div.end input", this.$popupContext).val(XdateStr(dat2));
        $("div.duration input", this.$popupContext).val(getText('txt.common.days', $("#travelDuration").attr("data")));

        var $popCon = this.$popupContext;
        $("td.selected", this.$popupContext).removeClass("selected");

        //**************

        $("td a[data='"+$tgt.attr("data")+"']", this.$popupContext).each(this.bindToObj( function(index,domObj){
          var $obj = $(domObj, $popCon);


          //          C.log("*********--------------");

          this.markSelectionX($obj,"selected", days)

        //          C.log(this);
        //          C.log($obj);

        }));
        //**************

        $in.val(datStr);
        if ($.isFunction(this.onUpdateFn))
          this.onUpdateFn();
      },

      markSelectionX : function($obj, selClass, days)
      {
        $obj = $obj.parent();
        for (var i = 0; i < days; i++)
        {
          if (!$obj.length)
            return;

          $obj.addClass(selClass);
          var $old = $obj;
          $obj = $obj.next("td:first");
          //                      C.log("TEST");
          //                      C.log($old);
          //                      C.log($obj);
          if ($obj.length == 0)
          {
            $obj = $old.parent("tr").next("tr:first").find("td:first");
            if ($obj.length == 0)
            {
              $obj = $old.parents("table:first").parent().next("div").find("table:first").find("td:first");
              //                              C.log("BREAK");
              //                              C.log($obj);
              if ($obj.length)
                while($obj.hasClass("ui-datepicker-unselectable"))
                  $obj = $obj.next("td:first");
            }
          }
        //                  C.log($obj);
        }
      },

      updateHolidays : function()
      {
        var myself = this;
        function internalUpdateHoliday($table, holidays) {
          //          C.log("updateHolidays");
          //          C.log($table);
          // remove old holiday markings
          var $tab = $table;
          $("td.holiday", $table).each(function(index,domObj){
            var $obj = $(domObj, $tab);
            $obj.removeClass("holiday");
          });

          // set new markings
          for (var idx in holidays)
          {
            var days = holidays[idx][1]+1;
            var start = holidays[idx][0];
            var $obj = $("td a[data='"+start+"']", $table);
            //            C.log(start);
            //            C.log(days);
            //            C.log($obj);
            //            C.log(days);


            myself.markSelectionX($obj,"holiday", days);

          }
        //          C.log("----");
        }
        //        C.log("updateHolidays");

        var idx = $("#holidaySelector").attr("data");
        if (idx == undefined)
          return;

        var holid = initParams.holiday[phpConst.holiday.aHoliday][idx];
        var $po = $("#travelDatePopup");


        var $t1 = $("table.cal1", $po);
        var t1c = $t1.attr("code");
        var $t2 = $("table.cal2", $po);
        var t2c = $t2.attr("code");
        var $t3 = $("table.cal3", $po);
        var t3c = $t3.attr("code");


        //        C.log(holid);
        //        C.log(t1c);
        //        C.log(holid[t1c])
        //        C.log(t2c);
        //        C.log(holid[t2c])
        //        C.log(t3c);
        //        C.log(holid[t3c])


        internalUpdateHoliday($t1, holid[t1c]);
        internalUpdateHoliday($t2, holid[t2c]);
        internalUpdateHoliday($t3, holid[t3c]);
      },

      updateView : function($tgt)
      {
        //        C.log("updateView1");
        //        C.log(this.$context);
        //        C.log(this.$context.attr("data"));
        //        C.log($tgt);
        var days = undefined;
        if ($tgt == undefined || $tgt.length == 0)
        {

          var search = this.$context.attr("data");
          if (search.length == 0)
            return;
          days = $("#travelDuration").attr("data")

          days = (parseInt(days) > 0) ? parseInt(days,10) : 0 ;
          days++;
          //          C.log(search);
          do {
            $tgt = $("td a[data='"+search+"']", this.$popupContext);

            //var one_day=1000*60*60*24;
            var x = parseDate(search);
            x = dateAddDays(x, 1); //new Date(x.getTime() + one_day);
            search = XdateStr(x);
            days--;
          //            C.log(x);
          //            C.log(search);
          }
          while($tgt != undefined && $tgt.length == 0 && days > 0)
          days++;
        //          C.log(this.$popupContext);
        //          C.log($tgt);
        }

        //        C.log($tgt);
        if (!$tgt || $tgt.length != 0)
          this.updateSelection($tgt, days);


        //        C.log("updateView2");
        this.updateHolidays();
      },


      clickOnDate : function(ev)
      {
        //        C.log("CLICK");
        var $tgt = $(ev.target);
        ev.preventDefault();
        //        C.log($tgt.attr("data"));
        //        C.log(this);
        //        C.log($tgt);
        if ($tgt.parent().hasClass("ui-datepicker-unselectable"))
          return;

        this.$context.p3Hide();
        this.$context.attr("data", $tgt.attr("data"));

        this.updateView($tgt);
        return false;
      },

      buildMonthTable : function(year, month, tableClass)
      {
        // build table head
        var $thead = $("<thead>");
        var $th = $('<tr  class="ui-datepicker-title-row">');
        for (var i = 0; i < 7; i++)
          $th.append(  $("<th>"+Date.abbrDayNames[(i+1)%7]+"</th>") );
        $thead.append($th);

        // build table body
        var day = 1;
        var dat = new Date(year, month, day);
        var count = - dat.getDay2() + 1;
        var xbreak = 1;
        var numDays = dat.getDaysInMonth(month);

        //        C.log("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
        //        C.log(dat);
        //        C.log(dat.getDay2());
        //        C.log(count);
        //        C.log(numDays);
        //        C.log((dat.getDay()+1)%7);
        //        C.log(count);



        var $tbody = $("<tbody>");
        var $tr = $('<tr  class="ui-datepicker-days-row">');
        var isBorder = false;

        while(count <= numDays)
        {
          var d = ( ((count.toString()) < 10) ? "0" : "" )+ count.toString() +"."+ ( ((month+1) < 10) ? "0" : "" )+ (month+1) + "."+year;
//                    C.log("XY++++");
//                    C.log(count);
//                    C.log(month);
//                    C.log(year);
        //  C.log(d);

          var datVal   = "ui-datepicker-days-cell";
          var datInval = "ui-datepicker-unselectable";

          var addClass = datInval;

          if (count > 0)
          {
            var d1 = new Date(this.minDate);
            var d2 = new Date(this.maxDate);
            var d3 = parseDate(d);

            //            C.log("d1,d2,d3");
            //            C.log(d);
            //            C.log(d1);
            //            C.log(d2);
            //            C.log(d3);
            if ((d3.getTime() < d1.getTime()) || (d3.getTime() > d2.getTime()))
            {
              addClass = datInval;
              isBorder = true;
            }
            else
              addClass = datVal;
          //            C.log(addClass);
          }

          if (count <= 0)
            $tr.append($("<td class='"+addClass+"'>&nbsp;</td>"));
          else
            $tr.append($("<td class='"+addClass+"'> <a data='"+d+"' href='#'>"+count+"</a></td>"));
          if (xbreak++ >= 7)
          {
            $tbody.append($tr);
            $tr = $("<tr>");
            xbreak = 1;
          }
          count++;
        }
        if ($("td",$tr).length)
          $tbody.append($tr);

        if (tableClass == undefined)
          tableClass = "";
        if (isBorder)
          tableClass += (tableClass.length > 0) ? " isBorder" : "isBorder";

        var yy = (year % 100) < 10 ? "0"+(year % 100).toString() : (year % 100).toString();
        var mm = month+1;
        var mm = (mm < 10) ? "0"+mm.toString() : mm.toString();

        var $tab = $("<table code='"+yy+""+mm+"' class='ui-datepicker-month "+tableClass+"' cellspacing='0'>").append($thead).append($tbody);
        //        var $res = $("<div style='display: block; float: left;'>").append($tab);
        return $("<div style=\"float: left;\">").append($tab);
      }

    }
    );

  function _getController(ele)
  {
    if (ele._dpcId) return $.event._dpcCache[ele._dpcId];
    return false;
  };

  // make it so that no error is thrown if bgIframe plugin isn't included (allows you to use conditional
  // comments to only include bgIframe where it is needed in IE without breaking this plugin).
  if ($.fn.bgIframe == undefined) {
    $.fn.bgIframe = function() {
      return this;
    };
  };


  // clean-up
  $(window)
  .bind('unload', function() {
    var els = $.event._dpcCache || [];
    for (var i in els) {
      $(els[i].ele)._dpcDestroy();
    }
  });


})(jQuery);
