/**
 * $Id: jquery.modifySearchController.js 2516 2009-11-13 09:59:49Z bjoern.moenikes $
 **/

(function($){

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

      // initialise the date picker controller with the relevant settings...
      options = $.extend(
      {
        //        id  : undefined,
        okCallback : undefined, // function is beeing called after update
        JSONaction : undefined
      }
      , options
      );

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

          if (!this._msId) {
            this._msId = $.event.guid++;
            $.event._msCache[this._msId] = new ModifySearchController(this);
            alreadyExists = false;
          }

          var controller = $.event._msCache[this._msId];

          controller.init(options);


          // initialisation of search kind radio buttons
          var cSK = phpConst.engineKind;

          // check if previous checked radiobutton was hotel.solo
          // if so, restore previous state
          // else forget data
          var checkAndReset = function()
          {
            if ($('#kind_hotelOnly').attr("travelairportval") != "")
            {
              $('#travelAirport').val($('#kind_hotelOnly').attr("travelairportval"));
              $('#travelAirport').attr("data", $('#kind_hotelOnly').attr("travelairportdata") );
              $('#travelAirport').removeAttr("disabled");
            }
            $('#kind_hotelOnly').attr("travelairportval", "");
            $('#kind_hotelOnly').attr("travelairportdata", "");
          }

          // update Info Text
          var updateInfo = function(engineKindTxt)
          {
            $('#modifySearch-infoHeader .headline').text(
              getText('txt.modifySearch.headline.' + engineKindTxt));
            $('#modifySearch-infoHeader .subheadline').text(
              getText('txt.modifySearch.subheadline.' + engineKindTxt));
          }


          // TODO FIXME uncomment to enable graphical radio buttons
          $("input[type='radio']").radioButton();

          $("#rb_ff1").click();
          $("#rb_ff3").click();
          $("#rb_ff5").click();

          $('#kind_individualTravel').val(cSK.individualTravel).rbSetOnClickFunction(function() {
            checkAndReset();
            updateInfo("individualTravel");
            $('#modifySearch').bookingLineChanged();
          });
          $('#kind_flightOnly').val(cSK.flightOnly).rbSetOnClickFunction(function() {
            checkAndReset();
            updateInfo("flightOnly");
            $('#modifySearch').bookingLineChanged();
          });


          $('#kind_hotelOnly').val(cSK.hotelOnly).rbSetOnClickFunction(function(){
            //checkAndReset();
            $("#modifySearch").msSetHotelOnly();
            updateInfo("hotelOnly");
            $('#modifySearch').bookingLineChanged();
          });
          
          $('#kind_flyDrive').val(cSK.flyDrive).rbSetOnClickFunction(function() {
            checkAndReset();
            updateInfo("flyDrive");
            $('#modifySearch').bookingLineChanged();
          });


          var ek  = initParams.searchParam[phpConst.searchParam.engineKind];
          if (ek == phpConst.engineKind.individualTravel)
            ek = "individualTravel";
          else if (ek == phpConst.engineKind.flyDrive)
            ek = "flyDrive";
          else if (ek == phpConst.engineKind.flightOnly)
            ek = "flightOnly";
          else if (ek == phpConst.engineKind.hotelOnly)
            ek = "hotelOnly";
          else
            ek = undefined;

          checkAndReset();
          updateInfo(ek);
          
          $("#travelSearch_OK").attr("href",'javascript:$("#modifySearch").msOKButton();');


          //initTravelChildAge : function
          var childTotalCnt = 4;
          var visibleChildCnt = initParams.searchParam.numChild;
          for (var i = 1; i <= childTotalCnt ; i++)
          {
            var id = "travelChildAge"+i;
            var $em = $("#"+id);

            if ($em.parent().find('a.popupButton').size() == 0)
            {
              var cTravel = phpConst.travel;
              var date = initParams[cTravel.travel][cTravel.minOutDate].split(".");

              date[0] = ""+(parseInt(date[0], 10)+2);  // add two days
              date[1] = date[1]-1; // month are mapped betweet 0...11
              date = date[0]+"."+date[1]+"."+date[2];

              var cAge = undefined;
              if (i<=visibleChildCnt)
                cAge = initParams.searchParam.childDOB[i-1];
              
              $em.singleDatePickerPopup({
                popupId : "#"+id,
                popupHeadline : getText('txt.singleDatePickerPopup.headline',i,phpConst.age.maxAgeChild),
                maxAge : phpConst.age.maxAgeChild,
                travelDate : date,
                onChangeCallback : function() {
                //$("#modifySearch").updateOKButtonStatus();
                },
                data : age
              }).attr('data', '').attr("value","").ppUpdateView(cAge);
            }
            if (i <= visibleChildCnt)
            {
              $em.parent().show();
            }
            else
            {
              $em.parent().hide();
            }
          }

          var $list = $('#templates .travelDestinationTree').clone(true);
          $("#travelDestination").popup($('<div class="travelDestinationPopup"></div>').
            append($('<h3>'+getText('txt.modifySearch.destination')+'</h3>')).append($list));
          $("#travelDestination").pResetEvents();

          $("#travelAirport").ulPopup({
            popupId : "#travelAirport",
            popupHeadline : getText('txt.modifySearch.airport'),
            onChangeCallback : function() {
            //$("#modifySearch").updateOKButtonStatus();
            },
            data:[{
              className : 'travelAirportList',
              items : {} //data.data
            }]
          });



          $('#travelDuration').attr('data', initParams.searchParam[phpConst.searchParam.duration]);
          $('#travelDuration').change();

          //initTravelDatePicker : function
          var cTravel = phpConst.travel;
          var minDate = initParams[cTravel.travel][cTravel.minOutDate].split(".");
          minDate = new Date(minDate[2],minDate[1]-1,minDate[0]);
          var maxDate = initParams[cTravel.travel][cTravel.maxOutDate].split(".");
          maxDate = new Date(maxDate[2],maxDate[1]-1,maxDate[0]);
          var date1 = initParams.searchParam[phpConst.searchParam.date];

          // prevent date changes while initializing control
          $('#travelDate').attr("init", "init");
      
          $('#travelDate').datepickerController({
            popupHeadline : getText('txt.modifySearch.arrival'),
            minDate: minDate,
            maxDate: maxDate,
            selectDate : date1,
            onUpdateFn : function()
            {
              var dat = $("#travelDate").attr("data");
              var childTotalCnt = 4;
              for (var i = 1; i <=childTotalCnt; i++)
              {
                var id = "travelChildAge"+i;
                var $em = $("#"+id);
                $em.ppSetTravelDate(dat);
                $em.ppUpdateGUI();
              }

              // update controls after changing date
              if ($('#travelDate').attr("init") != "init")
                $("#modifySearch").dateChanged();
            }
          });
          
          $('#travelDate').attr('data', date1);
          $('#travelDate').removeAttr('data2');
          $('#travelDate').dpcUpdateView();

          /********************** defaults ******************/
          var engineKind    = initParams.searchParam[phpConst.searchParam.engineKind];
          var departureId   = initParams.searchParam[phpConst.searchParam.travelAirportId];
          var destinationId = initParams.searchParam[phpConst.searchParam.travelDestinationId];

          var data = {};
          data[phpConst.searchParam.engineKind] = engineKind;
          data[phpConst.searchParam.travelDestinationId] = destinationId;

          var d = new Date();
          d = dateAddDays(d, 2);
          
          var txtDate = d.getDate()+"."+(d.getMonth()+1)+"."+d.getFullYear();
          data[phpConst.searchParam.date] = txtDate;


          // request data from BE
          $("#modifySearch").updateDestination(txtDate, engineKind, departureId, destinationId);
          $("#modifySearch").updateDepartureAirport(txtDate, engineKind, destinationId, departureId);



          $("#travelNumAdult").ulPopup({
            onChangeCallback : function() {
            //$("#modifySearch").updateOKButtonStatus();
            },
            popupId : "#travelNumAdult",
            popupHeadline : "Bitte wählen Sie die Anzahl Erwachsener aus. Ihre Auswahl wird direkt übernommen.",
            data:[{
              className : 'airport',
              items : [
              {
                txtValue: getText('txt.common.adult',1),
                data: 1
              },
              {
                txtValue: getText('txt.common.adults',2),
                data: 2
              },
              {
                txtValue: getText('txt.common.adults',3),
                data: 3
              },

              {
                txtValue: getText('txt.common.adults',4),
                data: 4
              }
              ]
            }
            ]
          });

          $("#travelNumChild").ulPopup({
            onChangeCallback : function() {
              //$("#modifySearch").updateOKButtonStatus();
              $("#modifySearch").updateChildAgeFieldset();
            },
            popupId : "#travelNumChild",
            popupHeadline : getText('txt.modifySearch.numChild',phpConst.age.maxAgeChild),
            data:[{
              className : 'airport',
              items : [
              {
                txtValue: getText('txt.common.children',0),
                data: 0
              },
              {
                txtValue: getText('txt.common.child',1),
                data: 1
              },
              {
                txtValue: getText('txt.common.children',2),
                data: 2
              },
              {
                txtValue: getText('txt.common.children',3),
                data: 3
              },

              {
                txtValue: getText('txt.common.children',4),
                data: 4
              }
              ]
            }
            ]
          });

          var weeks = {
            className : 'weeks',
            items : [
            {
              txtValue: getText('txt.common.week',1),
              data: 7
            },

            {
              txtValue: getText('txt.common.weeks',2),
              data: 14
            },

            {
              txtValue: getText('txt.common.weeks',3),
              data: 21
            },
            {
              txtValue: getText('txt.common.weeks',4),
              data: 28
            }
            ]
          }

          var getItems = function (className, start, end, singular, plural)
          {
            var items = [];

            for (var i = start; i <= end; i++)
            {
              var item = {
                txtValue: null,
                data: i
              };
              if (i == 1)
              {
                item.txtValue = i + ' ' + singular;
              }
              else
              {
                item.txtValue = i + ' ' + plural;
              }
              items.push(item);
            }
            return {
              'className': className,
              'items': items
            };
          }


          //initTravelDurationPicker : function
          var minDuration = initParams[cTravel.travel][cTravel.minTravelDuration];
          var maxDuration = initParams[cTravel.travel][cTravel.maxTravelDuration];
          maxDate = new Date(maxDate[2],maxDate[1]-1,maxDate[0]);

          var days1 = getItems ('daysLeft', minDuration, 7, getText('txt.common.day.noParam'), getText('txt.common.days.noParam'));
          var days2 = getItems ('days', 8, 18, getText('txt.common.day.noParam'), getText('txt.common.days.noParam'));
          var days3 = getItems ('days', 19, maxDuration, getText('txt.common.day.noParam'), getText('txt.common.days.noParam'));

          var $weeks = renderObjFromTemplate ('#templates ul.selectorList', this.directive,
            weeks, 'compiledSelectorList');
          var $days1 = renderObjFromTemplate ('#templates ul.selectorList', this.directive,
            days1, 'compiledSelectorList');
          var $days2 = renderObjFromTemplate ('#templates ul.selectorList', this.directive,
            days2, 'compiledSelectorList');
          var $days3= renderObjFromTemplate ('#templates ul.selectorList', this.directive,
            days3, 'compiledSelectorList');
          $("#travelDuration").popup($('<div class="travelDurationPopup"/>')
            .append($('<h3>'+getText('txt.modifySearch.duration')+'</h3>'))
            .append($('<div class="col1"/>').append($weeks).append($days1))
            .append($days2).append($days3)).bind("customChange", function ()
            {

            var duration = $('#travelDuration').attr('data');
            $('#travelDate').dpcUpdateView();
          /*
            var dates = $('.travelDatePicker').datepicker('getDate');
            var oneDay=1000*60*60*24;

            if (dates != null && dates[0] != null)
            {
              dates[1].setTime(dates[0].getTime() + oneDay*duration);

              $("#travelDate").attr("data", XdateStr(dates[0]));
              //$("#travelDate").attr("data2", XdateStr(dates[1])).change();
              //$(".travelDatePicker").datepicker('setDate', dates[0], dates[1]);
              $('#travelDate').dpcUpdateView();
            }
            else
              C.log("Warning: ModifySearch,  dates or dates[0] == null");
  */
          });

          // Try to find out why this block doesn't work (noLinks param and onSelect callback)
          //          $("#travelDuration").popup($('<div class="travelDurationPopup"/>').
          //            append($('<h3>Bitte wählen Sie die Reisedauer aus. Ihre Auswahl wird direct übernommen.</h3>')).
          //            append($('<div class="col1"/>').append($weeks).append($days1)).
          //            append($days2).append($days3), {noLinks:false, onSelect: function ($input, $selectedItem)
          //            {
          //              alert ($selectedItem.attr('data'));
          //            }
          //          });



          var age = [{
            className : "age",
            items : [ {
              txtValue: getText('txt.common.year',1),
              data: 1
            },

            {
              txtValue: getText('txt.common.years',2),
              data: 2
            },

            {
              txtValue: getText('txt.common.years',3),
              data: 3
            },

            {
              txtValue: getText('txt.common.years',4),
              data: 4
            },

            {
              txtValue: getText('txt.common.years',5),
              data: 5
            },

            {
              txtValue: getText('txt.common.years',6),
              data: 6
            }]
          },{
            className : "age",
            items : [

            {
              txtValue: getText('txt.common.years',7),
              data: 7
            },

            {
              txtValue: getText('txt.common.years',8),
              data: 8
            }, {
              txtValue: getText('txt.common.years',9),
              data: 9
            },

            {
              txtValue: getText('txt.common.years',10),
              data: 10
            },

            {
              txtValue: getText('txt.common.years',11),
              data: 11
            },

            {
              txtValue: getText('txt.common.years',12),
              data: 12
            }]
          },{
            className : "age",
            items : [

            {
              txtValue: getText('txt.common.years',13),
              data: 13
            },

            {
              txtValue: getText('txt.common.years',14),
              data: 14
            },

            {
              txtValue: getText('txt.common.years',15),
              data: 15
            },

            {
              txtValue: getText('txt.common.years',16),
              data: 16
            },

            {
              txtValue: getText('txt.common.years',17),
              data: 17
            } ]
          }];


          $("#modifySearch-infoHeader").show();
          $("#freeArea").show();

          $("#modifySearch").click(function(ev){
            $("#modifySearch").msCloseAllPopups();
          //            C.log("*-");
          });


          $this.msReset();

          // Workaround for slide effect in IE
          // if no defaultChecked attribute found, then no radio selected after
          // sliding (see http://dev.jquery.com/ticket/1095#comment:4)
          $("#modifySearch input:radio").click(function() {
            $("#modifySearch input:radio").removeAttr('defaultChecked').removeAttr('checked');
            $(this).attr('checked', 'checked').attr('defaultChecked', 'checked');
          });

          var $msc = $("#modifySearchClose a");
          $msc.click(function(){
            $("#bookingArea").ambbModifySearchCallback();
            return false;
          });

          // reactivate change events for travelDate picker
          $('#travelDate').removeAttr("init");
        })
    },

    getAirportNameById : function(id)
    {
      return($("#travelAirportList a[data='"+id+"']").text());
    },

    getCountryNameById : function(id)
    {
      return($("#travelDestinationTree a[data='"+id+"']").text());
    },


    // releations set after dropdowns have been populated to prevent redundat json_calls
    // done in jquery.filterFlightsController.js in updateFlightFilterAirlineList() if positive result
    initDropdownRelations : function()
    {
      $("#travelDuration").bind("customChange", function() {
        //$("#modifySearch").updateOKButtonStatus();
        }   );//$this.updateChildAgeFieldset();
      $("#travelAirport").bind("customChange", function() {
        //$("#modifySearch").updateOKButtonStatus();
        $('#modifySearch').departureAirportChanged();
      }   );//$this.updateChildAgeFieldset();
      $("#travelDestination").bind("customChange", function() {
        //$("#modifySearch").updateOKButtonStatus();
        $('#modifySearch').destinationChanged();
      }   );//$this.updateChildAgeFieldset();

    },



    //           dateChanged()  \
    //                           +---> departureAirportChanged() -> destinationChanged()--> departureAirportChanged()
    //    bookingLineChanged()  /


    dateChanged : function()
    {
      $("#modifySearch").departureAirportChanged();
    },
    bookingLineChanged : function()
    {
      $("#modifySearch").departureAirportChanged();
    },
    departureAirportChanged : function()
    {
      //      C.log("departureAirportChanged");
      var txtDate = $("#travelDate").attr("data");
      var engineKind = $("#modifySearch").msGetSearchKind();
      var departureId = $("#travelAirport").attr("data");
      var defaultDestinationId = $("#travelDestination").attr("data");
      var onSuccess = function()
      {
      //$("#modifySearch").destinationChanged(true);
      }

      $("#modifySearch").updateDestination(txtDate, engineKind, departureId, defaultDestinationId,onSuccess);


    },
    destinationChanged : function()
    {
      
      //      C.log("destinationChanged");
      var txtDate = $("#travelDate").attr("data");
      var engineKind = $("#modifySearch").msGetSearchKind();
      var destinationId = $("#travelDestination").attr("data");
      var departureId = $("#travelAirport").attr("data");
      var onSuccess = function()
      {
      //          $("#modifySearch").departureAirportChanged();
      }
      if (!($("#kind_hotelOnly").attr("checked") != ""))
        $("#modifySearch").updateDepartureAirport(txtDate, engineKind, destinationId, departureId, onSuccess);

    },


    updateDepartureAirport : function(txtDate, engineKind, destinationId, defaultDepartureId, onSuccess)
    {
      var oldId = $("#travelAirport").attr("data");
      var prepareAirportData = function (xdata)
      {
        var data = [];
        data["data"] = xdata["data"][phpConst.searchParam.resultAirport];
        defaultDepartureId = xdata["data"][phpConst.searchParam.travelAirportId];

        var ctlData = [{
          className : 'travelAirportList',
          items : data.data
        }];

        this.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;
          }
        };


        $("#travelAirport").ulpGenerateContent(ctlData,".travelAirport div");
        $("#travelAirport").pResetEvents();

        if (defaultDepartureId)
        {
          $("#travelAirport").attr('data', defaultDepartureId);
          if ($("input[id='kind_hotelOnly']").attr("checked")!="")
            $("input[id='kind_hotelOnly']").click();

          if (oldId != $("#travelAirport").attr("data") )
          {
            $("#travelAirport").change(); //C.log("changed 1");
          }
          else
          {
            $("#travelAirport").pUpdateItem(); //C.log("just mark it");
          }
        }
        if (onSuccess && typeof(onSuccess) == 'function')
          onSuccess();

      };
      var data = {};
      data[phpConst.searchParam.engineKind] = engineKind;
      data[phpConst.searchParam.travelDestinationId] = destinationId;
      data[phpConst.searchParam.travelAirportId] = defaultDepartureId;
      data[phpConst.searchParam.date] = txtDate;
      doJSON ('search_airports4dest', data, prepareAirportData, getShowResponse(), getShowResponse());
    },

    updateDestination : function(txtDate, engineKind, departureId, defaultDestinationId, onSuccess)
    {
      var oldDestId = $("#travelDestination").attr("data");

      var data = {};
      data[phpConst.searchParam.engineKind] = engineKind;
      data[phpConst.searchParam.travelAirportId] = departureId;
      data[phpConst.searchParam.travelDestinationId] = defaultDestinationId;
      data[phpConst.searchParam.date] = txtDate;


      var countries = {
        className: 'travelDestinationTree',
        items:[]
      };

      var prepareDestinationData = function (xdata)
      {
        var data = [];
        data["data"] = xdata["data"][phpConst.searchParam.resultDestination];
        defaultDestinationId = xdata["data"][phpConst.searchParam.travelDestinationId];
        
        for (var countryId in data.data)
        {
          var country = data.data[countryId];
          var countryObj = {
            id : "countryId_" + country.uid,
            style: 'background-image:url(/fileadmin/images/icons/countries/' + country.code.toLowerCase() + '.gif)',
            styleClass: 'country',
            name: country.name,
            data: country.uid,
            items : []
          }
          var countryStyleClass = 'country disabled';
          for (var destId in country.destlist)
          {
            var dest = country.destlist[destId];
            if (dest.reachable != 0) countryStyleClass = 'country';
            var destObj = {
              id : "destId_" + dest.uid,
              name: dest.name,
              data: dest.uid,
              styleClass: ((dest.reachable == 0) ? 'disabled' : '')
            }
            countryObj.items.push (destObj);
          }
          countryObj.styleClass = countryStyleClass;
          countries.items.push (countryObj);
        }
        var directive = {
          '[class]' : 'className',
          'li.country' : 'country <- items',
          'li.country[data]' : 'country.data',
          'li.country[class]' : 'country.styleClass',
          'li.country[id]' : 'country.id',
          'li.country[style]' : 'country.style',
          'li.country .countryName' : 'country.name',
          'li.destination' : 'destination <- country.items',
          'li.destination[class]' : 'destination.styleClass',
          'li.destination a' : 'destination.name',
          'li.destination a[data]' : 'destination.data',
          'li.destination a[id]' : 'destination.id',
          'li.destination a[class]' : 'destination.styleClass'
        };



        $('.travelDestinationPopup .travelDestinationTree').replaceWith($('#templates .travelDestinationTree').clone(true));
        $('.travelDestinationPopup .travelDestinationTree').autoRender(countries, directive);
        $("#travelDestination").pResetEvents();


        $("#travelDestination").attr('data', defaultDestinationId);

        if (oldDestId != $("#travelDestination").attr('data'))
          $("#travelDestination").change(); 
        else
          $("#travelDestination").pUpdateItem();

        if ($('#kind_hotelOnly').attr("checked") != "")
          $("#travelAirport").val(getText('txt.modifySearch.travelByYourself'));

        $(".travelDestinationTree li.country").click(function() {
          $(this).children('ul').toggle();
          $(this).toggleClass('plus');
        });


        if (onSuccess && typeof(onSuccess) == 'function')
          onSuccess();
      }

      // request data from BE
      doJSON ('search_dests4airport', data, prepareDestinationData, getShowResponse(), getShowResponse());
    },



    // called when app was just initialized and no mainpanel shown
    firstTimeCheck : function()
    {
      if ($("#modifySearchClose").hasClass("hidden"))
      {
        $("#modifySearchClose").removeClass("hidden")
        $(".statusPanel").setBlueButtons(
          true, true, true, true, false, false, false, false,false);
        $("#progressBar").pbcSetStep(1);
      }
    },
    msReset : function()
    {
      var cSP = phpConst.searchParam;
      var cSK = phpConst.engineKind;
      var oneDay = 1000*60*60*24;

      var data = initParams.searchParam;

      var $dp = $.datepicker;
      var dateFormat = $dp._defaults.dateFormat;
      data['startDate'] = $dp.parseDate (dateFormat, data[cSP.date]);
      data['stopDate'] = dateAddDays(data['startDate'], data[cSP.duration]);

      // Workarond for slide effect in IE
      // if no defaultChecked attribute found, then no radio selected after
      // sliding (see http://dev.jquery.com/ticket/1095#comment:4)
      $("#modifySearch input:radio").click(function() {
        $("#modifySearch input:radio").removeAttr('defaultChecked').removeAttr('checked');
        $(this).attr('checked', 'checked').attr('defaultChecked', 'checked');
      });

      var engineKindTxt = 'notDefined';
      switch (data[cSP.engineKind])
      {
        case cSK.individualTravel:
          engineKindTxt = 'individualTravel';
          break;
        case cSK.flightOnly:
          engineKindTxt = 'flightOnly';
          break;
        case cSK.hotelOnly:
          engineKindTxt = 'hotelOnly';
          break;
        case cSK.flyDrive:
          engineKindTxt = 'flyDrive';
          break;
      }

      $("#modifySearch").msSetData(data);

      $("#modifySearch").updateChildAgeFieldset();
    //      $("#modifySearch").updateOKButtonStatus();

    },

    msGetSearchKind : function()
    {
      var str = $("#modifySearch input[@name='travelKind']:checked").val();
      var i =parseInt(str, 10);
      var xdefault = initParams.searchParam.engKind;
      if (isNaN(i))
        C.log("ERROR in msGetSearchKind, isNaN(), Defaulting to "+xdefault);
      return(isNaN(i) ? xdefault : i);   // ERROR
    },
    
    msGetData : function() {
      var cSP = phpConst.searchParam;
      var data = {};
      var $ms = $("#modifySearch");
      data[phpConst.holiday.defaultSelection] = $("#holidaySelector").attr("data");
      data[cSP.engineKind] = $ms.msGetSearchKind();
      data[cSP.date] = $("#travelDate",$ms).attr("data");
      data[cSP.returnDate] = $('#travelDate',$ms).attr("data2");
      data[cSP.duration] = $("#travelDuration",$ms).attr("data");
      data[cSP.travelAirportId] = $("#travelAirport",$ms).attr("data");
      data[cSP.travelAirportName] = $("#travelAirport",$ms).attr("value");
      data[cSP.travelDestinationId] = $("#travelDestination",$ms).attr("data");
      data[cSP.travelDestinationName] = $("#travelDestination",$ms).attr("value");
      data[cSP.numAdult] = $("#travelNumAdult",$ms).attr("data");
      data[cSP.numChild] = parseInt($("#travelNumChild",$ms).attr("data"), 10);
      data[cSP.childAge] = Array();
      for (var j = 1; j <= data[cSP.numChild]; j++)
        data[cSP.childAge][j-1] = $("#travelChildAge"+j,$ms).attr("data");
      return(data);
    },

    msAllChildAgesFilled : function()
    {
      var cSP = phpConst.searchParam;
      var data = $("#modifySearch").msGetData();
      for (var j = 1; j <= data[cSP.numChild]; j++)
        if (data[cSP.childAge][j-1] == "")
          return false;
      return true;
    },

    msAllChildAgesValid : function()
    {
      var cSP = phpConst.searchParam;
      var data = $("#modifySearch").msGetData();
      for (var j = 1; j <= data[cSP.numChild]; j++)
        if (!$("#travelChildAge"+j).ppValidDate())
          return false;
      return true;
    },

    msCloseAllPopups : function()
    {
      $("a.popupButton_minus").click();
    },



    msSetData : function(data) {
      var cSP = phpConst.searchParam;


      $("#travelDate").attr("data",data[cSP.date]);
      $("#travelDate").attr("data2",data[cSP.returnDate]);

      $("#travelDate").val($.datepicker.formatDate ('D, dd.mm.yy',
        parseDate(data[cSP.date])));
      $(".travelDatePicker").datepicker('setDate', parseDate(data[cSP.date]), parseDate(data[cSP.returnDate]));

      $("#travelDuration").attr("data",data[cSP.duration]).change();
      $("#travelAirport").val($("#modifySearch").getAirportNameById(data[cSP.travelAirportId]));


      $("#travelAirport").attr("data",data[cSP.travelAirportId]).change();


      $("#travelDestination").attr("data",data[cSP.travelDestinationId]).change();
      $("#travelDestination").val($("#modifySearch").getCountryNameById(data[cSP.travelDestinationId]));

      $("#travelNumAdult").attr("data",data[cSP.numAdult]).ulpSelectItem();
      $("#travelNumChild").attr("data",data[cSP.numChild]).ulpSelectItem();

      for (var j = 1; j <= data["numChild"]; j++)
      {
        $("#travelChildAge"+j).attr("data",data[cSP.childAge][j-1]);
        $("#travelChildAge"+j).sdpSelectItem();
      }


      var id = $("#modifySearch input:radio[@value='"+ data[cSP.engineKind] + "']")
        .attr("id");
      $("#"+id+"-rbview").click();

      return(data);
    },

    // check, if whole form is filled
    isCompletelyFilled : function()
    {
      var complete = true;

      if (   ( $("#travelDate").attr("data") == "")
        || ( $("#travelDuration").attr("data") == "" )
        || ( $("#travelAirport").attr("data") == "" )
        || ( $("#travelDestination").attr("data") == "" )
        || ( $("#travelNumAdult").attr("data") == "" )
        || ( $("#travelNumChild").attr("data") == "" ))
        complete = false;
      var kids = parseInt($("#travelNumChild").attr("data"), 10);

      for (var i = 1; i <= kids; i++)
      {
        if ( $("#travelChildAge"+i).attr("data") == undefined
          || $("#travelChildAge"+i).attr("data") == ""  )
          {
          complete = false;
          break;
        }
      }
      return complete;
    },    
    updateChildAgeFieldset : function()
    {
      var childTotalCnt = 4;
      var visibleChildCnt = parseInt( $("#travelNumChild").attr("data"), 10 );
      for (var i = 1; i <= childTotalCnt ; i++)
      {
        var id = "travelChildAge"+i;
        var $em = $("#"+id);
        if (i <= visibleChildCnt)
        {
          $em.parent().show();
        }
        else
        {
          $em.parent().hide();
        }
      }
      if (visibleChildCnt == 0)
      {
        $('#modifySearch .additional').hide();
      }
      else
      {
        $('#modifySearch .additional').show();
      }
    },
    msSetHotelOnly : function()
    {
      var $target = $("ul.travelAirportList a[data='"+$("#travelAirport").attr("data")+"']");
      $('#travelAirport').removeAttr("disabled");
      $('#kind_hotelOnly').attr("travelairportval", $target.text() );
      $('#kind_hotelOnly').attr("travelairportdata", $("#travelAirport").attr("data"));
      $('#travelAirport').val(getText('txt.modifySearch.travelByYourself'));
      $('#travelAirport').attr("disabled","disabled");
    },
    msUpdateTopMenu : function ()
    {
      var idx = -1;
      var sk = $('fieldset.travelKind input:checked').val();
      switch (sk)
      {
        case '1': idx=0; break;
        case '4': idx=1; break;
        case '2': idx=2; break;
        case '3': idx=3; break;
      }
      if (idx >= 0)
      {
        $('#topMenu li').removeClass('active');
        $('#topMenu li:eq(' + idx + ')').addClass('active');
      }
    },
    msOKButton : function()
    {
      this.msUpdateTopMenu();
      var c = _getController(this[0]);
      if (c) {
        c.getOkCallback()();
      }
    },
    msSetOkCallback : function(callback)
    {
      return _w.call(this, 'setOkCallback', callback);
    },
    msSetJSONAction : function(action)
    {
      return _w.call(this, 'setJSONAction', action);
    },
    msGetOkCallback : function()
    {
      var c = _getController(this[0]);
      if (c) {
        return c.getOkCallback();
      }
      return null;
    },
    msGetJSONAction : function(action)
    {
      var c = _getController(this[0]);
      if (c) {
        return c.getJSONAction();
      }
      return null;
    },
    _msDestroy : 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 ModifySearchController(ele)
  {

    // initial values...
    this.ele = ele;
    this.id = '';
    this.context			=	'#name';
    this.okCallback = undefined; // function is beeing called after update
    this.JSONaction = undefined;
  };
  $.extend(
    ModifySearchController.prototype,
    {
      init : function(s)
      {
        this.context = $(s.id);
        this.okCallback = s.okCallback;
        this.JSONaction = s.JSONaction;

      },
      setOkCallback : function(a)
      {
        if (a && typeof(a) == 'function') {
          a = [a];
        }
        this.okCallback = this.okCallback.concat(a);
      },
      getOkCallback : function(a)
      {        
        return(this.okCallback);
      },
      setJSONAction : function(a)
      {
        this.JSONaction = a;
      },
      getJSONAction : function(a)
      {
        return(this.JSONaction);
      }

    }
    );


  function _getController(ele)
  {
    if (ele._msId) return $.event._msCache[ele._msId];
    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._msCache || [];
    for (var i in els) {
      $(els[i].ele)._msDestroy();
    }
  });


})(jQuery);

