function Navigation(pageID, pageSize){
  this.previousPage = 0;
  this.pageSize = pageSize;
  this.currentPage = pageID;
};

Navigation.prototype.reset = function() {
  this.previousPage = 0;
  this.currentPage = 0;
  this.buildPaginator();
};

Navigation.prototype.embed = function() {
  var self = this;
  $('#paging-chooser a').bind('click', function(){
    var setting = $(this);
    self.pageSize = Number(setting.text());
    self.reset();
    self.refresh();

    $('#paging-chooser a.current').removeClass('current');
    setting.addClass('current');
    return false;
  });

  this.refresh();
};

Navigation.prototype.refresh = function() {
  var range = this.calculatePageRange(this.currentPage);
  var start = range.start;
  var end = range.end;

  this.buildPaginator();
  this.displayRows(start, end);
};

Navigation.prototype.displayRows = function(start, end) {
  var ctx = $('#results');
  var index = 1;
  $('tbody tr', ctx).each(function(i){
    var row = $(this);
    if(row.hasClass('filtered')){
      row.hide();
    }
    else{
      if(index >= start && index <= end){
        row.show();
      }
      else{
        row.hide();
      }
      index++;
    }
  });
};

Navigation.prototype.buildPaginator = function() {
  var self = this;
  $("#pagination").pagination(this.totalRows(), {
    items_per_page: this.pageSize,
    current_page: this.currentPage,
    prev_text: '<<',
    next_text: '>>',
    ellipse_text: '...',
    num_edge_entries: 1,
    num_display_entries: 4,
    callback: function(newPageID){
      self.previousPage = self.currentPage;
      self.currentPage = newPageID;
      self.refresh();
      return false;
    }
  });
};

Navigation.prototype.totalRows = function() {
  return $('#results tbody tr:not(.filtered)').size();
};

Navigation.prototype.calculatePageRange = function(pageID) {
  var start = pageID * this.pageSize + 1;
  var end = start + this.pageSize - 1;
  return {start: start, end: Math.min(end, this.totalRows())};
};

var navigation = null;

$(document).ready(function(){
  navigation = new Navigation(0, 20);
  navigation.embed();

  $('#region-filter input').click(function(){
    var regions = this.value.split(',');
    if(this.checked){
      for (var i=0; i < regions.length; i++) {
        var regionId = regions[i];
        $('#results tbody tr:has(td.details li:contains(' + regionId + '))').removeClass('filtered');
      }
    }
    else{
      for (var i=0; i < regions.length; i++) {
        var regionId = regions[i];
        $('#results tbody tr:has(td.details li:contains(' + regionId + '))').addClass('filtered');
      }
    }
    navigation.reset();
    navigation.refresh();
  });

  $('select#departure_code').change(function(){
    var $select = $(this);
    if($select.val().match(/^[A-Z]{3}$/)){
      $('#results tbody tr').addClass('filtered');
      $('#results tbody tr:has(td.details ul.hide li:contains(' + $select.val() + '))').removeClass('filtered');
    }
    else{
      $('#results tbody tr').removeClass('filtered');
    }

    navigation.reset();
    navigation.refresh();
  });

  $('#choose-market').click(function(){
    $link = $(this);
    if($link.text() == change_text){
      $link.text(cancel_text);
      $('h1 #market').hide();
      $('#available-markets').show();
    }
    else{
      $link.text(change_text);
      $('h1 #market').show();
      $('#available-markets').hide();
    }

    return false;
  });

  $('#available-markets').change(function(){
    $select = $(this);
    $market = $('h1 #market');
    $market.text($select.find('option:selected').text());
    $market.show();
    $select.hide();
    $link.text('change');

    window.location = $select.val();
  });

  $('#hot-deals-subscription form input[name="email"]').click(function(){
    $(this).val('');
  });

  // Init
  $('select#departure_code').change();

  function twitterize() {

    var $tweetable = $('a.twitter');

    var long_urls_qs = [];
    for(var i = 0, l = $tweetable.length; i < l; i++) {
      long_urls_qs.push('longUrl=' + encodeURIComponent($tweetable[i].href));
    }

    var mid = long_urls_qs.length / 2;

    shorten_urls(long_urls_qs.slice(0,mid));
    shorten_urls(long_urls_qs.slice(mid));

  }

  function shorten_urls(long_urls) {

    var $tweetable = $('a.twitter');

    $.ajax({
       dataType: 'jsonp',
       data    : 'login=wego&apiKey=R_fc89d5d8825c7d988944184e712b7a32&version=2.0.1&' + long_urls.join('&'),
       url     : 'http://api.bit.ly/shorten',
       success : function(data) {

         $tweetable.each(function() {

           var result = data.results[this.href];

           if (result != null) {

            var headline      = encodeURIComponent($(this).attr('title'));
            var twitter_url   = 'http://twitter.com/home?status=Found%20@Wego!%20' + headline + '%20' + result.shortUrl;

            $(this).attr('href' , twitter_url);
            $(this).attr('title', 'Share on Twitter');

          }

        });

      }

    });
  }

  function facebookize() {

    var $facebookable = $('a.facebook');

    for(var i = 0, l = $facebookable.length; i < l; i++) {
      var url = 'http://www.facebook.com/share.php?u=' + encodeURIComponent($facebookable[i].href);
      $facebookable[i].href = url;
    }

  }

  twitterize();
  facebookize();

  $('#hot_deals_close').click(function()
  {
  	$(this).parent().fadeOut();
  	$.cookie('hide_newsletter','yes');
  	return false;
  });

  if($("#newsletter_form").is("*")) {

    $("#newsletter_form").validate({
     rules: {
       RR_Email:{
         required: true,
         email: true
       },
       AirportCode2: "required"
     },
     messages:{
       RR_Email: "x",
       AirportCode2: "x"
     }
    });

    $("#newsletter_form input[name=AirportCode2]").autocomplete('http://www.wego.com/p/flights/locations/search', {
     dataType: 'jsonp',
     minChars: 2,
     matchSubset: false,
     delay: 100,
     matchContains: true,
     extraParams: { format: 'jsonp', limit: 50 },
     parse: function(data) {
       if (data && data.r && data.r.length > 0) {
         var parsed = [];
         for (var i = 0, l = data.r.length; i < l; i++) {
           var result = data.r[i];
           parsed[i] = { data: result, value: result.id, result: result.fn };
         }
         return parsed;
       } else {
       // No results - show a message.
         return [{ data: { fn: 'No matching locations' }, value: '', result: '' }];
       }
     },
     formatItem: function(result) {
       return result.fn;
     }
    });

    $("#newsletter_form input[name=AirportCode2]").result(function(event, data, formatted) {
     if (data) {
       $("#newsletter_form input[name=AirportCode]").val(data.c);
       $("#newsletter_form input[name=AirportCode2]").val(data.fn);
     }
    });

  }

  // Just Landed Deals Tracking
  $("a.track").click(function () {
    partner = $("#partner").html();
    url     = this.href;
    details = partner + "|" + url;
    WegoFarmer().track_action("deal.just_landed", escape(details));
  });

});