// Depende de la librería de jQuery


var CaptchaImage = {
	// Estado de carga de la imagen
	_enable : true,
	
	// Estado de carga de la imagen
	_working : false,
	
	_color_txt : null,
	
	// URL de imagen
	source : "/img_validator/imgsess.php4",
	
	generic : url_imagen+"captcha_inactivo.gif",
	
	loading : url_css3+"i/cargando.gif",
	
	// Lista de elementos que actualizaran el captcha
	elmUpdate : [],
	
	timerReload : null,	
	
	// Mostramos un captcha nuevo. (con efectos)
	show : function() {

		if(!CaptchaImage.isWorking()) {
			CaptchaImage._working = true;

			CaptchaImage.enable();

			CaptchaImage.deactivate();
			
			jQuery('#captcha').fadeOut('fast', function() {
				var code = CaptchaImage.validateCode();
				var urlImg = CaptchaImage.source+'?code='+code;
				
				CaptchaImage.loadingShow();
				
				jQuery('#code_ok').val(code);
				jQuery('#captcha').attr("src", urlImg);
			});

		}

		return this;
	},
	
	// Mostramos un captcha nuevo. (sin efectos)
	load : function() {
		
		if(!CaptchaImage.isWorking()) {
			CaptchaImage._working = true;
			var code = CaptchaImage.validateCode();
			var urlImg = CaptchaImage.source+'?code='+code;
			
			CaptchaImage.enable();
			
			CaptchaImage.deactivate(false);
			
			jQuery('#captcha').hide();
			CaptchaImage.loadingShow();
			
			jQuery('#code_ok').val(code);
			jQuery('#captcha').attr("src", urlImg);
		}
		
		return this;
	},

	// Generámos un código aleatorio
	validateCode : function() {
		var charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
		var code = "";

		for(i = 0; i < 16; i++) {
			pos   = parseInt(Math.random()*charset.length);
			code += charset.charAt(pos);
		}
		
		return code;
	},
	
	// Acciones cuando el documento este listo
	ready : function() { 

		CaptchaImage.disable();

		var htmlLoading = '<img id="loading" src="'+CaptchaImage.loading+'" alt="Generando código..." style="display: none"/>';

		jQuery('#captcha')
			.before(htmlLoading)
			.load(function() {
				if(CaptchaImage.isWorking()) {
					jQuery('#loading').hide();
					jQuery('#captcha').fadeIn('fast');
					
					jQuery('.elem_captcha').removeAttr("disabled");
					
					if(CaptchaImage.timerReload != null) {
						clearTimeout(CaptchaImage.timerReload);
						CaptchaImage.timerReload = null;
					}
					CaptchaImage.timerReload = setTimeout("CaptchaImage.activate();", 5000);
				}
			}).error(function() {
				if(CaptchaImage.isWorking()) {
					jQuery('#loading').hide();
					jQuery('#captcha').fadeIn('fast');
					
					jQuery('.elem_captcha').removeAttr("disabled");
					
					CaptchaImage.activate();
				}
			})
			.show();

		return this;
	},
	
	// Mostrar imágen de cargando centrada con respecto al captcha
	loadingShow : function() {
		var hImg = CaptchaImage.outerHeight() - jQuery("#loading").height();
		var wImg = CaptchaImage.outerWidth() - jQuery("#loading").width();

		var cssLoading = {
			'padding': '0px',
			'border-width': '0px',
			'margin': parseInt(hImg/2)+'px '+parseInt(wImg/2)+'px '+
					Math.round(hImg/2.0)+'px '+Math.round(wImg/2.0)+'px'
		}
		
		jQuery("#loading").css(cssLoading).show();
		
		return this;
	},
	
	// Desactivar funcionalidades del captcha 
	disable : function() {
		
		if(CaptchaImage.isEnabled()) {
			CaptchaImage._enable = false;
			
			CaptchaImage.bindUpdate();
			
			jQuery('#captcha').attr("src", CaptchaImage.generic);
			jQuery('#codigo').add('.elem_captcha').attr("disabled", "true");
			
			CaptchaImage._color_txt = jQuery('.txt_captcha').css("color");
			jQuery('.txt_captcha').css("color", "#999");
		} else {
			CaptchaImage._enable = false;
		}

		return this;
	},
	
	// Activar funcionalidades del captcha 
	enable :  function() {
		
		if(!CaptchaImage.isEnabled()) {
			CaptchaImage._enable = true;
			
			CaptchaImage.unbindUpdate();
			
			jQuery('#codigo').add('.elem_captcha').removeAttr("disabled");
			
			if(CaptchaImage._color_txt != null) {
				jQuery('.txt_captcha').css("color", CaptchaImage._color_txt);
			}
		} else {
			CaptchaImage._enable = true;
		}

		return this;
	},
	
	// Está activo?
	isEnabled :  function() {
		return CaptchaImage._enable;
	},
	
	// Está generandose el captcha?
	isWorking :  function() {
		return CaptchaImage._working;
	},

	activate : function(anima) {
		anima = (anima == null || anima != false?true:false);
		
		if(CaptchaImage.timerReload != null) {
			clearTimeout(CaptchaImage.timerReload);
			CaptchaImage.timerReload = null;
		}

		if(anima) {
			jQuery('.reload_captcha').animate({opacity: 1}).find("a").attr("href", "#");
		} else {
			jQuery('.reload_captcha').css("opacity", "1").find("a").attr("href", "#");
		}
		
		CaptchaImage._working = false;
		
		return this;
	},
	
	// 
	deactivate : function(anima) {
		anima = (anima != false?true:false);
		
		if(CaptchaImage.timerReload != null) {
			clearTimeout(CaptchaImage.timerReload);
			CaptchaImage.timerReload = null;
		}
		
		if(anima) {
			jQuery('.reload_captcha').animate({opacity: 0}).find("a").removeAttr("href");
		} else {
			jQuery('.reload_captcha').css("opacity", "0").find("a").removeAttr("href");
		}
		
		jQuery('#codigo').val("");
		
		return this;
	},
	

	// Añade elementos de actualización del captcha 
	addUpdate : function() {
		var elem = (arguments.length>0?arguments[0]:null);
		var evnt = (arguments.length>1?arguments[1]:'focus');
		
		if(elem != null && (typeof elem) != 'undefined') {
			var objElm = new Object();
			objElm[evnt] = jQuery(elem).bind(evnt, CaptchaImage.show);
			CaptchaImage.elmUpdate.push(objElm);
		}
		
		return this;
	},

	// Activa los eventos de los elementos 
	bindUpdate : function() {
		for(var i = 0; i < CaptchaImage.elmUpdate.length; i++) {
			var elem = CaptchaImage.elmUpdate[i];
			for(var evnt in elem) {
				elem[evnt].bind(evnt, CaptchaImage.show);
			}
		}

		return this;
	},

	// Desactiva los eventos de los elementos 
	unbindUpdate : function() {
		for(var i = 0; i < CaptchaImage.elmUpdate.length; i++) {
			var elem = CaptchaImage.elmUpdate[i];
			for(var evnt in elem) {
				elem[evnt].unbind(evnt, CaptchaImage.show);
			}
		}
		
		return this;
	},

	// Calcula el ancho total del captcha, margenes, bordes, relleno incluidos
	outerWidth : function() {
		var aVal = ['border-left-width','border-right-width','padding-left','padding-right','margin-left','margin-right'];
		
		var objCaptcha = jQuery('#captcha');
		var width = objCaptcha.width();

		for(i = 0; i < aVal.length; i++) {
			var value = objCaptcha.css(aVal[i]).replace(/[^0-9]/g, "");
			width += (value==""?0:parseInt(value));
		}
		
		return width;
	},
	
	// Calcula el alto total del captcha, margenes, bordes, relleno incluidos
	outerHeight : function() {
		var aVal = ['border-top-width','border-bottom-width','padding-top','padding-bottom','margin-top','margin-bottom'];
		
		var objCaptcha = jQuery('#captcha');
		var height = objCaptcha.height();
		
		for(i = 0; i < aVal.length; i++) {
			var value = objCaptcha.css(aVal[i]).replace(/[^0-9]/g, "");
			height += (value==""?0:parseInt(value));
		}
		
		return height;			
	}
	
};
