function watermark(el, value) {
    el.onfocus = function(event) {
        if (! el.className.match(/empty/)) {
            return;
        }
        el.className = el.className.replace(/empty/, "");
        el.value = "";
    };
    el.onblur = function(event) {
        if (el.value) {
            return;
        }
        if (el.className) {
            el.className += " ";
        }
        el.className += "empty";
        el.value = value;
    }
    el.value = "";
    el.onblur(null);
}

var doNotSubmit = false;

function submit(el, value) {
    if (value != "no") {
        return;
    }
    var form = el.parentNode;
    while (form.tagName != "FORM") {
        form = form.parentNode;
    }
    form.onsubmit = function(event) {
        if (doNotSubmit) {
            doNotSubmit = false;
            return false;
        }
    }
    for (var i = 0; i < form.elements.length; i++) {
        if (form.elements[i] == el) {
            break;
        }
    }
    el.onkeydown = function(event) {
        event = event || window.event;
        var charCode = event.charCode || event.which || event.keyCode;
        if (charCode == 13 || charCode == 3) {
            var j = i;
            var el2 = form.elements[++j];
            while (el2.getAttribute("type") == "hidden") {
                el2 = form.elements[++j];
            }
            el2.focus();
            doNotSubmit = true;
            setTimeout(function(event) {
                doNotSubmit = false;
            }, 100);
            return false;
        }
    }
}

function effect(el, value /* ... */) {
    var args = value.split(new RegExp(" +", "g"));
    var effect = args[0];
    var effectPairs = values(MochiKit.Visual.PAIRS);
    if (findValue(flattenArray(effectPairs), effect) == -1) {
        return;
    }
    if (/^slide/.test(effect)) {
        // removeEmptyTextNodes(el);
        if (el.childNodes.length == 0) {
            var parent = el.parentNode;
            logDebug(parent);
            removeNodeAttribute(el, "x-keirn-toolbox");
            el = DIV(null, el);
            logDebug(el);
            replaceChildNodes(parent, el);
        }
    }
    var inEffects = map(itemgetter(0), effectPairs);
    if (findValue(inEffects, effect) != -1) {
        hideElement(el);
    }
    else {
        showElement(el);
    }
    setStyle(el, {'visibility': "visible"});
    var options = {};
    if (args.length > 1) {
        options["duration"] = parseFloat(args[1]);
    }
    MochiKit.Visual[effect](el, args[0], options);
}

function walkAndApply() {
    // Pour chaque élément du DOM ...
    var els = document.getElementsByTagName("*");
    for (var i = 0; i < els.length; i++) {
        var el = els[i];
        // ... présentant l'attribut 'x-keirn-toolbox'
        var attrs = el.getAttribute("x-keirn-toolbox");
        if (attrs != undefined) {
            // puis pour chacunes des directives ...
            attrs = attrs.split(";");
            for (var j = 0; j < attrs.length; j++) {
                var attr = attrs[j].split(":");
                // ... normalisée,
                if (!attr[0]) {
                    continue;
                }
                if (attr.length == 1) {
                    attr.push("");
                }
                var key = attr[0].replace(/^\s+/, "").replace(/\s+$/, "");
                var value = attr[1].replace(/^\s+/, "").replace(/\s+$/, "");
                // appliquer la modification correspondante si elle existe.
                try {
                    window[key](el, value);
                }
                catch(e) {
                    alert(key + ": " + e);
                }
            }
        }
    };
}

function addEventHandler(object, eventName, callback) {
    var listener = object[eventName];
    object[eventName] = function(event) {
        if (listener) {
            listener(event);
        }
        var r = callback(event);
        return r;  // last callback result only is returned to the event producer
    }
}

addEventHandler(window, "onload", walkAndApply)


