﻿/// <reference path="~/scripts/jsonhelper.js" />
/// <reference path="~/scripts/conf/ui.js" />

ui.search = {

    COOKIE_SEARCH: "search",

    // --------------------------------------------------------

    init: function () {
        if ($("select#dd_hotel").length > 0) {
            $("select#dd_hotel").change(function () {
                ui.search.resetSearch(false);
            });

            ui.search.getSearchParameters();
        }
    },

    // --------------------------------------------------------

    getSearchParameters: function () {
        //console.info("ui.search getSearchParameters");

        var request = "get-search-parameter-values";

        JSONHelper.MakeRequest(request, null, ui.search.getSearchParametersSuccess);
    },

    // --------------------------------------------------------

    getSearchParametersSuccess: function (result) {
        //console.info("ui.search getSearchParametersSuccess");

        //console.info(result);

        ui.map.initializeRegions(result.Regions);

        ui.search.setupSearch(result.Regions, result.AttendentRanges, result.ConferenceTypes, result.Hotels);

        var search = ui.search.retrieveSearch();

        if (search) {
            ui.search.doAutoSearch(search);
        } else {
            ui.search.transformSelects();
        }
    },

    // --------------------------------------------------------

    doAutoSearch: function (request) {
        //console.info("ui.search doAutoSearch");
        //console.info(request);

        ui.frontpage.searchBusy();

        var params = request.split("/");

        if (params[0] == "get-hotel") {
            $("select#dd_hotel").val(params[1]);
            $("div#menu li a").click();
        } else {
            $("select#dd_region").val(params[1]);
            $("select#dd_amount").val(params[2]);
            $("select#dd_purpose").val(params[3])

            if (params.length == 7 || params.length == 11) {
                //advanced search
                $("select#dd_grouprooms").val(params[4]);
                $("select#dd_hotelstars").val(params[5]);

                if (params.length == 7) {
                    params = params[6].split("?q=");
                    $("select#dd_conferencestars").val(params[0]);
                    $("input#txtFreetext").val(params[1]);
                } else {
                    $("select#dd_conferencestars").val(params[6]);
                    params = params[10].split("?q=");
                    $("input#txtFreetext").val(params[1]);
                }

                $("div#menu li a").click();
            }
            else {
                ui.frontpage.removeSearchHeader();
                $("div#search").css("height", "148px");
            }
        }

        ui.search.transformSelects();

        ui.map.init();

        // ConferenceType hack
        //params = request.split("/");
        //params[3] = "0";
        //request = params.join("/");

        JSONHelper.MakeRequest(request, null, ui.search.doAutoSearchSuccess);
    },

    // --------------------------------------------------------

    getUserSearchParams: function () {
        var search = $.cookies.get(this.COOKIE_SEARCH);
        var params = search.split("/");

        var amount = "";
        var purpose = "";
        var groupRooms = "";

        if (params[0] != "get-hotel") {
            amount = params[2];
            purpose = params[3];

            if (params.length == 7 || params.length == 11) {
                //advanced search
                groupRooms = params[4]; // group rooms
            }
        }

        return { amount: amount, purpose: purpose, groupRooms: groupRooms };
    },

    // --------------------------------------------------------

    doAutoSearchSuccess: function (hotels) {
        //console.info("ui.search doAutoSearchSuccess");

        ui.map.addHotels(hotels, true);
        ui.search.updateTable(hotels);

        ui.search.showResults();
    },

    // --------------------------------------------------------

    doBasicSearch: function () {
        // url: search/{region}/{antal}/{type}
        //console.info("ui.search doBasicSearch");

        ui.map.init();

        if ($("select#dd_region").val() != 0) {
            ui.map.zoomRegion($("select#dd_region").val());
        } else {

            var request = "search/" + $("select#dd_region").val() + "/" + $("select#dd_amount").val() + "/" + $("select#dd_purpose").val();

            ui.search.persistSearch(request);

            // ConferenceType hack
            //request = "search/" + $("select#dd_region").val() + "/" + $("select#dd_amount").val() + "/0";

            JSONHelper.MakeRequest(request, null, ui.search.doBasicSearchSuccess);
        }
    },

    // --------------------------------------------------------

    doBasicSearchSuccess: function (hotels) {
        //console.info("ui.search doBasicSearchSuccess");

        ui.map.addHotels(hotels, true);
        ui.search.updateTable(hotels);

        ui.search.showResults();
    },

    // --------------------------------------------------------

    doAdvancedSearch: function () {
        // url: advanced-search/{region}/{antal}/{type}/{hotel}/{hotelstars}/{conferencestars}?q={freeText}
        //console.info("ui.search doAdvancedSearch");

        ui.map.init();

        if ($("select#dd_hotel").val() != 0) {
            var request = "get-hotel/" + $("select#dd_hotel").val();

            ui.search.persistSearch(request);

            JSONHelper.MakeRequest(request, null, ui.search.doBasicSearchSuccess);
        } else {
            if ($("select#dd_region").val() != 0) {
                ui.map.zoomRegion($("select#dd_region").val());
            } else {
                var request = "advanced-search/" + $("select#dd_region").val() + "/" + $("select#dd_amount").val() + "/" + $("select#dd_purpose").val() + "/" + $("select#dd_grouprooms").val() + "/" + $("select#dd_hotelstars").val() + "/" + $("select#dd_conferencestars").val() + "?q=" + $("input#txtFreetext").val();

                ui.search.persistSearch(request);

                // ConferenceType hack
                //request = "advanced-search/" + $("select#dd_region").val() + "/" + $("select#dd_amount").val() + "/0/" + $("select#dd_grouprooms").val() + "/" + $("select#dd_hotelstars").val() + "/" + $("select#dd_conferencestars").val() + "?q=" + $("input#txtFreetext").val();

                JSONHelper.MakeRequest(request, null, ui.search.doAdvancedSearchSuccess);
            }
        }
    },

    // --------------------------------------------------------

    doAdvancedSearchSuccess: function (hotels) {
        //console.info("ui.search doAdvancedSearchSuccess");

        ui.map.addHotels(hotels, true);
        ui.search.updateTable(hotels);

        ui.search.showResults();
    },

    // --------------------------------------------------------

    doLatLongSearch: function (rect, regionSearch) {
        // url: search/{region}/{antal}/{type}
        //console.info("ui.search doLatLongSearch");

        ui.frontpage.searchBusy();

        var region = regionSearch ? $("select#dd_region").val() : "0";

        var request = "";
        if (ui.frontpage.searchState != 1) {
            //basic
            request = "search/" + region + "/" + $("select#dd_amount").val() + "/" + $("select#dd_purpose").val() + "/" + rect.getSouthWest().lng() + "/" + rect.getSouthWest().lat() + "/" + rect.getNorthEast().lng() + "/" + rect.getNorthEast().lat();

            ui.search.persistSearch(request);

            // regionSearch hack
            //request = "search/0/" + $("select#dd_amount").val() + "/" + $("select#dd_purpose").val() + "/" + rect.getSouthWest().lng() + "/" + rect.getSouthWest().lat() + "/" + rect.getNorthEast().lng() + "/" + rect.getNorthEast().lat();

        } else {
            //advanced
            request = "advanced-search/" + region + "/" + $("select#dd_amount").val() + "/" + $("select#dd_purpose").val() + "/" + $("select#dd_grouprooms").val() + "/" + $("select#dd_hotelstars").val() + "/" + $("select#dd_conferencestars").val() + "/" + rect.getSouthWest().lng() + "/" + rect.getSouthWest().lat() + "/" + rect.getNorthEast().lng() + "/" + rect.getNorthEast().lat() + "?q=" + $("input#txtFreetext").val();

            ui.search.persistSearch(request);

            // regionSearch hack
            //request = "advanced-search/0/" + $("select#dd_amount").val() + "/" + $("select#dd_purpose").val() + "/" + $("select#dd_grouprooms").val() + "/" + $("select#dd_hotelstars").val() + "/" + $("select#dd_conferencestars").val() + "/" + rect.getSouthWest().lng() + "/" + rect.getSouthWest().lat() + "/" + rect.getNorthEast().lng() + "/" + rect.getNorthEast().lat() + "?q=" + $("input#txtFreetext").val();
        }

        JSONHelper.MakeRequest(request, null, ui.search.doLatLongSearchSuccess);
    },

    // --------------------------------------------------------

    doLatLongSearchSuccess: function (hotels) {
        //console.info("ui.search doLatLongSearchSuccess");

        ui.map.addHotels(hotels, false);
        ui.search.updateTable(hotels);

        ui.search.showResults();
    },

    // --------------------------------------------------------

    setupSearch: function (regions, attendentRanges, conferenceTypes, hotels) {
        //console.info("ui.search setupSearch");

        $.each(regions, function (i, region) {
            $("select#dd_region").append("<option value=\"" + region.Id + "\">" + region.Name + "</option>");
        });

        $.each(attendentRanges, function (i, attendentRange) {
            $("select#dd_amount").append("<option value=\"" + attendentRange.Value + "\">" + attendentRange.Text + "</option>");
        });

        $.each(conferenceTypes, function (i, conferenceType) {
            $("select#dd_purpose").append("<option value=\"" + conferenceType.Value + "\">" + conferenceType.Text + "</option>");
        });

        $.each(hotels, function (i, hotel) {
            $("select#dd_hotel").append("<option value=\"" + hotel.Value + "\">" + hotel.Text + "</option>");
        });

        $("div#search select:not(#dd_hotel)").change(function () {
            ui.search.resetHotelSearch();
        });

        $("div#search input#txtFreetext").keyup(function () {
            ui.search.resetHotelSearch();
        });
    },

    // --------------------------------------------------------

    transformSelects: function () {
        $("div#search_form div.box").jqTransform();
        $("div#search_form div.box div.jqTransformSelectWrapper").css("width", "170px");
        $("div#search_form div.box div.jqTransformSelectWrapper div span").css("width", "139px");
        $("div#search_form div.box div.jqTransformSelectWrapper ul").css("width", "170px");
        $("div#search_form div.box div.jqTransformSelectWrapper div a").css("right", "-2px");

        $("div#search_form div.box div.jqTransformSelectWrapper li a").click(function () {
            ui.search.resetHotelSearch();
        });

        // Autosearch on Region onChange
        /*
        $("label[for='dd_region'] + .jqTransformSelectWrapper li a").click(function() {
        var val = $("select#dd_region").val();
        console.info("bang! " + val);
        });
        */
    },

    // --------------------------------------------------------

    resetSearch: function (perfomSearch) {
        //console.info("ui.search resetSearch");

        if (perfomSearch)
            ui.frontpage.searchBusy();

        $("select#dd_region").val(0);
        $("select#dd_amount").val(0);
        $("select#dd_purpose").val(0);

        //$("div.jqTransformSelectWrapper li a").toggleClass("selected", false);
        //$("div.jqTransformSelectWrapper li a:first").toggleClass("selected", true);
        $("div.jqTransformSelectWrapper div span").html("-");

        ui.search.resetAdvancedSearch();
        ui.search.transformSelects();

        if (perfomSearch)
            ui.search.doBasicSearch();
    },

    // --------------------------------------------------------

    resetHotelSearch: function () {
        //console.info("ui.search resetHotelSearch");
        $("select#dd_hotel").val(0);
    },

    // --------------------------------------------------------

    resetAdvancedSearch: function () {
        //console.info("ui.search resetAdvancedSearch");
        $("select#dd_grouprooms").val(0);
        $("select#dd_hotelstars").val(0);
        $("select#dd_conferencestars").val(0)
        $("input#txtFreetext").val("")
    },

    // --------------------------------------------------------

    showResults: function () {
        $("div#newsletter").hide();
        $("div#search_result").show();
    },

    // --------------------------------------------------------

    updateTable: function (hotels) {
        //console.info("ui.search updateTable");

        if (hotels.length == 1)
            $("div#search_result div.left h2").html("<strong>" + hotels.length + "</strong> hotel opfylder dine ønsker");
        else
            $("div#search_result div.left h2").html("<strong>" + hotels.length + "</strong> hoteller opfylder dine ønsker");

        var table = $("div#search_result div.left table");

        $("tr:gt(0)", table).remove();

        $.each(hotels, function (i, hotel) {
            var add = "<a class=\"add\" href=\"#\" alt=\"Tilføj til forespørgsel\"><img src=\"assets/images/conf/icon_add.png\" alt=\"Tilføj til forespørgsel\" /></a>";
            var added = "<a class=\"added\" href=\"#\" alt=\"Fjern fra forespørgsel\"><img src=\"assets/images/conf/icon_added.png\" alt=\"Fjern fra forespørgsel\" /></a>";

            var tr = $("<tr class=\"id_" + hotel.Id + "\"></tr>");
            tr.append("<td>" + hotel.Name + "</td>");
            tr.append("<td>" + hotel.City + "</td>");

            if (hotel.HasClassificationHotel) {
                tr.append("<td><img src=\"assets/images/conf/star_small_" + hotel.ClassificationHotel + ".png\" alt=\"" + hotel.ClassificationHotel + " stjerner\"></td>");
            } else {
                tr.append("<td>n/a</td>");
            }
            tr.append("<td>/</td>");
            if (hotel.HasClassificationConference) {
                tr.append("<td><img src=\"assets/images/conf/star_small_" + hotel.ClassificationConference + ".png\" alt=\"" + hotel.ClassificationConference + " stjerner\"></td>");
            } else {
                tr.append("<td>n/a</td>");
            }

            tr.append("<td>" + hotel.PriceDayMeeting + "</td>");
            tr.append("<td>/</td>");
            tr.append("<td>" + hotel.PriceCourse24Hours + "</td>");
            tr.append("<td>" + add + added + "</td>");

            $("tbody:last", table).append(tr);

            $("td:not(:last-child)", tr).click(function () { window.location = "/" + hotel.FriendlyCategorizedUrl; });

            $('td:last-child a.add', tr).click(function () { ui.search.addToCart(hotel); return false; });
            $('td:last-child a.added', tr).click(function () { ui.search.removeFromCart(hotel); return false; });

            if (ui.cart.isHotelInCart(hotel.Id)) {
                $(".add", tr).hide();
                $(".added", tr).show();
            }
        });

        $('tr:odd', table).addClass('alt');
        $('tr :last-child', table).addClass('last').addClass('ac');
        $('tr td:nth-child(3)', table).addClass('ar').addClass('no-border').addClass('brown');
        $('tr td:nth-child(4)', table).addClass('ac').addClass('last').addClass('brown');
        $('tr td:nth-child(5)', table).addClass('brown');
        $('tr td:nth-child(6)', table).addClass('ar').addClass('no-border');
        $('tr td:nth-child(7)', table).addClass('ac').addClass('last');

        $('tr', table).mouseover(function () { $(this).addClass('over'); });
        $('tr', table).mouseout(function () { $(this).removeClass('over'); });

        ui.frontpage.searchDone();
    },

    // --------------------------------------------------------

    addToCart: function (hotel) {
        if (ui.cart.addToCart(hotel)) {
            var td = $("div#search_result table tr.id_" + hotel.Id + " td:last-child");
            if (td.length) {
                $(".add", td).hide();
                $(".added", td).show();
            }
        }
    },

    // --------------------------------------------------------

    removeFromCart: function (hotel) {
        if (ui.cart.removeHotel(hotel, true)) {
            var td = $("div#search_result table tr.id_" + hotel.Id + " td:last-child");
            if (td.length) {
                $(".add", td).show();
                $(".added", td).hide();
            }
        }
    },

    // --------------------------------------------------------

    hotelRemovedFromCart: function (hotel) {
        var td = $("div#search_result table tr.id_" + hotel.Id + " td:last-child");
        if (td.length) {
            $(".add", td).show();
            $(".added", td).hide();
        }
    },

    // --------------------------------------------------------

    allHotelsRemovedFromCart: function () {
        var td = $("div#search_result table tr td:last-child");
        if (td.length) {
            $(".add", td).show();
            $(".added", td).hide();
        }
    },

    // --------------------------------------------------------

    persistSearch: function (request) {
        $.cookies.set(this.COOKIE_SEARCH, request);
    },

    // --------------------------------------------------------

    retrieveSearch: function () {
        return $.cookies.get(this.COOKIE_SEARCH);
    }
};
