var _H = {

    hasClass        : function(e,cls) {
        if (!e.className) return false;
        return e.className.match(new RegExp('(\\b|^)'+cls+'(\\b|$)'));
    },


    addClass        : function(e,cls) {
        if (!this.hasClass(e,cls)) e.className += " " + cls;
    },


    removeClass     : function(e,cls) {
        if (_H.hasClass(e,cls)) {
            var reg = new RegExp('(\\b|^)'+ cls +'(\\b|$)');
            e.className = e.className.replace(reg, '');
        }
    },


    switchClass    : function(e, fromClass, toClass) {
        _H.removeClass(e, fromClass);
        _H.addClass(e, toClass);
    },


    $               : function(id) {
        if (typeof id !== 'string') return id;
        return (document.getElementById)
            ? document.getElementById(id)
            : document.all[id];
    },

    trim            : function(s) {
        return s.replace(/^\s+/, '').replace(/\s+$/, '');
    },


    $$              : function(root, e) {
        return root.getElementsByTagName(e);
    },


    addEvent        : function(el, event, fn, capture) {
        if (el.addEventListener) {
                el.addEventListener(event, fn, capture); return true;
        }
        else if (el.attachEvent) {
                var r = el.attachEvent('on' + event, fn); return r;
        }
        else { el['on' + event] = fn; }
    }

};



/*
    Author: Fabrizio Calderan, http://www.fabriziocalderan.it/
    Version 1.0 release 2008-08-01.
*/

_H.DOM = function() {

    /* Private properties */

    var _separator          =  "~";
    var _defaultNode        =  document.body;


    /* some useful shortcuts. Add your own shortcuts here. */
    var _shortProperties    =  {
            "class"     : "className",
            "for"       : "htmlFor",
            "longdesc"  : "longDesc",
            "text"      : "innerHTML",
            "url"       : "href"
    };


    /*
        Entities can't be written with 'createTextNode' method, so we need to
        convert all entities into unicode sequences. Add your own entities here.
     */
    var _entityUnicode      = {
        "&nbsp;"    : " ",
        "&quot;"    : "\u0022",
        "&agrave;"  : "\u00e0",
        "&ccedil;"  : "\u00e7",
        "&egrave;"  : "\u00e8",
        "&eacute;"  : "\u00e9",
        "&igrave;"  : "\u00ec",
        "&ograve;"  : "\u00f2",
        "&ugrave;"  : "\u00f9",
        "&laquo;"   : "\u00ab",
        "&raquo;"   : "\u00bb",
        "&copy;"    : "\u00a9"
    };


    /* For memoization of nodes */
    var _cache                  = { };

    var _getElements    = function(e) {
        return e.split(_separator)[0];
    };


    var _createEntityReference  = function(text) {
        return text.replace(/(&[^;]+?;)/g, function(entity) {
            return _entityUnicode[entity] || "<unknown entity>";
        });
    };



    /* Public/Privileged methods */

    return {

        setSeparator    : function(s) {
            if (/^[^a-z]{1}$/i.test(s)) {
                _separator = s;
            }
        },


        remove          : function(node, complete) {
            var node = _H.$(node);
            if (node) {
                if (!!complete) {
                    node.parentNode.removeChild(node);
                };
                while (node.childNodes[0]) node.removeChild(node.childNodes[0]);
                return true;
            };
            return false;
        },


        create          : function(obj) {

            /* Create a DOM Fragment */
            this.df = document.createDocumentFragment();

            /* Return a recursive function */
            return (function(obj, node, self) {

                for (var p in obj) {

                    if (obj.hasOwnProperty(p)) {
                        var el = _getElements(p);

                        if (typeof obj[p] === 'object') {
                            if (!_cache[el]) {
                                _cache[el] = document.createElement(el);
                            };
                            var elementNode = _cache[el].cloneNode(false);
                            arguments.callee(obj[p], elementNode);
                            node.appendChild(elementNode);
                        }
                        else {
                            var attribute = (_shortProperties[el])? _shortProperties[el] : el;
                            switch(attribute) {

                                case    "innerHTML" :
                                    var textNode = document.createTextNode(_createEntityReference(obj[p]));
                                    node.appendChild(textNode);
                                    break;

                                default             : node[attribute] = obj[p];

                            }
                        }
                    }

                }; /* end [for..in] */

                if (self) return self; /* end 'for' loop at first recursion */

            })(obj, this.df, this);

        },


        append          : function(type, node) {

            _defaultNode = (node)
                ? _H.$(node)
                : _H.$(_defaultNode);

            if (_defaultNode) {
                switch(type.toLowerCase()) {

                    case "before"           :
                            var pNode = _defaultNode.parentNode;
                            return pNode.insertBefore(this.df, _defaultNode);
                            break;
                    case "after"            :
                            var pNode = _defaultNode.parentNode;
                            return pNode.insertBefore(this.df, _defaultNode.nextSibling);
                            break;

                    case "into"             :
                    case "inside"           :
                            return _defaultNode.appendChild(this.df);
                            break;

                    default : throw "Unknown 'type' argument in 'append' method.";
                }
            };

            return false;
        }
    }
};



_H.Tab = function() {

    var panelsLink  = [];
    var currentOpen = 0;
    var viewArrows  = false;

    var arrows      = new _H.DOM();
    var left_arr_link;
    var prev_arr_link;


    var setCurrentLink = function(tl) {

        var links  = _H.$$(_H.$(tl), 'a');
        var i      = links.length;
        _H.addClass(links[currentOpen].parentNode, 'current');

        while (i--) {
            var id = links[i].hash.substr(1);
            if (id !== '') {
                panelsLink[i] = {};
                panelsLink[i]['node'] = links[i];
                panelsLink[i]['id'] = id;

                var panelClass = (i === currentOpen)? 'panel_v' : 'panel_h';
                _H.addClass(_H.$(id), panelClass);
            }
        };

        if (viewArrows && panelsLink.length > 1) {

            var prev_arrow  = {
                "li": {
                    "a" : {
                        "text"      : "Precedente",
                        "class"     : "prev_arrow",
                        "href"      : "#",
                        "onclick"   : function() { goToPanel(-1) }
                    }
                }
            };
            var next_arrow  = {
                "li": {
                    "a" : {
                        "text"      : "Successivo",
                        "class"     : "next_arrow",
                        "href"      : "#",
                        "onclick"   : function() { goToPanel(1) }
                    }
                }
            };

            arrows.create(prev_arrow).append("before", panelsLink[0]['node'].parentNode);
            arrows.create(next_arrow).append("after", panelsLink[panelsLink.length-1]['node'].parentNode);

            links  = _H.$$(_H.$(tl), 'a');
            prev_arr_link = links[0];
            next_arr_link = links[links.length - 1];
        };

        setLinkEvent();
        if (viewArrows) { enableArrows(); }
    };


    var setLinkEvent   = function() {
        var i = panelsLink.length;
        while (i--) {
            var link = panelsLink[i]['node'];
            link.onclick = (function(i) {
                return function() {

                    if (!_H.hasClass(this.parentNode, 'current')) { switchView(i) };
                    return false;
                }
            })(i);
        }
    };


    var switchView      = function(i) {

        idC         = _H.$(panelsLink[currentOpen]['id']);
        idO         = _H.$(panelsLink[i]['id']);
        prevLink    = panelsLink[currentOpen]['node'];
        nextLink    = panelsLink[i]['node'];

        currentOpen = i;
        if (viewArrows) { enableArrows(); }

        oldIE = jQuery.browser.msie && (jQuery.browser.version < 7);
        if (typeof jQuery === 'function' && !oldIE) {
            jQuery(idC).fadeOut("normal", function() {
                _H.switchClass(idC, 'panel_v', 'panel_h');
                _H.removeClass(prevLink.parentNode, 'current');
                jQuery(idO).fadeIn("normal", function() {
                    _H.addClass(nextLink.parentNode, 'current');
                    _H.switchClass(idO, 'panel_h', 'panel_v');
                });
            });
        }
        else {
            _H.removeClass(prevLink.parentNode, 'current');
            _H.addClass(nextLink.parentNode, 'current');
            _H.switchClass(idC, 'panel_v', 'panel_h');
            _H.switchClass(idO, 'panel_h', 'panel_v');
        };

        return false;
    };

    var stopPanel       = function()    { return false; };
    var goToPanel       = function(inc) { return switchView(currentOpen + inc); };

    var enableArrows    = function() {

        var last = panelsLink.length - 1;
        prev_arr_link.onclick = (currentOpen === 0) ? stopPanel : function() { return goToPanel(-1) };
        next_arr_link.onclick = (currentOpen === last) ? stopPanel : function() { return goToPanel(+1) };

        if (currentOpen === 0) _H.addClass(prev_arr_link.parentNode, 'disabled');
            else _H.removeClass(prev_arr_link.parentNode, 'disabled');

        if (currentOpen === last) _H.addClass(next_arr_link.parentNode, 'disabled');
            else _H.removeClass(next_arr_link.parentNode, 'disabled');
    };


    return {

        init : function(tl, tp, op) {
            currentOpen = (op || currentOpen);
            setCurrentLink(tl);
        },

        setViewArrows  : function(s) {
            viewArrows = !!s;
        }
    }
};



function addDOMLoadEvent(func) {

    if (!window.__load_events) {
        var init = function () {

            if (arguments.callee.done) return;
            arguments.callee.done = true;

            if (window.__load_timer) {
                clearInterval(window.__load_timer);
                window.__load_timer = null;
            };

            for (var i=0;i < window.__load_events.length;i++) {
                window.__load_events[i]();
            };
            window.__load_events = null;
        };


        // for Mozilla/Opera9
        if (document.addEventListener) {
            document.addEventListener("DOMContentLoaded", init, false);
        };

        // for Internet Explorer
        /*@cc_on @*/
        /*@if (@_win32)
          document.write("<scr"+"ipt id=__ie_onload defer src=javascript:void(0)><\/scr"+"ipt>");
          var script = document.getElementById("__ie_onload");
          script.onreadystatechange = function() {
              if (this.readyState == "complete") {
                  init(); // call the onload handler
              }
          };
        /*@end @*/

        // for Safari
        if (/WebKit/i.test(navigator.userAgent)) { // sniff
            window.__load_timer = setInterval(function() {
                if (/loaded|complete/.test(document.readyState)) {
                    init(); // call the onload handler
                }
            }, 10);
        };

        // for other browsers
        window.onload = init;

        // create event function stack
        window.__load_events = [];
    };

    // add function to event stack
    window.__load_events.push(func);
};


_H.NK = {};

_H.NK.timeout = null;

_H.NK.flashintro = function() {


    var layer = new _H.DOM();

    layer.create({
        "div": {
            "id"    : "outerlayer",
            "div"   : {
                "id"    : "innerlayer",
                "div"   : {
                    "id"    : "objflash"
                }
            }
        }
    }).append("into", _H.$("outerlayer"));

    _H.$("outerlayer").style.height = [_H.$("flashcnt").offsetHeight, 'px'].join('');


    var vars = {};
    var pars = { "wmode"  : "transparent" };
    swfobject.embedSWF("/swf/nucleo.swf", "objflash", "100%", "805", "9.0.0", "/swf/expressinstall.swf", vars, pars);

};


_H.NK.flashfallback = function() {
    _H.NK.timeout = setTimeout(function() {
        _H.NK.closeintro();
    }, 10000);
}

_H.NK.closeintro = function() {
    var layer = new _H.DOM();
    if (_H.$("outerlayer")) {
        _H.$("outerlayer").parentNode.removeChild(_H.$("outerlayer"));
    }
}

_H.NK.loadintro = function() {
    clearInterval(_H.NK.timeout);
    _H.$("outerlayer").style.background = 'none';
    _H.$("innerlayer").style.background = 'none';
    _H.$("flashcnt").style.visibility = 'visible';
}

