/**
 * LanternJS MVC Framework v0.1
 * http://lanternjs.com/
 * 
 * Copyright (c) 2011 Yaroslav Tkachenko http://sap1ens.ru
 * GNU General Public License http://www.gnu.org/licenses/gpl.html
 */
function Controller () {
	this.enabledSmartCallbacks = false;
}

Controller.definedCallback = {
	'error': '<div style="text-align: center; margin-top: 40px;">{mess}</div>'
};

Controller.prototype.route = function(selector, type, func, params) {
	if(__.getConnectWith() == 'jquery') {
		if(typeof func == 'function' && params) {
			if(params.length > 1 && typeof params != 'string') {
				var oFunc = function() {
					func.apply(null, params);
				}
			} else {
				var oFunc = function() {
					func(params);
				}
			}
		} else if(!params) {
			var oFunc = func;
		}
		
		if(selector.length && type.length && func.length && (selector.length == type.length == func.length)) { // 1)
			for(var i in selector) {
				jQuery('body').delegate(selector[i], type[i], func[i]);
			}			
		} else if(selector.length && type.length && !func.length && (selector.length == type.length)) { // 2)
			for(var i in selector) {
				jQuery('body').delegate(selector[i], type[i], oFunc);
			}
		} else if(selector.length && !type.length && !func.length) { // 3)
			for(var i in selector) {
				jQuery('body').delegate(selector[i], type, oFunc);
			}
		} else if(!selector.length && type.length && !func.length) { // 4)
			for(var i in type) {
				jQuery('body').delegate(selector, type[i], oFunc);
			}		
		} else { // 5) 
			jQuery('body').delegate(selector, type, oFunc);
		}
	}
}

Controller.prototype.enableSmartCallbacks = function(model) {
	if(!this.enabledSmartCallbacks) {
		if(__.getConnectWith() == 'jquery') {
			jQuery('body').ajaxComplete(function(e, xhr, settings) {
				try {
					var obj = __.JSON.getObject(xhr.responseText);
					if(obj.__callback != undefined) {
						
						/**
						 * @TODO work on inner 'this'
						 */
						
						try {
							if(Controller.definedCallback[obj.__callback]) {
								switch(obj.__callback) {
									case 'error':
									var mess = obj.__callbackParams;
									obj.__callbackParams = Controller.definedCallback['error'].replace('{mess}', mess);
									var func = model.actions[obj.__callback];
									break;
								}
							} else {
								
								if(obj.__callback.indexOf('/') != -1) {
									var callbackArray = obj.__callback.split('/');
									var funct = model;
									var ev = 'var func = funct.actions';
									for(var key in callbackArray) {
										ev += '["'+callbackArray[key]+'"]';
									}
									eval(ev);
								} else {
									var func = model.actions[obj.__callback];
								}
							}
						} catch(e) { console.log(e); }		
						
						if(obj.__callbackParams != undefined && typeof obj.__callbackParams == 'object') {
							func.apply(null, obj.__callbackParams);
						} else if(obj.__callbackParams != undefined && typeof obj.__callbackParams != 'object') {
							func(obj.__callbackParams);
						} else {
							func();
						}
					}
				} catch(e) {
				
				} 
			});	
		}
		this.enabledSmartCallbacks = true;
	}
}


