/**
 * $Id: jquery.filterFlightsController.js 2409 2009-05-18 15:01:01Z Bjoern.Moenikes $
 **/

(function($){

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

      // initialise the date picker controller with the relevant settings...
      options = $.extend(
      {
        renderDirective : '',                  // needed for autorenderer
        emptyRow : ' ',
        updateCallback : undefined, // function is beeing called after update
        selectCallback : undefined, // function is beeing called after change of selection
        JSONaction : undefined
      }
      , options
      );

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

          if (!this._ffId) {
            this._ffId = $.event.guid++;
            $.event._ffCache[this._ffId] = new FilterFlightsController(this);
            alreadyExists = false;
          }

          var controller = $.event._ffCache[this._ffId];

          controller.init(options);


          $('#outwardFlightSlider').slider({
            steps: 24,
            range: true,
            change: function(e,ui) {
              von = $this.normalizeTo24h("#outwardFlightSlider",$("#outwardFlightSlider").slider("value",0));
              bis = $this.normalizeTo24h("#outwardFlightSlider",$("#outwardFlightSlider").slider("value",1));
              if (von == "")
                von = "0";
              $("#outwardFlightSlider1").text( von );
              $("#outwardFlightSlider2").text( bis  );
            }
          });
          $('#returnFlightSlider').slider({
            steps: 24,
            range: true,
            change: function(e,ui) {
              von = $this.normalizeTo24h("#returnFlightSlider",$("#returnFlightSlider").slider("value",0));
              bis = $this.normalizeTo24h("#returnFlightSlider",$("#returnFlightSlider").slider("value",1));
              if (von == "")
                von = "0";
              $("#returnFlightSlider1").text( von );
              $("#returnFlightSlider2").text( bis );
            }
          });

          $('#flightPriceSlider').slider({
            steps: 100,
            range: true,
            change: function(e,ui) {
              von = $this.normalizeToPrice($("#flightPriceSlider").slider("value",0));
              bis = $this.normalizeToPrice($("#flightPriceSlider").slider("value",1));

              $("#flightPriceSlider1").text(von);
              $("#flightPriceSlider2").text(bis);
            }
          });

          $this.updateFlightFilterAirlineList();
          
          // 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)
          var str = "hinflugzeit rueckflugzeit preisProStecke".split(" ");
          for (var j = 0; j < str.length; j++)
            $("#filterFlights input:radio[name='"+str[j]+"']").click(function() {
              $("#filterFlights input:radio[name='"+str[j]+"']").removeAttr('defaultChecked').removeAttr('checked');
              $(this).attr('checked', 'checked').attr('defaultChecked', 'checked');
            });
        }
        )
    },
    // maps f:[0..100] to  [0..24]
    normalizeTo24h: function(id, value)
    {
      var lowPrice = parseInt( $(id+"1").attr( "hour"), 10 );
      var highPrice = parseInt( $(id+"2").attr( "hour"), 10 );
      var range = highPrice - lowPrice;
      //return(Math.round(24/100 * value));
      var erg = Math.round( lowPrice + range / 100 * value);
      return erg;
    },


    // maps f:[0..100] to [min..max]
    normalizeToPrice : function(value)
    {
      var lowPrice = parseInt( $("#flightPriceSlider1").attr( "price"), 10 );
      var highPrice = parseInt( $("#flightPriceSlider2").attr( "price"), 10 );
      var range = highPrice - lowPrice;
      var erg = Math.floor( lowPrice + value * (range / 100.0) );
      return erg;
    },




    updateFlightFilterAirlineList : function ()
    {

      $("#flightFilterAirlineList fieldset div").remove();
      doJSON ('flightfilter_airlines', {}, function(response)
      {
        var $ul=$('<ul class="airlines"></ul>');
        for (var l = 0; l < response["data"].length; l++)
        {
          $ul.append('<li><input checked="true" airlineid="'+response["data"][l][phpConst.flight.airlineId]+'" id="ffCB'+response["data"][l][phpConst.flight.airlineCode]+'" type="checkbox" /> <img src="'+response["data"][l][phpConst.flight.airlineImage]+'" alt="'+response["data"][l][phpConst.flight.airlineName]+'" title="'+response["data"][l][phpConst.flight.airlineName]+'" /></li>');
        }
        $("#flightFilterAirlineList fieldset").append($ul);


        // releations set after dropdowns have been populated to prevent redundat json_calls
        $("#modifySearch").initDropdownRelations();
      }, getShowResponse(), getShowResponse());
    },



    // Filter the actual list of flights by using the data entered in FLIGHT.filter
    ffcExecuteFlightFilter : function()
    {
      $("#chooseFlight").cfcExecuteFlightFilter();
    
    },


    ffcAdjustFlightFilter : function()
    {
      var $left = $("#chooseFlight #leftFlightTable tbody tr");
      var $right = $("#chooseFlight #rightFlightTable tbody tr");
      var $lowestPrice = null;
      var $highestPrice = null;

      var $earliestLeave = null;
      var $latestLeave = null;

      var $earliestArrive = null;
      var $latestArrive = null;

      var priceExtrema = function($table)
      {
        this.$lowestPrice = undefined;
        this.$highestPrice = undefined;
        this.$earliestLeave = undefined;
        this.$earliestArrive = undefined;
        this.$latestLeave = undefined;
        this.$latestArrive = undefined;

        this.getLowestPrice = function()
        {
          var val = undefined;
          if (this.$lowestPrice != undefined)
            val = parseInt( this.$lowestPrice.attr("price"), 10);
          return val;
        }
        this.getHighestPrice = function()
        {
          var val = undefined;
          if (this.$highestPrice != undefined)
            val = parseInt( this.$highestPrice.attr("price"), 10 );
          return val;
        }
        this.getEarliestLeave = function()
        {
          var val = undefined;
          if (this.$earliestLeave != undefined)
            {
            val = parseInt($(".columnDeparture",this.$earliestLeave).text().substr(0,2),10);
            }
          return val;
        }
        this.getLatestLeave = function()
        {
          var val = undefined;
          if (this.$latestLeave != undefined)
            {
            val = parseInt($(".columnDeparture",this.$latestLeave).text().substr(0,2),10);
            if ($(".columnDeparture",this.$latestLeave).text().substr(3,2) != "00")
              val++;
            }
          return val;
        }
        this.getEarliestArrive = function()
        {
          var val = undefined;
          if (this.$earliestArrive != undefined)
            {
            val = parseInt($(".columnArrival",this.$earliestArrive).text().substr(0,2),10);
            }
          return val;
        }
        this.getLatestArrive = function()
        {
          var val = undefined;
          if (this.$latestArrive != undefined)
            {
            val = parseInt($(".columnArrival",this.$latestArrive).text().substr(0,2),10);
            if ($(".columnArrival",this.$latestArrive).text().substr(3,2) != "00")
              val++;
            }
          return val;
        }

        var xthis = this;
        $table.each(function(index, element){
          var $element = $(element, $table);

        // first time init
        if (xthis.$lowestPrice == null)
          xthis.$lowestPrice = $element;
        if (xthis.$highestPrice == null)
          xthis.$highestPrice = $element;
        if (xthis.$earliestLeave == null)
          xthis.$earliestLeave = $element;
        if (xthis.$earliestArrive == null)
          xthis.$earliestArrive = $element;
        if (xthis.$latestLeave == null)
          xthis.$latestLeave = $element;
        if (xthis.$latestArrive == null)
          xthis.$latestArrive = $element;


        if (parseInt($element.find(".columnPrice").text(), 10) < parseInt(xthis.$lowestPrice.find(".columnPrice").text(), 10))
          xthis.$lowestPrice = $element;
        if (parseInt($element.find(".columnPrice").text(), 10) > parseInt(xthis.$highestPrice.find(".columnPrice").text(), 10))
          xthis.$highestPrice = $element;

        if (parseInt($(".columnArrival", $element).text().replace(/:/,""), 10) < parseInt($(".columnArrival", xthis.$earliestArrive).text().replace(/:/,""),10))
          xthis.$earliestArrive = $element;
        if (parseInt($(".columnArrival", $element).text().replace(/:/,""), 10) > parseInt($(".columnArrival", xthis.$latestArrive).text().replace(/:/,""),10))
          xthis.$latestArrive = $element;

        if (parseInt($(".columnDeparture", $element).text().replace(/:/,""), 10) < parseInt($(".columnDeparture", xthis.$earliestLeave).text().replace(/:/,""),10))
          xthis.$earliestLeave = $element;
        if (parseInt($(".columnDeparture", $element).text().replace(/:/,""), 10) > parseInt($(".columnDeparture", xthis.$latestLeave).text().replace(/:/,""),10))
          xthis.$latestLeave = $element;

        });
      }

      var left = new priceExtrema($left)
      var right = new priceExtrema($right)

//      C.log(left);
//      C.log(left.getEarliestLeave());
//      C.log(right);

      // set it
      var lowPrice = left.getLowestPrice() < right.getLowestPrice() ? left.getLowestPrice() : right.getLowestPrice();
      var highPrice = left.getHighestPrice() > right.getHighestPrice() ? left.getHighestPrice() : right.getHighestPrice();
      var leftLow = left.getEarliestLeave(); // < right.getEarliestLeave() ? left.getEarliestLeave() : right.getEarliestLeave();
      var leftHigh = left.getLatestArrive(); // < right.getEarliestArrive() ? left.getEarliestArrive() : right.getEarliestArrive();
      var rightLow = right.getEarliestLeave(); // > right.getLatestLeave() ? left.getLatestLeave() : right.getLatestLeave();
      var rightHigh = right.getLatestArrive(); // > right.getLatestArrive() ? left.getLatestArrive() : right.getLatestArrive();


      if (leftLow > leftHigh)
        {
          var tmp = leftLow;
          leftLow = leftHigh - 1;
          leftHigh = tmp + 1;
        }

      if (rightLow > rightHigh)
        {
          var tmp = rightLow;
          rightLow = rightHigh - 1;
          rightHigh = tmp + 1;
        }

      // save lower and upper price
      $("#outwardFlightSlider1").attr( "hour", leftLow );
      $("#outwardFlightSlider2").attr( "hour", leftHigh );
      $("#returnFlightSlider1").attr( "hour",  rightLow );
      $("#returnFlightSlider2").attr( "hour", rightHigh );
      $("#flightPriceSlider1").attr( "price", lowPrice );
      $("#flightPriceSlider2").attr( "price", highPrice );

      // set slider to their extrema
      $("#outwardFlightSlider").slider( "moveTo", 100, 1 );
      $("#outwardFlightSlider").slider( "moveTo", 0, 0 );
      $("#returnFlightSlider").slider( "moveTo", 100, 1 );
      $("#returnFlightSlider").slider( "moveTo", 0, 0 );
      $("#flightPriceSlider").slider( "moveTo", 100, 1 );
      $("#flightPriceSlider").slider( "moveTo", 0, 0 );

      // hide all airlines in filter
      $("#flightFilterAirlineList .airlines li").each(
        function(index,element)
        {
          $(element).addClass("hidden");
        }
        );

      // for each airline in filter
      // check flightTables and show if airline in valid flights
      $("#flightFilterAirlineList .airlines li").each(
        function (index, element)
        {
          var $element = $(element).find("input"); // element points to actual airline in flightfilter

          // unhide if flight with same airlineid found
          var unhideNeededAirlines = function (index2, element2)
          {
            var $element2 = $(element2);
            if (($element2.attr("airlineid") == $element.attr("airlineid")) // same id
              ) //&& !( $element2.hasClass("hidden")) ) // entry is visible
              $element.parent().removeClass("hidden");
          };

          $left.each(unhideNeededAirlines);
          $right.each(unhideNeededAirlines);
        }
        );
    },

  
    _ffDestroy : 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 FilterFlightsController(ele)
  {
    this.ele = ele;

    // initial values...
    this.id				=	undefined;
    this.$context			=	undefined;

  };
  $.extend(
    FilterFlightsController.prototype,
    {
      init : function(s)
      {
        this.id = s.id;
        this.$context = $(s.id);
      }


    }
    );

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


})(jQuery);