/**
 * @author Krister
 */
function control(host) {
	
	this.host = host;

	this.save_forms = {};
	
	this.modules = {};
	this.activeModule = false;
	
	this.config = {};
	this.config['selects'] = [];
	
	this.init = function (parent) {
		
		if (parent == null) {
			ajax.load();
			control.setModules();
			control.setselects();
			
		} else { 
			
			ajax.load(parent);
			control.setModules(parent);
			control.setselects(parent);
		}
	};
	
	this.setModules = function(parent){
	
		var modules;
		if(parent == null) {
			modules=$(".module");
		} else {
			modules=$(parent).find(".module");
		}
		modules.each(function(){
			$(this).bind('click',function(){
				
				var data = null;
				if($(this).data("moduleLoad") != null) {
					var data = $(this).data("moduleLoad");
				}
				
				var name=$(this).attr("name");
				control.loadModule(name,data);
				return false;
			});
		});
	};
	
	this.setselects = function(parent) {
		
		var combos;
		if(parent == null) {
			combos=$("select.config");
		} else {
			combos=$(parent).find("select.config");
		}
		combos.each(function(){
			var name=$(this).attr("name");
			if(control.config.selects[name] != null) {
				if(control.config.selects[name]['get'] != null && control.config.selects[name]['get'] != false) {
					
					control.loadSelect(this);
				}
				if(control.config.selects[name]['combo'] != null && control.config.selects[name]['combo'] != false) {
					
					if($(this).val() != null && $(this).val() != 0) {
						control.loadCombo(this);
					}
					$(this).bind('change',function(){
						control.loadCombo(this);
					});
				}
			}
		});
	};
	
	this.loadSelect= function(e){
		
		var ob=$(e); 
		var name=ob.attr("name");
		if(control.config.selects[name].get.predefined != false) {
			
			var html='';
			if(control.config.selects[name].zero_req) {
				html='<option value="0">'+lang.v['msg'][control.config.selects[name].zero_req]+'</option>';
			}
			html+=control.predefined.selects[name];
			ob.html(html);
			
		} else {
			
			var mode=control.config.selects[name].get.mode;
			ajax.request(control.host + 'ajax-misc/getselect/mode='+mode,'GET','',function(data){
				var html='';
				if(control.config.selects[name].zero_req) {
					html='<option value="0">'+lang.v['msg'][control.config.selects[name].zero_req]+'</option>';
				}
				html+=control.parsecombo(data);
				ob.html(html);
				if(ob.data("loadSelect") != null) {
					if(ob.data("loadSelect").sel != null) {
						ob.val(ob.data("loadSelect").sel);
						ob.data("loadSelect").sel=null;
					}
					if (ob.data("loadSelect").onLoad != null) {
						control.attachCallback(ob.data("loadSelect").onLoad);
						ob.data("loadSelect").onLoad=null;
					}
				}
			});
		}
	}
	
	this.loadCombo= function(e){
		
		var ob=$(e);
		var obname=ob.attr("name");
		var sel=ob.val();
		var target_name = control.config.selects[obname].combo.target;
		
		if (target_name) {
			
			var mode=control.config.selects[obname].combo.mode;
			var target=ob.parents("form").find(target_name);
			if (sel != 0) {
				$.ajax({
					type: "GET",
					url: control.host + 'ajax-misc/combo/&mode='+mode+'&sel='+sel,
					data: '',
					dataType: "json",
					success: function(data){
						target.attr("disabled", false);
						var html = control.parsecombo(data);
						if(control.config.selects[obname].zero_req)
						{
							target.html('<option value="0">'+lang.v['msg'][control.config.selects[obname].zero_req]+'</option>'+html);
						} else {
							target.html(html);
						}
					}
				});
			}
		}
		
		if(sel == 0) {
			target.html('<option value="0">Seleccione...</option>');
			target.attr("disabled",true);
		}
	};
	
	this.parsecombo = function(data) {
		
		var pos=0;
		var html="";
		if (data.combooptions[pos] == null) {
			pos=1;
		}
		if	(data.combooptions[pos]['id'] != null) {
			while (data.combooptions[pos] != null) {
				html+='<option value="'+data.combooptions[pos].id+'">'+data.combooptions[pos].value+'</option>';
				pos=pos+1;
			}
			
		} else {
			while (data.combooptions[pos] != null) {
				html+='<option value="'+pos+'">'+data.combooptions[pos]+'</option>';
				pos=pos+1;
			}
		}
		return html;
	};
	
	this.loadModule = function(mod,data) {
		
		var modOpts = {
			preLoad : false,
			T : "",
			innerId : "#content",
			onLoad : false,
			dataRequired : false,
			hideToOnload : false,
			defaultOnload: true,
			moduleAnchor : false
		};
		
		if (control.modules[mod]) {
			$.extend(modOpts,control.modules[mod]);
		}
		
		if(!modOpts.dataRequired || (modOpts.dataRequired && data != null)) {
			$(".bigprop").remove();
			if (modOpts.preLoad) {
				
				control.attachCallback(modOpts.preLoad,new Array(data));
			}
			
			var parent = $(modOpts.innerId);
			if(modOpts.hideToOnload) {
				parent.css({visibility:"hidden"});
			}
			control.activeModule=mod;
			parent.html(modOpts.T);
			if(modOpts.moduleAnchor) {
				document.location.href="#"+modOpts.moduleAnchor;
			}
			
			if(modOpts.defaultOnload) {
				
				control.init(modOpts.innerId);
			}
			
			if(modOpts.onLoad) {
				
				control.attachCallback(modOpts.onLoad,new Array(data));
			}
			
			return true;
			
		} else {
			return false;
		}
	};
	
	this.attachCallback = function (fn,args) {
		
		if(!$.isFunction(fn)) {
			var fn=eval(fn);
		}
		if($.isFunction(fn)) {
			if(args != null) {
				
				if($.isArray(args)) {
					switch(args.length) {
						case 1: return fn(args[0]); break;
						case 2: return fn(args[0],args[1]); break;
						case 3: return fn(args[0],args[1],args[2]); break;
						case 4: return fn(args[0],args[1],args[2],args[3]); break;
						case 5: return fn(args[0],args[1],args[2],args[3],args[4]); break;
						case 6: return fn(args[0],args[1],args[2],args[3],args[4],args[5]); break;
						case 7: return fn(args[0],args[1],args[2],args[3],args[4],args[5],args[6]); break;
						default : return fn(); break;
					}
				} else {
					
					return fn(args);
				}
				
			} else {
				
				return fn();
			}
		} else {
			return false;
		}
	};
	
	this.innerText = function(Ob1,Ob2,cnt) {
		
		var Ob = (cnt!=null) ? $(Ob1).find(Ob2) : $(Ob1);
		var txt = cnt || Ob2;
		
		if(txt!=null && txt.length > 0) {
			if(Ob.is("select")) {
				Ob.find("option[value='"+txt+"']").attr("selected",true);
			} else if(Ob.is(":checkbox")){ 
				Ob.attr("checked",(txt == 1) ? true : false);
			} else if(Ob.is(":radio")){ 
				if(txt == 1) {
					Ob.each(function(){
						if($(this).val() == 1) {
							$(this).attr("checked",true);
						}
					})
				}
			}else {
				(Ob.is("input") || Ob.is("textarea")) ? Ob.val(txt) : Ob.text(txt);
			}
		}
	};
	
	this.parseImg = function(img,dim) {
		return this.host+'fotos/'+dim+'/'+img;
	}
}
$.intval = function (v)
{
	v = parseInt(v);
	return isNaN(v) ? 0 : v;
};
function dump(arr,level) {
	var dumped_text = "";
	if(!level) level = 0;
	
	//The padding given at the beginning of the line.
	var level_padding = "";
	for(var j=0;j<level+1;j++) level_padding += "    ";
	
	if(typeof(arr) == 'object') { //Array/Hashes/Objects 
		for(var item in arr) {
			var value = arr[item];
			
			if(typeof(value) == 'object') { //If it is an array,
				dumped_text += level_padding + "'" + item + "' ...\n";
				dumped_text += dump(value,level+1);
			} else {
				dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
			}
		}
	} else { //Stings/Chars/Numbers etc.
		dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
	}
	return dumped_text;
}