var COOKIE_NAME = 'DesignObjectivesWidget';
var COOKIE_NAME_SETTINGS = 'DesignObjectivesWidget-Settings';

var allsorts = {
    settings: {
        columns: '.column',
        columnLeft: '#column1',
        columnRight: '#column2',
        widgetSelector: '.widget',
        handleSelector: '.controlHeader',
        contentSelector: '.idisplay',
        customiseItems: '#customiseItems',
        customiseButton: '.customise',
        customiseContent: '.customise-content',
        widgetChildren: '.subItems',
        widgetReset: '.reset',
        url: '/Default.aspx'
    },

    init: function(setup) {
        this.addControls();
        this.makeSortable();
        this.loadSort(setup);
    },

    addControls: function() {
        var settings = this.settings, $items = $(settings.customiseItems);

        $(settings.widgetSelector, $(settings.columns)).each(function() {

            //Remove Widget
            $(this).find(".remove").mousedown(function(e) {
                e.stopPropagation();
            }).click(function() {
                allsorts.toggleVisible($(this).parents(settings.widgetSelector), false, true);
                return false;
            });

            //Collapse Widget
            $(this).find(".collapseBox").mousedown(function(e) {
                e.stopPropagation();
            }).toggle(function() {
                allsorts.toggleCollapse($(this).parents(allsorts.settings.widgetSelector), true, true);
                return false;
            }, function() {
                allsorts.toggleCollapse($(this).parents(allsorts.settings.widgetSelector), false, true);
                return false;
            });

            $(this).find(".minus").click(function() {
                var $widget = $(this).parents(allsorts.settings.widgetSelector);
                allsorts.setVisibleChildren($widget, $widget.find(allsorts.settings.widgetChildren + " li:visible").size() - 1, true);
                return false;
            });

            $(this).find(".plus").click(function() {
                var $widget = $(this).parents(allsorts.settings.widgetSelector);
                allsorts.setVisibleChildren($widget, $widget.find(allsorts.settings.widgetChildren + " li:visible").size() + 1, true);
                return false;
            });
        });

        $(settings.customiseButton).click(function() {
            allsorts.toggleCustomise($(allsorts.settings.customiseContent).is(":hidden"), true);
            customiseSite.togglePanel();
            return false;
        });

        //Reset Widgets
        $(settings.widgetReset).click(function() {
            var $sortableItems = allsorts.getSortableItems();

            //Toggle Collapse
            $.each($sortableItems, function() {
                var titleText = $(this).find("h2").text();
                $("INPUT[value='" + titleText + "']").attr("checked", true);
                allsorts.toggleCollapse($(this), false, true);
            });
            return false;
        });
    },
    
    toggleCustomise:function (isOpen, save){
        /*if (isOpen) {
            $(allsorts.settings.customiseButton).css({ backgroundPosition: '' })
            
        } else {
            $(allsorts.settings.customiseButton).css({ backgroundPosition: '-14px 0' })
        }*/
    
        //$(allsorts.settings.customiseContent).toggle(isOpen);
        
        if(save)
            allsorts.saveSort();
    },

    getSortableItems: function() {
        var settings = this.settings;
        return (function() {
            return $('> li', settings.columns);
        })();
    },

    makeSortable: function() {
        var settings = this.settings,
        $items = $(settings.customiseItems),
        $sortableItems = this.getSortableItems();

        var plus = true;
        var lc = parseInt(($sortableItems.size() / 2) + ($sortableItems.size() % 2 > 0 ? 1:0));
        var rc = parseInt($sortableItems.size() / 2);
        var counter = 1;
        $.each($sortableItems.find(settings.handleSelector), function(i, n) {
            $(this).mousedown(function(e) {
                $sortableItems.css({ width: '' });
                $(this).parent().css({
                    width: $(this).parent().width() + 'px'
                });
            }).mouseup(function() {
                if (!$(this).parent().hasClass('dragging')) {
                    $(this).parent().css({ width: '' });
                } else {
                    $(settings.columns).sortable('disable');
                }
            });
            
            var heading = $($sortableItems[counter - 1]).find("h2").text();
            
            $('<li><label><input type="checkbox" checked="checked" value="' + heading + '" />' + heading + '</label></li>').appendTo($items);
            
            if(plus){
                counter = counter + lc;
                plus = false;
            }
            else{
                counter = counter - rc + (lc == rc ? 1:0);
                plus = true;
            }
        });

        //Customise Page Checkboxes
        $items.find("INPUT[type='checkbox']").click(function() {
            allsorts.toggleCollapse($sortableItems.find("h2:contains('" + $(this).attr("value") + "')").parents(allsorts.settings.widgetSelector), !$(this).attr('checked'), true);
        });

        $(settings.columns).sortable({
            items: $sortableItems,
            connectWith: $(settings.columns),
            handle: settings.handleSelector,
            placeholder: 'widget-placeholder',
            forcePlaceholderSize: true,
            revert: 200,
            delay: 100,
            opacity: 0.7,
            start: function(e, ui) {
                $(ui.helper).addClass('dragging');
            },
            stop: function(e, ui) {
                $(ui.item).css({ width: '' }).removeClass('dragging');
                $(settings.columns).sortable('enable');
                allsorts.saveSort();
            }
        });
    },

    //Toggle Collapse
    toggleCollapse: function($widget, isCollapsed, save) {
        if (isCollapsed) {
            $widget.find(".collapseBox").css({ backgroundPosition: '-14px 0' })
            $widget.find(this.settings.contentSelector).hide();
        } else {
            $widget.find(".collapseBox").css({ backgroundPosition: '' })
            $widget.find(this.settings.contentSelector).show();
        }

        var titleText = $widget.find("h2").text();
        $("INPUT[value='" + titleText + "']").attr("checked", !isCollapsed);

        if (save)
            allsorts.saveSort();
    },

    //Toggle Visible
    toggleVisible: function($widget, isVisible, save) {
        $widget.toggle(isVisible);

        if (save)
            allsorts.saveSort();
    },

    setVisibleChildren: function($widget, count, save) {
        $widget.find(allsorts.settings.widgetChildren + " li:lt(" + count + ")").attr('class', '');
        $widget.find(allsorts.settings.widgetChildren + " li:eq(" + count + ")").attr('class', 'blocked');
        $widget.find(allsorts.settings.widgetChildren + " li:gt(" + count + ")").attr('class', 'blocked');
        if (save)
            allsorts.saveSort();
    },

    //Save Widget State
    saveSort: function() {
        var $sortableItems = allsorts.getSortableItems(),
        widgets = new Array();

        $.each($sortableItems, function() {
            timObject = {
                title: $(this).find("h2").text(),
                collapsed: !$(this).find(allsorts.settings.contentSelector).is(":visible"),
                visible: $(this).is(":visible"),
                parentid: $(this).parent().attr("id"),
                childCount: ($(this).find(allsorts.settings.widgetChildren).length ? $(this).find(allsorts.settings.widgetChildren + " li:visible").size() : 3)
            };
            widgets.push(timObject);
        });

        //Parse to JSON String
        var jWidgets = $.toJSON(widgets);
    
        //Single Settings
        var saveStateSettings = {
            customiseOpen: !$(allsorts.settings.customiseContent).is(":hidden")
        };
        
        var jSaveStateSettings = $.toJSON(saveStateSettings);

        //Save to Cookie
        $.cookie(COOKIE_NAME, jWidgets, { path: '/', expires: 30 });
        $.cookie(COOKIE_NAME_SETTINGS, jSaveStateSettings, { path: '/', expires: 30 });

        //Post JSON string for server side save
        if (allsorts.settings.url != '')
            $.post(allsorts.settings.url, { widgets: jWidgets });
    },

    //Load Widget State
    loadSort: function(setup) {
        var jWidgets = (setup && setup != '' ? setup : $.cookie(COOKIE_NAME)), widgets;
        
        if (jWidgets) {
            widgets = $.evalJSON(jWidgets);
            for (var i = widgets.length - 1; i >= 0; i--) {
                var widgetState = widgets[i];
                var $widget = $("h2:contains('" + widgetState.title + "')").parents(allsorts.settings.widgetSelector);

                //Move to Column Position
                $("#" + widgetState.parentid).prepend($widget);

                //Set Visible
                allsorts.toggleVisible($widget, widgetState.visible, false);

                //Set Collapsed
                if (widgetState.visible) {
                    allsorts.toggleCollapse($widget, widgetState.collapsed, false);
                }

                //Set Visible Children
                allsorts.setVisibleChildren($widget, widgetState.childCount, false);
            }
        } else {
            //Set Defaults
            var $sortableItems = allsorts.getSortableItems();
            $.each($sortableItems, function() {
                allsorts.setVisibleChildren($(this), 3, false);
            });
        }
        
        var jSaveStateSettings = $.cookie(COOKIE_NAME_SETTINGS), saveStateSettings;
        if(jSaveStateSettings){
            saveStateSettings = $.evalJSON(jSaveStateSettings);
            allsorts.toggleCustomise(saveStateSettings.customiseOpen);
        }
    }
};
