
/*
*	@author Luis Raul Marin
*	@date 16/09/09
*	Descripcion, clase para automatizar el menu de elementos, para cambiar y reemplazar imagenes de un mismo grupo.
*	Nota: Esta clase puede ser optimizada agregando otros metodos y funcionalidades.
*/

jQuery.noConflict();
var Menu = Class.create();
Menu.prototype = {
	//Atributos
	_url: "", 		//String		//carpeta raiz donde se encuentra el archivo	
	_rut_act:"",	//String		//nombre de la ruta actual
	_arr_obj: new Array(),			//conjunto de objetos
	
	initialize: function(url){
		this._url = url;		
	},
		
	/*
	 * efecto de un solo click nombre, cambia la imagen por la nueva.
	 * se selecciona un boton y cambia el anterior solo si es diferente al mismo que esta precionando
	 */
	click:function(ele,arc){
		
		var obj = this.com_ele_click(ele,arc,"nueva");			
		
		if (obj != false)
			this.new_ele(obj, true, false);				
		
	},
	
	/*
	 * mouseover lo mismo que el clip solo que este se habilita cuando se coloque el sobre el elemento
	 */
	 mouseover:function(ele,arc){
		
		var obj = this.com_ele_hover(ele,arc,"nueBlu");			
		
		if (obj != false)
			this.new_ele(obj, false, true);				
				
	},
	
	/*
	 * evento hover que trabaja condos metodos
	 */
	hover:function(ele,arc){
		var _self = this;
		jQuery(ele).hover(
			function(){
				_self.mouseover(this,arc);
			},
			function(){
				_self.mouseout(this);
			}
		);
		
	},
	
	
	/*
	 * metodo que funciona cuando el usuario quita el cursor del boton el boton retrocede a su icono original
	 */
	mouseout:function(ele){	

		_self = this;
		//se busca el elemento del icono que se esta haciendo mouseOut para reemplazarla con la imagen anterior que tenemos en memoria
		jQuery.each(_self._arr_obj, function(i) {

			if (jQuery(_self._arr_obj[i].elemento).attr("id") == jQuery(ele).attr("id")) {	
			
				_self.anterior(ele,_self._arr_obj[i].rut_ant_hov);
				return false;
			}
		});
				 
						
	},
	
	/*
	 * metodo para cambiar las imagenes del icono cuando se quiera
	 */	
	change:function(ele,img_roo,img_hov,img_cli){
		var _self = this
		var nue_obj = true;	
		var siz_arr = this._arr_obj.length;			
		var ultimo = siz_arr;
		var rut_rai = this._url+img_roo;
		
		
		var _id = jQuery(ele).attr("id");
		// si los elementos ya existen se actualizan los datos existentes.
		var img = img_roo;
		jQuery.each(_self._arr_obj, function(i) {
			
			if (jQuery(_self._arr_obj[i].elemento).attr("id") == _id){
				// se hacen cambios de los datos anteriores
				_self._arr_obj[i].rut_ant = rut_rai;	
				_self._arr_obj[i].rut_ant_hov = rut_rai;
				_self._arr_obj[i].cha_img_hov = img_hov;
				_self._arr_obj[i].cha_img_cli = img_cli;
		
				_self._arr_obj[i].change = true;
				
				//si el elemento del menu estaba seleccionado entonces cuando cambie "change" tambien estara seleccionado el nuevo icono
				if (_self._arr_obj[i].nueva == true){
					img = img_hov;
					_self._arr_obj[i].rut_ant_hov = _self._url+img_cli;
				}
				
				_self.nuevo(ele,img);			
				nue_obj = false;
				return false;
			}			
		});
		if (nue_obj == true){
			// si no se a creado el objeto por ninguno de los metodos de eventos, "click y hover", enconces se crea uno nuevo 
			_self.nuevo(ele,img_roo);
			_self._arr_obj[ultimo] = {
					"elemento":ele,
					"rut_ant":rut_rai,
					"rut_ant_hov":rut_rai,
					"cha_img_hov":img_hov,
					"cha_img_cli":img_cli,
					"change":true,
					"nueva":false,
					"nueBlu":false
			};						
		}		
	},
	/*
	 *comprueba si existe un elemento en la memoria, devuelve un objeto entero 
	 */	
	com_ele_click:function(ele,arc,nom_acc){
		
		//variable que comprueba si hay que crear o modificar un elemento
		var nue_obj = true;
		
		//elemento actual clikeado
		var _rut_ant = jQuery(ele).attr("src");		
		
		//tamaño del array
		var siz_arr = this._arr_obj.length;
		
		//ultimo registro o tamaño del array ya que el array empiesa en cero el tamaño seria el ultimo elemento
		var ultimo = siz_arr;
				
		//objeto para no hacer referencia al each de jQuery				
		var _self = this;	
		 jQuery.each(_self._arr_obj, function(i) {				 
		 			 			
			 //comprobacion si el objeto del array es diferente al objeto seleccionado por el usuario en este caso el click del nuevo boton 
			 if (_self._arr_obj[i].nueva == true  && (jQuery(_self._arr_obj[i].elemento).attr("id") != jQuery(ele).attr("id"))){
				 _self._arr_obj[i].nueva = false;	
				 
				 var rut_ant = _self._arr_obj[i].rut_ant;
				 
				 //establecemos la ruta que se encuentra original para el outMouse, cuando se quita el cursor regresa a la imagen original raiz
				 _self._arr_obj[i].rut_ant_hov = rut_ant;
				 
				 //se cambia el objeto por la imagen anterior del objeto
				 _self.anterior(_self._arr_obj[i].elemento,rut_ant);					
				 
			 //comprobacion si el objeto del array es igual al objeto seleccionado por el usuario 				 
			 } else if (jQuery(_self._arr_obj[i].elemento).attr("id") == jQuery(ele).attr("id")) {				 
				 _self._arr_obj[i].nueva = true;	
				 
				 //se verifica se existe un metodo change activo para asi reemplazar el contenido actual por el definido en el metodo change
				 if (_self._arr_obj[i].change == true)
					 arc = _self._arr_obj[i].cha_img_cli;
				 
				 _self.nuevo(ele,arc);	
			
				 //se cambia la imagen del icono anterior				 
				_self._arr_obj[i].nueBlu = false;	
				
				 //se guarda en memoria el cambio que se hiso del icono anterior
				  _self._arr_obj[i].rut_ant_hov = jQuery(ele).attr("src"); 
			 }				
			 
			 //si ya existe el la id en el array de objetos entonces se modifica el objeto nueva
			 if ( jQuery(_self._arr_obj[i].elemento).attr("id") == jQuery(ele).attr("id")){
				 nue_obj = false;				 							 
			 } 			 
		 });		 				 		
		 
		 //se crea un objeto del elemento seleccionado
		 if (nue_obj == true){
			 return {
					"elemento":ele,
					"archivo":arc,		
					"rut_ant_hov":"",	//mouseOUT o mouseIN
					"rut_ant":_rut_ant,	//ruta anterior que se retienen cuando se entre tanto en mouse como en click
					"ultimo":ultimo
	          };
		 } else {
			 return false;
		 }
	},
	
	/**
	 * comprueba si existe un elemento en la memoria, devuelve un objeto
	 */
	com_ele_hover:function(ele,arc,nom_acc){
		
		//variable que comprueba si hay que crear o modificar un elemento
		var nue_obj = true;
		
		//elemento actual clikeado
		var _rut_ant = jQuery(ele).attr("src");				
		//tamaño del array
		var siz_arr = this._arr_obj.length;
		
		//ultimo registro o tamaño del array ya que el array empiesa en cero el tamaño seria el ultimo elemento
		var ultimo = siz_arr;
				
		//objeto para no hacer referencia al each de jQuery				
		var _self = this;	
		 jQuery.each(_self._arr_obj, function(i) {				 
			 
			 //comprobacion si el objeto del array es diferente al objeto seleccionado por el usuario  en este caso el hover del nuevo boton
			 if (_self._arr_obj[i].nueBlu == true  && (jQuery(_self._arr_obj[i].elemento).attr("id") != jQuery(ele).attr("id"))){
				 //se identifica el objeto como false, la imagen nueva se reemplaza por la anterior
				 _self._arr_obj[i].nueBlu = false;	
				 
				 var rut_ant_hov = _self._arr_obj[i].rut_ant_hov;
				 //memoria ruta anterior en mouseOut								
				 _self.anterior(_self._arr_obj[i].elemento,rut_ant_hov);
				 				
			 //comprobacion si el objeto del array es igual al objeto seleccionado por el usuario 				 
			 } else if (jQuery(_self._arr_obj[i].elemento).attr("id") == jQuery(ele).attr("id")) {
				 
				 //comprobacion de que se a creado una imagen nueva
				 _self._arr_obj[i].nueBlu = true;
				 
				 //se verifica se existe un metodo change activo para asi reemplazar el contenido actual por el definido en el metodo change
				 if (_self._arr_obj[i].change == true)
					 arc = _self._arr_obj[i].cha_img_hov;
				 
				// se reemplaza la imagen actual por la seleccionada por la indicada en el metodo
				 _self.nuevo(ele,arc);				
				
			 }	
			 
			 //si ya existe el la id en el array de objetos entonces se modifica el objeto nueva
			 if ( jQuery(_self._arr_obj[i].elemento).attr("id") == jQuery(ele).attr("id")){
				 nue_obj = false;				 							 
			 } 			 
		 });		 				 		
		 
		 //se crea un objeto del elemento seleccionado
		 if (nue_obj == true){
			 return {
					"elemento":ele,
					"archivo":arc,		
					"rut_ant_hov":_rut_ant,	//mouseOUT o mouseIN
					"rut_ant":_rut_ant,		//ruta anterior que se retienen cuando ocurra un evento en hover o en click
					"ultimo":ultimo
	          };
		 } else {
			 return false;
		 }
	},
	
	/*
	 * crea nuevo elemento solo cuando no se a creado el objeto
	 */
	new_ele:function(obj,nue,nueB){
		var ele = obj.elemento;
		var arc = obj.archivo;
		var rut_ant = obj.rut_ant;
		var ultimo = obj.ultimo;
		var rut_ant_hov = obj.rut_ant_hov;
		this._arr_obj[ultimo] = 
		{
			"elemento":ele,
			"archivo":arc,
			"rut_ant":rut_ant,
			"rut_ant_hov":rut_ant_hov,
			"nueva":nue,
			"nueBlu":nueB
         };
		 //cambiamos la imagen del icono
		 this.nuevo(ele,arc);			 
		
	},
	
	/*
	 * metodo para reemplazar los botones nuevos por los anteriores.
	 */
	anterior:function(ele,url_ant){			
		jQuery(ele).attr({"src":url_ant});
	},
		
	/*
	 * metodo para reemplazar los botones anteriores por los nuevos. 
	 */
	nuevo:function(ele,arc){		
		jQuery(ele).attr({"src":this._url + arc});	
	}
	
	
};