/**
 * $Id: jquery.statusPanelController.js,v 1.36 2009/09/24 09:31:48 bjoern Exp $
 **/

(function($){

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

      // initialise the date picker controller with the relevant settings...
      options = $.extend(
      {
        id : undefined,
        $context : undefined,
        bbModifySearchCallback : undefined,
        bbFlightInfoCallback : undefined,
        bbFlightFilterCallback : undefined,
        bbHotelInfoCallback : undefined,
        bbHotelsFilternCallback : undefined,
        bbExtrasInfoCallback : undefined,
        bbExtrasFilternCallback : undefined,

        cmdBack : undefined,
        cmdStop : undefined,
        cmdFastForward : undefined,
        cmdNext : undefined,
        cmdBook : undefined,
        cmdPrint : undefined
      }
      , options
      );

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

          if (!this._spcId) {
            this._spcId = $.event.guid++;
            $.event._spcCache[this._spcId] = new StatusPanelController(this);
            alreadyExists = false;
          }

          var controller = $.event._spcCache[this._spcId];

          controller.init(options);

          $("#bbStartseite a").attr("href",'javascript:$(".statusPanel").spbbStartseiteButton();');
          $("#bbModifySearch a").attr("href",'javascript:$(".statusPanel").spbbModifySearchButton();');
          $("#bbFlightInfo a").attr("href",'javascript:$(".statusPanel").spbbFlightInfoButton();');
          $("#bbFlightFilter a").attr("href",'javascript:$(".statusPanel").spbbFlightFilterButton();');
          $("#bbHotelInfo a").attr("href",'javascript:$(".statusPanel").spbbHotelInfoButton();');
          $("#bbHotelsFiltern a").attr("href",'javascript:$(".statusPanel").spbbHotelsFilternButton();');
          $("#bbExtrasInfo a").attr("href",'javascript:$(".statusPanel").spbbExtrasInfoButton();');
          $("#bbExtrasFiltern a").attr("href",'javascript:$(".statusPanel").spbbExtrasFilternButton();');

          $("#cmdBack a").attr("href",'javascript:$(".statusPanel").spcmdBackButton();');
          $("#cmdStop a").attr("href",'javascript:$(".statusPanel").spcmdStopButton();');
          $("#cmdFastForward a").attr("href",'javascript:$(".statusPanel").spcmdFastForwardButton();');
          $("#cmdNext a").attr("href",'javascript:$(".statusPanel").spcmdNextButton();');
          $("#cmdBook a").attr("href",'javascript:$(".statusPanel").spcmdBookButton();');
          $("#cmdPrint a").attr("href",'javascript:$(".statusPanel").spcmdPrintButton();');

          $this.setBlueButtons(true, false, false, false, false, false, false, false,false);
          $this.setCommandPanelButtons(false,false,false,false);

          $this.setGUI("","","","","","");
          $this.hideFlightSummary();
        }
        )
    },

    showFlightSummary : function()
    {      
      $(".bookingInfo .travelInfo").show();
      $(".bookingInfo .priceInfo").show();
      $(".bookingInfo .priceInfo .description").show();
    //$(".bookingInfo .priceInfo .price").show();
    },

    hideFlightSummary : function()
    {      
      $(".bookingInfo .travelInfo").hide();
      $(".bookingInfo .priceInfo").hide();
      $(".bookingInfo .priceInfo .description").hide();
    //      $(".bookingInfo .priceInfo .price").hide();
    },

    setGUI : function(date,days,adults,children,price)
    {
      var c = _getController(this[0]);
      if (c) {
        c.setGUI(date,days,adults,children,price);
      }
    },

    spSetPrice : function(price, byebye)
    {
      var c = _getController(this[0]);
      if (c) {
        c.setPrice(price,byebye);
      }

    },

    spcSaveCmdState : function()
    {
      return _w.call(this, 'saveCmdState');
    },
    
    spcRestoreCmdState : function()
    {
      var c = _getController(this[0]);
      if (c) {
        return c.restoreCmdState();
      }
      return null;
    },


    spSetPriceDescription : function(headline, subheadline)
    {
      if (headline != null)
        $(".bookingInfo .priceInfo .description strong").text(headline);
      if (subheadline != null)
        $(".bookingInfo .priceInfo .description p").text(subheadline);
    },


    // set command buttons to their corresponding status given as parameter
    setCommandPanelButtons : function(button1enabled, button2enabled, button3enabled, button4enabled)
    {
      // show cmd Buttons
      $("#cmdBack").show();
      $("#cmdStop").show();
      $("#cmdFastForward").show();
      $("#cmdNext").show();

      // hide special Buttons
      $("#cmdBook a").hide();
      $("#cmdBook").hide();
      $("#cmdPrint a").hide();
      $("#cmdPrint").hide();

      if (button1enabled != undefined)
        if (button1enabled)
          $("#cmdBack a").removeClass("disabled");
        else
          $("#cmdBack a").addClass("disabled");

      if (button2enabled != undefined)
        if (button2enabled)
          $("#cmdStop a").removeClass("disabled");
        else
          $("#cmdStop a").addClass("disabled");

      if (button3enabled != undefined)
        if (button3enabled)
          $("#cmdFastForward a").removeClass("disabled");
        else
          $("#cmdFastForward a").addClass("disabled");

      if (button4enabled != undefined)
        if (button4enabled)
          $("#cmdNext a").removeClass("disabled");
        else
          $("#cmdNext a").addClass("disabled");
    },

    // show/hide buttons for "VERBINDLICH.buchen"/"BESTELLUNG.drucken"
    // button = 1 refers to cmdBook
    // button = 2 refers to cmdPrint
    setSpecialButtons : function(button, show)
    {
      if (button == 2) // only hide for print button
        $("#cmdBack").hide().removeClass("disabled");
      $("#cmdStop").hide();
      $("#cmdFastForward").hide();
      $("#cmdNext").hide();

      if (button == 1){
        $("#cmdPrint a").hide();
        $("#cmdPrint").hide();
        $("#cmdBook a").show();
        $("#cmdBook").show();
      }
      if (button == 2){
        $("#cmdBook a").hide();
        $("#cmdBook").hide();
        $("#cmdPrint a").show();
        $("#cmdPrint").show();
      }
    },


    spcRemovePressedState : function()
    {
      $("#cmdBack a").removeClass("pressed");
      $("#cmdStop a").removeClass("pressed");
      $("#cmdFastForward a").removeClass("pressed");
      $("#cmdNext a").removeClass("pressed");
    },

    // show or hide the blue buttons
    setBlueButtons : function(bb1, bb2, bb3, bb4, bb5, bb6, bb7, bb8)
    {
      if (bb1)
        $("#bbStartseite").show();
      else
        $("#bbStartseite").hide();
      if (bb2)
        $("#bbModifySearch").show();
      else
        $("#bbModifySearch").hide();
      if (bb3)
        $("#bbFlightInfo").show();
      else
        $("#bbFlightInfo").hide();
      if (bb4)
        $("#bbFlightFilter").show();
      else
        $("#bbFlightFilter").hide();
      if (bb5)
        $("#bbHotelInfo").show();
      else
        $("#bbHotelInfo").hide();
      if (bb6)
        $("#bbHotelsFiltern").show();
      else
        $("#bbHotelsFiltern").hide();
      if (bb7)
        $("#bbExtrasInfo").show();
      else
        $("#bbExtrasInfo").hide();
      if (bb8)
        $("#bbExtrasFiltern").show();
      else
        $("#bbExtrasFiltern").hide();
    },

    spbbStartseiteButton : function()
    {
      var c = _getController(this[0]);
      if (c) {
        c.getbbStartseiteCallback()();
      }
    },

    spbbModifySearchButton : function()
    {
      var c = _getController(this[0]);
      if (c) {
        c.getbbModifySearchCallback()();
      }
    },
    spbbFlightInfoButton : function()
    {

      var c = _getController(this[0]);
      if (c) {
        c.getbbFlightInfoCallback()();
      }
    },
    spbbFlightFilterButton : function()
    {

      var c = _getController(this[0]);
      if (c) {
        c.getbbFlightFilterCallback()();
      }
    },
    spbbHotelInfoButton : function()
    {

      var c = _getController(this[0]);
      if (c) {
        c.getbbHotelInfoCallback()();
      }
    },
    spbbHotelsFilternButton : function()
    {

      var c = _getController(this[0]);
      if (c) {
        c.getbbHotelsFilternCallback()();
      }
    },
    spbbExtrasInfoButton : function()
    {

      var c = _getController(this[0]);
      if (c) {
        c.getbbExtrasInfoCallback()();
      }
    },
    spbbExtrasFilternButton : function()
    {

      var c = _getController(this[0]);
      if (c) {
        c.getbbExtrasFilternCallback()();
      }
    },



    spcmdBackButton : function()
    {
      if ( $("#cmdBack a").hasClass("disabled"))
        return;
      var c = _getController(this[0]);
      if (c) {
        c.getcmdBackCallback()();
      }
    },
    spcmdStopButton : function()
    {
      if ( $("#cmdStop a").hasClass("disabled"))
        return;
      var c = _getController(this[0]);
      if (c) {
        c.getcmdStopCallback()();
      }
    },
    spcmdFastForwardButton : function()
    {
      if ( $("#cmdFastForward a").hasClass("disabled"))
        return;
      var c = _getController(this[0]);
      if (c) {
        c.getcmdFastForwardCallback()();
      }
    },
    spcmdNextButton : function()
    {
      if ( $("#cmdNext a").hasClass("disabled"))
        return;
      var c = _getController(this[0]);
      if (c) {
        c.getcmdNextCallback()();
      }
    },
    spcmdBookButton : function()
    {

      var c = _getController(this[0]);
      if (c) {
        c.getcmdBookCallback()();
      }
    },
    spcmdPrintButton : function()
    {

      var c = _getController(this[0]);
      if (c) {
        c.getcmdPrintCallback()();
      }
    },

    _spcDestroy : 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, a4, a5, a6)
  {
    return this.each(
      function()
      {
        var c = _getController(this);
        if (c) {
          c[f](a1, a2, a3, a4, a5, a6);
        }
      }
      );
  };

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

    // initial values...
    this.$context			=	$(ele);
    this.id				=	this.$context.attr("id");
    this.bbStartseiteCallback = undefined;
    this.bbModifySearchCallback = undefined;
    this.bbFlightInfoCallback = undefined;
    this.bbFlightFilterCallback = undefined;
    this.bbHotelInfoCallback = undefined;
    this.bbHotelsFilternCallback = undefined;
    this.bbExtrasInfoCallback = undefined;
    this.bbExtrasFilternCallback = undefined;
    this.cmdBackCallback = undefined;
    this.cmdStopCallback = undefined;
    this.cmdFastForwardCallback = undefined;
    this.cmdNextCallback = undefined;
    this.cmdBookCallback = undefined;
    this.cmdPrintCallback = undefined;

    this.cmdSaveState = undefined;

  };
  $.extend(
    StatusPanelController.prototype,
    {
      init : function(s)
      {
        //        this.id = s.id;
        //        this.$context = $(s.id);
        this.bbStartseiteCallback = s.bbStartseiteCallback;
        this.bbModifySearchCallback = s.bbModifySearchCallback;
        this.bbFlightInfoCallback = s.bbFlightInfoCallback;
        this.bbFlightFilterCallback = s.bbFlightFilterCallback;
        this.bbHotelInfoCallback = s.bbHotelInfoCallback;
        this.bbHotelsFilternCallback = s.bbHotelsFilternCallback;
        this.bbExtrasInfoCallback = s.bbExtrasInfoCallback;
        this.bbExtrasFilternCallback = s.bbExtrasFilternCallback;
        this.cmdBackCallback = s.cmdBackCallback;
        this.cmdStopCallback = s.cmdStopCallback;
        this.cmdFastForwardCallback = s.cmdFastForwardCallback;
        this.cmdNextCallback = s.cmdNextCallback;
        this.cmdBookCallback = s.cmdBookCallback;
        this.cmdPrintCallback = s.cmdPrintCallback;

        this.cmdSaveState = undefined;
      },

      saveCmdState : function()
      {
        this.cmdSaveState = [];
        this.cmdSaveState[0] = !$("#cmdBack a").hasClass("disabled");
        this.cmdSaveState[1] = !$("#cmdStop a").hasClass("disabled");
        this.cmdSaveState[2] = !$("#cmdFastForward a").hasClass("disabled");
        this.cmdSaveState[3] = !$("#cmdNext a").hasClass("disabled");
        this.cmdSaveState[4] = !$("#cmdBook a").hasClass("disabled");
        this.cmdSaveState[5] = !$("#cmdPrint a").hasClass("disabled");
      },

      restoreCmdState : function()
      {
        if (  (this.cmdSaveState == undefined )
          ||(this.cmdSaveState.length == 0))
          return;

        $(".statusPanel", this.$context).setCommandPanelButtons(this.cmdSaveState[0],this.cmdSaveState[1],this.cmdSaveState[2],this.cmdSaveState[3]);
      },


      setGUI : function(date,days,adults,children,price)
      {
        var $bi = $(".bookingInfo", this.$context);

        var adultsKey = (adults == 1 ? 'txt.common.adult' : 'txt.common.adults');
        var childrenKey = (children == 1 ? 'txt.common.child' : 'txt.common.children');
        var day = "";
        var retDate = "";
        var mydate = "";
        if (date) {
          mydate = Date.fromString(date);
          day = mydate.getDayName();
          days = parseInt(days, 10);
          retDate = dateAddDays(mydate, days);
          retDate = XdateStr(retDate);
          mydate = XdateStr(mydate);
        }


        days = ( days  &&  (days != "") && (days != 0) ) ?
        getText('txt.common.days',days) : "";


        if (days != "")
          date = date + ", ";

        adults = getText(adultsKey, adults);

        children = ( children  &&  (children != "") && (children != 0) ) ?
        getText(childrenKey, children) : "";

        if (children != "")
          adults = adults + ", ";

        var data = {
          'day': day,
          'date': date,
          'days': days,
          'adults': adults,
          'children': children
        };

        $bi.autoRender (data);


        $("div.travelInfo span.date").attr("startdate", mydate);
        $("div.travelInfo span.date").attr("retdate", retDate);


        if (price)
          this.setPrice (price); 
      },

      setPrice : function(price,byebye)
      {
        if (byebye != true)
          byebye = false;
        if (byebye)
          price=" ";
        else if ((price && typeof(price)=='string' && price.length > 0 && price.indexOf(/\u20ac/) == -1)
          || (typeof(price)=='number') )
          price = getText('txt.common.price', price);
        else if (price == "")
          price = " ";

        $("#priceStandard", this.$context).text(price);
      },

      getbbStartseiteCallback : function(a)
      {
        return(this.bbStartseiteCallback);
      },
      getbbModifySearchCallback : function(a)
      {
        return(this.bbModifySearchCallback);
      },
      getbbFlightInfoCallback : function(a)
      {

        return(this.bbFlightInfoCallback);
      },
      getbbFlightFilterCallback : function(a)
      {

        return(this.bbFlightFilterCallback);
      },
      getbbHotelInfoCallback : function(a)
      {

        return(this.bbHotelInfoCallback);
      },
      getbbHotelsFilternCallback : function(a)
      {

        return(this.bbHotelsFilternCallback);
      },
      getbbExtrasInfoCallback : function(a)
      {

        return(this.bbExtrasInfoCallback);
      },
      getbbExtrasFilternCallback : function(a)
      {

        return(this.bbExtrasFilternCallback);
      },
      getcmdBackCallback : function(a)
      {

        return(this.cmdBackCallback);
      },

      getcmdStopCallback : function(a)
      {

        return(this.cmdStopCallback);
      },

      getcmdFastForwardCallback : function(a)
      {

        return(this.cmdFastForwardCallback);
      },

      getcmdNextCallback : function(a)
      {

        return(this.cmdNextCallback);
      },

      getcmdBookCallback : function(a)
      {

        return(this.cmdBookCallback);
      },

      getcmdPrintCallback : function(a)
      {

        return(this.cmdPrintCallback);
      }
    }
    );

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


})(jQuery);
