lf.element = {
    
    version:    1,
    overlays:   {},
    
    hide: function(element) {
        YAHOO.util.Dom.setStyle(element,'display','none');
    },
    
    show: function(elements) {
        if(!lf.isArray(elements)) {
            elements = [elements];
        }
        
        lf.foreach(elements,function(e) {
            var element = lf.element.get(e);
            if(element) {
                this.setStyle(element,'display','block');
                this.setStyle(element,'visibility','visible');
                this.setStyle(element,'opacity','1');
            }
        },this);
    },
    
    getAttribute: function(element,attributeName) {
        var attributes = element.attributes;
        for(var i=0; i<attributes.length; i++) {
            if(attributes[i].nodeName == attributeName) {
                return attributes[i].nodeValue;
            }
        }
        
        return false;
    },
    
    query: function(query, parent, firstOnly) {
        return YAHOO.util.Selector.query(query,parent,firstOnly);  
    },
    
    isAncestor: function(ancestor, child) {
        return YAHOO.util.Dom.isAncestor(ancestor,child);
    },
    
    getHeight: function(element) {
        return this.getDimensions(element).height;  
    },
    
    getWidth: function(element) {
        return this.getDimensions(element).width; 
    },
  


    getDimensions: function(e) {
        var element     = this.get(e);
        var display     = this.getStyle(e,'display');
        
        if (display != 'none' && display !== null) {// Safari bug
            return {width: element.offsetWidth, height: element.offsetHeight};
        }
        
        // YOU ROCK PROTOTYPE
        // http://www.prototypejs.org/assets/2008/9/29/prototype-1.6.0.3.js
        // All *Width and *Height properties give 0 on elements with display none,
        // so enable the element temporarily
        var els                 = element.style;
        var originalVisibility  = els.visibility;
        var originalPosition    = els.position;
        var originalDisplay     = els.display;
        
        els.visibility = 'hidden';
        els.position = 'absolute';
        els.display = 'block';
       
        var originalWidth = element.clientWidth;//     - parseInt(this.getStyle(element,'padding-left')) - parseInt(this.getStyle(element,'padding-right'));
        var originalHeight = element.clientHeight;//  - parseInt(this.getStyle(element,'padding-top')) - parseInt(this.getStyle(element,'padding-bottom'));
        
        els.display = originalDisplay;
        els.position = originalPosition;
        els.visibility = originalVisibility;
        
        return {width: originalWidth, height: originalHeight};
    },
    
    getChildren: function(element) {
        return YAHOO.util.Dom.getChildren(element);
    },
    
    getXy: function(element) {
        return YAHOO.util.Dom.getXY(element);
    },
    
    getX: function(element) {
        return YAHOO.util.Dom.getX(element);
    },
    
    getY: function(element) {
        return YAHOO.util.Dom.getY(element);
    },
    
    setXy:function(element,x,y) {
        YAHOO.util.Dom.setXY(element,[x,y]);  
    },
    
    setY: function(element, y) {
        YAHOO.util.Dom.setY(element, y);
    },
    
    addClass: function(element, className) {
        YAHOO.util.Dom.addClass(element,className);
    },
    
    removeClass: function(elements, classNames) {
        if(!lf.isArray(classNames)) {
            classNames = [classNames];
        }
        
        if(!lf.isArray(elements)) {
            elements = [elements];
        }
        
       
        lf.foreach(elements, function(element) {
            for(var c=0;c<classNames.length;c++) {
                if(classNames[c].length > 0) {
                    YAHOO.util.Dom.removeClass(element,classNames[c]);
                }
            }
        });
    },
    
    getClasses: function(element) {
        var el = lf.element.get(element);
        if(el) {
            return el.className.split(" ");
        } else {
            return [];
        }
    },
    
    hasClass: function(element,className) {
        if(lf.isUndefined(element) || !element.attributes) {
            return false;
        }
        
        return YAHOO.util.Dom.hasClass(element,className);
    },
    
    get: function(id) {
        return YAHOO.util.Dom.get(id);
    },
    
    setStyle: function(id,property,value) {
        //yui dom setstyle already accepts arrays
        YAHOO.util.Dom.setStyle(id,property,value);
    },
    
    getStyle: function(id,property) {
        return YAHOO.util.Dom.getStyle(id,property);
    },
    
    setStyles:function(element, styles) {
        if(styles) {
            for(key in styles) {
                if(styles.key) {
                    lf.element.setStyle(element,key,styles.key);
                }
            }
        }
    },
    
    getViewportHeight: function() {
        return YAHOO.util.Dom.getViewportHeight();
    },
    
    getViewportWidth: function() {
        return YAHOO.util.Dom.getViewportWidth();
    },
    
    getDocumentScrollTop: function() {
        return YAHOO.util.Dom.getDocumentScrollTop();
    },
    
    getDocumentHeight: function() {
        return YAHOO.util.Dom.getDocumentHeight();
    },
    
    isVisible:function(element) {
        element = this.get(element);
        if(this.getStyle(element,'display') == 'none' || this.getStyle(element,'visibility') == 'hidden') {
            return false;
        }
        
        return true;
    },
    
    listClasses:function(element) {
        var e               = this.get(element);
        var classes         = e.className.split(' ');
        var finalClasses   = [];
        for(var c=0;c<classes.length;c++) {
            if(classes.length > 0) {
                finalClasses.push(classes[c]);
            }
        }
        
        return finalClasses;
    },
    
    overlayProgress: function(element, arguments) {
        
        //this will show a progress bar and model it over the element
        if(!this.overlays[element]) {
            
            arguments = lf.defaultObjectProperties(arguments,{
                inside:         false,
                opacity:        0.2,
                styleProgress:  0
            });
            
            var e = lf.element.get(element);
            var o = document.createElement('div');
            
            //add class and make it see through
            lf.element.addClass(o,'wrapper-overlay-mask');
            lf.element.setStyle(o,'opacity',arguments.opacity);
            
            //append our overlay to the dom
            if(arguments.inside) {
                
                e.appendChild(o);
                lf.element.setStyle(o,'top','0px');
                lf.element.setStyle(o,'height','100%');
                lf.element.setStyle(o,'width','100%');

            } else {
                
                document.body.appendChild(o);
                
                //find location of element we are overlaying
                var dim = lf.element.getDimensions(e);
                var xy  = lf.element.getXy(e);
                
                //set the styles of the overlay
                lf.element.setXy(o,xy[0],xy[1]);
                lf.element.setStyle(o,'height',dim.height + 'px');
                lf.element.setStyle(o,'width',dim.width+'px');
                
            }
            
            //insert the progress bar div
            var p = document.createElement('div');
            p.innerHTML = lf.progressBarDiv({
                style:  arguments.styleProgress
            });
            
            //add class and append to document
            lf.element.addClass(p,'wrapper-overlay-progress');
            
            if(arguments.inside) {
                e.appendChild(p);
                
                lf.element.setStyle(p,'height','100%');
                lf.element.setStyle(p,'width','100%');
                
            } else {
                document.body.appendChild(p);
                
                lf.element.setXy(p,xy[0],xy[1]);
                lf.element.setStyle(p,'height',dim.height + 'px');
                lf.element.setStyle(p,'width',dim.width+'px');
                
            }
            
            this.overlays[element] = {
                overlay: o,
                progress: p
            };
        }
    },
    
    overlayProgressHide: function(element) {
        if(this.overlays[element]) {
            var obj = this.overlays[element];
            lf.element.deleteElement([obj.overlay,obj.progress]);
            this.overlays[element] = null;
        }
    },
    
    deleteElement: function(elements) {

        if(!lf.isArray(elements)) {
            elements = [elements];   
        }
        lf.foreach(elements,function(e) {
            e.parentNode.removeChild(e);
        });
        
    },
    
    getNextSibling: function(element) {
        return YAHOO.util.Dom.getNextSibling(element);
    },
    
    insertAsFirst: function(parent,element) {
        
        var elements    = lf.element.getChildren(parent);
        var child       = elements[0];
        
        YAHOO.util.Dom.insertBefore(element,child);
    },
    
    getAncestorMatching: function(element,callback) {
       do {
            if(callback(element)) {
                return element;
            }
            
            element = element.parentNode;
        }  while(element);
        
        return false;
    }
};