﻿
var calStartDate;
var calEndDate;
var hotelData;
var pagesize = 10;
var currentPage = 1;

var currentPageFromCache = null;
var currentMapZoomFromCache = null;
var currentMapLatFromCache = null;
var currentMapLonFromCache = null;

var resultMap = null;
var resultMapLoadedForCurrentResult = false;

var searchAnimation = null;

var lddiv = null;

var resultMode = 1; // 1 .. liste, 2 ... karte
var partners = null;

var categorySelectedIndexCache = 0;

function InitDetailSearch() {
    InitSearchAnimationDiv();
    InitCalendars();
    InitPartners();
    InitAutocomplete();

    if (CookieSearchParamsExists()) {
        LoadCookieSearchParams();
        SearchDetail();
        EraseSearchParamsCache();
    }
    else if (UrlSearchParammsExists()) {
        LoadUrlParams();
        SearchDetail();
    }

    DetailSearchSearchForChanged();
}

function LoadUrlParams() {

    try {
        $("txtOsHotelname").value = GetUrlParameter("pattern");
        
        if(GetUrlParameter("country") != null)
            $("txtOsCountry").value = GetUrlParameter("country");

        try {
            var start = new Date(GetUrlParameter("startyear"), GetUrlParameter("startmonth"), GetUrlParameter("startday"));
            var end = new Date(GetUrlParameter("endyear"), GetUrlParameter("endmonth"), GetUrlParameter("endday"));
            SetCalendarDates(start, end);
        } catch (e) { }



        calStartDate.render();
        calEndDate.render();

        if(GetUrlParameter("pricefrom") != null)
            $("txtOsStartPrice").value = GetUrlParameter("pricefrom");
        if(GetUrlParameter("priceto") != null)
            $("txtOsEndPrice").value = GetUrlParameter("priceto");
        if (GetUrlParameter("currency") != null)
            $("sOsCurrency").selectedIndex = 1 * GetUrlParameter("currency");
        if (GetUrlParameter("searchfor") != null)
            $("sOsSearchFor").selectedIndex = 1 * GetUrlParameter("searchfor");
        if (GetUrlParameter("category") != null)
            $("sOsCategory").selectedIndex = 1 * GetUrlParameter("category");
        if (GetUrlParameter("offersfrom") != null)
            $("sOsPartner").selectedIndex = 1 * GetUrlParameter("offersfrom");
        if (GetUrlParameter("detailpage") != null)
            currentPageFromCache = 1 * GetUrlParameter("detailpage");
        if (GetUrlParameter("displayMode") != null)
            resultMode = 1 * GetUrlParameter("displayMode");
        if (GetUrlParameter("mapZoom") != null)
            currentMapZoomFromCache = 1 * GetUrlParameter("mapZoom");
        if (GetUrlParameter("mapLat") != null)
            currentMapLatFromCache = 1 * GetUrlParameter("mapLat");
        if (GetUrlParameter("mapLon") != null)
            currentMapLonFromCache = 1 * GetUrlParameter("mapLon");

    } catch (e) {
        alert(e);
    }
}

function UrlSearchParammsExists() {
    if (GetUrlParameter("pattern") != null) {
        return true;
    }
}

function InitPartners() {
    if (!partners)
        return;

    ReloadPartners();
}

function DetailSearchSearchForChanged() {
    ReloadPartners();

    if ($("sOsSearchFor").value == 1) { // nur hotels
        $("sOsCategory").disabled = false;
        $("sOsCategory").selectedIndex = categorySelectedIndexCache;
        $("dsGotoGeoSearch").style.display = "inline";
    } else if ($("sOsSearchFor").value == 2) { // nur angebote
        categorySelectedIndexCache = $("sOsCategory").selectedIndex;
        $("sOsCategory").selectedIndex = 0;
        $("sOsCategory").disabled = true;
        $("dsGotoGeoSearch").style.display = "none";
    }
}

function ReloadPartners() {
    if (!partners)
        return;

    $("sOsPartner").options.length = 0;
    if ($("sOsSearchFor").value == 0) {
        for (var x = 0; x < partners["all"].length; x++) {
            $("sOsPartner").options[$("sOsPartner").options.length] = new Option(partners["all"][x]["name"], partners["all"][x]["id"]);
        }
    }else if ($("sOsSearchFor").value == 1) {
        for (var x = 0; x < partners["hotels"].length; x++) {
            $("sOsPartner").options[$("sOsPartner").options.length] = new Option(partners["hotels"][x]["name"], partners["hotels"][x]["id"]);
        }
    } else if ($("sOsSearchFor").value == 2) {
        for (var x = 0; x < partners["offers"].length; x++) {
            $("sOsPartner").options[$("sOsPartner").options.length] = new Option(partners["offers"][x]["name"], partners["offers"][x]["id"]);
        }
    }
}

function InitSearchAnimationDiv() {
    var search = "Performing search";
    if (clang == "de")
        search = "Suche l&auml;uft";

    searchAnimation = document.createElement("div");
    
    searchAnimation.className = "SearchAnimationOverlay";
    searchAnimation.innerHTML = "<div align=\"center\" style=\"position: relative; top: 50%;\"><img src=\"/imgs/nickwalk-anim.gif\" /><br /><span style=\"filter:alpha(opacity=10);opacity: 1;\"><b>" + search + "</b></span></div>";
}

function DetailSerachCurrencyChanged() {
    $("sDefaultCurrency").selectedIndex = $("sOsCurrency").selectedIndex;
    DefaultCurrencyChanged(true);
}

function GotoStdSearch() {

    resultMode = 1;
    $("DetailSerachTextResult").style.display = "block";
    $("DetailSearchResultMap").style.display = "none";
}

function GotoGeoSearch() {
    resultMode = 2;
    $("DetailSearchResultMap").style.display = "block";
    $("DetailSerachTextResult").style.display = "none";
    
    if(resultMapLoadedForCurrentResult == false)
        ReloadResultMap();
   
}

function InitResultMap() {
    $("DetailSearchResultMap").style.width = "100%";
    $("DetailSearchResultMap").style.height = "600px";
    resultMap = new VEMap("DetailSearchResultMap");
    resultMap.LoadMap();
    var latlon = new VELatLong(40, 40);
    resultMap.LoadMap(latlon, 2, "r", 0, VEMapMode.Mode2D, 1);
}

function ClearResultMap() {
    if (resultMap != null) {
        resultMap.DeleteAllShapes();
    }
}

function ReloadResultMap() {
    if (resultMap == null){
        InitResultMap();
    }

    var addToWl = "Add to watchlist";
    var removeFromWl = "Remove from watchlist";
    var category = "Category";
    var avdataloading = "Vacancy data loading...";
    if (clang == "de") {
        //more = "mehr";
        category = "Kategorie";
        avdataloading = "Verf&uuml;gbarkeitsdaten werden geladen...";
        addToWl = "Hotel merken";
        removeFromWl = "Hotel aus Merkliste entfernen";
    }
    
    resultMapLoadedForCurrentResult = true;
    resultMap.DeleteAllShapes();
    if (hotelData != null) {

        for (var x = 0; x < hotelData["hotels"].size(); x++) {
            try {
                var shape = new VEShape(VEShapeType.Pushpin, new VELatLong(1 * (hotelData["hotels"][x]["latitude"]), 1 * (hotelData["hotels"][x]["longitude"])));
                shape.SetCustomIcon("<img width=\"24\" height=\"24\" src='/imgs/mapstar.png'></img>");
                shape.SetTitle("<a onclick=\"StoreSearchParams()\" href=\"" + hotelData["hotels"][x]["link"] + "\">" + hotelData["hotels"][x]["hotelname"] + "</a>");
                var wllink = "";

                if (!WatchlistContainsItem(hotelData["hotels"][x]["link"])) {
                    wllink = "<a onclick=\"AddToWatchlist('" + hotelData["hotels"][x]["rowid"] + "', '" + hotelData["hotels"][x]["link"] + "')\">" + addToWl + "</a>";
                } else {
                wllink = "<a onclick=\"RemoveFromWatchlist('" + hotelData["hotels"][x]["rowid"] + "', '" + hotelData["hotels"][x]["link"] + "')\">" + removeFromWl + "</a>";
                }
                
                var description = "<div class=\"detailsearchresultitem\">" +
                                            "<div class=\"underline\"></div>" +
                                            "<div class=\"content\" style=\"float:left;\">" +
                                            "<div class=\"partnerinfo\">powered by <img style=\"margin-left: 10px;\" src=\"/ImageHandler.aspx?height=20&url=" + url + "/imgs/partner_" + hotelData["hotels"][x]["partnerid"] + ".gif\"></img></div>" +
                                                "<p class=\"factor\">" + category + ": <img src=\"" + hotelData["hotels"][x]["stars"] + "\"></img></p>" +

                                                "<p>" + hotelData["hotels"][x]["text"] + "</p>" +
                                                "<p>" + hotelData["hotels"][x]["address"] + ", " + hotelData["hotels"][x]["city"] + "</p>" +
                                                "<p id=\"DetailSearch_WlGeoAction_" + hotelData["hotels"][x]["rowid"] + "\">" + wllink + "</p>" +
                                            "</div>" +
                                            "<div><img src=\"" + url + "/ImageHandler.aspx?height=80&url=" + hotelData["hotels"][x]["thumbnail"] + "\"></img></div>" +
                                        "</div>";

                shape.SetDescription(description);
                //shape.SetDescription("<div>" + hotelData[x]["address"] + "<br /><img style=\"margin-left: 10px;\" src=\"/ImageHandler.aspx?height=20&url=" + url + "/imgs/partner_" + hotelData[x]["partnerid"] + ".gif\"></img></div>");
                resultMap.AddShape(shape);
            } catch (ex) {
                // kann auftreten wenn latitude und longitude undefined sind
            }
        }

        if (currentMapZoomFromCache == null) {
            var coors = GetCoorAverage(hotelData["hotels"]);
            if (coors != null)
                resultMap.SetCenterAndZoom(new VELatLong(coors["latitude"], coors["longitude"]), coors["zoom"]);
        } else {
            resultMap.SetCenterAndZoom(new VELatLong(currentMapLatFromCache, currentMapLonFromCache), currentMapZoomFromCache);
            currentMapZoomFromCache = null;
            currentMapLonFromCache = null;
            currentMapLatFromCache = null;
        }
    }
}

function GetCoorAverage(data) {
    if (data.size() == 0)
        return null;    
    var ignorelistsize = Math.round(data.size() * 0.2);
    var ignore = Array();
    var coorerrors = 0;
    var latitude = 0;
    var longitude = 0;
    for (var x = 0; x < data.size(); x++) {
        if (!data[x]["latitude"] || !data[x]["longitude"]) {
            coorerrors++;
        } else {
            latitude += 1 * data[x]["latitude"];
            latitude = Math.round(100 * latitude) / 100;
            longitude += 1 * data[x]["longitude"];
            longitude = Math.round(100 * longitude) / 100;
        }
    }
    latitude = latitude / (data.size() - ignore.size() - coorerrors);
    longitude = longitude / (data.size() - ignore.size() - coorerrors);
    var averagedistance = 0;
    var averagedistanceCalculated = false;
    while (ignore.size() < ignorelistsize) {
        var min = null;
        var maxdistance = 0;
        var maxdistanceElement = null;
        for (var x = 0; x < data.size(); x++) {

            if (ArrayContains(ignore, data[x]))
                continue;

            if (!data[x]["latitude"] || !data[x]["longitude"]) {
                continue;
            }

            var distancelat = Math.abs(data[x]["latitude"] - latitude);
            var distancelon = Math.abs(data[x]["longitude"] - longitude);

            var distanceabs = Math.sqrt(Math.pow(distancelat, 2) + Math.pow(distancelon, 2));
            averagedistance += distanceabs;
            if (distanceabs > maxdistance) {
                maxdistance = distanceabs;
                maxdistanceElement = data[x];
            }
        }
        averagedistanceCalculated = true;
        
        if (maxdistanceElement != null) {
            ignore[ignore.size()] = maxdistanceElement;
            averagedistance -= maxdistance;
        } else {
            break;
        }
    }
    averagedistance = averagedistance / (data.size() - ignore.size());
    

    latitude = 0;
    longitude = 0;
    coorerrors = 0;
    for (var x = 0; x < data.size(); x++) {
        if (ArrayContains(ignore, data[x]))
            continue;
        if (!data[x]["latitude"] || !data[x]["longitude"]) {
            coorerrors++;
        } else {
            latitude += 1 * data[x]["latitude"];
            latitude = Math.round(100 * latitude) / 100;
            longitude += 1 * data[x]["longitude"];
            longitude = Math.round(100 * longitude) / 100;
        }
    }
    latitude = latitude / (data.size() - ignore.size() - coorerrors);
    longitude = longitude / (data.size() - ignore.size() - coorerrors);

    var ret = Array();
    ret["longitude"] = longitude;
    ret["latitude"] = latitude;
    ret["zoom"] = Math.round(-0.0114 * averagedistance + 8);
    if (ret["zoom"] > 14)
        ret["zoom"] = 14;
    else if (ret["zoom"] < 1)
        ret["zoom"] = 1;
    
    return ret;
}

function CookieSearchParamsExists() {
    if (ReadCookie(searchCookieName + "_pattern") != null) {
        return true;
    } else {
        return false;
    }
}

function LoadCookieSearchParams() {
    $("txtOsHotelname").value = ReadCookie(searchCookieName + "_pattern");
    $("txtOsCountry").value = ReadCookie(searchCookieName + "_country");

    var start = new Date(ReadCookie(searchCookieName + "_startyear"), ReadCookie(searchCookieName + "_startmonth"), ReadCookie(searchCookieName + "_startday"));
    var end = new Date(ReadCookie(searchCookieName + "_endyear"), ReadCookie(searchCookieName + "_endmonth"), ReadCookie(searchCookieName + "_endday"));

    SetCalendarDates(start, end);
    calStartDate.render();
    calEndDate.render();

    if (ReadCookie(searchCookieName + "_pricefrom") != null && ReadCookie(searchCookieName + "_pricefrom") != "") {
        $("txtOsStartPrice").value = ReadCookie(searchCookieName + "_pricefrom");
    }
    if (ReadCookie(searchCookieName + "_priceto") != null && ReadCookie(searchCookieName + "_priceto") != "") {
        $("txtOsEndPrice").value = ReadCookie(searchCookieName + "_priceto");
    }
    if (ReadCookie(searchCookieName + "_currency") != null && ReadCookie(searchCookieName + "_currency") != "") {
        $("sOsCurrency").selectedIndex = 1 * ReadCookie(searchCookieName + "_currency");
    }
    if (ReadCookie(searchCookieName + "_category") != null && ReadCookie(searchCookieName + "_category") != "") {
        $("sOsCategory").selectedIndex = 1 * ReadCookie(searchCookieName + "_category");
    }
    if (ReadCookie(searchCookieName + "_searchfor") != null && ReadCookie(searchCookieName + "_searchfor") != "") {
        $("sOsSearchFor").selectedIndex = 1 * ReadCookie(searchCookieName + "_searchfor");
    }
    if (ReadCookie(searchCookieName + "_offersfrom") != null && ReadCookie(searchCookieName + "_offersfrom") != "") {
        $("sOsPartner").selectedIndex = 1 * ReadCookie(searchCookieName + "_offersfrom");
    }
    if (ReadCookie(searchCookieName + "_detailpage") != null && ReadCookie(searchCookieName + "_detailpage") != "") {
        currentPageFromCache = 1 * ReadCookie(searchCookieName + "_detailpage");
    }
    if (ReadCookie(searchCookieName + "_displayMode") != null && ReadCookie(searchCookieName + "_displayMode") != "") {
        resultMode = 1 * ReadCookie(searchCookieName + "_displayMode");
    }
    if (ReadCookie(searchCookieName + "_mapZoom") != null && ReadCookie(searchCookieName + "_mapZoom") != "") {
        currentMapZoomFromCache = 1 * ReadCookie(searchCookieName + "_mapZoom");
    }
    if (ReadCookie(searchCookieName + "_mapLat") != null && ReadCookie(searchCookieName + "_mapLat") != "") {
        currentMapLatFromCache = 1 * ReadCookie(searchCookieName + "_mapLat");
    }
    if (ReadCookie(searchCookieName + "_mapLon") != null && ReadCookie(searchCookieName + "_mapLon") != "") {
        currentMapLonFromCache = 1 * ReadCookie(searchCookieName + "_mapLon");
    }
    
}

function InitCalendars() {
    var startday = 0;
    if (clang == "de")
        startday = 1;

    calStartDate = new YAHOO.widget.Calendar("calStartDate", "calOsStartDate", { START_WEEKDAY: startday, MULTI_SELECT: false });
    calEndDate = new YAHOO.widget.Calendar("calEndDate", "calOsEndDate", { START_WEEKDAY: startday, MULTI_SELECT: false });

    var start = AddDaysToDate(new Date(), 1);
    var end = AddDaysToDate(start, 7);
    SetCalendarDates(start, end);
    
    calStartDate.render();
    calEndDate.render();
}

function SetCalendarDates(start, end) {
    calStartDate.select((start.getMonth() * 1 + 1) + "/" + start.getDate() + "/" + start.getFullYear());
    calStartDate.cfg.setProperty("pagedate", (start.getMonth() * 1 + 1) + "/" + start.getFullYear());
    calEndDate.select((end.getMonth() * 1 + 1) + "/" + end.getDate() + "/" + end.getFullYear());
    calEndDate.cfg.setProperty("pagedate", (end.getMonth() * 1 + 1) + "/" + end.getFullYear());
}

function RemoveInfoBoxes() {
    $("DS_InfoBoxContainer").innerHTML = "";
    $("DS_InfoBoxSearchResult").innerHTML = "";
}

function InitAutocomplete()
{
    var ds = new YAHOO.widget.DS_XHR("AjaxRequestHandler.aspx", ["ResultSet","title","url","mod"] ); 
    ds.scriptQueryParam = "query";
    ds.scriptQueryAppend = "function=GetCountryAutocomplete";
    var myAutoComp = new YAHOO.widget.AutoComplete("txtOsCountry", "txtOsCountryAutoComplete", ds);
    
}

function CheckSubmitDetailSearch(evtmp) {
        
    var ev;
    var keycode = 0;
    
    if (!evtmp) {
        ev = window.event;
    } else {
        ev = evtmp;
    }
    if (!ev)
        return true;
    if (ev.which) {
        keycode = ev.which;
    } else if (ev.keyCode) {
        keycode = ev.keyCode;
    }

    if (keycode == 13) {
        SearchDetail();
        return false;
    } else {
        return true;
    }
    
}

function DisplayNoSearchParamInfo() {
    var text = "Please specifiy search term.";
    if (clang == "de")
        text = "Bitte geben Sie einen Suchparameter an.";
    $("DS_InfoBoxContainer").appendChild(CreateInfoBox(text));
}

function DisplayNoCountryInfo() {
    var text = "Please specify destination country.";
    if (clang == "de")
        text = "Bitte geben Sie ein Zielland an.";
    $("DS_InfoBoxContainer").appendChild(CreateInfoBox(text));
}

function DisplayUnvalidCalendarSelection() {
    var text = "Please select a valid time span.";
    if (clang == "de")
        text = "Bitte geben Sie eine g&uuml;ltige Zeitspanne an.";

    $("DS_InfoBoxContainer").appendChild(CreateInfoBox(text));
}

function StoreSearchParams() {
    var start = calStartDate.getSelectedDates()[0];
    var end = calEndDate.getSelectedDates()[0];
    var mapZoom = "";
    var mapLat = "";
    var mapLon = "";
    if (resultMap != null) {
        mapZoom = resultMap.GetZoomLevel();
        mapLat = resultMap.GetCenter().Latitude;
        mapLon = resultMap.GetCenter().Longitude;
    }
    SetSearchParamsCacheDetailSearch($("txtOsHotelname").value, $("txtOsCountry").value, start.getDate(), start.getMonth(), start.getFullYear(), end.getDate(), end.getMonth(), end.getFullYear(), $("txtOsStartPrice").value, $("txtOsEndPrice").value, $("sOsCurrency").selectedIndex, $("sOsCategory").selectedIndex, $("sOsSearchFor").selectedIndex, $("sOsPartner").selectedIndex, currentPage, resultMode, mapZoom, mapLat, mapLon);
}

function SearchDetail() {
    
    RemoveInfoBoxes();
    
    $("txtOsHotelname").value = Trim($("txtOsHotelname").value);
    $("txtOsCountry").value = Trim($("txtOsCountry").value);
    if ($("txtOsHotelname").value.length == 0) {
        DisplayNoSearchParamInfo();
        return;
    }
    if ($("sOsSearchFor").value == 1 && $("txtOsCountry").value.length == 0) {
        DisplayNoCountryInfo();
        return;
    }

    if (calStartDate.getSelectedDates()[0].getTime() > calEndDate.getSelectedDates()[0].getTime()) {
        DisplayUnvalidCalendarSelection();
        return;
    }

    var startDate = GetDateStringFromCalendar(calStartDate);
    var endDate = GetDateStringFromCalendar(calEndDate);
    
    LockInput();
    DoRequest("GetDetailSearchResult", "query=" + escape($("txtOsHotelname").value) + "&startDate=" + escape(startDate) + "&endDate=" + escape(endDate) + "&startPrice=" + escape($("txtOsStartPrice").value) + "&endPrice=" + escape($("txtOsEndPrice").value) + "&country=" + escape($("txtOsCountry").value) + "&category=" + escape($("sOsCategory").value) + "&searchFor=" + escape($("sOsSearchFor").value) + "&partner=" + escape($("sOsPartner").value) + "&currency=" + escape($("sOsCurrency").value), SearchResultReceived);
    
    if($("sOsSearchFor").value == 2)
        GotoStdSearch();
}


function GetDateStringFromCalendar(cal) {
    var datestr = "";
    var temp = cal.getSelectedDates();
    if (temp.size() == 1) {
        var date = temp[0];
        datestr = date.getDate() + "." + (date.getMonth() + 1) + "." + date.getFullYear();
    }

    return datestr;
}

function LockInput() {

    
    $("DS_InputParametersContainer").appendChild(searchAnimation);
        
    $("SearchResult").innerHTML = "";
    $("PageIndexTop").innerHTML = "";
    $("PageIndexBottom").innerHTML = "";


    $("DS_SearchButton").disabled = true;
    $("txtOsHotelname").disabled = true;
    $("txtOsCountry").disabled = true;
    $("txtOsStartPrice").disabled = true;
    $("txtOsEndPrice").disabled = true;
    $("sOsCurrency").disabled = true;
    $("sOsCategory").disabled = true;
    $("sOsSearchFor").disabled = true;
    $("sOsPartner").disabled = true;

}

function UnlockInput() {
    $("DS_InputParametersContainer").removeChild(searchAnimation);
    $("DS_SearchButton").disabled = false;
    $("txtOsHotelname").disabled = false;
    $("txtOsCountry").disabled = false;
    $("txtOsStartPrice").disabled = false;
    $("txtOsEndPrice").disabled = false;
    $("sOsCurrency").disabled = false;
    $("sOsCategory").disabled = false;
    $("sOsSearchFor").disabled = false;
    $("sOsPartner").disabled = false;
}

function OpenSearchResultDetail(link) {
    StoreSearchParams();
    window.location = link;
}

function DisplayData(page) {
    //var more = "more";
    var addToWlHotel = "Add to watchlist";
    var removeFromWlHotel = "Remove from watchlist";
    var addToWlOffer = "Add to watchlist";
    var removeFromWlOffer = "Remove from watchlist";
    var from = "From";
    var category = "Category";
    var avdataloading = "Vacancy data loading...";
    if (clang == "de") {
        //more = "mehr";
        from = "ab";
        category = "Kategorie";
        avdataloading = "Verf&uuml;gbarkeitsdaten werden geladen...";
        addToWlHotel = "Hotel merken";
        removeFromWlHotel = "Hotel aus Merkliste entfernen";
        addToWlOffer = "Angebot merken";
        removeFromWlOffer = "Angebot aus Merkliste entfernen";
    }

    currentPage = page;
    $("SearchResult").innerHTML = "";
    var cnt = 0;
    var x = (page - 1) * pagesize;
    while (x < hotelData["offers"].size() && x < page * pagesize) {

        var wllink = "";

        if (!WatchlistContainsItem(hotelData["offers"][x]["link"])) {
            wllink = "<a onclick=\"AddToWatchlist('" + hotelData["offers"][x]["rowid"] + "', '" + hotelData["offers"][x]["link"] + "')\">" + addToWlOffer + "</a>";
        } else {
            wllink = "<a onclick=\"RemoveFromWatchlist('" + hotelData["offers"][x]["rowid"] + "', '" + hotelData["offers"][x]["link"] + "')\">" + removeFromWlOffer + "</a>";
        }

        $("SearchResult").innerHTML += "<div class=\"detailsearchresultitem\">" +
                                            "<h1><a onclick=\"StoreSearchParams()\" href=\"" + hotelData["offers"][x]["link"] + "\">" + hotelData["offers"][x]["title"] + "</a></h1>" +
                                            "<div class=\"underline\"></div>" +
                                            "<div class=\"content\" style=\"float:left;\">" +
                                            "<div class=\"partnerinfo\">powered by <img style=\"margin-left: 10px;\" src=\"/ImageHandler.aspx?height=20&url=" + url + "/imgs/partner_" + hotelData["offers"][x]["partnerid"] + ".gif\"></img></div>" +
                                                "<p class=\"factor\">" + from + " " + hotelData["offers"][x]["price"] + " " + hotelData["offers"][x]["currency"] + "</p>" +
                                                "<p class=\"avalabilityLoading\">&nbsp;</p>" +
                                                "<p>" + hotelData["offers"][x]["description"] + "</p>" +
                                                "<p id=\"DetailSearch_WlOfferAction_" + hotelData["offers"][x]["rowid"] + "\">" + wllink + "</p>" + 
                                            "</div>" +
                                            "<div><img src=\"" + url + "/ImageHandler.aspx?height=80&url=" + hotelData["offers"][x]["thumbnail"] + "\"></img></div>" +
                                        "</div>";
        
        
        x++;
    }
    x -= hotelData["offers"].size();
    while (x < hotelData["hotels"].size() && (x + hotelData["offers"].size()) < page * pagesize) {
    // for (var x = (page - 1) * pagesize; x < hotelData["hotels"].size() && x < page * pagesize; x++) {
       
        var wllink = "";

        if (!WatchlistContainsItem(hotelData["hotels"][x]["link"])) {
            wllink = "<a onclick=\"AddToWatchlist('" + hotelData["hotels"][x]["rowid"] + "', '" + hotelData["hotels"][x]["link"] + "')\">" + addToWlHotel + "</a>";
        } else {
            wllink = "<a onclick=\"RemoveFromWatchlist('" + hotelData["hotels"][x]["rowid"] + "', '" + hotelData["hotels"][x]["link"] + "')\">" + removeFromWlHotel + "</a>";
        }
    
    
        $("SearchResult").innerHTML += "<div class=\"detailsearchresultitem\">" +
                                            "<h1><a onclick=\"StoreSearchParams()\" href=\"" + hotelData["hotels"][x]["link"] + "\">" + hotelData["hotels"][x]["hotelname"] + "</a></h1>" +
                                            "<div class=\"underline\"></div>" +
                                            "<div class=\"content\" style=\"float:left;\">" +
                                            "<div class=\"partnerinfo\">powered by <img style=\"margin-left: 10px;\" src=\"/ImageHandler.aspx?height=20&url=" + url + "/imgs/partner_" + hotelData["hotels"][x]["partnerid"] + ".gif\"></img></div>" +
                                                "<p class=\"factor\">" + category + ": <img src=\"" + hotelData["hotels"][x]["stars"] + "\"></img></p>" +
                                                "<p id=\"avRowId" + hotelData["hotels"][x]["rowid"] + "\" class=\"avalabilityLoading\">" + avdataloading + "</p>" +
                                                "<p>" + hotelData["hotels"][x]["text"] + "</p>" +
                                                "<p>" + hotelData["hotels"][x]["address"] + ", " + hotelData["hotels"][x]["city"] + "</p>" +
                                                "<p id=\"DetailSearch_WlAction_" + hotelData["hotels"][x]["rowid"] + "\">" + wllink + "</p>" + 
                                            "</div>" +
                                            "<div><img src=\"" + url + "/ImageHandler.aspx?height=80&url=" + hotelData["hotels"][x]["thumbnail"] + "\"></img></div>" +
                                        "</div>";

        LoadAvailability(hotelData["hotels"][x]["rowid"], hotelData["hotels"][x]["partnerid"], hotelData["hotels"][x]["hotelid"]);
        x++;
    }
    
    DisplayPageIndex();
}

function AddToWatchlist(rowid, link) {
    WatchlistAddItem(link);
    var removeFromWl = "Remove from watchlist";
    if (clang == "de") {
        removeFromWl = "Hotel aus Merkliste entfernen";
    }

    if ($("DetailSearch_WlAction_" + rowid)) {
        $("DetailSearch_WlAction_" + rowid).innerHTML = "<a onclick=\"RemoveFromWatchlist('" + rowid + "', '" + link + "')\">" + removeFromWl + "</a>";
    }
    if ($("DetailSearch_WlOfferAction_" + rowid)) {
        $("DetailSearch_WlOfferAction_" + rowid).innerHTML = "<a onclick=\"RemoveFromWatchlist('" + rowid + "', '" + link + "')\">" + removeFromWl + "</a>";
    }
    if ($("DetailSearch_WlGeoAction_" + rowid)) {
        $("DetailSearch_WlGeoAction_" + rowid).innerHTML = "<a onclick=\"RemoveFromWatchlist('" + rowid + "', '" + link + "')\">" + removeFromWl + "</a>";
    }
}

function RemoveFromWatchlist(rowid, link) {
    WatchlistRemoveItem(link);
    var addToWl = "Add To watchlist";
    if (clang == "de") {
        addToWl = "Hotel merken";
    }

    if ($("DetailSearch_WlAction_" + rowid)) {
        $("DetailSearch_WlAction_" + rowid).innerHTML = wllink = "<a onclick=\"AddToWatchlist('" + rowid + "', '" + link + "')\">" + addToWl + "</a>";
    }
    if ($("DetailSearch_WlOfferAction_" + rowid)) {
        $("DetailSearch_WlOfferAction_" + rowid).innerHTML = wllink = "<a onclick=\"AddToWatchlist('" + rowid + "', '" + link + "')\">" + addToWl + "</a>";
    }
    if ($("DetailSearch_WlGeoAction_" + rowid)) {
        $("DetailSearch_WlGeoAction_" + rowid).innerHTML = wllink = "<a onclick=\"AddToWatchlist('" + rowid + "', '" + link + "')\">" + addToWl + "</a>";
    }
}

function LoadAvailability(rowid, partnerid, hotelid) {
    var startDate = GetDateStringFromCalendar(calStartDate);
    var endDate = GetDateStringFromCalendar(calEndDate);
    DoRequest("GetHotelAvailability", "rowid=" + rowid + "&partnerid=" + partnerid + "&hotelid=" + hotelid + "&startdate=" + startDate + "&enddate=" + endDate, AvailabilityDataReceived);
}

function AvailabilityDataReceived(response) {
    var roomsfree = "Vacancy";
    var noRoomsFree = "No vacancy";
    var avOnRequest = "Vacancy on application";
    if (clang == "de") {
        noRoomsFree = "Keine Zimmer frei";
        roomsfree = "Zimmer frei";
        avOnRequest = "Verf&uuml;gbarkeit auf Anfrage";        
    }

    var data = eval("(" + response.responseText + ")");

    var element = $("avRowId" + data["rowid"]);
    if (!element)
        return;
    
    if (data["DataAvailable"] == 0) {
        element.innerHTML = avOnRequest;
    } else {
        if (data["AvailableRooms"] > 0) {
            element.innerHTML = roomsfree;
            element.className = "avalabilityRoomsFree";
        } else {
            element.innerHTML = noRoomsFree;
            element.className = "avalabilityNoRoomsFree";
        }
    }
    
}

function SearchResultReceived(response) {
    $("PageIndexTop").innerHTML = "";
    $("PageIndexBottom").innerHTML = "";
    UnlockInput();
    hotelData = eval("(" + response.responseText + ")");
    ClearResultMap();
    resultMapLoadedForCurrentResult = false;

    if (!hotelData["hotels"]) 
    {
        var nores = "Please specify your search parameters.";
        if (clang == "de")
            nores = "Bitte spezifizieren Sie die Suchparameter.";

        $("DS_InfoBoxContainer").appendChild(CreateInfoBox(nores));
    }
    else if (hotelData["hotels"].size() > 0 || hotelData["offers"].size() > 0) {
        var p = 1;
        if (currentPageFromCache != null) {
            p = 1 * currentPageFromCache;
            currentPageFromCache = null;
        }
        DisplayData(p);
        DisplayPageIndex();


        if (resultMode == 1) {
            GotoStdSearch();
        }
        else if (resultMode == 2) {
            GotoGeoSearch();
        }
    }
    else {
        var nores = "No results found";
        if (clang == "de")
            nores = "Keine Ergebnisse gefunden";

        $("DS_InfoBoxSearchResult").appendChild(CreateInfoBox(nores));
    }
}

function DisplayPageIndex() {

    if ((hotelData["hotels"].size() + hotelData["offers"].size()) <= pagesize)
        return;

    var foreward = "Foreward";
    var backward = "Backward";
    if (clang == "de") {
        foreward = "Vorw&auml;rts";
        backward = "Zur&uuml;ck";
    } 
    
    var index = "";
    if (currentPage != 1)
        index += "<a  onclick=\"DisplayData(" + (currentPage - 1) + ")\">" + backward + " <img style=\"border:0px;\" src=\"" + url + "/imgs/arrow_left_active.png\"></img></a> ";
    else
        index += "<span>" + backward + " <img src=\"" + url + "/imgs/arrow_left_inactive.png\"></img> ";
    for (var x = 0; x < (hotelData["hotels"].size() + hotelData["offers"].size()); x = x + pagesize)
    {
        if((Math.ceil(x / pagesize) + 1) != currentPage)
            index += "<a onclick=\"DisplayData(" + (Math.ceil(x / pagesize) + 1) + ")\">" + (Math.ceil(x / pagesize) + 1) + "</a> ";
        else
            index += "<strong>" + (Math.ceil(x / pagesize) + 1) + "</strong> ";
            
    }

    if (currentPage * pagesize < (hotelData["hotels"].size() + hotelData["offers"].size()))
        index += "<a onclick=\"DisplayData(" + (currentPage + 1) + ")\"><img style=\"border:0px;\" src=\"" + url + "/imgs/arrow_right_active.png\"></img> " + foreward + "</a>"
    else
        index += "<span><img src=\"" + url + "/imgs/arrow_right_inactive.png\"></img> " + foreward + "</span>";

    $("PageIndexTop").innerHTML = index;
    $("PageIndexBottom").innerHTML = index;
}
