
function SearchState() {
    this.loc_university = "";
    this.loc_campus = "";
    this.loc_postcode = "";
    this.loc_area = "";
    this.loc_tubestation = "";
    this.room_types = "";
    this.price_ranges = "";
    this.sorting_key = "";
    this.sorting_order = "";
}

var ubsRequest = "";
var gl_url_hash = "";
var cityCode = "city";
var theState = new SearchState();
var gl_lastRequest = null;

function readStateFromForm(state) {
    
    //if search is enabled - read anything
    if ($('#search-tool').length !== 0){
	
          state.loc_university = $("#city-search-form select[name=university]").val();
	    state.loc_campus = $("#city-search-form select[name=" + state.loc_university + "]").val();
	    state.loc_postcode = $("#city-search-form select[name=postcode]").val();
	    state.loc_area = $("#city-search-form select[name=area]").val();
	    state.loc_tubestation = $("#city-search-form select[name=tube-station]").val();

	    state.room_types = "";
	    $("#city-search-form .room-type-search input:checkbox:checked").each(function () {
	        state.room_types += "," + $(this).attr("name");
	    });
	    state.room_types = state.room_types.substring(1);
	    
	    state.price_ranges = "";
	    $("#city-search-form .price-range-search input:checkbox:checked").each(function () {
	        state.price_ranges += "," + $(this).attr("name");
	    });
	    state.price_ranges = state.price_ranges.substring(1);
    }

    var sorting = $(".sorting-select select").val();
    if (typeof(sorting) != "undefined"){
      var index = sorting.indexOf('-');
      state.sorting_order = sorting.substring(0, index);
      state.sorting_key = sorting.substring(index + 1);
    }
    else{
        state.sorting_order = "";
        state.sorting_key = "";
    }
    
}

function showOrHideFilterSearchContent() {
    if ($(".filter-search-content").is(":visible")) {
        $(".filter-search-content").hide();
        $(".filter-search-content-transparentbox").hide();
        $("#filer-search-icon").removeClass("expand-filer-search-icon");
        $("#minimize-filer-search-label").text("Expand search filter");
        $("#search-tool").height('auto');
    } else {
        $(".filter-search-content").show();
        $(".filter-search-content-transparentbox").show();
        $("#filer-search-icon").addClass("expand-filer-search-icon");
        $("#minimize-filer-search-label").text("Minimize search filter");
        $("#search-tool").height('250px');
    }
}



function applySliders() {
    $(function () {
        $('.checkbox-list ul').jScrollPane({
            scrollbarWidth: 11,
            topCapHeight: 5,
            bottomCapHeight: 5,
            dragMaxHeight: 50,
            showArrows: true
        });
    });
}



function applyHints() {
    $(".hint").mouseout(function () {
        $(this).find('p').hide();
    });
    $(".hint").mouseover(function () {
        $(this).find('p').show();
    });
}

function prepareGalleries() {
    /* images are associated by attribiute 'rel' */
    $("a.property-images").fancybox({
        'transitionIn': 'none',
        'transitionOut': 'none',
        'titlePosition': 'inside',
        'titleShow': true,
        'overlayOpacity': 0.4,
        'showNavArrows': false,
        'cyclic': true,
        'autoDimensions':false,
        'width':599,
        'height':388,
        'titleFormat': function (title, currentArray, currentIndex, currentOpts) {
            return '<div class="gallery-header" style="display:none"><h4>' + propertyTitle + '</h4></div><div class="gallery-container"><a id="fancy-box-left" href="javascript:;" onclick="jQuery.fancybox.prev();" ></a><span>Picture ' + (currentIndex + 1) + ' / ' + currentArray.length + '</span><a id="fancy-box-right" href="javascript:;" onclick="jQuery.fancybox.next();" ></a></div>';
        },
        'showCloseButton': true,
        'onComplete': function () {
            $('#fancybox-title').height('100%');
            $('#fancybox-outer').css('padding-top', '50px');
            $('#fancybox-outer').css('padding-bottom', '10px');
            $('#fancybox-inner').css('margin-top', '20px');
        }
    });
    
    /* part of code responsible for enlarged single photo */
    $(".single-photo").fancybox({
        'hideOnContentClick': true,
        'onComplete': function () {
            $('#fancybox-title').height('100%');
            $('#fancybox-outer').css('padding-top', '50px');
            $('#fancybox-outer').css('padding-bottom', '10px');
            $('#fancybox-inner').css('margin-top', '20px');
        }
    });
    /*.hover(function() {
    $(this).click();
    })
    */

}

function prepareGMaps() {
    if (typeof (GBrowserIsCompatible) != 'undefined') {
        propertyMapInited = false;
        cityMapInited = false;
        
        newShowMap();
        newInitCityMap();
        $('#property-item-map-list').trigger('click');
        newLoadCityMap();
    }
}

function showGallery(code, name) {
    propertyTitle = name;
    $("a[rel='" + code + "']:first").trigger('click');
}

function showPhoto(code, name) {
    propertyTitle = name;
    $("#single-" + code).trigger('click');
}

function showLoader() {
    $('#replace-in .overlay').css('opacity', '0.4');
    $("#replace-in .loading").show();
}
function hideLoader() {
    $("#replace-in .loading").hide(); 
}


/* executed on .select-wrapper */
function updateDropdownScroll() {
    var list = $(this).find('ul.select-list');
    var list_wrapper = $(this).find(".select-list-display-wrapper");
    var list_header = list_wrapper.prev(".select-header");
    

    if (list_wrapper.find(".jScrollPaneContainer").length !== 0) {
        list.jScrollPaneRemove();
    } /*else if (list.height() > 200) {
        if (list_wrapper.attr("originalWidth") > list_wrapper.width() - 16) {
            list_wrapper.width(list_wrapper.width() + 16);
            // must be wider beacused of scroll
        }		
    }
    */
	list_wrapper.width(list_wrapper.width() + 16);
	
    list.removeClass("fixedHeight200");
    var list_height = $(this).find('.select-list-display-wrapper').height();
    if (list_height > 200) {
        list.addClass('fixedHeight200');
    }
    
    //if (list_wrapper.width() < list_header.width() - 2) {
    //    list_wrapper.width(list_header.width() - 2);
    //}
    
    list.jScrollPane({
        scrollbarWidth: 11,
        topCapHeight: 5,
        bottomCapHeight: 5,
        dragMaxHeight: 50,
        showArrows: true
    });
}

function updateDropdownScrollOnEvent(event) {
    updateDropdownScroll.apply($(event.target));
}

function setCampusFilter(event) {
    var wrapper = $(event.target);
    
    //updateDropdownScroll.apply(wrapper);
    
    $(document).keyup(function (evt) {
        if (evt.keyCode > 47 && evt.keyCode < 91) {
            var count = 0;
            var filter = String.fromCharCode(evt.keyCode).toUpperCase();
            wrapper.find('ul.select-list li').each(function () {
                if ($(this).text().charAt(0).toUpperCase() != filter) {
                    $(this).addClass("hiddenCampus");
                } else {
                    $(this).removeClass("hiddenCampus");
                    count++;
                }
            });
        } else {
            wrapper.find('ul.select-list li').each(function () {
                $(this).removeClass("hiddenCampus");
            });
        }
        
        updateDropdownScroll.apply(wrapper);
    });
}

function unsetCampusFilter(event) {
    var wrapper = $(event.target);
    $(document).unbind("keyup");
    $('.location-search .select-wrapper ul li').each(function () {
        $(this).removeClass("hiddenCampus");
    });
}


//function setSearchCookie(value) {
    //$.cookie(cityCode, null);
//    $.cookie(cityCode, value);
//}

function setSearchHashInURL(value){
   $.historyLoad(escape(value));
}

//function getSearchCookie() {
//    return $.cookie(cityCode);/
//}

var pageWithReplace = "toBeReplace";
// = 'http://172.16.101.148/unite-stage2/test/CitySearchPage/PoorCitySearchPage.page';

function stateToParamString(state) {
    params = "";
    params += "loc_university=" + state.loc_university;
    params += "&loc_campus=" + state.loc_campus;
    params += "&loc_postcode=" + state.loc_postcode;
    params += "&loc_area=" + state.loc_area;
    params += "&loc_tubestation=" + state.loc_tubestation;
    params += "&room_types=" + state.room_types;
    params += "&price_ranges=" + state.price_ranges;
    params += "&sorting_key=" + state.sorting_key;
    params += "&sorting_order=" + state.sorting_order;
    return params;
}

function buildUrlWithReplace(state) {
    return pageWithReplace + "&" + stateToParamString(theState);
}

function reloadFromUrlInt(url) {
    // abort previous request
    if (null != gl_lastRequest) {
        gl_lastRequest.abort();
    }
    
    gl_lastRequest = jQuery.ajax({
        type: 'GET',
        url: url,
        success: function (response, status, xhr) {
            if (status != 'success' ||  response.length == 0) {
                // TODO: handle error!
                return;
            }
            
            // set HTML results
            $("#replace-in").html($("#replace-in", $(response)).html());
            
            preparePropertyList();
            hideLoader();
            
            //next two lines are workaround to the bug in IE7 which causes it to ignore "return false" in onclick functions
            $('.link-map a.arrow').attr('href','#');
            $('.mappopup-close a').attr('href','#');
            
            if (map_displayed && ($("#replace-in .noresults").length === 0 )) {
                newShowMap();
            } else {
                newShowList();
            }
            
            // fix overflows
            overflow();
            
            // we don't need it anymore
            gl_lastRequest = null;
        }
    });
}

function reloadFromUrl(url) {
    showLoader();

    /* this setTimeout was introduced because bug in ie7 / jquery 
     * prevented showLoader from working if there was no
     * "idle time" after it1
     */
    setTimeout('reloadFromUrlInt("'+url+'");', 10);
}


function reloadSearchResult() {
    readStateFromForm(theState);
    var url = buildUrlWithReplace(theState);
    
    //setSearchCookie(stateToParamString(theState));
    setSearchHashInURL(stateToParamString(theState));
    reloadFromUrl(url);
}

function displayProperCampusSelect() {
    var university = $("#city-search-form select[name=university]").val();
    
    $("#city-search-form .campus-select .select-wrapper:visible").hide();
    
    var pureSelect = $("#city-search-form .campus-select select[name='" + university + "']");
    if (!(pureSelect.parent().hasClass("select-wrapper"))) {
        buildSelect.apply(pureSelect);
    } 
    
    pureSelect.closest(".select-wrapper").show();
}


function getLocationType(locationWrapper) {
    var selectedTypeLocation;
    if (locationWrapper.parent().hasClass("campus-select")) {
        selectedTypeLocation = 'campus';
    } else {
        selectedTypeLocation = locationWrapper.find("select").attr('name');
    }
    return selectedTypeLocation;
}


function setSortingSelect(value) {
    var sortingWrapper = $('.select-wrapper.sorting-select');
    var sortingSelect = sortingWrapper.find('select');
    
    sortingSelect.val(value);
    setSelectState(sortingWrapper);
}

/* on .select-wrapper */
function setActiveLocationOnExpand(event) {
    var wrapper = $(event.target);
    var activable = wrapper.parent();
    if (activable.hasClass('activable-select')) {
        if (! wrapper.hasClass("disabled")) {
            if (getLocationType(wrapper) != 'university') {
                $("#city-search-form .activable-select").removeClass("active");
                activable.addClass("active");
            }
        }
    }
}

/* on .select-wrapper */
function unsetActiveLocationOnHideNonSelected(event) {
    var wrapper = $(event.target);
    var activable = wrapper.parent();
    if (activable.hasClass('activable-select')) {
        if (getLocationType(wrapper) != 'university') {
            var firstOption = wrapper.find("select option:first");
            if (firstOption.is(":selected")) {
                activable.removeClass("active");
                
                // back to previosly selected
                $("#city-search-form .activable-select").each(function () {
                    if (getLocationType($(this)) != 'university') {
                        var localFirstOption = $(this).find("select option:first");
                        if (! localFirstOption.is(":selected")) {
                            $(this).addClass('active');
                        }
                    }
                });
            }
        }
    }
}

function onLocationSelectChange(event) {
    var wrapper = $(event.target);
    var locationType = getLocationType(wrapper);
    if (locationType == 'university') {
        displayProperCampusSelect();
        return;
    }
    
    var value = wrapper.find("select").val();
    
    if (value !== null && value !== "") {
        // if value chosen
        
        // unset sorting select
        setSortingSelect('');
        
        // unset other locations
        $("#city-search-form .select-wrapper").each(function () {
            var type = getLocationType($(this));
            if (type != locationType) {
                if (type != 'university' || locationType != 'campus') {
                    clearSelect.apply($(this));
                    if (type == 'university') {
                        displayProperCampusSelect();
                    }
                }
            }
        });
        
        // reload result
        reloadSearchResult();
    } else {
        // if no value
        // should not happen!!! user cannot choose no value
    }
}


function onRoomCheckboxChange() {
    setSortingSelect('');
    reloadSearchResult();
}

function onPriceCheckboxChange() {
    setSortingSelect('');
    reloadSearchResult();
}

function onSortingSelectChange() {
    reloadSearchResult();
}

function clearSearchForm() {
    setSortingSelect('');
    $("#city-search-form").clearForm();
    displayProperCampusSelect();
    reloadSearchResult();
    // TODO: run only on changes
}

// used by newShowList
function setCaptionContainerPosition() {
    var hi = $(this).find("img.thumbnail:first").height();
    var hd = $(this).height();
    if (hi > hd) {
        $(this).find(".captionContainer").css("margin-top",(hd - hi - 18) + "px");
    }
}

function loadInitialPropertyList() {
    ubsRequest = ubsRequest.replace(/&amp;/g, '&');
    var ubsParam = ubsRequest.substring(ubsRequest.indexOf('loc_university'));
    var ubsParamNS = ubsParam.substring(ubsParam, ubsParam.indexOf('&sorting'));
    // alert('ubs: '+ubsParamNS);
    
    var urlParam = gl_url_hash;
    var urlParamNS = '';
    if (urlParam !== null && urlParam !== '') {
        urlParamNS = urlParam.substring(0, urlParam.indexOf('&sorting'));
    }
    //   alert('cookie: '+cookieParamNS);
    
    if (urlParamNS !== '') {
        reloadFromUrl(pageWithReplace + "&" + urlParam);
    }
    else {
        reloadFromUrl(pageWithReplace);
    }
}

function loadSearchDataFromHash(hash) {
    gl_url_hash = unescape(hash);
} 

//load datqa from hash parameter
function initializeHistoryPlugin(){
    $.historyInit(loadSearchDataFromHash);
}

/**
 * Prepares Search Box
 * 
 * @return
 */
function prepareCitySearchComponent() {
    showOrHideFilterSearchContent();
    
    $("#city-search-form .checkbox-wrapper").each(buildCheckbox);
    
    buildSelect.apply($("#city-search-form .university-select select"));
    buildSelect.apply($("#city-search-form .tube-station-select select"));
    buildSelect.apply($("#city-search-form .area-select select"));
    buildSelect.apply($("#city-search-form .postcode-select select"));
    
    $(".minimize-filer-search-icon").click(showOrHideFilterSearchContent);
    $(".filter-search-header").dblclick(showOrHideFilterSearchContent);
    $(".minimize-filer-search-label").click(showOrHideFilterSearchContent);
    
    $("#city-search-form #clear-button").click(clearSearchForm);
    $("#view-all-properties-link").click(clearSearchForm);
    
    applyHints();
    applySliders(); 
    
    $("#city-search-form").bind("list-expanded", updateDropdownScrollOnEvent);
    $("#city-search-form").bind("list-hidden", unsetActiveLocationOnHideNonSelected);
    $("#city-search-form").bind("list-expanded", setActiveLocationOnExpand);
    $("#city-search-form").bind("list-hidden", unsetCampusFilter);
    $("#city-search-form").bind("list-expanded", setCampusFilter);
    
    $("#city-search-form .room-type-search").bind("checkbox-changed", onRoomCheckboxChange);
    $("#city-search-form .price-range-search").bind("checkbox-changed", onPriceCheckboxChange);
    $("#city-search-form").bind("select-changed", onLocationSelectChange);
    
    // TODO: remove after testing is done
    $(".refine-search-label").click(function () {
        readStateFromForm(theState);
    });
}

function preparePropertyList(){
    
    prepareGalleries();
    
    map_initialized = false;
    // prepareGMaps will be called when needed
    if (map_displayed) {
        newShowMap();
    } else {
        newShowList();
    }
    
    //build sorting select
    $(".newpropertylist.resultbody .browsing .sorting").buildForm();
    //bind event to sorting select
    $('.select-wrapper.sorting-select').bind("select-changed", onSortingSelectChange);

}

//disable default action on javascript links
$(function () {
    $("a[href='#']").live('click', function(event) {
        event.preventDefault();
    });
});
