﻿var urlHandler = {
    "getParam":
    function(name) {
        name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
        var regexS = "[\\?&]" + name + "=([^&#]*)";
        var regex = new RegExp(regexS);
        var results = regex.exec(window.location.href);
        return (results == null) ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
    },

    "setParam":
    function(search, key, value) {
        key = escape(key); value = !!value ? escape(value) : null;
        if (search[0] === '?') search = search.substr(1);
        var newqs = [],
            kvp = search.split('&'),
            x, lkey, lvalue;
        for (var i = 0; i < kvp.length; i++) {
            x = kvp[i].split('='); lkey = x[0]; lvalue = x[1];
            if (lkey == key) lvalue = value;
            if (!lkey || !lkey.length || !lvalue) continue;
            newqs[lkey] = lvalue;
        }
        if (key && key.length && value) newqs[key] = value;
        var retqs = [];
        for (k in newqs) {
            retqs[retqs.length] = [k, newqs[k]].join('=');
        }
        return retqs.join('&');
    }

};

(function($) {
    $(document).ready(initContactFinder);

    function initContactFinder() {
        var contactfinder = $(".contactfinder");
        if (!contactfinder.length) return;
        var radiocontainer = contactfinder.find(".radiobuttons"),
            radiolistitems = radiocontainer.find("> ul > li"),
            radiolabels = radiolistitems.find("> label"),
            radioinputs = radiolabels.find("> input"),
            inputwrapper = contactfinder.find(".inputwrapper"),
            forms = inputwrapper.find(".formsection"),
            searchbutton = inputwrapper.find("input[type='button'][name='findproject']");

        radioinputs.each(function(index) { initRadioForm($(this), forms.eq(index)); });
        searchbutton.click(submitSearch);
        initCurrentForm();

        function initCurrentForm() {
            var selectedType = urlHandler.getParam("type");
            var selectedRadio = radioinputs.filter("[value='" + selectedType + "']");
            if (!selectedRadio.length) selectedRadio = radioinputs.eq(0);
            selectedRadio.click();
        }

        function genericForm(form) {
            var opened = false,
                loaded = false;

            var loadForm = function() {
                var column = $(this),
                    urlinput = column.find("> input[type=hidden]"),
                    url = urlinput.val(),
                    dropdowns = column.find("select");

                if (!url && !dropdowns.length) return;

                var dropdown = dropdowns.eq(0),
                    binder = dropdowns.dropdownBinder();

                var callback = function(data, textStatus) {
                    var ids = getQueryValuesByFormNames();
                    markSelectedDataItem(data);
                    dropdown.data("source", data);
                    dropdown.trigger("bindSelect", [data]);

                    function getQueryValuesByFormNames() {
                        var names = [];
                        column.find("select[name]").each(function() {
                            names[names.length] = $(this).attr("name");
                        });
                        ids = $.map(names, function(param, index) {
                            var value = urlHandler.getParam(param);
                            return value.length ? value : null;
                        });
                        return ids;
                    }

                    function markSelectedDataItem(data) {
                        if (!ids || !ids.length) return false;
                        var i = 0;
                        while (i < data.length) {
                            var dataItem = data[i++];
                            if (!dataItem) continue;
                            var found = $.map(ids, function(id, index) {
                                return dataItem.Id == id ? true : null;
                            }).length;
                            var foundsub = markSelectedDataItem(dataItem.Items);
                            if (found || foundsub) {
                                dataItem.IsSelected = true;
                                return true;
                            }
                        }
                        return false;
                    }
                }
                var lang = $("head meta[http-equiv='Content-Language']").attr("content");
                $.getJSON(url, { "lang": lang }, callback);
            }

            var initForm = function() {
                if (loaded) return;
                var columns = form.find("> .columns").each(loadForm);
                loaded = true;
            }

            var openForm = function() {
                initForm();
                form.show();
            }
            form.bind("openForm", openForm);

            var closeForm = function() {
                form.hide();
            }
            form.bind("closeForm", closeForm);

            return {};
        }

        function initRadioForm(radio, form) {
            var label = radio.parent(),
                listitem = label.parent(),
                index = listitem.index(),
                searchForm = genericForm(form);

            form.hide();
            radio.click(radioChange);
            return {};

            function radioChange() {
                var checked = radio.is(":checked");
                radiolistitems.not(radio).removeClass("selected");
                listitem.toggleClass("selected", checked);
                forms.not(form).trigger("closeForm");
                form.trigger("openForm");
            }
        }

        function submitSearch() {
            var selectedradio = radioinputs.filter(":checked").val();
            var searchsegment = urlHandler.setParam(document.location.search, "type", selectedradio);

            var selects = forms.filter(":visible").find("select");
            selects.each(function() {
                var selected = getSelectedOption($(this));
                if (selected) searchsegment = urlHandler.setParam(searchsegment, selected.name, selected.data ? selected.data.Id : null);
            });

            document.location.search = searchsegment;

            function getSelectedOption(dropdowns) {
                var selected = dropdowns.find("option[selected]"),
                    array = $.makeArray(selected).reverse();
                for (var i = 0; i < array.length; i++) {
                    var option = $(array[i]);
                    var dataItem = option.data("source");
                    return { "name": option.parent().attr("name"), "data": dataItem };
                };
                return null;
            }
        }
    }

})(jQuery);
