﻿(function($) {
    $.fn.vacation_planner = function(options) {
        opts = $.extend({}, $.fn.vacation_planner.defaults, options);
        $("a").css("cursor", "pointer");
        set_reload_options(); // test
        return this.each(function() {
            set_options_add_click();
            set_options_remove_click();
            set_tab_switch_click();
            set_next_click();
            set_prev_click();
            set_tab_filter();
            page_options();
            set_plan_click();
        });
    };

    function set_plan_click() {
        $(".plan-selector li a").click(function() {
            var meta = $(this).metadata();
            $(this).closest(".plan-selector").siblings("div.plan").hide();
            $("div." + meta.plan).show();
            return false;
        });
    };

    function set_tab_filter() {
        $(".vacation-selector ul li a").click(function() {
            var meta = $(this).metadata();
            var options = $(this).closest(".tab").siblings(".vacation-options").children("div");
            options.show().removeClass("filtered");
            if (meta.filter) {
                options.not("." + meta.filter).hide().addClass("filtered");
            }
            page_options();
        });
    };

    function set_next_click() {
        $(".next").click(function() {
            var option_count = parseInt(opts.option_count);
            var options = $(this).parent().siblings(".vacation-options").children();
            var next_options = options.filter("div:visible:last").nextAll().not(".filtered").slice(0, option_count);
            var last_index = options.index(next_options.filter(":last"));
            var max_options = options.length;
            options.hide();
            next_options.show();
            $(this).siblings(".prev").show();
            if (next_options.length < option_count || last_index == (max_options - 1)) {
                $(this).hide();
            }
            return false;
        });
    };

    function set_prev_click() {
        $(".prev").click(function() {
            var option_count = parseInt(opts.option_count);
            var options = $(this).parent().siblings(".vacation-options").children().not(".filtered");
            var first_index = options.index(options.filter("div:visible:first"));
            var start_index = first_index - option_count < 0 ? 0 : first_index - option_count;
            var prev_options = options.slice(start_index, (start_index + option_count));
            options.hide();
            prev_options.show();
            $(this).siblings(".next").show();
            if (start_index == 0) $(this).hide();
            return false;
        });
    };

    function page_options() {
        $(".vacation-options").each(function() {
            if ($(this).children("div").not(".filtered").length > parseInt(opts.option_count)) {
                $(this).children("div").not(".filtered").filter(":gt(" + (parseInt(opts.option_count) - 1) + ")").hide();
                $(this).siblings(".page-control").show();
                $(this).siblings(".page-control").children(".prev").hide();
                $(this).siblings(".page-control").children(".next").show();
            }
            else {
                $(this).siblings(".page-control").hide();
            }
        });
    };

    function set_options_add_click() {
        $(".vacation-options div a").click(function() {
            var option = $(this).parent();
            var meta = option.parent().metadata()
            var drop_class = meta.drop_class;
            var option_id = option.attr("id");
            var planList = GetCookie("plan");
            if (!option.hasClass("selected")) {
                $(get_selected_option_html(option, drop_class)).appendTo("." + drop_class).fadeIn();
                option_id = option_id.indexOf("plan") > -1 ? option_id.split("-")[1] : option_id;
                $(get_input_html(meta.input_name, option_id)).appendTo("#vacation-form");
            }
            $("#" + option_id).addClass("selected");
            $("#plan-" + option_id).addClass("selected");
            if (planList != null) {
                planList = Sys.Serialization.JavaScriptSerializer.deserialize(planList, true);
                var is_plan_exist = planExists(planList, option_id);
                if (!is_plan_exist) {
                    planList[planList.length] = option_id;
                    set_cookie("plan", Sys.Serialization.JavaScriptSerializer.serialize(planList));
                }
            }
            else {
                planList = new Array();
                planList[0] = option_id;
                set_cookie("plan", Sys.Serialization.JavaScriptSerializer.serialize(planList));
            }
            return false;
        });
    };

    function set_reload_options() {
        var planList = GetCookie("plan");
        if (planList != null) {
            planList = Sys.Serialization.JavaScriptSerializer.deserialize(planList, true);
            for (var i = 0; i < planList.length; i++) {
                var option_id = planList[i];
                $("#" + option_id).addClass("selected");
                $("#plan-" + option_id).addClass("selected");
                var option = $("#" + option_id).parent();
                var meta = option.metadata();
                var drop_class = meta.drop_class;
                
                $(set_reloaded_html(option, drop_class, option_id)).appendTo("." + drop_class).fadeIn();

            }
        }
        else { return false; }
    }

    function set_reloaded_html(option, meta_class, option_id) {
        var option_id = option_id;
        var option_name = option.find("#" + option_id + ":eq(0) a > span").text();
        var meta = $("#" + option_id).metadata();
        result = "<div style=\"display:none;\" class=\" {remove_id: " + option_id + "} \">";
        result += "<span>" + option_name + "</span>";
        result += "<a href=\"\" class=\"remove-btn\">x</a>";
        if (meta.info_link) result += "<a href=\"" + meta.info_link + "\" onclick=\"_gaq.push(['_trackEvent', 'Plan Your Vacation - " + meta_class.toString().replace("-drop", "") + "', '" + option_name + "', 'Info');\">INFO</a>";
        if (meta.book_link) result += "<a href=\"" + meta.book_link + "\" onclick=\"_gaq.push(['_trackEvent', 'Plan Your Vacation - " + meta_class.toString().replace("-drop", "") + "', '" + option_name + "', 'Book');\">BOOK</a>";
        result += "</div>";
        return result;
    };


    function get_input_html(input_name, option_id) {
        result = '<input type="hidden" id="' + input_name + '" name="' + input_name + '" value="' + option_id + '" class="input' + option_id + '"/>';
        return result;
    }


    function set_options_remove_click() {
        $(".remove-btn").live("click", function() {
            var meta = $(this).parent().metadata();
            var remove_id = meta.remove_id;
            $(".vacation-options div#" + remove_id).removeClass("selected");
            $("#plan-" + remove_id).removeClass("selected");
            $(this).parent().fadeOut(function() { $(this).remove() });
            $("#vacation-form input.input" + remove_id).remove();
            var planList = GetCookie("plan");
            if (planList != null) {
                planList = Sys.Serialization.JavaScriptSerializer.deserialize(planList, true);
                planList = removeItems(planList, remove_id);
                set_cookie("plan", Sys.Serialization.JavaScriptSerializer.serialize(planList));
            }
            return false;
        });
    };

    function removeItems(array, item) {
        var i = 0;
        while (i < array.length) {
            if (array[i] == item) {
                array.splice(i, 1);
            } else {
                i++;
            }
        }
        return array;
    }

    function set_tab_switch_click() {
        $("ul.tab li a").click(function() {
            $(this).parent().siblings(".active").removeClass("active");
            $(this).parent().addClass("active");
            return false;
        });
    };

    function get_selected_option_html(option, meta_class) {
        var option_name = option.find("a > span").text();
        var option_id = option.attr("id");
        var meta = option.metadata();
        option_id = option_id.indexOf("plan") > -1 ? option_id.split("-")[1] : option_id;
        result = "<div style=\"display:none;\" class=\" {remove_id: " + option_id + "} \">";
        result += "<span>" + option_name + "</span>";
        result += "<a href=\"\" class=\"remove-btn\">x</a>";
        if (meta.info_link) result += "<a href=\"" + meta.info_link + "\" onclick=\"_gaq.push(['_trackEvent', 'Plan Your Vacation - " + meta_class.toString().replace("-drop", "") + "', '" + option_name + "', 'Info']);\">INFO</a>";
        if (meta.book_link) result += "<a href=\"" + meta.book_link + "\" onclick=\"_gaq.push(['_trackEvent', 'Plan Your Vacation - " + meta_class.toString().replace("-drop", "") + "', '" + option_name + "', 'Book']);\">BOOK</a>";
        result += "</div>";
        return result;
    };

    $.fn.vacation_planner.defaults = {
        option_count: 8
    };

    function planExists(planList, option_id) {
        var i = 0;
        for (i = 0; i < planList.length; i++) {
            if (planList[i] == option_id) {
                return true;
            }
        }
        return false;
    };
    function set_cookie(name, value) {
        var expDate = new Date();
        expDate.setDate(expDate.getDate() + 1);
        document.cookie = name + "=" + encodeURIComponent(value) + ";expires=" + expDate.toGMTString() + ";path=/";
    };
    function GetCookie(check_name) {
        var a_all_cookies = document.cookie.split(';')
        var a_temp_cookie = ''
        var cookie_name = ''
        var cookie_value = ''
        var b_cookie_found = false

        for (i = 0; i < a_all_cookies.length; i++) {
            a_temp_cookie = a_all_cookies[i].split('=')
            cookie_name = a_temp_cookie[0].replace(/^\s+|\s+$/g, '')

            if (cookie_name == check_name) {
                b_cookie_found = true;
                if (a_temp_cookie.length > 1) {
                    cookie_value = decodeURIComponent(a_temp_cookie[1].replace(/^\s+|\s+$/g, ''))
                }
                return cookie_value
                break
            }
            a_temp_cookie = null
            cookie_name = ''
        }

        if (!b_cookie_found) return null
    };


})(jQuery);
