/**
 * Global client info object
 */

/**
 * 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.all ? document_ref.all[element] : ( document_ref.getElementById ? document_ref.getElementById( 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 ) );
}


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 );
			
		}
	}

}



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 );
		}
	}


}



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;
		
	}

}

CompatEvent.prototype.stopPropogation = function() {
	
	if( this.event ) {
		
		if( this.event.stopPropogation ) {
			this.event.stopPropogation();
		} 
		
		if( this.event.cancelBubble ) {
			this.event.cancelBubble = true;
		}
	
	}

}

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();
		}
		
	}

}

function Clone( variable ) {

	var ret_val = null;
	
	switch( typeof( variable ) ) {
	
		case 'function':
			// function cloning not implemented
		break;
		
		case 'array':
		
			ret_val = new Array();
			
			for( var idx in variable ) {
				ret_val[idx] = Clone( variable[idx] );
			}
		
		case 'object':
			
			ret_val = {};
			
			for( var idx in variable ) {
				ret_val[idx] = Clone( variable[idx] );
			}
		
		break;
		
		default:
			ret_val = variable;
		break;
	
	}
	
	return( ret_val );

}