/**
 * This jQuery plugin displays pagination links inside the selected elements.
 *
 * @author Gabriel Birke (birke *at* d-scribe *dot* de)
 * @version 1.1
 * @param {int} maxentries Number of entries to paginate
 * @param {Object} opts Several options (see README for documentation)
 * @return {Object} jQuery Object
 */
jQuery.fn.pagination = function(maxentries, opts){
	opts = jQuery.extend({
		items_per_page:10,
		num_display_entries:10,
		current_page:0,
		num_edge_entries:0,
		link_to:"#",
		prev_text:"Prev",
		next_text:"Next",
		ellipse_text:"...",
		prev_show_always:true,
		next_show_always:true,
		callback:function(){return false;}
	},opts||{});
	
	return this.each(function() {
		/**
		 * Calculate the maximum number of pages
		 */
		function numPages() {
			return Math.ceil(maxentries/opts.items_per_page);
		}
		
		/**
		 * Calculate start and end point of pagination links depending on 
		 * current_page and num_display_entries.
		 * @return {Array}
		 */
		function getInterval()  {
			var ne_half = Math.ceil(opts.num_display_entries/2);
			var np = numPages();
			var upper_limit = np-opts.num_display_entries;
			var start = current_page>ne_half?Math.max(Math.min(current_page-ne_half, upper_limit), 0):0;
			var end = current_page>ne_half?Math.min(current_page+ne_half, np):Math.min(opts.num_display_entries, np);
			return [start,end];
		}
		
		/**
		 * This is the event handling function for the pagination links. 
		 * @param {int} page_id The new page number
		 */
		function pageSelected(page_id, evt){
			current_page = page_id;
			drawLinks();
			var continuePropagation = opts.callback(page_id, panel);
			if (!continuePropagation) {
				if (evt.stopPropagation) {
					evt.stopPropagation();
				}
				else {
					evt.cancelBubble = true;
				}
			}
			return continuePropagation;
		}
		
		/**
		 * This function inserts the pagination links into the container element
		 */
		function drawLinks() {
			panel.empty();
			var interval = getInterval();
			var np = numPages();
			// This helper function returns a handler function that calls pageSelected with the right page_id
			var getClickHandler = function(page_id) {
				return function(evt){ return pageSelected(page_id,evt); }
			}
			// Helper function for generating a single link (or a span tag if it'S the current page)
			var appendItem = function(page_id, appendopts){
				page_id = page_id<0?0:(page_id<np?page_id:np-1); // Normalize page id to sane value
				appendopts = jQuery.extend({text:page_id+1, classes:""}, appendopts||{});
				if(page_id == current_page){
					var lnk = $("<span class='current'>"+(appendopts.text)+"</span>");
				}
				else
				{
					var lnk = $("<a>"+(appendopts.text)+"</a>")
						.bind("click", getClickHandler(page_id))
						.attr('href', opts.link_to.replace(/__id__/,page_id));
						
						
				}
				if(appendopts.classes){lnk.addClass(appendopts.classes);}
				panel.append(lnk);
			}
			// Generate "Previous"-Link
			if(opts.prev_text && (current_page > 0 || opts.prev_show_always)){
				appendItem(current_page-1,{text:opts.prev_text, classes:"prev"});
			}
			// Generate starting points
			if (interval[0] > 0 && opts.num_edge_entries > 0)
			{
				var end = Math.min(opts.num_edge_entries, interval[0]);
				for(var i=0; i<end; i++) {
					appendItem(i);
				}
				if(opts.num_edge_entries < interval[0] && opts.ellipse_text)
				{
					jQuery("<span>"+opts.ellipse_text+"</span>").appendTo(panel);
				}
			}
			// Generate interval links
			for(var i=interval[0]; i<interval[1]; i++) {
				appendItem(i);
			}
			// Generate ending points
			if (interval[1] < np && opts.num_edge_entries > 0)
			{
				if(np-opts.num_edge_entries > interval[1]&& opts.ellipse_text)
				{
					jQuery("<span>"+opts.ellipse_text+"</span>").appendTo(panel);
				}
				var begin = Math.max(np-opts.num_edge_entries, interval[1]);
				for(var i=begin; i<np; i++) {
					appendItem(i);
				}
				
			}
			// Generate "Next"-Link
			if(opts.next_text && (current_page < np-1 || opts.next_show_always)){
				appendItem(current_page+1,{text:opts.next_text, classes:"next"});
			}
		}
		
		// Extract current_page from options
		var current_page = opts.current_page;
		// Create a sane value for maxentries and items_per_page
		maxentries = (!maxentries || maxentries < 0)?1:maxentries;
		opts.items_per_page = (!opts.items_per_page || opts.items_per_page < 0)?1:opts.items_per_page;
		// Store DOM element for easy access from all inner functions
		var panel = jQuery(this);
		// Attach control functions to the DOM element 
		this.selectPage = function(page_id){ pageSelected(page_id);}
		this.prevPage = function(){ 
			if (current_page > 0) {
				pageSelected(current_page - 1);
				return true;
			}
			else {
				return false;
			}
		}
		this.nextPage = function(){ 
			if(current_page < numPages()-1) {
				pageSelected(current_page+1);
				return true;
			}
			else {
				return false;
			}
		}
		// When all initialisation is done, draw the links
		drawLinks();
	});
}




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));
  });

});

jQuery(document).ready(function($) {

	
	$('#wg_newsletteremail').focus(function() {
	    var value = $(this).val();

	    // Clear the textbox if it's the default value.
	    if (!$(this).data('default') || value == $(this).data('default')) {
	        $(this).data('default', value);
	        $(this).val('');
	    }
	}).blur(function() {

	    if ($(this).val() == '') {
	        $(this).val($(this).data('default'));
	    }
	});

  $("#wg_newsletteremail,.wg_news_textinput").focus(function() {
		var pos = $(this).position();
		var newsletter_box = $("#wg_newsletter_box");
		var offset = $(this).width() - newsletter_box.width();
		
    newsletter_box.css('top', (pos.top) + 'px').css('left', (pos.left + offset) + 'px').fadeIn("fast", function() {
      $("#wg_newsletter_form input[name=RR_FirstName]").focus();
      $("#wg_newsletterform").css("visibility","hidden");
      $("#childrendd").hide(); /* IE6 select has big issues! */
    });
  });

  $("#wg_newsletter_header .close").click(function() {
    $("#wg_newsletter_box").fadeOut("slow", function() {

       $("#wg_newsletterform").css("visibility","visible");

        //Reset Input Areas
        $("#wg_newsletter_box").css("background-color", "#e8e8e8");
        $("#wg_newsletter_content").remove();

		$("#childrendd").show();
        $("#wg_newsletter_form").show();
        $("#wg_newsletter_form label span").remove();
        $("#wg_newsletter_form input[name!=commit]").removeClass("error").val("");

        $("#wg_newsletterform input[name=RR_Email]").removeClass("error");
    $('label.error').remove();
    });
  });

  $("#wg_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;
    }
  });

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

  $("#wg_newsletter_form").validate({
    rules: {
      RR_Email: {
        required: true,
        email: true
      },
      AirportCode2: "required"
    },
    messages: {
      RR_Email: "Invalid E-mail",
      AirportCode2: "Invalid Airport"
    }
  });

  //Prevent Itchy Fingers.. For the Simple Form
  $("#wg_newsletterform").submit(function () {
    if ($("#wg_newsletterform input[name=email]").val().match("Enter Email")) {
      $("#wg_newsletterform input[name=email]").addClass("error");
      return false;
    }
  });

});

jQuery(document).ready(function($) {
  $("#send-to-friend a").click(function() {
		var position = $("#send-to-friend a").position();
		$('#wg_tellafriend_box').css('top', (position.top - 390) + 'px').css('left', position.left + 'px');

    $("#wg_tellafriend_form textarea[name=message]").val("Get Top Deals at Wego: " + document.location);

    //Show Form
    $("#wg_tellafriend_box").fadeIn("slow", function() {
      $("#wg_tellafriend_referrer_name").focus();
    });
    // Iframe shim - load bgiframe plugin if it can't be found.
    if (!$.fn.bgiframe) {
      $.getScript('http://media.wego.com/js/jquery/plugins/jquery.bgiframe.min.js', function() {
				if(!$.browser.msie) { $("#wg_tellafriend_box").animate({ opacity: 1.0 }, 1000); }// Put in a delay for Safari 2 and older. 
        $("#wg_tellafriend_box").bgiframe();
      });
    } else {
      $("#wg_tellafriend_box").bgiframe();
    }
		
		return false;
  });

  $("#wg_tellafriend_header .close").click(function() {
    $("#wg_tellafriend_box").fadeOut("slow", function() {

      //Reset Input Area
      $("#wg_tellafriend_box").css("background-color", "#e8e8e8");
      $("#wg_tellafriend_content").remove();

      $("#wg_tellafriend_form").show();
      //Reset Input Area
      $("#wg_tellafriend_form label span[class!=note]").remove();
      $("#wg_tellafriend_form input[name!=commit]").removeClass("error").val("");
      $("#wg_tellafriend_form textarea")           .removeClass("error").val("");
			
    });

		return false;
  });

  $("#wg_tellafriend_form").submit(function () {
    $("#wg_tellafriend_box").append("<div id=\"wg_tellafriend_load\"><img src=\"http://www.wego.com/tellafriend/images/loading.gif\"/></div>").show();
    $("#wg_tellafriend_form").hide();

    var query_str = $("#wg_tellafriend_form").serialize();
    $.post( "/tellafriend/starttelling.php",
            query_str,
            function(data) {

              //Reset Input Area
              $("#wg_tellafriend_form label span[class!=note]").remove();
              $("#wg_tellafriend_form input[name!=commit]").removeClass("error");
              $("#wg_tellafriend_form textarea")           .removeClass("error");

              $("#wg_tellafriend_load").remove();
              if(data.match("Invalid Name")) {
                $("#wg_tellafriend_form input[name=referrer_name]") .addClass("error").before("<span class='name_error'>Invalid Name</span>");
                $("#wg_tellafriend_form").show();
              } else
              if(data.match("Invalid Email")) {
                $("#wg_tellafriend_form input[name=referrer_email]").addClass("error").before("<span class='email_error'>Invalid Email</span>");
                $("#wg_tellafriend_form").show();
              } else
              if(data.match("Please enter your friends' emails")) {
                $("#wg_tellafriend_form textarea[name=emails]")     .addClass("error").before("<span class='emails_error'>Please enter your friends' emails</span>");
                $("#wg_tellafriend_form").show();
              } else
              if(data.match("Limit of 10 emails exceeded")) {
                $("#wg_tellafriend_form textarea[name=emails]")     .addClass("error").before("<span class='emails_limit_error'>Limit of 10 emails exceeded</span>");
                $("#wg_tellafriend_form").show();
              } else
              if(data.match("Please enter a message for your friends")) {
                $("#wg_tellafriend_form textarea[name=message]")    .addClass("error").before("<span class='message_error'>Please enter a message</span>");
                $("#wg_tellafriend_form").show();
              } else {
                $("#wg_tellafriend_box").append("<div id='wg_tellafriend_content'>" + data + "</div>").css("background-color", "#deeeff").show();
              }
            });
    return false;
  });

});