// JavaScript Document
var BaseClass = function( ) 
{
	var self					= this ; 
	var _isInitalised			= false ;

	self.name					= "BaseClass" ;
	self.applicationPath		= "/" ;

	var HIDDEN_CSS_CLASS_NAME	= " Hidden " ;
	var INVISIBLE_CSS_CLASS_NAME= " Invisible " ;

	self.progressControlId		= "" ;

	var preInitaliseEvents		= [ ] ;
	var initaliseEvents			= [ ] ;
	var postInitaliseEvents		= [ ] ;
	
	self.messageControlId		= "" ;

	self.EmptyGuid				= "00000000-0000-0000-0000-000000000000" ;

	var isBusy					= false ;

	//
	// Set up method to add new events
	self.addEvent				= function ( obj , evType , fn )
	{
		if ( obj.addEventListener )
		{ // W3C DOM
			try
			{
				obj.addEventListener( evType, fn, true ) ;
			}
			catch( ex )
			{
				alert( "Event Type :: " + evType + " not recognised or function is null" ) ;
			}
			return true ;
		}
		else if ( obj.attachEvent )
		{ // IE 5/6 
			var r = obj.attachEvent( "on" + evType, fn ) ;
			return r ;
		}
		// We dont support any thing else ;)
		return false ; 
	} ;

	// Set up method to add new events
	self.addEventWithParameters	= function ( obj , evType , fn )
	{
		// get all option args
		var args = [] ;
		for( var i = 3 ; i < arguments.length ; i++ )
		{
			args.push( arguments[ i ] ) ;
		}

		var handler = function ( e )
		{
			if ( e )
			{
				if( !e.target ) e.target = e.srcElement ;
			}
			else
			{
				alert( "no ee" );
			}
			args.push( e );
			fn.apply( e.target, args )
		} ;

		if ( obj.addEventListener )
		{ // W3C DOM
			obj.addEventListener( evType, handler, true ); 
			return true; 
		}
		else if ( obj.attachEvent )
		{ // IE 5/6 
			var r = obj.attachEvent( "on" + evType, handler ); 
			return r; 
		}
		// We dont support any thing else ;)
		return false; 
	} ;

	// Default for most comman event
	self.addOnWindowLoadEvent	= function ( func )
	{
		return self.addEvent( window , "load" , func ) ;
	}

	// remove method to add new events
	self.removeEvent			= function ( obj , evType , fn )
	{
		if ( obj.removeEventListener )
		{ // W3C DOM
			obj.removeEventListener( evType, fn, true ) ;
			return true ;
		}
		else if ( obj.removeEvent )
		{ // IE 5/6 
			var r = obj.removeEvent( "on" + evType, fn ) ;
			return r ;
		}
		// We dont support any thing else ;)
		return false ;
	} ;

    self.registerPreInitaliseEvent	= function( func )
	{
		if ( typeof func == "function" )
		{
			preInitaliseEvents.push( func ) ;
			return					true ;
		}
		alert( "[" + self.name + "][registerPreInitaliseEvent] Delagates of the type " + typeof func + " are not supported." ) ;
		return						false ;
    } ;

    self.registerInitaliseEvent		= function( func )
	{
		if ( typeof func == "function" )
		{
	        initaliseEvents.push( func ) ;
			return					true ;
		}
		alert( "[" + self.name + "][registerInitaliseEvent] Delagates of the type " + typeof func + " are not supported." ) ;
		return						false ;
    } ;

    self.registerPostInitaliseEvent	= function( func )
	{
		if ( typeof func == "function" )
		{
	      postInitaliseEvents.push( func ) ;
			return					true ;
		}
		alert( "[" + self.name + "][registerPostInitaliseEvent] Delagates of the type " + typeof func + " are not supported." ) ;
		return						false ;
    } ;

	self.firePreInitaliseEvents		= function( )
	{
        for ( var i = 0; i < preInitaliseEvents.length; i++ )
		{
            preInitaliseEvents[ i ]( ) ;
        }
    } ;

	self.fireInitaliseEvents		= function( )
	{
        for ( var i = 0; i < initaliseEvents.length; i++ )
		{
            initaliseEvents[ i ]( ) ;
        }
    } ;

	self.firePostInitaliseEvents	= function( )
	{
        for ( var i = 0; i < postInitaliseEvents.length; i++ )
		{
            postInitaliseEvents[ i ]( ) ;
        }
    } ;

	self.preInitalise			= function ( )
	{
		return true ;
	} ;

	self.initalise				= function ( )
	{
		AjaxPro.timeoutPeriod	= 60 * 1000 ;
		self.preInitalise( ) ;
		self.firePreInitaliseEvents( ) ;
		self.fireInitaliseEvents( ) ;
		self.firePostInitaliseEvents( ) ;
		self._isInitalised = true ;
		self.postInitalise( ) ;
		return true ;
	} ;

	self.postInitalise			= function ( )
	{
		return true ;
	} ;
	
	self.loadJsCssFile			= function ( filename, filetype )
	{
		if ( filetype == "js" )
		{ //if filename is a external JavaScript file
			var fileref = document.createElement( "script" ) ;
			fileref.setAttribute( "type", "text/javascript" ) ;
			fileref.setAttribute( "src", filename ) ;
		}
		else if ( filetype == "css" )
		{ //if filename is an external CSS file
			var fileref = document.createElement( "link" )
			fileref.setAttribute( "rel", "stylesheet" ) ;
			fileref.setAttribute( "type", "text/css" ) ;
			fileref.setAttribute( "href", filename ) ;
		}
		if ( typeof fileref != "undefined" )
		{
			document.getElementsByTagName( "head" )[ 0 ].appendChild( fileref ) ;
		}
		return true ;
	} ;

	self.showProgressControl	= function( )
	{
		var element				= document.getElementById( self.progressControlId ) ;
		if ( element != null && isBusy == false )
		{
			var ClassName		= element.className ;

			while ( ClassName.length > HIDDEN_CSS_CLASS_NAME.length && ClassName.substr(ClassName.length - HIDDEN_CSS_CLASS_NAME.length) == HIDDEN_CSS_CLASS_NAME )
			{
				element.className = ClassName.substr( 0, ClassName.length - HIDDEN_CSS_CLASS_NAME.length ) ;
				ClassName		= element.className 
			}
			while ( ClassName.length > INVISIBLE_CSS_CLASS_NAME.length && ClassName.substr(ClassName.length - INVISIBLE_CSS_CLASS_NAME.length) == INVISIBLE_CSS_CLASS_NAME )
			{
				element.className = ClassName.substr( 0, ClassName.length - INVISIBLE_CSS_CLASS_NAME.length ) ;
				ClassName		= element.className 
			}
			
			isBusy				= true ;
			return				true ;
		}
		return					false ;
	} ;

	self.hideProgressControl	= function( )
	{
		var element = document.getElementById( self.progressControlId ) ;
		if ( element != null )
		{
			element.className	= element.className + HIDDEN_CSS_CLASS_NAME ;

			return				true ;
		}
		return					false ;
	} ;

	self.raiseMessage			= function( message )
	{
		isBusy					= false ;
		setTimeout( self.hideProgressControl , 1000 ) ;
		var messageControl		= document.getElementById( self.messageControlId ) ;
		if ( messageControl == null )
		{
			//alert( message ) ;
			return				false ;
		}
		else
		{
			messageControl.innerHTML = message ;
			return				true ;
		}
	} ;

	self.isInitalised = function ( )
	{
		return self._isInitalised ;
	} ;

	// Object create OK	
	return true ;
} ;

var page = new BaseClass( ) ;
page.name = "page" ;
page.addOnWindowLoadEvent( page.initalise ) ;
