
// TODO: Move to global events file
Event.observe(window, 'load', function () { 
	globalInit();
});

// TODO: Sort out methods in global and (sub) controller-scope files/sections/namespaces

function toggleVisibility(clickedElem, openImgUrl, closedImgUrl) {
    var elem = $(clickedElem).next();
    var img = $(clickedElem).down();
    if (elem.visible()) {
        new Effect.BlindUp(elem);
        img.writeAttribute('src', closedImgUrl);
    }
    else {
        new Effect.BlindDown(elem);
        img.writeAttribute('src', openImgUrl);
    }
}

function toggleVisibilityOrLoad(clickedElem, loadChildrenUrl, openImgUrl, closedImgUrl) {
    var elem = $(clickedElem).next();
    var img = $(clickedElem).down();
    if (elem.empty()) {
        twidgets.Loader.show();
        new Ajax.Request(
            loadChildrenUrl,
            {
                onSuccess: function (transport) {
                    elem.update(transport.responseText);
                    new Effect.BlindDown(elem, { queue: 'end' });
                    img.writeAttribute('src', openImgUrl);
                },
                onComplete: function () {
                    twidgets.Loader.hide();
                }
            });
        return;
    }
    toggleVisibility(clickedElem, openImgUrl, closedImgUrl);
}

function createInPlaceEditor(element, explanationElement, url, xmlPathValue) {
    function callbackFunc(form, editValue) {
        var params = $(form).serialize(true);
        params['xmlPath'] = xmlPathValue;
        return params;
    }
    function enterEditMode(form, value) {
        $(explanationElement).show();
    }

    function leaveEditMode(form, value) {
        $(explanationElement).hide();
    }

    function failureCallback() {
        alert("Error: Invalid configuration value");
    }
    return new Ajax.InPlaceEditor(
        $(element),
        url,
        {callback: callbackFunc, onEnterEditMode: enterEditMode, onLeaveEditMode: leaveEditMode, onFailure: failureCallback});
}

function createInPlaceCollectionEditor(element, url, allowedValues, xmlPathValue)
{
    function callbackFunc(form, editValue) {
        var params = $(form).serialize(true);
        params['xmlPath'] = xmlPathValue;
        return params;
    }
    function failureCallback() {
        alert("Error: Invalid configuration value");
    }
    return new Ajax.InPlaceCollectionEditor(
        $(element),
        url,
        {collection: allowedValues, callback: callbackFunc, onFailure: failureCallback});
}


function createRebootPeriodicalUpdater(element, updateUrl)
{
    function hook(transport) {
        if (!transport.responseText) {
            console.info('No response text');
            transport.responseText = '<h3>Please wait, rebooting...</h3> (this may take several minutes)';
        } else {
            transport.responseText = '<h3>Redirecting...</h3>';
            window.location.href = '/';
        }
    }

    console.info('Creating reboot updater');
    periodicalUpdater = new Ajax.PeriodicalUpdater($(element), updateUrl, {
                evalScripts: true,
                frequency: 5,
                decay: 1,
                onSuccess: hook,
                onFailure: hook
    });
}


function okStatus(status)
{
    return status >= 200 && status < 300;
}

function validAjaxCode(text)
{
    return text.substring(0, 9) != '<!DOCTYPE' && text != '';
}

function createPeriodicalUpdater(element, updateUrl, bootUrl)
{
    function hook(transport) {
        if (!validAjaxCode(transport.responseText) || !okStatus(transport.status)) {
            transport.responseText = '';
            periodicalUpdater.stop();
            createRebootPeriodicalUpdater($(element), bootUrl);
        }
    }

    console.info('Creating update');
    periodicalUpdater = new Ajax.PeriodicalUpdater($(element), updateUrl, {
                evalScripts: true,
                frequency: 3,
                decay: 1,
                onSuccess: hook,
                onFailure: hook});
}

