function MMElement( oRef ) {
    if ( typeof oRef == 'string' ) {
        if ( document.getElementById( oRef ) )
            oRef = document.getElementById( oRef );
        else
            oRef = document.createElement( oRef );
    } else if ( typeof oRef == 'object' && oRef.addCssClass ) {
        return oRef;
    }

    if ( !oRef || typeof oRef != 'object' )
        return false;

    for ( var method in this )
        oRef[method] = this[method];
    
    return oRef;
}
        
MMElement.prototype = {
    addEvent: function( oEvent, oFn, oElement ) {
        if ( document.addEventListener ) {
            MMElement.prototype.addEvent = function( oEvent, oFn, oElement ) {
                oElement = oElement || this;
                oElement.addEventListener( oEvent, oFn, false );
            }
        } else if ( document.attachEvent ) {
            MMElement.prototype.addEvent = function( oEvent, oFn, oElement ) {
                oElement = oElement || this;
                oElement.addEvent( 'on' + oEvent, oFn );
            }
        } else {
            MMElement.prototype.addEvent = function( oEvent, oFn, oElement ) {
                oElement = oElement || this;
                oElement['on' + oEvent] = oFn;
            }            
        }
        return MMElement.prototype.addEvent( oEvent, oFn, ( oElement ? oElement : this ) );
    },
    appendChildren: function( oChildren, oElement ) {
        oElement = oElement || this;
        for ( var i = 0; i < oChildren.length; i++ )
            oElement.appendChild( oChildren[i] );
        return oElement;
    },
    addCssClass: function( oCss, oElement ) {
        oElement = oElement || this;
        if ( !MMElement.prototype.hasCssClass( oCss, oElement ) )
            oElement.className = oElement.className.trim() + ' ' + oCss.trim();
        return oElement;
    },
    hasCssClass: function( oCss, oElement ) {
        oElement = oElement || this;
        var aFrags = oElement.className.split( ' ' );
        for ( var i = 0; i < aFrags.length; i++ ) {
            if ( aFrags[i] == oCss )
                return true;
        }
        return false;
    },
    removeCssClass: function( oCss, oElement ) {
        oElement = oElement || this;
        if ( MMElement.prototype.hasCssClass( oCss, oElement ) )
            oElement.className = oElement.className.trim().replace( oCss.trim(), '' ).trim();
        return oElement;
    },
    getComputedStyle: function( oProp, oElement ) {
        oElement = oElement || this;
        if ( oElement.currentStyle )
            return oElement.currentStyle[oProp];
        else
            return document.defaultView.getComputedStyle( oElement, null ).getPropertyValue( oProp );
    },
    getChildrenByClassName: function( oCss, oTag, oElement ) {
        var oTag = oTag || '*', oElement = oElement || this, rElements = [];
        oElements = oElement.getElementsByTagName( oTag );
        for ( var i = 0; i < oElements.length; i++ ) {
            if ( MMElement.prototype.hasCssClass( oCss, oElements[i] ) )
                rElements.push( oElements[i] );
        }
        return rElements;
    },
    getDimensions: function( oElement ) {
        var oElement = oElement || this, oDim;
        oDim = MMElement.prototype.getOffset( undefined, oElement );
        oDim['width'] = oElement.offsetWidth;
        oDim['height'] = oElement.offsetHeight;
        return oDim;
    },
    getOffset: function( oPar, oElement ) {
        var oElement = oElement || this, oPar = oPar || document.body, oOffset = {};
        oOffset['top'] = oElement.offsetTop;
        oOffset['left'] = oElement.offsetLeft;
        while( oElement.offsetParent && oElement.offsetParent != oPar ) {
            oElement = oElement.offsetParent;
            oOffset['top'] += oElement.offsetTop;
            oOffset['left'] += oElement.offsetLeft;
        }
        return oOffset;
    },
    insertAfter: function( oNode, oTarget, oElement ) {
        oElement = oElement || this;
        oTarget = oTarget || oElement.parentNode;
        if ( oElement.nextSibling )
            oTarget.insertBefore( oNode, oElement.nextSibling );
        else
            oTarget.appendChild( oNode );
        return oElement;
    },
    setDisplayState: function( bDisplay, oElement ) {
        oElement = oElement || this;
        oElement.style.display = ( bDisplay ) ? 'block' : 'none';
        return oElement;
    },
    setCssAttribute: function( sCss, oElement ) {
        oElement = oElement || this;
        if ( MMIsIe() )
            oElement.style.setAttribute( 'cssText', sCss );
        else
            oElement.setAttribute( 'style', sCss );
        return oElement;
    },
    removeAllChildren: function( oElement ) {
        oElement = oElement || this;
        while ( oElement.childNodes[0] )
            oElement.removeChild( oElement.childNodes[0] );
        return oElement;
    }
}

function MMIsIe() {
    if ( navigator.userAgent.indexOf( 'MSIE' ) > -1 ) {
        function MMIsIe() {
            return true;
        }
    } else {
        function MMIsIe() {
            return false;
        }
    }
    return MMIsIe();
}
