var DU;
if (!DU) DU = {};

DU.Functions = {
    checkVar: function(variable, type) {
        type = type + '';
        
        if (!variable || typeof variable != type) {
            return false;
        }
        
        return true;
    },
    
    array: function(variable, sep) {
        var arr = [], tempArr = variable.split(sep);
        
        if (tempArr.length == 0) {
            return arr;
        }
        
        for (var i = 0; i < tempArr.length; i++) {
            tempArr[i] = this.strReplace(tempArr[i], '[ \t\r\n]', '');
            arr.push(tempArr[i]);
        }
        
        return arr;
    },
    
    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;
    },
    
    textNodes: function(elem) {
        elem = elem.childNodes || elem;
        
        for (var i = 0; i < elem.length; i++) {
            if (elem[i].nodeType == 3 && DU.Functions.trim(elem[i].nodeValue)) {
                return elem[i];
            }
        }
    },
    
    text: function(elem) {
        var t = '';
        
        elem = elem.childNodes || elem;
        
        for (var i = 0; i < elem.length; i++) {
            t += (elem[i].nodeType == 3 ? elem[i].nodeValue : this.text(elem[i].childNodes));
        }
        
        return t;
    },
    
    inserBeforeText: function(elem, str) {
        var temp = document.createElement('span');
        temp.innerHTML = str;
        elem.nodeValue = temp.childNodes[0].nodeValue + elem.nodeValue;
    },
    
    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;
        }
    },
    
    getHeight: function(elem) {
        return parseInt(this.getStyle(elem, 'height'));
    },
    
    getWidth: function(elem) {
        return parseInt(this.getStyle(elem, 'width'));
    },
    
    fullHeight: function(elem) {
        if (this.getStyle(elem, 'display') != 'none') {
            return elem.offsetHeight || this.getHeight(elem);
        }
        
        var old = this.resetCSS(elem, {
            display: '',
            visibility: 'hidden',
            position: 'absolute'
        });
        
        var h = elem.clientHeight || this.getHeight(elem);
        
        this.restoreCSS(elem, old);
        
        return h;
    },
    
    fullWidth: function(elem) {
        if (this.getStyle(elem, 'display') != 'none') {
            return elem.offsetWidth || this.getWidth(elem);
        }
        
        var old = this.resetCSS(elem, {
            display: '',
            visibility: 'hidden',
            position: 'absolute'
        });
        
        var w = elem.clientWidth || this.getWidth(elem);
        
        this.restoreCSS(elem, old);
        
        return w;
    },
    
    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];
        }
    },
    
    src: function() {
        var i, elements = [], nl;
        var head = document.getElementsByTagName('head')[0];
        
        if (head) {
            for (i = 0, nl = head.getElementsByTagName('script'); i < nl.length; i++) {
                elements.push(nl[i]);
            }
        }
        
        for (i = 0, nl = document.getElementsByTagName('script'); i < nl.length; i++) {
            elements.push(nl[i]);
        }
        
        for (i = 0; i < elements.length; i++) {
            if (elements[i].src && (elements[i].src.indexOf('doc_updater_core_src.js') != -1 || elements[i].src.indexOf('doc_updater_core.js') != -1)) {
                return elements[i].src;
            }
        }
        
        return false;
    },
    
    url: function() {
        if (!this.src()) {
            return false;
        }
        
        return this.src().substring(0, this.src().lastIndexOf('/'));
    },
    
    scriptMode: function() {
        return (this.src().indexOf('_src') != -1 ? '_src' : '');
    },
    
    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;
        }
    },
    
    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 || DU.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 = DU.Functions.preventDefault;
        event.stopPropagation = DU.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;
    },
    
    strReplace: function(in_str, reg_exp, replace_str, opts) {
        if (in_str == null) {
            return in_str;
        }
        
        if (typeof(opts) == 'undefined') {
            opts = 'g';
        }
        
        var re = new RegExp(reg_exp, opts);
        
        return in_str.replace(re, replace_str);
    },
    
    trim: function(str) {
        return str.replace(/^\s+|\s+$/g, '');
    },
    
    ltrim: function(str) {
        return str.replace(/^\s+/, '');
    },
    
    rtrim: function(str) {
        return str.replace(/\s+$/, '');
    },
    
    getFormCheckedValue: function(obj, objType) {
        switch (objType) {
            case 'radio':
                if (!obj) {
                    return false;
                }
                
                var radioLength = obj.length;
                
                if (radioLength == undefined) {
                    if (obj.checked) {
                        return obj.value;
                    } else {
                        return false;
                    }
                }
                
                for (var i = 0; i < radioLength; i++) {
                    if (obj[i].checked) {
                        return obj[i].value;
                    }
                }
            break;
        }
        
        return false;
    },
    
    setFormCheckedValue: function(obj, newValue, objType) {
        switch (objType) {
            case 'radio':
                if (!obj) {
                    return false;
                }
                
                var radioLength = obj.length;
                
                if (radioLength == undefined) {
                    obj.checked = (obj.value == newValue.toString());
                    return false;
                }
                
                for (var i = 0; i < radioLength; i++) {
                    obj[i].checked = false;
                    
                    if (obj[i].value == newValue.toString()) {
                        obj[i].checked = true;
                    }
                }
            break;
        }
        
        return false;
    }
};