/*!
 * versions.js 0.2
 *
 * Copyright (c) 2009 Adaptavist.com
 * Dual licensed under the MIT and GPL licenses.
 *
 * http://www.adaptavist.com/display/~mgibson/Versions
 */
/* Allow multiple versions of self-contained libraries to exist.
 *
 * Author: Mark Gibson (jollytoad at gmail dot com)
 */
(window.Versions || (function() {

var v;
v= window.Versions = {

	library: {},
	
	// Register an object under a given name and version numbers
	add: function ( name, versions, object ) {
		var vers = versions.split(/\s+/),
			lib = v.library[name] || {};
		
		while (vers.length) {
			lib[vers.shift()] = object;
		}
		
		v.library[name] = lib;
		
		// Should this return the registered object, or Versions (for chaining),
		// or nothing at all?
	},
	
	// Retrieve a object by name and version
	use: function ( name, version ) {
		return v.library[name][version] ||
			v.error("non-existent library version: "+name+"-"+version);
	},
	
	// Break a version number down in stages - down to a given level
	// Suitable for passing into Versions.add.
	//
	// eg. Versions.cascade('1.3.4.2', 2, 'latest') returns "latest 1.3.4.2 1.3.4 1.3"
	cascade: function ( version, level, extra ) {
		var points = version.split('.'),
			i = points.length,
			ret = extra ? [extra] : [];
		
		while ( i >= (level || 2) ) {
			ret.push(points.slice(0, i).join('.'));
			i++;
		}
		
		return ret.join(' ');
	},
	
	debug: false,
	
	error: function(msg) {
		if ( v.debug ) {
			if ( window.console ) {
				(console.error||console.log)(msg);
			} else if ( window.opera && opera.postError ) {
				opera.postError(msg);
			} else {
				alert(msg);
			}
		}		
	}

};

})());

