lf.element = {
    
    version:    1,
    overlays:   new Object(),
    
    hide: function(element) {
        YAHOO.util.Dom.setStyle(element,'display','none');
    },
    
    show: function(elements) {
        if(!lf.isArray(elements)) {
            elements = new Array(elements);
        }
        
        lf.foreach(elements,function(e) {
            var element = lf.element.get(e);
            if(element) {
                YAHOO.util.Dom.setStyle(element,'display','block');
            }
        });
    },
    
    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);
    },
    
    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(element, classNames) {
        if(!lf.isArray(classNames)) {
            classNames = new Array(classNames);
        }
       
        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 new Array();
        }
    },
    
    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) {
        for(key in styles) {
            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();
    },
    
    
    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   = new Array();
        for(var c=0;c<classes.length;c++) {
            if(classes.length > 0) {
                finalClasses.push(classes[c]);
            }
        }
        
        return finalClasses;
    },
    
    overlayProgress: function(element, args) {
        //this will show a progress bar and model it over the element
        if(!this.overlays[element]) {
            
            args = lf.defaultObjectProperties(args,{
                inside: false
            });
            
            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',.2);
            
            //append our overlay to the dom
            if(args.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:  2
            });
            
            //add class and append to document
            lf.element.addClass(p,'wrapper-overlay-progress');
            
            if(args.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 = new Array(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);
    }
}