if (typeof _H !== 'object') var _H = {};
if (typeof _H.DOM !== 'object') _H.DOM = {};
if (typeof _H.DIESEL !== 'object') _H.DIESEL = {};

_H.Author = {
    'Name'          : 'Fabrizio Calderan', 
    'Company'       : 'H-art', 
    'Last-revision' : '2008.17.06'
};

_H.DOM.$ = function(id) {
    if (typeof id === 'object') return id;
    return (document.getElementById)
        ? document.getElementById(id)
        : document.all(id);
};


_H.DOM.hasClass = function(e,cls) {
    return e.className.match(new RegExp('(\\b|^)'+cls+'(\\b|$)'));
};


_H.DOM.addClass = function(el, c) {
    if (el.className !== '') { 
        var classes = el.className.split(' ');
        for (var i=0; i<classes.length; i++) { 
	  		if (c.toLowerCase() === classes[i].toLowerCase()) { return; } 
    	}
    }
    el.className = [el.className, c].join(' ');
};

_H.DOM.removeClass = function(el, c) {
    var cRe = new RegExp(['(^|\\b)', c, '($|\\b)'].join(''), 'i');
    el.className = el.className.replace(cRe, '');
    if (el.className.toString() === '') { 
		el.removeAttribute('class'); 
	}
};



_H.DOM.Builder = 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      = {
        "&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                  = { };
    
    
    
    /* Private methods */

    var _getElements    = function(e) { 
        return e.split(_separator)[0];       
    };
	       
        
    var _createEntityReference  = function(text) {
        return text.replace(/(&[^;]+?;)/g, function(entity) {
            return _entityUnicode[entity] || "<unknown entity>";
        });
    };
        
    
    var _setStyle       = function(node, csstext) {
        if (document.all && !window.opera) {
            node.style.setAttribute('cssText', csstext, 0);
        } else {
            node.setAttribute('style', csstext);
        }    
    };        
        
    /* Public/Privileged methods */
        
    return {
            
        setSeparator    : function(s) {
            if (/^[^a-z]{1}$/i.test(s)) {
                _separator = s;
            }
        },
            
            
        remove          : function(node, complete) {
            var node = _H.DOM.$(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;
                                        
                                case    "style" : 
                                    _setStyle(node, obj[p]);
                                    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.DOM.$(node)
                : _H.DOM.$(_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;
        }       
    }
    
};

/*  ---------- */

if (typeof _H.Cookie !== 'object') _H.Cookie = { };

_H.Cookie = function() {

    return {
        
        create      : function(name, value, days) {
            if (days) {
                var date    = new Date();
                date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
                var expires = "; expires = " + date.toGMTString();
            }
            else var expires = "";
            document.cookie = name+"="+value+expires+"; path=/";
        },
            
        read        : function(name) {
            var nameEQ = name + "=";
            var ca = document.cookie.split(';');
            for(var i=0;i < ca.length;i++) {
                var c = ca[i];
                while (c.charAt(0)==' ') c = c.substring(1,c.length);
                if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
            }
            return null;
        },

        remove      : function(name) {
            this.create(name,"",-1);
        }        
    }
};



/* -------------- */


DomLoad.load(function() {
    
    /* handle legal terms popup */
    if (_H.DOM.$('legalterms')) {
        var link = _H.DOM.$('legalterms');
        link.onclick    = function() {
            
            var url     = this.href;
            var id      = (this.id || ''); 
            var popup = window.open(url, id, 'width=475,height=700,scrollbars=yes,toolbar=no,status=no,resizable=no');
            popup.focus();
            
            return false;
        };
    }

});
