//namespace
var ha = {
	ajax: {}, map: {}, geocode: {}, reviews: {}, page: {}, settings: {}, site: {}, strings: {}, ui: {},
	
    seo: {
    	/* business requirement to have markup up high but display down low */
    	showSeoText: function() {
    		// check if the elements exist before calling them - the no search results page and some decorates
    		// do not for instance
    		if ($j('#searchText') && $j('#searchTextPosition')) {
    			$j('#searchTextPosition').append($j('#searchText'));
    		}
    	}
    },
    
    util: {
    	isInt: function(c){ return((c>="0")&&(c<="9")) },
    	
    	initToggles: function(){
			$j(".expand .content").addClass("hidden");
			$j(".expand .show").removeClass("hidden");
			$j(".expand .action").bind("click", function(){
				var el = $j(this).parent("div.container").children("div.content");
				if(el.hasClass("hidden")){
					el.removeClass("hidden");
					$j(this).addClass("open");
				}
				else{
					el.addClass("hidden");
					$j(this).removeClass("open");
				}
			});
		},
		
		initPopupUrls: function(){
			$j(".popup-url").bind("click", function(){
				window.open(this.href);
				return false;
			});
		},	
		
		initSearchSwap: function(){
			$j(".input-keyword").each(function(){
		        var val = $j(this).val();
		        var rel = $j(this).attr("rel");
		        if(val == ""){ 
		        	$j(this).addClass("default");
		        	$j(this).val(rel);
		        }
		        else if(val != rel){
		        	$j(this).removeClass("default");
				}
			});
			$j(".input-keyword").focus(function(){
				var val = $j(this).val();
				$j(this).removeClass("default");	
				if($j(this).attr("rel") == $j(this).val()){
					$j(this).val("");
				}
			});
			$j(".input-keyword").blur(function(){
				var val = $j(this).val();
				$j(this).removeClass("default");
				if($j(this).val() == ""){
					$j(this).addClass("default");
					$j(this).val($j(this).attr("rel"));
				}
			});
		},
		
		// used to get dateformat for the datepicker
		calDateFmt: function() {
			var dateSplit = brand.javaDateInputPattern.split("/");
			return (dateSplit[0].charAt(0) + "-" + dateSplit[1].charAt(1) + "-" + dateSplit[2].charAt(0)).toLowerCase();
		},
		
		//onkeyup: monitor length and update counter
		limiter: function(event){
			var maxChars = $j(this).attr('maxlength');
			var charCount = $j(this).val().length;
			var lineCount = $j(this).val().split(/\r\n|\n|\r\|\f/).length;
			var totalCount = (charCount > 0) ? charCount + lineCount : 0;
			var remainder = ((maxChars - totalCount) > -1) ? maxChars - totalCount : 0;
			var allowedKeys = new Array(8,9,27,46,33,34,35,36,37,38,39,40,45);
						
			if(event.metaKey || event.ctrlKey || event.altKey) return true;
			
			if(jQuery.inArray(event.keyCode, allowedKeys) != -1){
				$j('#remainder').text(remainder);
				return true;
			}
			
			if(totalCount >= maxChars){
				$j(this).val($j(this).val().substr(0,maxChars-lineCount));
				$j('#remainder').text(remainder);
				return false;
			}
			$j('#remainder').text(remainder);
		},
		
    	partialBox: function(partialHeight,duration){
    		$j(".partial-box .toggles").click(function(){
				var contentHeight = $j(this).siblings(".content").children("div").height();
				if (contentHeight > partialHeight){
					if ($j(this).children(".fade").css("display") == "block"){
						$j(this).children(".fade").css("display","none");
						$j(this).siblings(".content").animate({height: contentHeight}, duration);
						var sibling = $j(this).children(".hide");
						var delay = function() { toggle(sibling); };
						setTimeout(delay, duration+1);
					} else {
						$j(this).children(".hide").css("display","none");
						$j(this).siblings(".content").animate({height: partialHeight + "px"}, duration);
						var sibling = $j(this).children(".fade");
						var delay = function() { toggle(sibling); };
						setTimeout(delay, duration+1);
					}
					function toggle(el){ $j(el).css("display","block"); }
				} else {
					$j(this).children(".fade").css("display","none");
					$j(this).children(".all").css("display","block");
				}
    		});
    	}
    }
    
};

/* 
 * Straightforward/simple Observer pattern implementation
 * Example useage:
 * var publisher = new Observer
 * publisher.subscribe(function(msg){
 *    alert(msg);
 * });
 * publisher.fire("Event fired!");
 */
function Observer() {
	this.fns = [];
}

Observer.prototype = {
	subscribe : function(fn) {
		this.fns.push(fn);
	},
	unsubscribe : function(fn) {
		this.fns = this.fns.filter(
			function(el) {
				if (el !== fn) {
					return el;
				}
			}
		);
	},
	fire : function(o, thisObj) {
		var scope = thisObj || window;
		this.fns.forEach(
			function(el) {
				el.call(scope, o);
			}
		);
	}
};
// Add some sugar to the Array prototype
Array.prototype.forEach = function(fn, thisObj) {
    var scope = thisObj || window;
    for ( var i=0, j=this.length; i < j; ++i ) {
        fn.call(scope, this[i], i, this);
    }
};
Array.prototype.filter = function(fn, thisObj) {
    var scope = thisObj || window;
    var a = [];
    for ( var i=0, j=this.length; i < j; ++i ) {
        if ( !fn.call(scope, this[i], i, this) ) {
            continue;
        }
        a.push(this[i]);
    }
    return a;
};

//TO-DO: deprecate these
var jsEnabled = function(s){ this.s=s;}

/*
 * GLOBAL
 * advancedSearchForm, homeSearchForm, keywordSearchForm, refineSearchForm (aka sidebar)
 * noResults, 404error, error, secondary pages, etc.
 */
var searchErrorObserver = new Observer;

ha.site.searchform = {
    init: function(){
        
        
        
    	
    },

    isDigit: function(e){
    	var charCode = (e.which) ? e.which : window.event ? window.event.keyCode : 0;
   		if (charCode > 31 && (charCode < 48 || charCode > 57)){
   			return false;
   		}
   		return true;
    },
    
    submit: function(e){
    	var formObj = $j('form[name=searchForm],form[name=refineSearchForm]');
    	if (e) formObj = $j(e.target).parents('form');

    	// determine what sort of search has been performed
    	var searchType = formObj.attr("id");
    	if(searchType == "simple-search") searchType = "simple";
    	else if(searchType == "keywordSearchForm") searchType = "keyword";
    	else if(searchType == "adv-search-form") searchType = "advanced";
    	else if(searchType == "refineSearchform") searchType = "availability";
    	else searchType = "notknown";
    	
    	$j.cookie('searchType', searchType, {expires: 1, path: '/'});	

    	// get keywords
    	var keywords = ($j("input[name=keywords]", formObj).length > -1) ? $j("input[name=keywords]", formObj).val() : "";
    	var defaultMessage = $j("input[rel]", formObj).attr("rel");

    	if ($j.trim(keywords) !="" && keywords!=defaultMessage) {
    		if(searchType == "availability"){
    			// avoid double encoding
        		keywords = "/keywords:" + keywords;
    		}
    		else{
        		keywords = "/keywords:" + encodeURIComponent(keywords);
    		}
    	}
    	else{
    		keywords = "";
    	}

    	var refinements = "";
    	if ($j("#refinements",formObj).val() != null && $j.trim($j("#refinements",formObj).val()) != ''){
    		// get refineSearchForm refinements aka sidebar
    		refinements += $j("#refinements",formObj).val().replace("+", "*");
    	}
    	else{
    		// get advancedSearchForm refinements
    		var refinements = "";
    		$j('input, select',formObj).each(function(i,el){
    			if ((el.type == "select-one" && el.value != '') || (el.type == "checkbox" && el.checked)){
    				refinements += '/' + el.value;
    			}
    		});
    	}

    	// validate price range        	
    	var priceFrom = $j("#priceFrom").val(); 
    	var priceTo = $j("#priceTo").val();
    	var prices = "";

    	if(priceFrom !=null && priceTo != null && parseInt(priceFrom) > parseInt(priceTo)){
    		searchErrorObserver.fire();
    		$j("#price-range-vaidation").fadeIn("def");
    		return false;
    	}
    	//Were prices provided?
    	if(priceFrom !=null && priceFrom > 0){
    		prices += "/minPrice/" + priceFrom;
    	}
    	if (priceTo !=null && priceTo > 0) {
    		prices += "/maxPrice/" + priceTo;
    	}
    	//If prices provided, add currency 
    	if((priceFrom !=null && priceFrom > 0) || (priceTo !=null && priceTo > 0)) {
    		prices += "/currency/" + brand.baseCurrency;
    	}
    	
    	// if a startDate was not entered then set it to the end date
    	if (searchType != "keyword") {
    		ha.util.datePickControl.checkStart('startDateInput','endDateInput');
    	}
    	
    	var url = '/search';
    	if (refinements != ''){ url += '/refined'; }
    	url += keywords;
    	url += refinements;
    	url += ha.site.searchform.dateParam($j('#startDateInput', formObj),'arrival');
    	url += ha.site.searchform.dateParam($j('#endDateInput', formObj),'departure');
    	url += prices;
    	window.location = url;
    },
    
    // return a formatted url param for a given search date string
    dateParam: function(o,s){
    	if ((typeof $j(o).val() == "undefined") || (ha.site.searchform.delim($j(o).val()) == "")){
    		return "";
    	}
    	else if ($j(o).val() != brand.dateInputHelpText){
    		if (brand.dateInputHelpText == 'mm/dd/yyyy'){
    			var parts = $j(o).val().split("/")
    			return '/' + s + ':' + parts[2] + '-' + parts[0] + '-' + parts[1];
    		}
    		return '/' + s + ':' + $j(o).val().split("/").reverse().join("-");
    	}
    	return "";
    },
    
    // set the date string delimiters
    delim: function(s){
		if(s.indexOf("/") == -1){
			if(s.indexOf("-") > -1) s = s.replace(/-/g, "/");
			else if(s.indexOf(".") > -1) s = s.replace(/\./g, "/");
			else s = "";
		}
		return s;
    }
};

/*
 * HOME PAGE
 */
var homeBannerUrl2 = function(s){ this.s=s;}
var homeBannerUrl3 = function(s){ this.s=s;}
var homeBannerUrl5 = function(s){ this.s=s;}
ha.page.home = {
	init: function(){
		ha.util.initToggles();
		if (homeBannerUrl2.s || homeBannerUrl3.s) ha.page.home.initSwapImages();
		
		if ($j("#sparky-ad-btn").length > -1 && $j.cookie('sparkymicrosite') != null){
			$j("#sparky-ad-btn").css("display","block");
		} else if ($j("#sparky-ad-btn").length > -1){
			$j("#sparky-ad-btn").css("display","none");
		}
		
	},
	
	initSwapImages: function(){
		var swapduration = 8000;
		var timeout;

		$j("#layer2 img").attr("src", homeBannerUrl2.s);
		$j("#layer3 img").attr("src", homeBannerUrl3.s);
		
		$j(window).load(function(){
		
			$j("#layer2 img, #layer3 img").show();
			// fix text dimming in Firefox
			// http://allinthehead.com/retro/328/when-bugs-collide-fixing-text-dimming-in-firefox-2
	
			function show() {
				$j('#layer1').fadeIn(1500)
				setTimeout(function(){
					$j('#layer2').css({display:'block'});
				}, 1501);
				timeout = setTimeout(hideOne, swapduration);
			}
			function hideOne(){
				$j('#layer1').fadeOut(1500);
				timeout = setTimeout(hideTwo, swapduration);
			}
			function hideTwo(){
				$j('#layer2').fadeOut(1500);
				timeout = setTimeout(show, swapduration);
			}
			
			timeout = setTimeout(hideOne, swapduration);

		}); 
	}
};

$j(document).ready(function(){
	//global
	

	if ($j("body.homePage").length > 0) ha.page.home.init();

	$j("iframe[rel]").each(function(){
		if($j(this).hasClass("tracking-frame") && $j.cookie('sparkymicrosite') != null){}
		else { $j(this).attr("src", $j(this).attr("rel"));}
	});
});


