﻿(function($) {
    $.fn.dropdownBinder = function() {
        dropdowns = this;

        var bindSelect = function(event, data) {
            var dropdown = $(this);
            dropdown.find("option:gt(0)").remove();
            if (!data || !data.length) return;
            for (var i = 0; i < data.length; i++) {
                var dataItem = data[i];
                var option = $("<option />").text(dataItem.Name);
                if (dataItem.IsSelected) option.attr("selected", "selected");
                option.val(dataItem.Url);
                option.data("source", dataItem)
                option.appendTo(dropdown);
            }
            if (data.length) { dropdown.removeAttr("disabled"); }
            dropdown.next("select").eq(0).trigger("unbindSelect");
            dropdown.trigger("change");
        }

        var unbindSelect = function(event) {
            var dropdown = $(this);
            dropdown.find("option:gt(0)").remove();
            dropdown.attr("disabled", true);
            dropdown.next("select").eq(0).trigger("unbindSelect");
        }

        function changeDropdown(event) {
            var dropdown = $(this),
                items = dropdown.data("items"),
                selected = dropdown.find("option[selected]"),
                dataItem = selected.data("source"),
                nextDropdown = dropdown.next("select").eq(0);

            if (!selected.index() || !dataItem || !dataItem.Items || !dataItem.Items.length) {
                nextDropdown.trigger("unbindSelect");
                return;
            }
            nextDropdown.trigger("bindSelect", [dataItem.Items]);
        }

        function getSelectedUrl() {
            var selected = getSelected();
            if (!selected) return null;
            return selected.Url;
        }

        function getSelected() {
            var selected = dropdowns.find("option[selected]"),
            array = $.makeArray(selected).reverse();
            for (var i = 0; i < array.length; i++) {
                var item = $(array[i]);
                var dataItem = item.data("source");
                if (!dataItem) { continue; }
                return dataItem;
            };
            return null;
        }

        dropdowns.bind("bindSelect", bindSelect);
        dropdowns.bind("unbindSelect", unbindSelect);
        dropdowns.change(changeDropdown);

        return {
            "getSelectedUrl": getSelectedUrl,
            "getSelected": getSelected
        };
    }

})(jQuery);

(function($) {
    $("#main .projectfinder").each(locationForm);

    var mainMenuInitOk = false;
    $(".mainmenu > ul > li.dropdownexpand").mouseover(function() {
        if (!mainMenuInitOk) {
            $(".mainmenuhover .location, .mainmenuhover .locationsearch").each(locationForm);
            mainMenuInitOk = true;
        }
    });

    function dropdownBinder(dropdowns) {

        var bindSelect = function(event, data) {
            var dropdown = $(this);
            dropdown.find("option:gt(0)").remove();
            if (!data || !data.length) return;
            for (var i = 0; i < data.length; i++) {
                var dataItem = data[i];
                var option = $("<option />").text(dataItem.Name);
                if (dataItem.IsSelected) option.attr("selected", "selected");
                option.val(dataItem.Url);
                option.data("source", dataItem)
                option.appendTo(dropdown);
            }
            if (data.length) { dropdown.removeAttr("disabled"); }
            dropdown.next("select").eq(0).trigger("unbindSelect");
            dropdown.trigger("change");
        }

        var unbindSelect = function(event) {
            var dropdown = $(this);
            dropdown.find("option:gt(0)").remove();
            dropdown.attr("disabled", true);
            dropdown.next("select").eq(0).trigger("unbindSelect");
        }

        function changeDropdown(event) {
            var dropdown = $(this),
                items = dropdown.data("items"),
                selected = dropdown.find("option[selected]"),
                dataItem = selected.data("source"),
                nextDropdown = dropdown.next("select").eq(0);

            if (!selected.index() || !dataItem || !dataItem.Items || !dataItem.Items.length) {
                nextDropdown.trigger("unbindSelect");
                return;
            }
            nextDropdown.trigger("bindSelect", [dataItem.Items]);
        }

        function getSelectedUrl() {
            var selected = getSelected();
            if (!selected) return null;
            return selected.Url;
        }

        function getSelected() {
            var selected = dropdowns.find("option[selected]"),
            array = $.makeArray(selected).reverse();
            for (var i = 0; i < array.length; i++) {
                var item = $(array[i]);
                var dataItem = item.data("source");
                if (!dataItem) { continue; }
                return dataItem;
            };
            return null;
        }

        dropdowns.bind("bindSelect", bindSelect);
        dropdowns.bind("unbindSelect", unbindSelect);
        dropdowns.change(changeDropdown);

        return {
            "getSelectedUrl": getSelectedUrl,
            "getSelected": getSelected
        };
    }

    function locationForm() {
        var panel = $(this),
            segment = panel.find("select[name='segment']"),
            dropdowns = panel.find("select[name='region'],select[name='country'],select[name='location']").attr("disabled", true),
            region = dropdowns.filter("[name='region']"),
            country = dropdowns.filter("[name='country']"),
            location = dropdowns.filter("[name='location']"),
            button = panel.find("button[name='find']");


        var hasSegment = !!segment.length,
            hasRegion = !!region.length,
            hasDropdowns = hasSegment || hasRegion;

        if (!hasDropdowns) return;

        var segmentroot = panel.find("input[name='segmentroot']").attr("value"),
            locationroot = panel.find("input[name='locationroot']").attr("value"),
            searchpage = panel.find("input[name='searchpage']").attr("value"),
            segmentBinder = dropdownBinder(segment),
            locationBinder = dropdownBinder(dropdowns);

        if (hasSegment) loadData(segment, "/Data/Project/TechnologySegments.aspx", segmentroot, getParameterByName("segment"));
        if (hasRegion) loadData(region, "/Data/Project/Locations.aspx", locationroot, getParameterByName("location"));

        button.click(function(event) {
            event.preventDefault();
            var url = findSelectedUrl();
            if (url) window.location.href = url;
        });

        function findSelectedUrl() {
            var url = null;
            var selectedLocation = locationBinder.getSelected(),
                selectedSegment = segmentBinder.getSelected();
            if (selectedLocation && selectedSegment) {
                url = window.location.href;
                if (searchpage) url = searchpage;
                var splits = url.split("?");
                if (splits.length) {
                    url = splits[0];
                }
                return url + "?segment=" + selectedSegment.Id + "&location=" + selectedLocation.Id;
            }
            if (selectedLocation) {
                url = selectedLocation.Url;
                if (url && selectedSegment) {
                    url += (url.indexOf("?", 0) > 0) ? "&" : "?";
                    url += "display=all&segment=" + selectedSegment.Id;
                }
                return url;
            }
            if (selectedSegment) {
                return selectedSegment.Url;
            }
            return null;
        }

        function getParameterByName(name) {
            name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
            var regexS = "[\\?&]" + name + "=([^&#]*)";
            var regex = new RegExp(regexS);
            var results = regex.exec(window.location.href);
            if (results == null)
                return "";
            else
                return decodeURIComponent(results[1].replace(/\+/g, " "));
        }

        function loadData(dropdown, url, pageid, selectValue) {

            function markSelectedDataItem(data) {
                if (!data || !data.length) return false;
                var i = 0;
                while (i < data.length) {
                    var dataItem = data[i++];
                    if (!dataItem) continue;
                    if ((dataItem.Id == selectValue) || markSelectedDataItem(dataItem.Items)) {
                        dataItem.IsSelected = true;
                        return true;
                    }
                }
                return false;
            }

            var callback = function(data, textStatus) {
                markSelectedDataItem(data);
                dropdown.data("source", data);
                dropdown.trigger("bindSelect", [data]);
            }

            if (pageid) {
                var lang = $("head meta[http-equiv='Content-Language']").attr("content");
                $.getJSON(url, { "pageid": pageid, "lang": lang }, callback);
            }
        }
    }
})(jQuery);
