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;
    }
    return new Ajax.InPlaceCollectionEditor(
        $(element),
        url,
        {collection: allowedValues, callback: callbackFunc});
}


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 {
            console.info('Received response');
        }
    }
    console.info('Creating reboot updater');
    periodicalUpdater = new Ajax.PeriodicalUpdater($(element), updateUrl, {
                evalScripts: true,
                frequency: 5,
                decay: 1,
                onSuccess: hook,
                onFailure: hook
    });
}


function createPeriodicalUpdater(element, updateUrl, bootUrl)
{
    function hook(transport) {
        if (!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});
}
