YAHOO.lang.augmentObject(YAHOO.namespace("YAHOO.util.App.CruiseSearchFilter"), {
	  height: 223,

	  buttons: {
	    plus: '/nclweb/images/framework/booking/filter_tab_show.gif',
	    minus: '/nclweb/images/framework/booking/filter_tab_hide.gif'
	  },

	  attach_events: function () {
	    if (Dom.get('cruise_results_filter_toggle')) {
	      Evt.on('cruise_results_filter_toggle', 'click', function () {
	        (App.is_hidden('cruise_results_header_row') ? App.CruiseSearchFilter.open : App.CruiseSearchFilter.close)();
	      });
	    }
	  },

	  initialize: function () {
    this.attach_events();
  },

	  open: function () {
	    App.show('cruise_results_header_row');
    var animation = new YAHOO.util.Anim('cruise_results_header_row', {
      height: { from: 0, to: App.CruiseSearchFilter.height }
    }, 1, YAHOO.util.Easing.easeOut);

    animation.onComplete.subscribe(function () {
      Dom.get('cruise_results_filter_toggle_img').src = App.CruiseSearchFilter.buttons.minus;
      App.CruiseSearchFilter.closed("false");
    });

    animation.animate();
	  },

		show: function () {
			this.open();
		},

	  close: function () {
	    var animation = new YAHOO.util.Anim('cruise_results_header_row', {
      height: { from: App.CruiseSearchFilter.height, to: 0 }
    }, 1, YAHOO.util.Easing.easeIn);

    animation.onComplete.subscribe(function () {
      Dom.get('cruise_results_filter_toggle_img').src = App.CruiseSearchFilter.buttons.plus;
      App.hide('cruise_results_header_row');
      App.CruiseSearchFilter.closed("true");
    });

    animation.animate();
	  },

		hide: function () {
    this.close();
  },

		toggle: function () {
			App.is_hidden('cruise_results_header_row') ? App.CruiseSearchFilter.show() : App.CruiseSearchFilter.hide();
		}
	});

Evt.on(window, 'load', function () {
  App.CruiseSearchFilter.initialize();
});


Evt.onContentReady('cta_promo2', function () {
  YAHOO.util.App.CallToAction.initialize("cta_link2", "cta_container");
});

function submitCruiseSearchForm() {
  var searchForm = document.getElementById('cruiseSearchForm');
  searchForm.submit();
}

// Merchandising
App.register_component("YAHOO.util.App.Merchandising", {
	generated_index: false,
  promotions: [],
	index: {},
		
	initialize: function () {
		this.createPromoIndex();
	
  	if (this.on_cruise_details_page()) {
			this.add_promos_to_cruise_details();	  	  
  	}

		if (this.on_cruise_search_page()) {			
  	  this.merchandise();
    }
  },

	define_promotions: function (promos) {
		try {			
			Fn.each(promos, function (p) { App.Merchandising.promotions.push(p); });
		}
		catch (e) {
			App.log('Could not create merchandising promotions');
			App.log(e);
		}
	},

	add_promos_to_cruise_details: function () {
		try {
			Fn.each(this.promotions, function (promotion) {
				var links = App.Merchandising.links_for_promo(promotion.sail_ids);
		    App.Merchandising.add_promo_content_to(links, promotion);
		  });
		}
		catch (e){
			App.log('Could not create merchandising promotions for cruise details');
			App.log(e);
		}
	},

	on_cruise_details_page: function () {
		return (/booking\/cruisedetails\.html/).test(document.location.href);
	},

	on_cruise_search_page: function () {
		return (/cruisesearch\/cruisesearch\.html/).test(document.location.href);
	},

  sailing_links: function () {
    return Dom.getElementsBy(function (el) {
      return Dom.hasClass(el, 'departure_date') && el.href.match(/packageId=(\d+)$/);
    }, 'A', Dom.get('result_body'));
  },

  highlight: function (link, promo) {
    if (Dom.hasClass(link, 'promo') && !promo.overrides) { return; }
    Dom.addClass(link, 'promo');
    Dom.addClass(link, promo.toggle_class);
		Dom.addClass(link, promo.promo_color);
    link.innerHTML = promo.marker + link.innerHTML;
  },

	mark_result_card: function (link, promotion) {
		Dom.addClass(link.parentNode.parentNode, promotion.toggle_class);
	},
	
	fares_table: function (link, promotion, block) {
		return Dom.getElementsByClassName('fares', 'TABLE', link.parentNode.parentNode.parentNode, block);
	},
	
	create_promo_cell: function (table, link, promotion) {
		var generated_content = promotion.content_generator();				
		generated_content.innerHTML = promotion.marker + '&nbsp;' + generated_content.innerHTML;
		Dom.addClass(generated_content, promotion.promo_color);
		
		Fn.each([promotion.toggle_class, 'promo'], function (klass) {
			Dom.addClass(generated_content, klass);
		});
		var tbody = App.new_element('tbody', {}, null, table);
		var row = App.new_element('tr', {}, null, tbody);
		var cell = App.new_element('td', {'colspan': '4'}, null, row);
		Dom.addClass(cell, "promo_container");
		cell.appendChild(generated_content);
	},
	
	has_promo_heading: function (table) {
		return 0 < Dom.getElementsByClassName('promo_heading', 'TH', table).length;
	},
	
	create_promo_heading: function (table) {
		var tbody = App.new_element('tbody', {}, null, table);
		var row 	= App.new_element('tr', {}, null, tbody);
		var cell 	= App.new_element('th', {'colspan': '4'}, 'Available Promotions:', row);	
		Dom.addClass(cell, 'promo_heading');
	},
	
	ensure_promo_heading: function (table) {
		if (this.has_promo_heading(table)) { return; } 
		this.create_promo_heading(table);
	},
	
	generate_promotion_content: function (link, promotion) {		
		this.fares_table(link, promotion, function(table) {
			App.Merchandising.ensure_promo_heading(table);			
			App.Merchandising.create_promo_cell(table, link, promotion);
		});
	},
	
	has_promo: function (link, promotion) {
		return Dom.hasClass(link.parentNode.parentNode, promotion.toggle_class);
	},
	
  display_promotion: function (link, promotion) {
    if (this.has_promo(link, promotion)) { return;}
		this.mark_result_card(link, promotion);
		this.generate_promotion_content(link, promotion);
  },

	extract_sail_id: function (link) {
		return link.href.match(/packageId=(\d+)$/)[1];
	},

  merchandise: function () {
		Fn.each(this.sailing_links(), function (link) {		
			try {			
	      var applicable_promos = App.Merchandising.index[App.Merchandising.extract_sail_id(link)];      
				if (!applicable_promos) { return; }
			
				Fn.each(applicable_promos, function (promo) {					
					App.Merchandising.highlight(link, promo);
	        App.Merchandising.display_promotion(link, promo);
				});						
			}
			catch (ex) {
				App.log('Failed to merchandise ' + link.innerHTML);
				App.log(ex);
				return false;
			}
		});		
  },

  createPromoIndex: function () {    				
		Fn.each(this.promotions, function (current_promo) {
			Fn.each(current_promo.sail_ids, function (sailing) {				
				if (!App.Merchandising.index[sailing]) {					
          App.Merchandising.index[sailing] = [current_promo];
        }
        else {
          App.Merchandising.index[sailing].push(current_promo);
        }
			});
		});    		
		
		return this.index;
  },

	create_family_friends_promotion_for: function () {
		App.Merchandising.define_promotions([
			{ 
				name: 'Friends and Family',
		  	sail_ids: Array.prototype.slice.call(arguments, 0),
			  toggle_class: 'friendsfamily',
			  category_message: 'Friends and Family',
			  overrides: true,
			  disclaimer_class: '',
			  marker: '*',
			  promo_color: 'red_highlight',
			  content_generator: function () {
			    return App.new_element('span', {}, ' Friends & Family Eligible')
				}
		  }
		]);
	},
	
	links_for_promo: function (promo_ids) {
    return Fn.select(Dom.getElementsByClassName('select_cruise', 'a', 'travelOptions'), function (item) {
      var match = item.href.match(/packageId=(\d{7})&/);
      return Fn.contains(promo_ids, parseInt(match[1]));
    });
  },

  add_promo_content_to: function (links, promotion) {
    Fn.each(links, function (link) {
      var row = link.parentNode.parentNode;
      var promo_para = Dom.getElementsByClassName('special_offers', 'p', row)[0];
      if (promo_para.innerHTML.match(/\S+/)) {
        promo_para.innerHTML += '<br />';
      }
      promo_para.appendChild(promotion.content_generator());
    });
  }
}, true);

var searchResultPage = "Search";

Evt.onDOMReady(function () { 
	
	// Sample promotion definition
	 //App.Merchandising.define_promotions([
	 //	{
	 //  	name: 'Free Balcony Upgrades',
	 //	  marker: '&#8224;',
	 //	  overrides: true,
	 //	  toggle_class: 'sun',
	 //		promo_color: 'yellow_highlight',
	 //	  sail_ids: [ 1957453, 1957459 ],
	 //	  content_generator: function () {
	 //	    return ce('span', {}, 'Free Balcony Upgrades');
	 //	  }
	 //	}
	 //]);
	App.Merchandising.initialize();

});


