/**********************************************************************************
 * 
 * LastChangedDate:		$Date: 2007-01-12 08:06:05 +0100 (Fri, 12 Jan 2007) $
 * LastChangedRevision	$Rev: 33 $
 * LastChangedBy:		$Author: $
 * HeadURL:				$URL: http://linux/cd/balance/trunk/httpdocs/js/nl/xd/util/dom.js $
 * ID:					$Id: dom.js 33 2007-01-12 07:06:05Z  $
 * 
/**********************************************************************************/

// Create namespace
if ( ! window.nl.xd.util ) {
	window.nl.xd.util = {} ;
} ;

// DOM
nl.xd.util.DOM = function() {
	var ua = navigator.userAgent.toLowerCase() ;
	var isOpera = ( ua.indexOf( 'opera' ) != -1 ) ;
	var isIE = ( ua.indexOf( 'msie' ) != -1 && ! isOpera ) ;
	
	/**
	 * static methods
	 */
	return {
		get: function( id ) {
			return document.getElementById( id ) ;
		} ,
		getParent: function( element , tagName , className ) {
			if ( tagName == null ) {
				return element.parentNode ;
			} else {
				while ( element.tagName != null ) {
					if ( ( element.tagName.toLowerCase() == tagName ) && ( className == null || this.hasClass( element , className ) ) ) {
						return element ;
					} ;
					
					element = element.parentNode ;
				} ;
				
				return element ;
			} ;
			return null;
		} ,
		hasClass: function( element , className ) {
			var classes = element.className || element.getAttribute( 'class' ) ;
			
			if ( ( classes ) && ( classes.indexOf ) ){
				var aclasses = classes.split( ' ' ) ;
				
				for ( var i = 0; i < aclasses.length; i++ ) {
					if ( aclasses[ i ] == className ) {
						return true ;
					} ;
				} ;
			} ;
			
			return false ;
		} ,
		addClass: function( element , className ) {
			if ( this.hasClass( element , className ) ) {
				return ;
			} ;
			
			element[ 'className' ] = [ element[ 'className' ] , className ].join( ' ' ) ;
		} ,
		removeClass: function( element , className ) {
			if ( ! this.hasClass( element , className ) ) {
				return ;
			} ;
			
			var newClassName = '' ;
			var classes      = element.className || element.getAttribute( 'class' ) ;
			var aclasses     = classes.split( ' ' ) ;
			
			for ( var i = 0; i < aclasses.length; i++ ) {
				if ( aclasses[ i ] == className ) {
					continue ;
				} ;
				
				if ( newClassName != '' ) {
					newClassName += ' ' ;
				} ;
				
				newClassName += aclasses[ i ] ;
			} ;
			
			element[ 'className' ] = newClassName ;
		} ,
		replaceClass: function( element , oldClassName , newClassName ) {
			this.removeClass( element , oldClassName ) ;
			this.addClass( element , newClassName ) ;
		} ,
		position: function( element ) {
			if ( element.parentNode === null ) {
				return false ;
            } ;
            
            var parent = element.offsetParent ;
            var pos = [ element.offsetLeft , element.offsetTop ] ;
            
            while ( parent != null ) {
            	pos[ 0 ] += parent.offsetLeft ;
            	pos[ 1 ] += parent.offsetTop ;
            	
            	parent = parent.offsetParent ;
            } ;
			
			return pos ;
		}
	} ;
} () ;
