window.definitions = [];

var Definition = {

	version: '1.0rc',
	libs: $w('Debug Window Cookie String Number Element Functions Template RediTemplate TemplateFactory MessageManager Validation'),
	sheets: $w('FormHandler SideBar'),
	registrations: [],
	require: function(libraryName) {
		document.write('<script type="text/javascript" src="'+libraryName+'"><\/script>');
	},
	register: function( classDefinition ) {
		Definition.registrations.push( classDefinition );
	},
	start: function () { 
		var path = $$('script').pluck('src').find( 
		function (s) { return s.match('definition.js') } ).gsub(/"'/,'').gsub(/definition\.js/,'');
		Definition.libs.each( function(include) { Definition.require( path + include.toLowerCase() + '.js' ) });
		Definition.sheets.each( function(include) { Definition.require( path + include.toLowerCase() + '.js' ) });
		document.observe ( 'dom:loaded', this.applyDefinitions.bindAsEventListener(this) );
	},
	applyDefinitions: function(){
		
		while ( def = Definition.registrations.shift() ) {

			var rootElementList = Element.select( 'body', def.classIndicator );
			if ( rootElementList.length ) { //if there is no need, dont load!
				
				var DefinitionClass = Class.create(def);
								
				rootElementList.each(function (elm){
					try {
						
						var obj = new DefinitionClass(elm);
						obj.observers.each(
							function (observer) {
								observer.element.observe (
									observer['event'], 
									observer['function'] );
							}
						);
						
						window.definitions.push (obj);
						elm._registerDefinition (obj);
						
						if ( elm.id == '' ) {
							// Make sure every element has an id
							elm.id = 'elm_' + generateGuid();
							generatedID = true;
						}
						 	
					} catch(e) {
						
						Debug.write( new Template('Definition Error: #{message}.',e) );
						
					}
				});
				
			} else {
				
				Debug.write ( 'Definition Error: Found no elements for definition ' + def.name + ', please remove.'  );
				
			};
			
		};
		
	}
};

Definition.start();
