/**
 * Controller
 * 
 * @author	pro	(1.0)
 */
var Controller = Class.create(
{	
	/**
	 * Optionen
	 */
	options : null,
	
	/**
	 * Timerobjekt 
	 */
	_objTimer : null,
	
	/**
	 * Wurde der Controller bereits generiert
	 */
	_blnGenerated : false,
	
	/**
	 * Argumente für die Main-Methode
	 */
	_argMain : null,
	
	/**
	 * Konstruktor
	 * 
	 * @author 	pro (1.0)
	 * @param	Boolean 	blnRun	Soll die Run Methode aufgerufen werden
	 * @param	Options				
	 */
	initialize : function()
	{
		this.options 	= {};
		var args		= $A(arguments);
		var blnRun 		= args.shift();
		this._argMain 	= args;
		
		if(blnRun)
		{
			this.run();
		}
	},	
	
	/**
	 * Run-Methode
	 * 
	 * @author pro (1.0)
	 */
	run : function()
	{
		this.generate();
	},	

	/**
	 * Ruft einmalig die main und setListeners-Methode auf
	 * 
	 * @author	pro (1.0)
	 */
	generate : function()
	{
		if(!this._blnGenerated)
		{
			this.main.apply(this, this._argMain);
			this.setListeners.bind(this).defer(); // Verzögern wegen IE
			this._blnGenerated = true;
		}
	},
	
	/**
	 * Zerstört die View und entfernt alle Eventlistener
	 * 
	 * @author	pro (1.0)
	 */
	remove : function()
	{
		this.removeListeners();
	},
	
	/**
	 * Abstrakte Main-Methoden
	 * 
	 * @author	pro	(1.0)
	 */
	main : function(){},
	
	/**
	 * Abstrakte setListeners-Methoden
	 * 
	 * @author	pro	(1.0)
	 */
	setListeners : function(){},
	
	/**
	 * Abstrakte removeListeners-Methoden
	 * 
	 * @author	pro	(1.0)
	 */
	removeListeners : function(){},
	
	/**
	 * Erstellt eine Instanz von einer View
	 * 
	 * @author	pro	(1.0)
	 */
	_loadView : function()
	{
		var args		= $A(arguments);
		var constrView  = function ()
		{
			strView = args.shift();
			
			var arrParams = [];
			args.each(function(item,index) {
				arrParams[index] = "args[" + index + "]";
			});
			
			return eval("new " + strView + "(" + arrParams.join(",") + ")");
		};
		
		var objView = new constrView();
		return objView.fetch();
	},
	
	/**
	 * Verzögert den Aufruf einer eigenen Methode
	 * 
	 * @author	pro (1.0)
	 */
	_delay : function(func, delay)
	{
		/*
		 * Muss der Timer resettet werden?
		 */
		if(this._objTimer)
		{
			window.clearTimeout(this._objTimer);
		}
		
		var delay = delay || 0.4;
		
		/*
		 * Timer setzen
		 */
		this._objTimer = func.delay(delay);
	}
});


/**
 * Stellt Grundfunktionen für eine View bereit
 * 
 * @author	pro (1.0)
 */
var View = Class.create(
{
	/**
	 * Referenz auf die erstellte View
	 */
	Object : null, 
		
	/**
	 * Konstruktor
	 * 
	 * @author pro (1.0)
	 */
	initialize : function()
	{
		/*
		 * Main-Methode direkt ausführen
		 */
		this.main.apply(this, arguments);
	},
	
	/**
	 * Abstrakte Main-Methoden
	 * 
	 * @author	pro	(1.0)
	 */
	main : function(){},
	
	/**
	 * Gibt eine Referenz auf das Objekt zurück
	 * 
	 * @author pro (1.0)
	 */
	fetch : function()
	{
		return this.Object;
	}
});
