    /*
        This script tries to refer a global-scope hash named 'blockProperties'
        'blockProperties' should have the following minimal interface interface:
            blockProperties = {
                labels : {
                    switchOn: <aSwitchOnLabel>
                    switchOff: <aSwitchOffLabel>
                }
            }
    */

    blockProperties = {
            labels : { // default values. Override them in the html header
                    alternativeText: "",
                    switchMeOn: "switch on",
                    switchMeOff: "switch off"
                } // labels
        }; // blockProperties


    /* className pattern used to identify those of DOM objects
       that will be handle click events to switch on/off switchable objects */
    //var BLOCK_SWITCH_CLASSNAME = "switch";

    /* keyword used in classnames to indicate if an object is a binary switch */
    var SWITCH      = "switch" ;
    /* keywords used in classnames to store ON/OFF state of switchable object  */
    var SWITCHED_ON         = "switchedOn";
    var SWITCHED_OFF        = "switchedOff";
    var SWITCHED_OFF_ON_INIT    = "switchedOffOnInit"; // accessibility

    /* RegExps used to find information from object classNames  */
    var TEXT_BOUNDARY           = new String("\\b");
    var IS_SWITCH_RE        = new RegExp(TEXT_BOUNDARY + SWITCH + TEXT_BOUNDARY);
    var STATE_RE        = new RegExp(TEXT_BOUNDARY + SWITCHED_ON + TEXT_BOUNDARY
                        + "|" + TEXT_BOUNDARY + SWITCHED_OFF + TEXT_BOUNDARY
                        + "|" + TEXT_BOUNDARY + SWITCHED_OFF_ON_INIT + TEXT_BOUNDARY);
    var SWITCHED_ON_STATE_RE        = new RegExp(TEXT_BOUNDARY + SWITCHED_ON + TEXT_BOUNDARY);
    var SWITCHED_OFF_STATE_RE       = new RegExp(TEXT_BOUNDARY + SWITCHED_OFF + TEXT_BOUNDARY);
    var SWITCHED_OFF_ON_INIT_STATE_RE   = new RegExp(TEXT_BOUNDARY + SWITCHED_OFF_ON_INIT + TEXT_BOUNDARY);


    function initAllBlocks() {

        if(!document.getElementById) { // return if browser does not support DOM
            return;
        }

        /* Define a function that returns the node that stores the block state class */
        function getStateNode(node) {
            // alert("node tagName : "+node.tagName+", node.parentNode : "+node.parentNode);
            return (STATE_RE.test(node.parentNode.className)) ? node.parentNode : null;
        }

        var nodes = document.getElementsByTagName("*"); // collect all DOM nodes from page
        for(var i=0; i<nodes.length; i++) { // and parse them

            if(!IS_SWITCH_RE.test(nodes[i].className)) {     // continue if the node is not a switch
                continue;
            }

            var switchNode = nodes[i]; // the node is a switch
            var stateNode = getStateNode(switchNode); // retrieve the state node

            if(null != stateNode) { // if the state node exists

                // switch off blocks that must be initialized "closed"
                if(SWITCHED_OFF_ON_INIT_STATE_RE.test(stateNode.className)) {
                    stateNode.className = stateNode.className.replace(SWITCHED_OFF_ON_INIT_STATE_RE, SWITCHED_OFF);
                    stateNode.title = blockProperties.labels.switchMeOn;
                }
                // ie : styling switchNode : text must be non-selectable. See CSS file for other browser settings
                //TODO: move this styling elsewhere
                if(switchNode.attachEvent) { // is browser IE ?
                    switchNode.onselectstart = function() { return false; };
                    switchNode.setAttribute('unselectable', 'on', 0);
                }
                var onClickEventHandler = function(e) { // define an handler for the "onclick" event

                        var self = null; // reference to the DOM object that emitted the event
                        if(e.target) {
                            self = e.target;
                                        e.stopPropagation();
                        } else if(window.event.srcElement) {
                            self = window.event.srcElement;
                                        e.cancelBubble = true;
                        }
                        if(null == self) {
                            var msg = "Error: onClickEventHandler, self is null";
                            alert(msg);
                            throw new Error(msg);
                        }

                        var stateNode = getStateNode(self) ;
                        if(null == stateNode) {
                            var msg = "Error: stateNode is null";
                            alert(msg);
                            throw new Error(msg);
                        }

                        if(STATE_RE.test(stateNode.className)) {
                            var newState = null, newTitle = null;
                            if(SWITCHED_ON_STATE_RE.test(stateNode.className)) {
                                newState = SWITCHED_OFF;
                                newTitle = blockProperties.labels.switchMeOn;
                            } else if(SWITCHED_OFF_STATE_RE.test(stateNode.className)) {
                                newState = SWITCHED_ON;
                                newTitle = blockProperties.labels.switchMeOff;
                            } else {
                                var msg = "Error: newState is undefined";
                                alert(msg);
                                throw new Error(msg);
                            }
                            stateNode.className = stateNode.className.replace(STATE_RE, newState);
                            stateNode.title = newTitle;
                        }
                    }; // onClickEventHandler

                // add the event handler to the switch node

                if(switchNode.addEventListener) { // Mozilla
                    switchNode.addEventListener("click", onClickEventHandler, true);
                } else if(switchNode.attachEvent) { // IE
                    switchNode.attachEvent("onclick", onClickEventHandler);
                }
            }
        }
    }

   if(window.addEventListener) {
       window.addEventListener("load", initAllBlocks, true);
   } else if(window.attachEvent) {
       window.attachEvent("onload", initAllBlocks);
   }


