//Script Jquery
var _tmplCache={};
$.fn.parseTemplate = function(data) {
	var str = (this).html();
	var err = "";
	try {
		var func = _tmplCache[str];
		if (!func) {
			var strFunc =
			"var p=[],print=function(){p.push.apply(p,arguments);};" +
			"with(obj){p.push('" +
			str.replace(/[\r\t\n]/g, " ")
		   .replace(/'(?=[^#]*#>)/g, "\t")
		   .split("'").join("\\'")
		   .split("\t").join("'")
		   .replace(/<#=(.+?)#>/g, "',$1,'")
		   .split("<#").join("');")
		   .split("#>").join("p.push('")
		   + "');}return p.join('');";
			func = new Function("obj", strFunc);
			_tmplCache[str] = func;
		}
		return func(data);
	} catch (e) { err = e.message; }
	return "< # ERROR: " + err.toString() + " # >";
}
//La funcion class es del autor jClass2k
var Class = function(current, previous) {
    //Creamos el metodo superclass sera un objeto que tendra como
    //puntero las funciones la clase padre esto es para los casos que se
    //desee acceder aun metodo publico de la clase padre desde cualquier
    //lugar
    current.superclass = new Object();
    //Comprobamos si tenemos una Class que extender.
    previous = typeof previous == 'undefined' ? {} : previous.prototype;
    //Extendemos con las propiedades de la Class anterior
    for (p in previous) {
        //cargamos las funciones a superclass
        if (typeof previous[p] == 'function') current.superclass[p] = previous[p];
        //Si no existe la propiedad la añadimos
        if (typeof current[p] == 'undefined') current[p] = previous[p];
        //Si es una función
        else if (typeof previous[p] == 'function') {
            //añadimos this.parent() a la función de la Class actual.
            current[p] = (function(tmp) {
                var _parent = function() {
                    this.parent = _parent.parent;
                    return tmp.apply(this, arguments);
                }
                return _parent;
            })(current[p]);
            //Igualamos this.parent() al método de la Class anterior.
            current[p].parent = previous[p];
        }
    }
    // Construimos el contenedor
    var construct = function() {
        if (this.init) this.init.apply(this, arguments);
    }
    // Le aplicamos los métodos extendidos
    construct.prototype = current;
    // asignamos un constructor
    construct.constructor = Class;
    //Devolvemos el constructor.
    return construct;
};

var EventListen = new Class(
(function() {
	var onfireEventListen = function(pevent,pdata){
		$.each(this.listiner, function(key, value) { 
			var handler = value;
			if(handler.eventlisten == pevent){
				var oListen = {
					scope:handler.objlisten
				};
				handler.eventcallback.apply(oListen,[pdata]);
			}
		})
	};
	//Attach Event
	var onattachEventos = function(objevent, funcionrecive, nameevento) {
		 $(objevent).bind(nameevento,{scope:funcionrecive.scope,eventobject :funcionrecive.eventobject},funcionrecive.handleEvent);
    };
	//Fire Event
	var onEventExecute = function(element,event){
                var evt = null;
		if (document.createEventObject){
			evt = document.createEventObject();
			return element.fireEvent('on'+ event,evt);
		}else{
			evt = document.createEvent("HTMLEvents");
			evt.initEvent(event, true, true ); // event type,bubbling,cancelable
			return !element.dispatchEvent(evt);
		}
	};
    return {
        init: function(){
			this.listiner = new Array();	
		},
		firenEventListener:function(pevent,pdata){
			onfireEventListen.apply(this,[pevent,pdata]);
		},
                addEventListeners:function(plisten,peventlisten,pcallback){
			this.listiner.push({objlisten:plisten,eventlisten:peventlisten,eventcallback:pcallback});
		},
		attachEventos:function(objevent, funcionrecive, nameevento){
			var listener = {
				scope:this,
				eventobject: objevent,
    			handleEvent: funcionrecive
			};
			onattachEventos(objevent,listener, nameevento);
		},
		eventExecute:function(element,event){
			onEventExecute(element,event);
		}
    }
})());
var Request = new Class(
(function(){
		var onpreparerequest = function(obj){
			//Prepara el Uri Request
			var objectrequest  = this.objectevent;
			var namecontroller = obj.namecontroller;
			var namefunctioncontroller = obj.namefunctioncontroller;
			var typeargument = obj.typeargument;
			var argument = '';
			if(obj.argument.length>0){
				var arrIdParameters = obj.argument.split(',');
				if(typeargument==2){
					argument = arrIdParameters.join('/');
				}else{
					$.each(arrIdParameters,function(index, value){ 
							var objparam = value.split('|');
							var valorattr = "";
							if(objparam[0]=="this"){
								valorattr = getAttr(objectrequest, objparam[1]);
							}else{
								if($('#' + objparam[0])){valorattr = getAttr($('#' + objparam[0]).get(0),objparam[1]);}
							}
							if(valorattr){
								var arrValues = valorattr.split(',');
								arrValues = arrValues.join('/');
								valorattr = arrValues;
								if(argument.length == 0){
							   		argument = valorattr;
								}else{
							   		argument = argument + '/' + valorattr;
								}
							}
					})
				}
			}else{
				argument = '';
			}
			
			var cod = Math.random();
			var protocol = window.location.protocol;
			var hostname = window.location.hostname;
			var port 	 = window.location.port;
				
			var url    = protocol + '//' + hostname + ((port && port.length > 0)?':' + port:'') + '/process/' + cod + '/' + namecontroller + '/' + namefunctioncontroller + '/' + argument;
			return url;
		}
		var onexecuterequest = function(){
			var scope = this;
			var firts = this.arrRequest.shift();
			if(firts){
				this.arrCopy.push(firts);
				this.template = firts.template;
				var url	 = onpreparerequest.apply(scope,[firts]);
				$.ajax({url:url,
						global:false,
						dataType:"json",
						contentType:"application/json; charset=utf-8",
						success:function(data){
							handlersuccess.apply(scope,[data]);
      					},
						error:function(result){
							if(result.status == "200"){
								data = eval("q=" + result.responseText);
								handlersuccess.apply(scope,[data]);
							}else{
								handlererror.apply(scope,[result]);
							}
      					}});	
			}else{
				this.arrRequest = new Array();
				$.each(this.arrCopy,function(key, value){ 
					scope.arrRequest.push(value);
				})
				var arg = {objevent:this,value:this.arrData};	
				this.firenEventListener('completerequest',arg);
				this.arrCopy = new Array();
				this.arrData= new Array();
			}
		}
		var handlersuccess=function(evt){
			var htmlData = '';
			if( this.template && this.template.length > 0){
				htmlData = $('#' + this.template).parseTemplate(evt.data);
			}else{
				htmlData = evt.data;
			}
			this.arrData.push(htmlData);
			onexecuterequest.apply(this,[]);
		}
		var handlererror=function(result){
			//alert("se presento un error en uno de los request");
			onexecuterequest.apply(this,[]);
		}
		var getAttr = function(ele, attr) {
        	var result = ele.getAttribute(attr) || ele[attr] || null;
        	if( !result ) {
            	var attrs = ele.attributes;
            	var length = attrs.length;
            	for(var i = 0; i < length; i++){
                	if(attr[i].nodeName === attr) result = attr[i].nodeValue;
				}
        	}
        	return result;
    	}
		return {
			init:function(obj){
				var scope = this;
				this.parent();
				this.arrRequest = new Array();
				this.arrCopy = new Array();
				this.arrData = new Array();
				this.template = null;
				$.each(obj, function(key, value) { 
					scope.arrRequest.push(value);
				})		
			},
			executerequest:function(pevent){
				this.objectevent = pevent;
				onexecuterequest.apply(this,[]);
			}
		}				
						
})(),EventListen);

var Dispacher = new Class(
(function(){
	//Callback De Evento
	var onfunctionretriveEvent = function(e){
		var diff  = 0;
		var scope = e.data.scope;
		var oevent = e.data.eventobject;
		if (scope._timecache){
			var now	= new Date();
			diff = scope._timecache.getTime() - now.getTime();	
		}
		if(!scope.cache){scope.cache = new Array();}
		if((!scope.cache[e.data.eventobject.id]) || (scope.cache[e.data.eventobject.id] && diff < 0)){
			scope.cache[e.data.eventobject.id] = null;
			onshowloader(scope._responsewrapper);
			scope._request.executerequest(oevent);
		}else{
			var arg = {objevent:scope,value:scope.cache[e.data.eventobject.id][0],dispachertriggerobject:e.data.eventobject};
			scope.firenEventListener('complitedispacher',arg);
		}
	};
	var oncomplitedata = function(argevent){
		var scope = this.scope;
		scope._dataresponse = argevent.value;
		var arg = {objevent:scope,value:scope._dataresponse,dispachertriggerobject:argevent.objevent.objectevent};
		if((!scope.cache)  || (!scope.cache[argevent.objevent.objectevent.id] && scope._timeexpired > 0)){
			scope.cache[argevent.objevent.objectevent.id] = new Array();
			scope._timecache = new Date();
			scope._timecache.setSeconds(scope._timecache.getSeconds() + scope._timeexpired);
			scope.cache[argevent.objevent.objectevent.id].push(scope._dataresponse);
		}
		onhideloader(scope._responsewrapper);
		scope.firenEventListener('complitedispacher',arg);
	};
	var onshowloader = function(wrapper){
		var loader = $('#myloader' + wrapper).get(0);
		if(loader){
			loader.innerHTML = "";
			var img      = document.createElement('img');
			var protocol = window.location.protocol;
			var hostname = window.location.hostname;
			var port     = window.location.port;
			namecargador = loader.getAttribute('name');
			var url      = protocol + '//' + hostname + ((port && port.length > 0)?':' + port:'') + "/sites/default/files/" + ((namecargador)?namecargador:'cargador') + ".gif";
                        img.src = url;
			loader.appendChild(img);
		}
	}
	var onhideloader = function(wrapper){
		var loader = $('#myloader' + wrapper).get(0);
		if(loader){
			loader.innerHTML = "";
		}
	}
	return {
		init:function(obj){
			if(obj){
				this.parent();
				this.cache 						 = null;
				this._id 						 = obj.id;
				this._name 						 = obj.name;
				this._autorequest 				 = (obj.autorequest)?obj.autorequest:0;
				this._timeexpired 				 = (obj.timeexpired)?obj.timeexpired:0;
				this._htmlobject  				 = (obj.htmlobject && obj.htmlobject.length > 0)?obj.htmlobject:null;
				this._htmleventobject 			 = (obj.htmleventobject && obj.htmleventobject.length > 0)?obj.htmleventobject:null;
				this._responsewrapper 			 = obj.responsewrapper;
				this._responsejavascriptcallback = (obj.responsejavascriptcallback && obj.responsejavascriptcallback.length > 0)?obj.responsejavascriptcallback:null;	
				this._dataresponse 				 = null;
				this._timecache					 = null;
				//Crea el objeto request
				this._request = new Request(obj.request);
				//Agrega una escucha al objeto cuando complete la ejecucion de los request
				this._request.addEventListeners(this,'completerequest',oncomplitedata)
				if(!this._htmlobject){
					//crear un objeto DOM
					var wrapper = $('#' + this._responsewrapper);
 					this.objHtml = document.createElement('div');
  					var divIdName = 'my'+ String(Math.random()) +'Div';
 					this.objHtml.setAttribute('id',divIdName);
  					wrapper.appendChild(this.objHtml);
					//adjuntar un Evento
					this._htmleventobject = "click";
				}else{
					this.objHtml = $('#' + this._htmlobject).get(0);
					if(!this.objHtml){this.objHtml = document.getElementsByName(this._htmlobject);}
				}
				if(this.objHtml){
					if(this.objHtml.length > 0){
						for(var i=0;i<=this.objHtml.length-1;i++){
							this.attachEventos(this.objHtml[i],onfunctionretriveEvent,this._htmleventobject);
						}
					}else{
						this.attachEventos(this.objHtml,onfunctionretriveEvent,this._htmleventobject);
					}
				}
			}
		},
		getwrapper:function(){
			return this._responsewrapper;
		},
		getautorequest:function(){
			return this._autorequest;
		},	
		getjavascriptcallback:function(){
			return this._responsejavascriptcallback;
		},
		autorequest:function(){
			this.eventExecute(this.objHtml,this._htmleventobject);
		}
	}
})(),EventListen);

var BlocksAjax = new Class(
(function(){
	var oncompletedispacher = function(arg){
		var scope 		= this.scope;
		var odispacher  = arg.objevent;
		var ovalue 	= arg.value;
                var dispachertriggerobject = arg.dispachertriggerobject;
		if(odispacher.getjavascriptcallback() && odispacher.getjavascriptcallback().length > 0 ){
		  	var functionnamecallback = odispacher.getjavascriptcallback();
			var Func = window[functionnamecallback];
			Func(scope,odispacher.getwrapper(),ovalue,dispachertriggerobject);
		}else{
			var strvalue = ovalue.join('<br>');
			scope.updatewrapper(odispacher.getwrapper(),strvalue,true);
		}
	};
	var onautorequest = function(){
		$.each(this.dispachers, function(index, value) { 
  			var dispacher = value;
			if(dispacher.getautorequest() && dispacher.getautorequest() == 1){
				dispacher.autorequest();
			}
		})
	}
	return {
			init:function(){
				this.parent();
				this.dispachers = new Array();
			},
			register:function(oJson){
				var scope = this;
				$.each(oJson,function(index, value) { 
									var dispacher = new Dispacher(value);
									dispacher.addEventListeners(scope,'complitedispacher',oncompletedispacher);
									scope.dispachers.push(dispacher);
				})
				onautorequest.apply(this,[]);
			},
			updatewrapper:function(idwrapper,newvalue,iseffect){
				if(iseffect){
					$('#' + idwrapper).fadeOut("slow",function(){
						$('#' + idwrapper).html(newvalue);
						$('#' + idwrapper).fadeIn("slow");
					});
				}else{
					$('#' + idwrapper).html(newvalue);
				}
			}
	}
})(),EventListen);
