//==========//
// Name: 		Library Manager v1.0
// Copyright:	Cozai Open Source License (http://www.cozai.com/opensource/license.html)
// Author: 		Andy Freeborough (andy.freeborough@cozai.com)
// Date: 		28 Jun 2001
// Requires:	NA
// Description:	The Library Manager provides the means to register, manage and use JavaScript libraries.
//				The libraries must follow some simple rules to allow them to be used in this way, then
//				libraries can be extended, queried at runtime, etc.  This system provides a solid
//				structure for building and extending JavaScript based functionality.
//==========//


// Create a global instance of the Library Manager.
var libraryManager = new LibraryManager();

function LibraryManager() {
	
	// Private properties.
	this.registeredList = new Array;
	
	// Public methods.
	this.register = LibraryManager_register;
	this.list = LibraryManager_list;
	this.upgrade = LibraryManager_upgrade;
	
}

function LibraryManager_register( name, majorVersion, minorVersion, upgrades, classname ) {
	
	this.registeredList[ this.registeredList.length ] = new Library( name, majorVersion, minorVersion, upgrades, classname );

}

function LibraryManager_list() {
	
	var message = "Registered Libraries:\n";
	for( var i = 0 ; i < this.registeredList.length ; i++ ) {
		
		message += "\n" + this.registeredList[i].name() + " v" + this.registeredList[i].majorVersion() + "." + this.registeredList[i].minorVersion();
		
	}
	alert( message );
	
}

function LibraryManager_upgrade( objectRef ) {
	
	// Search through the registered libraries to see if there are any that upgrade this object.
	for( var i = 0; i < this.registeredList.length ; i++ ) {

		// If a registered library that upgrades this object is found, then call its upgrade function.
		if (this.registeredList[i].upgrades() == objectRef.libraryName) {
			eval( this.registeredList[i].classname() + "_Upgrade( objectRef )" );
		}
		
	}
	
}

//
// Library Class
//
function Library( name, majorVersion, minorVersion, upgrades, classname ) {

	// Private properties.
	this._name = name;
	this._majorVersion = majorVersion;
	this._minorVersion = minorVersion;
	this._upgrades = upgrades;
	this._classname = classname;

	// Public methods.
	this.setName = Library_setName;
	this.setMajorVersion = Library_setMajorVersion;
	this.setMinorVersion = Library_setMinorVersion;
	this.setUpgrades = Library_setUpgrades;
	this.setClassname = Library_setClassname;
	
	this.name = Library_getName;
	this.majorVersion = Library_getMajorVersion;
	this.minorVersion = Library_getMinorVersion;
	this.upgrades = Library_getUpgrades;
	this.classname = Library_getClassname;

}

function Library_setName( name ) {
	this._name = name;
}

function Library_setMajorVersion( majorVersion ) {
	this._majorVersion = majorVersion;
}

function Library_setMinorVersion( minorVersion ) {
	this._minorVersion = minorVersion;
}

function Library_setUpgrades( upgrades ) {
	this._upgrades = upgrades;
}

function Library_setClassname( classname ) {
	this._classname = classname;
}

function Library_getName() {
	return this._name;
}

function Library_getMajorVersion() {
	return this._majorVersion;
}

function Library_getMinorVersion() {
	return this._minorVersion;
}

function Library_getUpgrades() {
	return this._upgrades;
}

function Library_getClassname() {
	return this._classname;
}