/**
* Global client info object
*/

if( ! oClientInfo ) { var oClientInfo = new ClientInfo() };

/**
* Get element ( extended )
*
* @param object document
* @param mixed element
* @return object
*/
function getElementEx( document_ref, element ) {
	
	var ret_val = null;	
	
	if( typeof( element ) == 'string' ) {
		
		ret_val = document_ref.getElementById ? document_ref.getElementById( element ) : ( document_ref.all ? document_ref.all[element] : null );
		
		if( typeof( ret_val ) != 'object' ) {
			ret_val = null;
		}
		
	} else if( typeof( element ) == 'object' ) { 
		ret_val = element;
	}
		
	return( ret_val );
	
}

/**
* Get element
*
* @param mixed element
* @return object
*/
function getElement( element ) {
	return( getElementEx( document, element ) );
}

/**
* Handy shortcut for getElement
*
* @param mixed element
* @return object
*/
function $( element ) {
	return( getElement( element ) );
}

/**
* Add event listener to an element
*
* @param mixed element
* @param string event
* @param string event handler
* @param bool capture element
* @return object
*/
function setEventHandler( element, event, handler, capture ) {
	
	element = getElement( element );
	capture = capture ? true : false;
	
	if( element ) {
		
		if( element.attachEvent ) {
			
			element.attachEvent( 'on' + event, handler );
			
			if( capture && element.setCapture ) {
				element.setCapture( true );
			}
			
		} else if ( element.addEventListener ) {
			
			element.addEventListener( event, handler, capture );
			
		}
	}

}

/**
* Remove event listener from an elment
*
* @param mixed element
* @param string event
* @param string event handler
* @param bool capture element
* @return object
*/
function remEventHandler( element, event, handler, capture ) {
	
	element = getElement( element );
	capture = capture ? true : false;
	
	if( element ) {
		if( element.detachEvent ) {
			element.detachEvent( 'on' + event, handler );
			if( capture && element.releaseCapture ) {
				element.releaseCapture();
			}
			
		} else if( element.removeEventListener ) {
			element.removeEventListener( event, handler, capture );
		}
	}


}

/**
* Compatible event constructor
* Intializes a compatible event object built from a passed event
*
* @param object event
* @return void
*/
CompatEvent = function( evt ) {
	
	evt = window.event ? window.event : ( evt ? evt : null );
	
	if( evt ) {
		
		this.event = evt;
		this.element = evt.srcElement ? evt.srcElement : ( evt.target ? evt.target : null );
		this.pageX = evt.x ? evt.x : ( evt.pageX ? evt.pageX : null );
		this.pageY = evt.y ? evt.y : ( evt.pageY ? evt.pageY : null );
		this.button = evt.button ? evt.button : null;
		this.ctrlKey = evt.ctrlKey ? evt.ctrlKey : null;
		this.altKey = evt.altKey ? evt.altKey : null;
		
	}

}

/**
* Stop event propogation
*
* @param void
* @return void
*/
CompatEvent.prototype.stopPropogation = function() {
	
	if( this.event ) {
		
		if( this.event.stopPropogation ) {
			this.event.stopPropogation();
		} 
		
		if( this.event.cancelBubble ) {
			this.event.cancelBubble = true;
		}
	
	}

}

/**
* Cancel event
*
* @param void
* @return void
*/
CompatEvent.prototype.cancel = function() {
	
	if( this.event ) {
		
		this.stopPropogation();

		if( this.event.returnValue ) {
			this.event.returnValue = false;
		} else if( this.event.preventDefault ) {
			this.event.preventDefault();
		}
		
	}

}

/**
* Get client rectangle
*
* @params void
* @return object rectangle
*/
function getClientRect() {
  
	var ret_val = { 'x_min': 0, 'y_min': 0, 'x_max': 0, 'y_max' : 0 };
  
	if( oClientInfo.is_gecko ) {
		
		ret_val.x_min = window.pageXOffset;
		ret_val.y_min = window.pageYOffset;
		ret_val.x_max = window.innerWidth + window.pageXOffset;
		ret_val.y_max = window.innerHeight + window.pageYOffset;
	
	} else if ( oClientInfo.is_ie5up ) {
		
		ret_val.x_min = document.body.scrollLeft;
		ret_val.y_min = document.body.scrollTop;
		ret_val.x_max = document.body.clientWidth + document.body.scrollLeft;
		ret_val.y_max = document.body.clientHeight + document.body.scrollTop;
	
	}
	
	return( ret_val );

}

/**
* Clone javascript variable
*
* @params mixed variable
* @return mixed variable
*/
function Clone( variable ) {

	var ret_val = null;
	
	switch( typeof( variable ) ) {
	
		case 'function':
		break;
		
		case 'array':
		case 'object':
			ret_val = {};
			for( var idx in variable ) {
				ret_val[idx] = Clone( variable[idx] );
			}
		
		break;
		
		default:
			ret_val = variable;
		break;
	
	}
	
	return( ret_val );
}

/**
* Show or hide element
*
* @params string element id
* @return void
*/
function showHideObject( object_id ) {
	target_object = document.getElementById( object_id );
	
	if( target_object.style.display == 'none' ){
		
		switch( target_object.tagName ){
			case 'TABLE':
				try{
					target_object.style.display = 'table';
				} catch( e ){
					target_object.style.display = 'block';
				}
				break;
			
			case 'TR':
				try{
					target_object.style.display = 'table-row';
				} catch( e ) {
					target_object.style.display = 'block';
				}
				break;
			
			case 'TD':
				try{
					target_object.style.display = 'table-cell';
				} catch( e ) {
					target_object.style.display = 'block';
				}
				break;
			
			default:
				target_object.style.display = 'block';
				break;
		}
		
	} else {
		target_object.style.display = 'none';
	}
	
}