var hes;
if (!hes) hes = {};

hes.functions = {
    id: function(elem) {
        if (!document || !document.getElementById) {
            return false;
        }
        
        elem += '';
        
        return document.getElementById(elem) || false;
    },
    
    tag: function(elem, name) {
        if (!document || !document.getElementsByTagName) {
            return false;
        }
        
        name = name + '';
        
        return (elem || document).getElementsByTagName(name);
    },
    
    attr: function(elem, name, val) {
        if (!elem) {
            return false;
        }
        
        if (!name || name.constructor != String || !val) {
            return false;
        }
        
        name = {'for': 'htmlFor', 'class': 'className'}[name] || name;
        
        if (name == 'style') {
            var styleOld = elem.getAttribute('style');
            
            if (typeof styleOld == 'string') {
                styleOld = styleOld || '';
            } else if (styleOld != null && typeof styleOld == 'object') {
                styleOld = (styleOld.cssText ? styleOld.cssText + ';' : '');
            } else {
                styleOld = '';
            }
            
            elem.style.cssText = styleOld + val;
        } else {
            elem[name] = val;
            
            if (elem.setAttribute) {
                elem.setAttribute(name, val);
            }
    }
        
        return true;
    },
    
    getStyle: function(elem, name) {
        if (elem.style[name]) {
            return elem.style[name];
        } else if (elem.currentStyle) {
            return elem.currentStyle[name];
        } else if (document.defaultView && document.defaultView.getComputedStyle) {
            name = name.replace(/([A-Z])/g, '-$1');
            name = name.toLowerCase();
            
            var s = document.defaultView.getComputedStyle(elem, '');
            
            return s && s.getPropertyValue(name);
        } else {
            return null;
        }
    },
    
    resetCSS: function(elem, prop) {
        var old = {};
        
        for (var i in prop) {
            old[i] = elem.style[i];
            
            elem.style[i] = prop[i];
        }
        
        return old;
    },
    
    restoreCSS: function(elem, prop) {
        for (var i in prop) {
            elem.style[i] = prop[i];
        }
    },
    
    eGuid: 1,
    
    addEvent: function(element, type, handler) {
        if (element.addEventListener) {
            element.addEventListener(type, handler, false);
        } else {

            if (!handler.$$guid) handler.$$guid = this.eGuid++;
            
            if (!element.events) element.events = {};
            
            var handlers = element.events[type];
            
            if (!handlers) {
                handlers = element.events[type] = {};
                
                if (element["on" + type]) {
                    handlers[0] = element["on" + type];
                }
            }
            
            handlers[handler.$$guid] = handler;
            element["on" + type] = this.handleEvent;
//alert(handler);
        }
    },
    
    removeEvent: function(element, type, handler) {
        if (element.removeEventListener) {
            element.removeEventListener(type, handler, false);
        } else {
            if (element.events && element.events[type]) {
                delete element.events[type][handler.$$guid];
            }
        }
    },
    
    handleEvent: function(event) {
        var returnValue = true;
        event = event || hes.functions.fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
        var handlers = this.events[event.type];
        
        for (var i in handlers) {
            this.$$handleEvent = handlers[i];
            if (this.$$handleEvent(event) === false) {
                returnValue = false;
            }
        }
        
        return returnValue;
    },
    
    fixEvent: function(event) {
        event.preventDefault = hes.functions.preventDefault;
        event.stopPropagation = hes.functions.stopPropagation;
        
        return event;
    },
    
    preventDefault: function() {
        this.returnValue = false;
    },
    
    stopPropagation: function() {
        this.cancelBubble = true;
    },
    
    keyE: function(e, key) {
        var code = e.keyCode || e.charCode;
        var k = key;
        
        if (code == k) {
            return true;
        }
        
        return false;
    },
    
    programsShow: function(obj) {
        var id = obj.id;
        var programItemAn = document.getElementById('anonsprogr_' + id);
        var programItemDe = document.getElementById('detailprogr_' + id);

        if (programItemAn.style.display == 'none') {
            programItemAn.style.display = 'block';
            programItemDe.style.display = 'none';
        } else {
            programItemAn.style.display = 'none';
            programItemDe.style.display = 'block';
        }
    }
};