﻿var _container;// = '.widget-sortable';
var _panes;// = ['.ContentPane'];
var _cookieName;
var _defaultPane;
var _removedList = '#dnn_removedWidgets';

function initAjaxCallback()
{
    if (typeof(__theFormPostData) !== 'undefined')
    {
        if (__theFormPostData == '')
        {
            WebForm_InitCallback();
        }
    }
}

// Initializes neccessary variables for jQuery srcipt
//  selector : string           - jQuery selector for container element
//  panes : Array of string    - jQuery selectors for panes to register
function initSortable(containerSelector, paneSelectors, callback)
{
    _container = containerSelector;
    _panes = paneSelectors;
    _callback = callback;
    _defaultPane = _panes.split(',')[0];
}

function callbackError(message, context)
{
    if (message != null)
    {
        alert(message);
    }
}

function setCookieName(moduleId)
{
    _cookieName = '_Module' + moduleId + '_Sortable_';
}

function getVisibleCookieName(moduleId) {
    return '_Module' + moduleId + '_Visible';
}

function setDefaultPane(pane) {
    _defaultPane = pane;
}

function setCookie(widgets, pane)
{
    document.cookie = _cookieName + pane + '=' + widgets;
}

function getCookie(pane) {
    var name = _cookieName + pane;
    return readCookie(name);
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
    return null;
}


// Enables jQuery sortable effect as configured with initSortable(..) method
//  widgets : Array of int    - sorted list of ModuleId for widgets
function startSortable(widgets, widgetPanes, isAuthenticated)
{
    $(document).ready(function() {
        initAjaxCallback();

        // wrap container into <div> with module id
        $(_container).prev('a').wrap(function() {
            return '<div id="' + $(this).attr('name') + '" class="widgetWrapper" />';
        });

        $(_container).prev('div').append(function() {
            return $(this).next('div').detach();
        });

        //fixed widget handling obsolete - should be positioned by DNN layout
        //$(_defaultPane).prepend($(_defaultPane).children('.widget-fixed').detach());

        // sort widgets initially
        for (i = 0; i < widgets.length; i++) {
            $(widgetPanes[i]).append($(widgets[i]).detach());
        }

        $(_container).fadeIn();

        $(_panes).addClass('widgetPane');

        // turn on .sortable
        $(_panes).sortable({
            connectWith: _panes, handle: 'h3', items: '.widgetWrapper', appendTo: 'body', helper: 'clone', placeholder: 'ui-state-highlight', forcePlaceholderSize: true, tolerance: 'pointer',
            update: function(event, ui) {
                var pane = $(this).attr('id');
                if (pane == "")
                    return;

                if ('#' + pane == _removedList) {
                    removedListChanged();
                }

                var widgets = $(this).sortable('toArray');

                if (isAuthenticated) {
                    callback(widgets, pane);
                }
                else {
                    setCookie(widgets, pane);
                }
            }
        });

        removedListChanged();
        enableCloseEvent(isAuthenticated);
        enableRestoreEvent(isAuthenticated);
        if (isAuthenticated) {
            enableVisibleChangedEvent();
        }
    });
}
        
function enableVisibleChangedEvent()
{
    $(".widgetPane " + _container + " .visible").children().bind('click', function() {
        toggleVisibility($(this).parents(".widgetWrapper"));
    });
}

function enableCloseEvent(isAuthenticated) {
    $(".widgetPane .close").children().click(function() {
        close($(this).parents(".widgetWrapper"), isAuthenticated);
    });
}

function enableRestoreEvent(isAuthenticated) {
    $(".widgetPane .restore").children().click(function() {
        restore($(this).parents(".widgetWrapper"), isAuthenticated);
    });
}

function toggleVisibility(widget) {
    var widgetId = $(widget).attr("id");

    var visible = !(getVisibilityState(widgetId) === 'false'); // causes empty hidden field value == true
    callback_visibility(widgetId, !visible);
    setVisibilityState(widgetId, !visible);
}

function close(widget, isAuthenticated) {
	if(widget.length == 0)
		return;

    var widgetId = $(widget).attr('id');
    
    var oldPane = $(widget).parents(".ui-sortable").attr("id");
    $(_removedList).append($(widget).detach());
    var newPane = $(widget).parents(".ui-sortable").attr("id");

    removedListChanged();

    if (isAuthenticated) {
        callback_close(widgetId, true, $(_removedList).attr("id"));
    } else {
        removeFromCookie(oldPane, widgetId);
        appendToCookie(newPane, widgetId);
    }
}

function restore(widget, isAuthenticated) {
    var widgetId = $(widget).attr('id');

    var oldPane = $(widget).parents(".ui-sortable").attr("id");
    var firstWidget = $(_defaultPane).children(".widgetWrapper").first();
    if (!(firstWidget == null || firstWidget.length == 0)) {
        firstWidget.before($(widget).detach())
    }
    else {
        $(_defaultPane).append($(widget).detach());    
    }
    var newPane = $(widget).parents(".ui-sortable").attr("id");

    removedListChanged();

    if (isAuthenticated) {
        callback_close($(widget).attr('id'), false, $(_defaultPane).attr("id"));
    } else {
        removeFromCookie(oldPane, widgetId);
        prependToCookie(newPane, widgetId);
    }
}

function appendToCookie(pane, item) {
    var cookie = getCookie(pane);
    if (cookie != null) {
        cookie = appendToCsv(cookie, item);
        setCookie(cookie, pane);
    }
    else {
        setCookie(item, pane);
    }    
}

function prependToCookie(pane, item) {
    var cookie = getCookie(pane);
    if (cookie != null) {
        cookie = prependToCsv(cookie, item);
        setCookie(cookie, pane);
    }
    else {
        setCookie(item, pane);
    }
}

function removeFromCookie(pane, item) {
    var cookie = getCookie(pane);
    if (cookie != null) {
        cookie = removeFromCsv(cookie, item);
        setCookie(cookie, pane);
    }
}

function appendToCsv(csv, item) {
    if (csv == "") {
        return item;
    }
    else {
        return csv + "," + item;
    }
}

function prependToCsv(csv, item) {
    if (csv == "") {
        return item;
    }
    else {
        return item + "," + csv;
    }
}

function removeFromCsv(csv, item) {
    csv = csv.replace(item, "");
    csv = csv.replace(/,,/, ",");
    csv = csv.replace(/(^,|,$)/, "");
    return csv;    
}

function setVisibilityState(widgetId, state) {
    $(".widgetWrapper#" + widgetId + " .visible-state").val(state);
}

function getVisibilityState(widgetId) {
    return $(".widgetWrapper#" + widgetId + " .visible-state").val();
}

function removedListChanged() {
    if ($(".removedWidgets").children().length > 0) {
        $(".removedWidgets-data").show();
        $(".removedWidgets-no-data").hide();
    }
    else {
        $(".removedWidgets-data").hide();
        $(".removedWidgets-no-data").show();
    }
}
