/* -*- Mode: JavaScript; tab-width: 4; indent-tabs-mode: nil; coding: utf-8 -*- */
/*////////////////////////////////////////////////////////////////////////////
// 11cl
//
// Form helper functions.
//
// Copyright(C) 2009-2011, xplo.re IT Services, Michael Maier.
// All rights reserved.
//
// $Id: forms.js 172 2011-10-01 16:45:31Z takerukoushirou $
*/

//----------------------------------------------------------------------------
function bindDisplay(obj_, r_, v_, n_, x_, o_)
{
    var value = $(obj_);

    if (value.type == 'checkbox' || value.type == 'radio')
    {
        value = value.checked;
    }
    else
    {
        value = value.value;
    }

    if ( n_ && null != v_ &&  v_.indexOf (value) <  0
    ||   n_ && null == v_ && !value
    ||  !n_ && null != v_ &&  v_.indexOf (value) >= 0
    ||  !n_ && null == v_ &&  value)
    {
        if (x_)
        {
            $(r_).show();
        }
        else
        {
            window.setTimeout (
                function() {
                    Effect.Appear (r_, {duration: 0.5});
                },
                350
                );
        }
    }
    else
    {
        if (x_)
        {
            $(r_).hide();
        }
        else
        if (!o_)
        {
            Effect.Fade (r_, {duration: 0.3});
        }
    }
}

//----------------------------------------------------------------------------
function fireNativeEvent(element_, event_)
{
    if (document.createEvent)
    {
        var event =
            document.createEvent('HTMLEvents');

        event.initEvent(event_, true, true);

        return (!element_.dispatchEvent(event));
    }
    else
    {   // IE-specific.
        var event =
            document.createEventObject();

        return (element_.fireEvent('on' + event_, event));
    }
}

//----------------------------------------------------------------------------
function validateNumber(obj_, min_, max_, f_)
{
    var numScalar =
        parseFloat(obj_.value);

    if (isNaN(numScalar))
    {
        numScalar = 0.0;
    }

    var num =
        numScalar;

    if (!f_)
    {
        num =
            Math.round(num);
    }

    if (typeof max_ != "boolean")
    {
        num =
            Math.min(max_, num);
    }

    if (typeof min_ != "boolean")
    {
        num =
            Math.max(min_, num);
    }

    var newValue =
        num.toString();

    if (obj_.value != newValue)
    {
        var exInfo;

        if (typeof max_ != "boolean" && numScalar > max_)
        {
            exInfo =
                ' The value entered exceeds an upper' +
                ' limit of ' + max_.toString() + '.';
        }
        else
        if (typeof min_ != "boolean" && numScalar < min_)
        {
            exInfo =
                ' The value entered is smaller than the lower' +
                ' limit of ' + min_.toString() + '.';
        }
        else
        {
            exInfo = '';
        }

        alert(
            'Warning:\n' +
            'Automatically fixed the last entered number field value.' +
            ' Please test, whether the new value is correct.' + exInfo
            );
    }

    obj_.value = newValue;
}

//----------------------------------------------------------------------------
// Exception-safe focus setter.
function tryFocus(element_)
{
    try {
        element_.focus();
    }
    catch (e)
    {
        return (false);
    }

    return (true);
}

//----------------------------------------------------------------------------
function isHidden(e_)
{
    element = $(e_);

    while (typeof(element.style) != 'undefined')
    {
        if (element.style.display == 'none')
        {
            return (true);
        }
        else
        {
            element =
                element.parentNode;
        }
    }

    return (false);
}

//----------------------------------------------------------------------------
function textDefaultSet(n_, d_)
{
    var input = $(n_);

    if (input.value == '') {
        input.value = d_;
    }

    if (input.value == d_) {
        input.setStyle({color: '#777'});
    }
}

//----------------------------------------------------------------------------
function textDefaultUpdate(n_, d_)
{
    var input = $(n_);

    if (input.value == d_) {
        input.value = '';
    }

    input.setStyle({color: 'black'});
}

//----------------------------------------------------------------------------
Event.observe(window, 'dom:loaded',
    function() {
        $$('.collapsable').each (function(node) {
            node = $(node);
            node.addClassName('closed');
            var content = node.select('div')[0];
            var header = node.select('h2')[0];
            content.hide();
            header.innerHTML = header.innerHTML;
            Event.observe(header, 'click', function() {
                // Avoid messed up height if switched during action.
                content.style.height = '';
                if (node.hasClassName('closed')) {
                    new Effect.BlindDown(content, {duration: 0.3, fps: 100});
                    Element.removeClassName(node, 'closed');
                } else {
                    new Effect.BlindUp(content, {duration: 0.3, fps: 100});
                    Element.addClassName(node, 'closed');
                }

                return (false);
            });
        });
    });
