
// Extend jquery just a bit to allow easy access to GET params
$.extend({
  getUrlVars: function(){
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
      hash = hashes[i].split('=');
      vars.push(hash[0]);
      vars[hash[0]] = hash[1];
    }
    return vars;
  },
  getUrlVar: function(name){
    return $.getUrlVars()[name];
  }
});


function DeferedSliderInit(event) {
    options = event.data;
    SetSliderInit(options.lowestRate, options.highestRate, options.leftSlider, options.rightSlider);
    $("#t-price").unbind("click", DeferedSliderInit);
}

function isdefined( variable){
    return (typeof(window[variable]) == "undefined")?  false: true;
}

function AutoSearch(options) {
    var checkin = $("#hotelCheckin").val();
    var checkout = $("#hotelCheckout").val();
    var guests = $("#searchBoxGuests")[0].value;
    var rooms = $("#searchBoxRooms")[0].value;
    
    CityPageSearch(options);
}


function SetSlider(lowestRate, highestRate, leftSlider, rightSlider) {

    document.getElementById("M_C_LowRate").value = currencySymbol + leftSlider;
    document.getElementById("M_C_HighRate").value = currencySymbol + rightSlider;

    if ($("#p-price:visible").length == 0) {
        //Need to defer init till shown
        $("#t-price").bind("click", { lowestRate: lowestRate,
            highestRate: highestRate,
            leftSlider: leftSlider,
            rightSlider: rightSlider
        }, DeferedSliderInit);
    } else {
        SetSliderInit(lowestRate, highestRate, leftSlider, rightSlider)
    }
}

function SetSliderInit(lowestRate, highestRate, leftSlider, rightSlider) {

    var Dom = YAHOO.util.Dom;
    var initLeft = leftSlider;
    var initRight = rightSlider;

    //var initDisplayToAUD = displayToAUD;
    var initialed = false;

    // Slider has a range of 170 pixels
    var range = 170 - 27;

    // No ticks for this slider
    var tickSize = 0;

    // We'll set a minimum distance the thumbs can be from one another
    var minThumbDistance = -7;

    // Slider image width
    var sliderWidth = 8;

    lowestRate = floorPrice(parseInt(lowestRate));
    highestRate = ceilPrice(parseInt(highestRate));

    // Conversion factor from 0-170 pixels to lowestRate-highestRate
    var cf = (highestRate - lowestRate) / range;

    // Set up a function to convert the min and max values into something useful
    var convert = function(val) {
        return Math.round(val * cf + lowestRate);
    };

    var convertToSlider = function(val) {
        return Math.round(((parseInt(val, 10) | 0) - lowestRate) * range / (highestRate - lowestRate));
    }

    //initialize slider values according to 'lowRate' and 'highRate' on query string
    var sliderInitValues;
    if (leftSlider != null && rightSlider != null && leftSlider >= 0 && rightSlider >= 0) {
        leftSlider = convertToSlider(leftSlider);
        if (leftSlider < 0) leftSlider = 0;
        rightSlider = convertToSlider(rightSlider);
        if (rightSlider > range) rightSlider = range;

        var min = Math.abs(parseInt(leftSlider, 10) | 0),
            max = Math.abs(parseInt(rightSlider, 10) | 0);

        if (min > max) {
            var hold = min;
            min = max;
            max = hold;
        }

        // Verify the values are in range
        min = Math.min(min, range - (sliderWidth + minThumbDistance));
        max = Math.max(Math.min(max, range), min + sliderWidth + minThumbDistance);
        sliderInitValues = [min, max];
    }
    else {
        sliderInitValues = [0, range];
    }


    // Slider set up is done when the DOM is ready
    var slider_bg = Dom.get("slider_bg"),
    from = Dom.get("M_C_LowRate"),
    to = Dom.get("M_C_HighRate");
    var leftThumb = Dom.get("slider_min_thumb"),
    rightThumb = Dom.get("slider_max_thumb");

    // Create the DualSlider
    document.getElementById("p-price").style.display = "block";
    var slider = gSliderReference = YAHOO.widget.Slider.getHorizDualSlider(slider_bg,
            "slider_min_thumb", "slider_max_thumb",
            range, tickSize, sliderInitValues);
    //
    slider.minRange = minThumbDistance;

    // Custom function to update the text fields, the converted value
    // report and the slider's title attribute
    var updateUI = function() {
        if (initialed) {
            var min = convert(slider.minVal),
            max = convert(slider.maxVal);
            if (isdefined('currencySymbol')){
                from.value = currencySymbol + min;
                to.value = currencySymbol + max;
            } else {
                from.value = HC.Common.fields.currencySymbol + min;
                to.value = HC.Common.fields.currencySymbol + max;
            }
        }
        leftThumb.style.visibility = "visible";
        rightThumb.style.visibility = "visible";
        initialed = true;
    };
    slider.subscribe('ready', updateUI);
    slider.subscribe('change', updateUI);
    slider.subscribe('slideEnd', function() {
        var min = convert(slider.minVal);
        var max = convert(slider.maxVal);
        if (leftSlider == slider.minVal && rightSlider == slider.maxVal) {
            return;
        } else {
            if(typeof CityPageSearch == 'function') {
                AutoSearch();
            } else {
                HC.SR.Filter.SetPrice($("#M_C_LowRate")[0], $("#M_C_HighRate")[0]);
            }
        }

    });

    slider.isAtMinMax = function() {
        if (slider.minVal == sliderInitValues[0] && slider.maxVal == sliderInitValues[1]) {
            return true;
        } else {
            return false;
        }
    }
}

function floorPrice(price) {
    return Math.floor(price / 10) * 10;
}
function ceilPrice(price) {
    return Math.ceil(price / 10) * 10;
}
function roundPrice(price) {
    return Math.round(price / 10) * 10;
}


if(isdefined('HC')){
    try {
        HC.SR.Filter.Slider.Init = SetSliderInit;
    } catch(e){
        
    }
}


function setMapFrame() {
    mapSource = mapSource.replace('http://www.hotelscombined.com/Map.aspx','http://www.hotelscombined.com/Skyscanner/Map.aspx');
    document.getElementById("mapDiv").innerHTML = "<iframe id=\"mapFrame\" src = \"" + mapSource + "&width=420px" + "\" scrolling=\"no\" frameborder=\"0\" width=\"740px\" height=\"480px\"></iframe>";
    mapAlreadyShown = true;
}

//DisplayFiltering();
function DisplayFiltering(options) {

    options = options || {};
    $("#filterDiv").remove();
    var text = "";
    if (options.sorting) {
        text = typeof (citySearchPageSortingResults) == 'undefined' ? 'Sorting Results...' : citySearchPageSortingResults;
    } else if (options.paging) {
        text = typeof (citySearchPageLoadingResults) == 'undefined' ? 'Loading Page...' : citySearchPageLoadingPage;
    } else if (options.loading) {
        text = typeof (citySearchPageLoadingResults) == 'undefined' ? 'Loading Results...' : citySearchPageLoadingResults;
    } else if (options.loadingHotel) {
        text = typeof (citySearchPageLoadingHotel) == 'undefined' ? 'Loading Hotel...' : citySearchPageLoadingHotel;
    } else {
        text = typeof (cityPageFilteringResults) == 'undefined' ? 'Filtering Results...' : cityPageFilteringResults;
    }

    //Setup filter    
    var filterDiv = $('<div id="filterDiv" class="filterDiv"><div id="filterText">' + text + '</div></div>');
    filterDiv.remove().appendTo("body").show();

    var filterWidth = filterDiv.width();
    var scrollTop = $(window).scrollTop();
    var centerPosition = $("#mainContent").position().left + (($("#mainContent").width() - filterWidth)/2);
    var topPosition = scrollTop + $(window).height() / 2;
    filterDiv.css({ left: centerPosition + "px", top: topPosition + "px" });

    var filterText = $("#filterText", filterDiv);
    var top = filterDiv.height() / 2 - (filterText.height() / 2);
    var left = filterDiv.width() / 2 - (filterText.width() / 2);
    filterText.css({ "top": top + "px", "left": left + "px" });
}


//change date format from dd/mm/yyyy to mm/dd/yyyy
function reFormatDate(date) {
    var day = date.substr(0, 2);
    var month = date.substr(3, 2);
    var year = date.substr(6, 4);
    return month + "/" + day + "/" + year;
}

function unFormatDate(date){
    var dmy = date.split('/');
    return(dmy[2] + '-' + dmy[1] + '-' + dmy[0]);
}

function dateFormat(date) {
    return date.toString().length == 1 ? "0" + date : date;
}


//Yahoo Calendar
function setupCal(checkin, checkout, checkinId, checkoutId, checkinCalId, checkoutCalId, numOfCal) {
    var theMindate = new Date();
    var min_date = theMindate.getDate();
    var min_month = theMindate.getMonth();
    min_month++;
    var min_year = theMindate.getFullYear();
    theMindate = min_month + "/" + min_date + "/" + min_year;
    var theMaxdate = min_month + "/" + min_date + "/" + (min_year + 1);

    //make yesterday selectable for checkin calendar(due to time zone differnce)
    var earlyMindate = new Date();
    earlyMindate.setDate(min_date - 1);
    var early_month = earlyMindate.getMonth();
    early_month++;
    earlyMindate = early_month + "/" + earlyMindate.getDate() + "/" + earlyMindate.getFullYear();

    if (checkin == null || checkout == null) {
        checkin = dateFormat(min_month) + "/" + dateFormat(min_date) + "/" + min_year;
        checkout = checkin;
    }

    //get calendar selected date
    var checkinSelection = document.getElementById(checkinId).value == 0 ? checkout : reFormatDate(document.getElementById(checkinId).value);
    var checkoutSelection = document.getElementById(checkoutId).value == 0 ? checkout : reFormatDate(document.getElementById(checkoutId).value);

    //get calendar seleted month
    var checkinCalPage = checkin.substr(0, 2) + checkin.substr(5, 5);
    var checkoutCalPage = checkout.substr(0, 2) + checkout.substr(5, 5);

    var isIE6 = ($.browser.msie && $.browser.version=="6.0");
    

    // setup checkin calendar
    var checkinCal = new YAHOO.widget.CalendarGroup("checkinCal", checkinCalId,
                                                { pages: numOfCal,
                                                    mindate: earlyMindate,
                                                    maxdate: theMaxdate,
                                                    navigator: true
                                                });
    checkinCal.cfg.setProperty("pagedate", checkinCalPage, false);
    checkinCal.cfg.setProperty("selected", checkinSelection + ", " + checkoutSelection, false);

    //add international features
    checkinCal.cfg.setProperty("MONTHS_LONG", monthsLong);
    checkinCal.cfg.setProperty("WEEKDAYS_SHORT", weekdaysShort);
    checkinCal.cfg.setProperty("MY_LABEL_YEAR_POSITION", myLabelYearPosition);
    checkinCal.cfg.setProperty("MY_LABEL_MONTH_POSITION", myLabelMonthPosition);
    checkinCal.cfg.setProperty("MY_LABEL_YEAR_SUFFIX", myLabelYearSuffix);
    checkinCal.cfg.setProperty("MY_LABEL_MONTH_SUFFIX", myLabelMonthSuffix);
    checkinCal.render();
    
    function showCheckinCal(){
        checkinCal.show();
        if(isIE6){
            $('div.twoColumn #searchBoxRooms').css({'position': 'absolute', 'left': '-2000px'});
            $('div.twoColumn #searchBoxGuests').css({'position': 'absolute', 'left': '-2000px'});            
        }
    }


    //set the input field as the calendar trigger        
    var checkinShow = document.getElementById(checkinId);
    YAHOO.util.Event.addListener(checkinShow, "click", showCheckinCal, checkinCal, true);

    //handle calendar select event
    checkinCal.selectEvent.subscribe(checkinHandleSelect, checkinCal, true);
    checkinCal.hide();

    function checkinHandleSelect(type, args, obj) {
        var dates = args[0];
        var date = dates[0];
        var year = date[0], month = dateFormat(date[1]), day = dateFormat(date[2]);
        var checkinDate = day + "/" + month + "/" + year;
        checkinSelection = month + "/" + day + "/" + year;
        document.getElementById(checkinId).value = checkinDate;
        document.getElementById("checkinValue").value = unFormatDate(checkinDate);
        document.getElementById("checkoutValue").value = unFormatDate(document.getElementById(checkoutId).value);
        checkinCal.hide();
        if(isIE6){
            $('div.twoColumn #searchBoxRooms').css({'position': 'static'});
            $('div.twoColumn #searchBoxGuests').css({'position': 'static'});
        }

        //update checkout calendar start month according to checkin date
        checkinCalPage = date[1] + "/" + year;
        checkoutCal.cfg.setProperty("pagedate", checkinCalPage, false);

        //update checkout calendar highlight dates
        if (document.getElementById(checkoutId).value != 0) {
            checkoutSelection = reFormatDate(document.getElementById(checkoutId).value);
        }
        checkinCal.cfg.setProperty("selected", checkinSelection + ", " + checkoutSelection, false);
        checkoutCal.cfg.setProperty("selected", checkinSelection + ", " + checkoutSelection, false);
        checkinCal.render();
        checkoutCal.render();
    }

    // setup checkout calendar    
    var checkoutCal = new YAHOO.widget.CalendarGroup("checkoutCal", checkoutCalId,
                                                { pages: numOfCal,
                                                    mindate: theMindate,
                                                    maxdate: theMaxdate,
                                                    navigator: true
                                                });
    checkoutCal.cfg.setProperty("pagedate", checkoutCalPage, false);
    checkoutCal.cfg.setProperty("selected", checkinSelection + ", " + checkoutSelection, false);

    //add international features 
    checkoutCal.cfg.setProperty("MONTHS_LONG", monthsLong);
    checkoutCal.cfg.setProperty("WEEKDAYS_SHORT", weekdaysShort);
    checkoutCal.cfg.setProperty("MY_LABEL_YEAR_POSITION", myLabelYearPosition);
    checkoutCal.cfg.setProperty("MY_LABEL_MONTH_POSITION", myLabelMonthPosition);
    checkoutCal.cfg.setProperty("MY_LABEL_YEAR_SUFFIX", myLabelYearSuffix);
    checkoutCal.cfg.setProperty("MY_LABEL_MONTH_SUFFIX", myLabelMonthSuffix);
    checkoutCal.render();
    
    function showCheckoutCal(){
        checkoutCal.show();
        if(isIE6){
            $('div.twoColumn #searchBoxRooms').css({'position': 'absolute', 'left': '-2000px'});
            $('div.twoColumn #searchBoxGuests').css({'position': 'absolute', 'left': '-2000px'});
        }    
    }
    
    //set the input field as the calendar trigger
    var checkoutShow = document.getElementById(checkoutId);
    YAHOO.util.Event.addListener(checkoutShow, "click", showCheckoutCal, checkoutCal, true);

    //handle calendar select event
    checkoutCal.selectEvent.subscribe(checkoutHandleSelect, checkoutCal, true);
    checkoutCal.hide();

    function checkoutHandleSelect(type, args, obj) {
        var dates = args[0];
        var date = dates[0];
        var year = date[0], month = dateFormat(date[1]), day = dateFormat(date[2]);
        var checkoutDate = day + "/" + month + "/" + year;
        checkoutSelection = month + "/" + day + "/" + year;
        document.getElementById(checkoutId).value = checkoutDate;
        document.getElementById("checkinValue").value = unFormatDate(document.getElementById(checkinId).value);
        document.getElementById("checkoutValue").value = unFormatDate(checkoutDate);

        //update checkout calendar highlight dates
        if (document.getElementById(checkinId).value != 0) {
            checkinSelection = reFormatDate(document.getElementById(checkinId).value);
        }
        checkinCal.cfg.setProperty("selected", checkinSelection + ", " + checkoutSelection, false);
        checkoutCal.cfg.setProperty("selected", checkinSelection + ", " + checkoutSelection, false);
        checkinCal.render();
        checkoutCal.render();

        checkoutCal.hide();
        if(isIE6){
            $('div.twoColumn #searchBoxRooms').css({'position': 'static'});
            $('div.twoColumn #searchBoxGuests').css({'position': 'static'});
        }
    }

    //hide calendar when user click anywhere outside the calendar
    this.hideDiv = function(e) {
        var target = (e ? e.target : event.srcElement); 
        var checkinCalDiv = document.getElementById(checkinCalId);
        var checkinDiv = document.getElementById(checkinId);
        var checkoutCalDiv = document.getElementById(checkoutCalId);
        var checkoutDiv = document.getElementById(checkoutId);
        if (checkinCalDiv != null && checkinDiv != null && checkoutCalDiv != null && checkoutDiv != null) {
            (isChild(target, checkinCalDiv) || target == checkinDiv) ? null : checkinCalDiv.style.display = 'none';
            (isChild(target, checkoutCalDiv) || target == checkoutDiv) ? null : checkoutCalDiv.style.display = 'none';
        }

        //if it is hotel page, set additional visibility control for the calendars on rate tab
        if (document.getElementById("detailTabCheckin") != null || document.getElementById("rateTabCheckin") != null) {
            hideHotelDiv(e)
            hideRateDiv(e)
        }

        //if it is city page, set additional visibility control for both calendars
        if (document.getElementById("popupCheckin") != null) {
            hideHotelDiv(e)
            //hidePopupDiv(e)
        }
        if(($('#checkinCalContainer').css('display') == 'none') && ($('#checkoutCalContainer').css('display') == 'none') && isIE6){
            $('div.twoColumn #searchBoxRooms').css({'position': 'static'});
            $('div.twoColumn #searchBoxGuests').css({'position': 'static'});                
        }
        
    }  
    document.onclick = hideDiv
}

