//var BASE="http://www.exeperu.net/demos/regalosv2/"; // maldito explorer
var BASE="http://localhost/regalosv2/"; // maldito explorer
var $ventana = "";
var tipAgregado;
var TolSuscrito;
var ventanaSugerencias="";
var ventanaVistaprevia="";
var vEdita="";
var CargandoAjax= new Element('div',{
		id:'AjaxCargando',
		styles:{
			backgroundColor:'white',
			width:'110px',
			height:'35px',
			position:'relative',
			zIndex:900,
			display:'none',
			padding:'5px',
			border:'1px solid #1D3D7A'
		},
		'class':'numerossss',
		html:'<img style="padding-right:5px" src="images/cargar.gif" align="absmiddle"/>Cargando...'
		
	});

Selectors.Pseudo.selected = function(){ 
   return (this.selected && 'option' == this.get('tag')); 
};
	
Element.implement({ 
	val:function(){
		return this.get("value");
	},
    show: function() { 
      this.setStyle('display',''); 
	  this.setStyle('visibility','visible'); 
    }, 
    hide: function() { 
      this.setStyle('display','none'); 
	  this.setStyle('visibility','hidden'); 
    },
	html:function(htm){
		this.set("html",htm);
	},
	Imprimir: function() {
		var strName = 'printer-' + (new Date()).getTime(),
		styles = $$('link[type=text/css]').clone(),
		title = document.title,
		that = this,
		iframe = new IFrame({
			name: strName,
			styles: {
				width: 1,
				height: 1,
				position: 'absolute',
				left: -9999
			},
			events: {
				load: function() {
					var doc = this.contentDocument || window.frames[strName].document;
					doc.title = title;
					$(doc.body).adopt(styles, that.clone(true,true));
					this.contentWindow.focus(); // IE necesita obtener el foco sino imprime el frame padre.
					this.contentWindow.print();
				}
			}
		}).inject($(document.body));
		iframe.dispose.delay(15000); // Destruimos el iframe luego de 15 segundos.
	},
	reflect: function(options) {
		var img = this;
		if (img.get("tag") == "img") {
			options = $extend({
				height: 0.33,
				opacity: 0.5
			}, options);

			img.unreflect();

			function doReflect() {
				var reflection, reflectionHeight = Math.floor(img.height * options.height), wrapper, context, gradient;

				if (Browser.Engine.trident) {
					reflection = new Element("img", {src: img.src, styles: {
						width: img.width,
						height: img.height,
						marginBottom: -img.height + reflectionHeight,
						filter: "flipv progid:DXImageTransform.Microsoft.Alpha(opacity=" + (options.opacity * 100) + ", style=1, finishOpacity=0, startx=0, starty=0, finishx=0, finishy=" + (options.height * 100) + ")"
					}});
				} else {
					reflection = new Element("canvas");
					if (!reflection.getContext) return;
					try {
						context = reflection.setProperties({width: img.width, height: reflectionHeight}).getContext("2d");
						context.save();
						context.translate(0, img.height-1);
						context.scale(1, -1);
						context.drawImage(img, 0, 0, img.width, img.height);
						context.restore();
						context.globalCompositeOperation = "destination-out";

						gradient = context.createLinearGradient(0, 0, 0, reflectionHeight);
						gradient.addColorStop(0, "rgba(255, 255, 255, " + (1 - options.opacity) + ")");
						gradient.addColorStop(1, "rgba(255, 255, 255, 1.0)");
						context.fillStyle = gradient;
						context.rect(0, 0, img.width, reflectionHeight);
						context.fill();
					} catch (e) {
						return;
					}
				}
				reflection.setStyles({display: "block", border: 0});

				wrapper = new Element(($(img.parentNode).get("tag") == "a") ? "span" : "div").injectAfter(img).adopt(img, reflection);
				wrapper.className = img.className;
				img.store("reflected", wrapper.style.cssText = img.style.cssText);
				wrapper.setStyles({width: img.width, height: img.height + reflectionHeight, overflow: "hidden"});
				img.style.cssText = "display: block; border: 0px";
				img.className = "reflected";
			}

			if (img.complete) doReflect();
			else img.onload = doReflect;
		}

		return img;
	},
	unreflect: function() {
		var img = this, reflected = this.retrieve("reflected"), wrapper;
		img.onload = $empty;

		if (reflected !== null) {
			wrapper = img.parentNode;
			img.className = wrapper.className;
			img.style.cssText = reflected;
			img.store("reflected", null);
			wrapper.parentNode.replaceChild(img, wrapper);
		}

		return img;
	},
	enVivo: function(event, selector, fn){
		this.addEvent(event, function(e){
			var t = $(e.target);
			if (!t.match(selector)) return false;
			fn.apply(t, [e]);
		}.bindWithEvent(this, selector, fn));
	},
	fadeTo: function(value,duration){
		(duration=="")? speed=500 : speed=duration;
		var elt = this; 
		 elt = new Fx.Tween(elt, {
			 duration : speed,
			 //transition : Fx.Transitions.Quad.easeIn,
			 wait:false
		 }); 
		elt.start('opacity', value);
	}

}); 



/****/

var Descuentos= new Class({
	tipOlvido:"",
	initialize:function(page){
		this.pagina=page;
		this.iniciar();
	},
	activaBanners:function(){
		if($('img_cabecera')){
			$each($$('#img_cabecera img'),function(e){
					new Asset.image(e.get("src"));
			});
			var slideshow = new ASlide('img_cabecera','#img_cabecera img.banners'); 
			slideshow.start();  
		}
	},
	verReloj:function(){
		if($('hora')){
			if (!document.layers&&!document.all&&!document.getElementById)
			return
			
			 var Digital=new Date()
			 var hours=Digital.getHours()
			 var minutes=Digital.getMinutes()
			 var seconds=Digital.getSeconds()
			
			var dn="PM"
			if (hours<12)
			dn="AM"
			if (hours>12)
			hours=hours-12
			if (hours==0)
			hours=12
			
			 if (minutes<=9)
			 minutes="0"+minutes
			 if (seconds<=9)
			 seconds="0"+seconds
			//change font size here to your desire
			myclock="<span>"+hours+":"+minutes+":"
			 +seconds+" "+dn+"</span>"
			if (document.layers){
			document.layers.hora.document.write(myclock)
			document.layers.hora.document.close()
			}
			else if (document.all)
			hora.innerHTML=myclock
			else if (document.getElementById)
			document.getElementById("hora").innerHTML=myclock
			setTimeout(function(){
				this.verReloj();
			}.bind(this),1000)
			}
	},
	verCupon:function(i){
		new Ventana({
			modal:true,
			fondo:"",
			alto:425,
			ancho:787,
			borde:0,
			separacion:0,
			btnCerrar:"xxxx",
			url:'cupon.php?ic='+i
		}).render();
	},
	activaCarruselProvincias:function(){
		if($('carruselProvincias')){
			new ACarrusel("carruselProvincias",{
				avanze:1,
				ver:7,
				anchoItem:100,
				altoItem:30,
				siguiente:'sig',
				anterior:'ant',
				duracion:0.5,
				transicion:'quad:in:out'
			});
			
		}
		
	},
	iniciar:function(){
	},
	reflejaImagenes:function(){
		$$('.reflejo').reflect();
	},
	verCupones:function(i,tipo,t){
		var lista=""
		if($('conconcate_mas_final')){
			this.muestraAjax('conconcate_mas_final');
			$('conconcate_mas_final').tween("opacity",[1,0]);
			(tipo=="cupones")? lista="listaCupones.php?cat="+i+"&p="+t : lista="listaProvincias.php?p="+i+"&cat="+t
			new Request.HTML({
				url: lista,
				update: 'conconcate_mas_final',
				onComplete: function() {
					$('conconcate_mas_final').tween("opacity",[0,1]);
					this.escondeAjax('conconcate_mas_final');
				}.bind(this)
			}).send();
	
		}
	
		
	},
	pagCupones:function(url){
		if($('conconcate_mas_final')){
			this.muestraAjax('conconcate_mas_final');
			$('conconcate_mas_final').tween("opacity",[1,0]);
			new Request.HTML({
				url: url,
				update: 'conconcate_mas_final',
				onComplete: function() {
					$('conconcate_mas_final').tween("opacity",[0,1]);
					this.escondeAjax('conconcate_mas_final');
				}.bind(this)
			}).send();
	
		}
	},
	verProvincia : function(i,c){
		(c!="")?cat=c:cat="";
		window.location.href='provincia.php?p='+i+'&cat='+cat;
		return false;
	},
	muestraAjax:function(capa){
		div=$(capa);
		contenedor=div.getParent();
		coord=contenedor.getCoordinates();
		CargandoAjax.setStyles({
			"top":(coord.height/2) - 250,
			"left":(coord.width/2)- 65
		});
		contenedor.grab(CargandoAjax);
		CargandoAjax.show();

	},
	escondeAjax:function(capa){
		div=$(capa);
		CargandoAjax.hide();
	},
	enviaAmigo:function(){
		$('enviando_ajax').set("html","");
		$('spry_form').reset();
		$('envio_a_amigo').fadeTo(1,500);
	},
	activaContacto:function(){
		if($('formulario')){
			new FormCheck('form1',{
				submitByAjax:true,
				display : {
					scrollToFirst:false
				},
				onAjaxRequest:function(){
					$('msgcontacto').set("html","Enviando Comentario...").show();
				},
				onAjaxSuccess:function(e){
					$('msgcontacto').set("html","Gracias.Pronto nos pondremos en contacto contigo.");		
				}
			});
		}
	}
});




var ACarrusel= new Class({
	Implements : Options,
	contenedor:"",
	options:{
		anchoItem:"",
		altoItem:"",
		ver:2,
		avanze:2,
		anterior:"",
		siguiente:"",
		duracion:0.5,
		auto:"",
		anchoTotal:"",
		transicion:"linear",
		ruedita:"",
		controles:"si"
	},
	anchoTotal:"",
	timer:"",
	hijos:"",
	
	initialize:function (contenedor,options){
		this.setOptions(options);
		this.contenedor=$(contenedor);
		padre=this.contenedor.getParent().getStyle("width");
		var warp= new Element("div",{
			styles:{
				"overflow":"hidden",
				"position":"relative",
				"width":padre
			}
		});
		
		
		if(this.options.ruedita!=""){
			this.contenedor.addEvents({
				"mousewheel":function(e){
					var e = new Event(e).stop();
					if ( e.wheel > 0  ) {
						this.mover("adelante");
					}else{
						this.mover("atras");
					}
				
				}.bind(this)
			});
		}
		this.contenedor.getParent().grab(warp);
		warp.adopt(this.contenedor);
		var ancho=this.contenedor.getParent().getCoordinates();
		if(this.options.anchoItem=="" && this.options.altoItem==""){
			this.options.anchoItem= (ancho.width.toInt()/this.options.ver);
			this.options.altoItem= (ancho.height.toInt()/this.options.ver);
		}
		var nodos=this.contenedor.getChildren();
		this.hijos=nodos;
		this.anchoTotal=this.options.anchoItem * nodos.length;
		this.contenedor.setStyles({"overflow":"hidden","position":"relative","list-style":"none","margin":0,"padding":0,"width":this.anchoTotal });
		this.contenedor.getChildren()
		.setStyles({"float":"left","height":this.options.altoItem,"width":this.options.anchoItem})
		.each(function(e,k){
			//e.set("id","_item_"+(k+1).toInt());
			e.addEvents({
				"mouseenter":function(){
					if(this.options.auto!=""){
						this.detenerAutomovible();
					}
					//e.setStyle("cursor","pointer");
				}.bind(this),
				"mouseleave":function(){
					if(this.options.auto!=""){
						this.automovible();
					}
				}.bind(this)
			});
		}.bind(this));
		
		
		if(this.options.controles=="si"){
			$(this.options.anterior)
			.setStyle("cursor","pointer");
			$(this.options.siguiente)
			.setStyle("cursor","pointer");
			$(this.options.siguiente).
					addEvent("click",function(){
						this.mover("adelante");
				}.bind(this));
				
				$(this.options.anterior).
					addEvent("click",function(){
						this.mover("atras");
				}.bind(this));
		}
		
		if(this.options.auto!=""){
				this.automovible();
		}
	},
	automovible:function(){
		this.timer=this.mover.periodical(this.options.auto * 1000,this,["adelante"]);
	},
	detenerAutomovible:function(){
		$clear(this.timer);
	},
	mover:function(direccion){	
			
			if(direccion=="adelante"){
				actual=this.contenedor.getStyle("margin-left").toInt();
				this.contenedor.set("morph",{
					duration:this.options.duracion * 1000,wait:true,transition:this.options.transicion,
					onStart:function(){
						itemactual= - (this.contenedor.getStyle("margin-left").toInt());//this.anchoTotal
						aver=(itemactual/this.options.anchoItem)+1;
						if(aver>(this.hijos.length-this.options.avanze)){
							this.contenedor.get("morph").cancel();
							this.moverAlPrimero();
							return false;
						}
					}.bind(this)
				});
				this.contenedor.morph({
					"margin-left":  (actual - this.options.anchoItem * this.options.avanze)
					//"opacity" : [0.5,1]
				});
				
			}else if (direccion="atras"){
				actual=this.contenedor.getStyle("margin-left").toInt();
				this.contenedor.set("morph",{duration:this.options.duracion * 1000,wait:true,transition:this.options.transicion,
					onStart:function(){
						itemactual=(this.contenedor.getStyle("margin-left").toInt());//this.anchoTotal
						if(itemactual==0){
							this.contenedor.get("morph").cancel();
							return false;
						}
					}.bind(this)
				});
				this.contenedor.morph({
					"margin-left":  (actual + this.options.anchoItem * this.options.avanze)
					//"opacity" : [0.5,1]
				});
			}
	},
	moverAlPrimero:function(index){
		this.contenedor.set("morph",{duration:this.options.duracion * 1000,wait:true,transition:this.options.transicion});
		this.contenedor.morph({
			"margin-left":  0
			//"opacity" : [0.5,1]
		})
	}
});


var Ventana= new Class({
	Implements: Options,
	options :{
		modal:false,
		ancho:350,
		titulo:'',
		alto: 350,
		id : "VentanaMoo",
		fondo : "white",
		fondoModal:"#FEF4F8",
		opacidad:0.6,
		html:"",
		url:"",
		arrastra:false,
		juntoA:"",
		separacion:10,
		borde:1,
		btnCerrar:"",
		imagenFondo:"",
		colorfondoCabecera:"",
		colorBorde:"",
		textoCerrar:"",
		anchoPrivado:35,
		htmlCerrar:"",
		estiloCabecera:""
		
	},
	initialize:function(options){
		
		this.setOptions(options);
		av=window.getWidth()/2;
		alv=window.getHeight()/2;
		ad=this.options.ancho/2;
		ald=this.options.alto/2;
		ventana=new Element("div",{
				id:this.options.id,
					styles:{
						backgroundColor : this.options.fondo,
						padding:this.options.separacion + 'px',
						height:this.options.alto + 'px',
						width:this.options.ancho + 'px',
						position:'absolute',
						border:this.options.borde+'px solid #CCC',
						left:parseInt(av)-parseInt(ad),
						top:parseInt(alv)-parseInt(ald),
						zIndex:1200						
					}
					
		});
		
		if(!$(this.options.juntoA)){
			ventana.set('html','<div id="header__moo" class="cabecera__moo" style="padding:10px;height:15px" >'+
								 '<div style="width:85%;float:left;">'+this.options.titulo+'</div>'+
								 '<div align="right" id="cierra_v_moo" style="float:left;width:15%;cursor:pointer;" title=""></div>'+
								 '</div>'+
								 '<div style="border-top:0px solid #CCC;padding:35px;height:'+parseInt(this.options.alto-25)+
								 'px;overflow:auto;vertical-align:middle" align="center" id="conte__moo" class="cuerpo__moo">'+
								 '</div>');
			
		}else{
			ventana.set('html','<div style="border-top:0px solid #CCC;height:'+parseInt(this.options.alto)+
								'px;overflow:auto;vertical-align:middle" align="center" id="conte__moo" class="cuerpo__moo">'+
								'</div>');
		}
	
	},
	render:function(){		
		if(!this.options.modal){
				$$('select').setStyle("visibility","hidden");
				$$('body').grab(ventana);
				
			if(!$(this.options.juntoA)){	
				$('cierra_v_moo').addEvent('click',this.cerrar.bind(this));
			}

				if(this.options.url==""){
					$('conte__moo').set('html',this.options.html);	
				}else{
					$('conte__moo').load(this.options.url);	
				}
				
		}else{
			var modal= new Element('div',{
				id:"VentanaMooModal",
				styles:{
					backgroundColor : this.options.fondoModal,
					opacity:this.options.opacidad,
					height:window.getScrollHeight(),
					width:window.getScrollWidth(),
					zIndex:1009,
					position:'absolute',
					top:'0px',
					left:'0px',
					visibility:'hidden'
				}
			});
			$$('select').setStyle("visibility","hidden");
			$$('body').grab(modal);
			modal.tween("opacity",[0,this.options.opacidad]);
			//modal.fadeTo(this.options.opacidad);
			$$('body').grab(ventana);
			
			if(this.options.separacion==0){
				$('conte__moo').setStyle("padding","0px");
			}
			
			if(this.options.htmlCerrar!=""){
				$('cierra_v_moo').set("html",this.options.htmlCerrar);
			}
			if(this.options.colorBorde!=""){
				ventana.setStyles({"border-color":this.options.colorBorde});
			}
			if(this.options.estiloCabecera!=""){
				$('header__moo').addClass(this.options.estiloCabecera);
			}
			if(this.options.imagenFondo!=""){
					$('conte__moo').setStyle("background-image","url("+this.options.imagenFondo+")");
					$('conte__moo').setStyle("background-repeat","repeat-x");
			}
			
			this.posicionar();
			if(this.options.url==""){
				$('conte__moo').set('html',this.options.html);	
			}else{
					try{
						$('conte__moo').set('load',{
							'evalResponse':true,
							'onSuccess':function(){
								if($(this.options.btnCerrar) && this.options.url){
									$(this.options.btnCerrar).addEvent('click',this.cerrar.bind(this)).setStyle("cursor","pointer").set("title","");
								}else{
									$('cierra_v_moo').addEvent('click',this.cerrar.bind(this));
								}
							}.bind(this)
						});
					
					}catch(err){
							txt="There was an error on this page.\n\n";
							txt+="Error description: " + err.description + "\n\n";
							txt+="Click OK to continue.\n\n";
							alert(txt);
					}
						
				$('conte__moo').load(this.options.url);	
			}
		}
		
		if(this.options.arrastra=="si"){
			if($('header__moo')){
				$('header__moo').setStyle("cursor","move");
				$(ventana).makeDraggable({handle :'header__moo'/*,container:document.body*/});
			}
			
		}
		
		document.addEvents({
			'keypress':function(e){
				if(e.key == 'esc' ){
					if($('conte__moo')){
						this.cerrar();
					}
				}
			}.bind(this)
		});
		window.addEvents({
			'resize':function(){
				if($('conte__moo')){
				//	$('VentanaMooModal').morph({"width":window.getScrollWidth(),"height":window.getScrollHeight()});
					this.posicionar();
				}
				
			}.bind(this),
			"scroll":function(){
				if($('conte__moo')){
					//$('VentanaMooModal').morph({"width":window.getScrollWidth(),"height":window.getScrollHeight()});
					this.posicionar();
				}
			}.bind(this)
		});
	
		$('VentanaMooModal').addEvent("click",function(){
			if($('conte__moo')){
				this.cerrar();
			}
		}.bind(this));
		
		
		var pos=window.getHeight();
				var posAncho=window.getWidth();
				sizes = window.getSize();
				scrollito = window.getScroll();
				
				
				ventana.setStyles({
					top:0
					//'top': (scrollito.y + (sizes.y - this.options.alto) / 2).toInt()
					//'top': (scrollito.y + (sizes.y - this.options.alto) / 2).toInt()
				});
		
		
	},
	cerrar:function(){
			//window.removeEvent('keypress',function(e){});
			$$('select').setStyle("visibility","visible");
			$('VentanaMooModal')
			.set("tween",{
				duration:500,
				onComplete:function(){
						$('VentanaMooModal').destroy();
				}
			});
			if($(this.options.id)){
				$(this.options.id).destroy();
			}
			$('VentanaMooModal').tween("opacity",[this.options.opacidad,0])
			
			$$('select').setStyle("visibility","visible");
	},
	posicionar:function(){
		var scrollventana = new Fx.Scroll(window, {
				wait: false,
				duration: 800,
				transition:  Fx.Transitions.Sine.easeInOut
		});
		if($(this.options.juntoA!="")){
				var pos=$(this.options.juntoA).getCoordinates();
				scrollventana.toElement($(this.options.juntoA).getParent());
				try{
					ventana.set('morph', {
									duration: 800, 
									transition: 'quad:out',
									onComplete:function(){
										//$('VentanaMooModal').setStyles({"width","100","height":"100"})
									}
								})
								
							.setStyle("left",pos.left - (this.options.ancho / 2).toInt());
							ventana.morph({
								opacity : [0.5,1],
								top: pos.top -  (this.options.alto).toInt() - 30
							});
				}catch(err){
					  txt="There was an error on this page.\n\n";
					  txt+="Error description: " + err.description + "\n\n";
					  txt+="Click OK to continue.\n\n";
					  alert(txt);
				}	
				
							
		}else{
				var pos=window.getHeight();
				var posAncho=window.getWidth();
				sizes = window.getSize();
				scrollito = window.getScroll();
				
				/*
				ventana.setStyles({
					//top:0 + defaz.toInt()  
					'top': (scrollito.y + (sizes.y - this.options.alto) / 2).toInt()
				});
				*/
				
				try{
					
					//$('VentanaMooModal').morph({"width":window.getScrollWidth(),"height":window.getScrollHeight()});
					//ventana.setStyles({'top': (scrollito.y + (sizes.y - this.options.alto) / 2).toInt()});
					ventana.set('morph', {
									duration: 500, 
									transition: 'sine:in:out',
									onComplete:function(){
										//scrollventana.toElement($('conte__moo'));
										
									}
								})								
							.morph({
								'top': (scrollito.y + (sizes.y - this.options.alto) / 2).toInt(),
								"left":posAncho / 2 - (this.options.ancho / 2).toInt()
							});
					$('cierra_v_moo').addEvent('click',this.cerrar.bind(this));
					
							
				}catch(err){
					  txt="There was an error on this page.\n\n";
					  txt+="Error description: " + err.description + "\n\n";
					  txt+="Click OK to continue.\n\n";
					  alert(txt);
				}	
				
		}
	}
});

var FormCheck = new Class({
	
	Implements: [Options, Events],

	options : {
		
		tipsClass : 'fc-tbx',				//tips error class
		errorClass : 'fc-error',			//div error class
		fieldErrorClass : 'fc-field-error',	//error class for elements
		
		submit : true,						//false : just validate the form and do nothing else. Use onValidateSuccess event to execute some code
		
		trimValue : false,					//trim (remove whitespaces before and after) the value
		validateDisabled : false,			//skip validation on disabled input if set to false.
		
		submitByAjax : false,				//false : standard submit way, true : submit by ajax
		ajaxResponseDiv : false,			//element to inject ajax response into (can also use onAjaxSuccess) [cronix] 
		ajaxEvalScripts : false,			//use evalScripts in the Request response [cronix] 
		onAjaxRequest : $empty,				//Function to fire when the Request event starts 
		onAjaxSuccess : $empty,				//Function to fire when the Request receives .  Args: response [the request response] - see Mootools docs for Request.onSuccess 
		onAjaxFailure : $empty,				//Function to fire if the Request fails
		
		onSubmit		  : $empty,			//Function to fire when user submit the form
		onValidateSuccess : $empty,			//Function to fire when validation pass
		onValidateFailure : $empty,			//Function to fire when validation fails

		display : {
			showErrors : 0,
			titlesInsteadNames : 0,
			errorsLocation : 1,
			indicateErrors : 1,
			indicateErrorsInit : 0,
			keepFocusOnError : 0,
			checkValueIfEmpty : 1,
			addClassErrorToField : 0,
			removeClassErrorOnTipClosure : 0,
			fixPngForIe : 1,
			replaceTipsEffect : 1,
			flashTips : 0,
			closeTipsButton : 1,
			tipsPosition : "right",
			tipsOffsetX : -45,
			tipsOffsetY : 0,
			listErrorsAtTop : false,
			scrollToFirst : true,
			fadeDuration : 0
		},
		
		alerts : {
			required : "Este campo es obligatorio.",
			alpha : "Este campo solo acepta letras.",
			alphanum : "Este campo s&oacute;lo acepta letras y n&uacute;meros.",
			nodigit : "No se aceptan d&iacute;gitos.",
			digit : "Por favor solo ingrese numero enteros.",
			digitltd : "Este valor debe estar entre %0 y %1",
			number : "Por favor ingrese un n&uacute;mero v&aacute;lido.",
			email : "Por favor ingrese un email v&aacute;lido.",
			image : 'Este campo s&olo acepta im&aacute;genes', 
			phone : "Por favor ingrese un numero de tel&eacute;fono v&acute;lido.",
			phone_inter : "Por favor ingrese un numero internacional de tel&eacute;fono v&acute;lido.",
			url : "Por favor ingrese una correcta URL.",
			
			confirm : "Este campo es diferente de  %0",
			differs : "Este campo debe ser diferente de  %0",
			length_str : "El tama&ntilde;o es incorrecto, debe ser contener entre %0 y %1",
			length_fix : "El tama&ntilde;o es incorrecto, debe contener exactamente %0 caracteres",
			lengthmax : "El tama&ntilde;o es incorrecto, debe ser como m&aacute;ximo %0",
			lengthmin : "El tama&ntilde;o es incorrecto, debe ser mayor a %0",
			words_min : "Este campo debe estar entre %0 palabras, actualmente: %1 palabras",
			words_range : "Eset campo debe contener %0-%1 palabras, actualmente: %2 palabras",
			words_max : "Este campo debe contener como m&aacute;ximo %0 palabras, actualmente: %1 palabras",
			checkbox : "Por favor revise el check",
			radios : "Por favor seleccione una opci&oacute;n",
			select : "Por favor seleccione un valor"
		},
		
		regexp : {
			required : /[^.*]/,
			alpha : /^[a-z ._-]+$/i,
			alphanum : /^[a-z0-9 ._-]+$/i,
			digit : /^[-+]?[0-9]+$/,
			nodigit : /^[^0-9]+$/,
			number : /^[-+]?\d*\.?\d+$/,
			email : /^([a-zA-Z0-9_\.\-\+%])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,
			image : /.(jpg|jpeg|png|gif|bmp)$/i,
			phone : /^[\d\s ().-]+$/, // alternate regex : /^[\d\s ().-]+$/,/^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/
			phone_inter : /^\+{0,1}[0-9 \(\)\.\-]+$/,
			url : /^(http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&amp;%\$#\=~])*$/i
		}
	},
	
	/*
	Constructor: initialize
		Constructor
	
		Add event on formular and perform some stuff, you now, like settings, ...
	*/
	initialize : function(form, options) {
		if (this.form = $(form)) {
			this.form.isValid = true;
			this.regex = ['length'];
			this.setOptions(options);
			
			//internalization
			if (typeof(formcheckLanguage) != 'undefined') this.options.alerts = $merge(this.options.alerts, formcheckLanguage);
			
			this.validations = [];
			this.alreadyIndicated = false;
			this.firstError = false;
			
			var regex = new Hash(this.options.regexp);
			regex.each(function(el, key) {
				this.regex.push(key);
			}, this);

			this.form.getElements("*[class*=validate]").each(function(el) {
				if (el.get('tag') == 'select' || el.get('tag') == 'input' || el.get('tag') == 'textarea') this.register(el);
			}, this);
			
			this.form.addEvents({
				"submit": this.onSubmit.bind(this)
			});
			
			if(this.options.display.fixPngForIe) this.fixIeStuffs();
			document.addEvent('mousewheel', function(){
				this.isScrolling = false;
			}.bind(this));
		}
	},
	
	/*
	Function: register
		Allows you to declare afterward new fields to the formcheck, to check dynamically loaded fields for example.
		By default it will be the last element to be validated as it's added after others inputs, but you can define a position with second parameter.
	
	Example:
		(code)
		<script type="text/javascript">
			window.addEvent('domready', function() {
				formcheck = new FormCheck('form_id');
			});
			
			// ...some code...
			
			var newField = new Element('input', {
				class	: "validate['required']",
				name	: "new-field"
			}).inject('form_id');
			formcheck.register(newField, 3);
			
			new Element('input', {
				class	: "validate['required']",
				name	: "another-field",
				id		: "another-field"
			}).inject('form_id');
			formcheck.register($('another-field'));
		</script>
		(end code)
	
	See also:
		<FormCheck::dispose>
	*/
	register : function(el, position) {
		el.validation = [];
		el.getProperty("class").split(' ').each(function(classX) {
			if(classX.match(/^validate(\[.+\])$/)) {
				var valid = true;
				//we check if group is already registered
				if (el.type == "radio") {
					this.validations.each(function(valider){
						if (valider.name == el.name) valid = false;
					}, this)
				}
				var validators = eval(classX.match(/^validate(\[.+\])$/)[1]);
				for(var i = 0; i < validators.length; i++) {
					el.validation.push(validators[i]);
					if (validators[i].match(/^confirm\[/)) {
						var field = eval(validators[i].match(/^.+(\[.+\])$/)[1].replace(/([A-Z0-9\._-]+)/i, "'$1'"));
						if (this.form[field].validation.contains('required')){
							el.validation.push('required');
						}							
					}
					if(validators[i].match(/^target:.+/)) {
						el.target = validators[i].match(/^target:(.+)/)[1];
					}
				}
				//new push way
				if (position && position <= this.validations.length) {
					var newValidations = [];
					this.validations.each(function(valider, i){
						if (position == i+1 && valid) {
							newValidations.push(el);
							this.addListener(el);
						}
						newValidations.push(valider);
					}, this);
					this.validations = newValidations;
				} else {
					if (valid) {
						this.validations.push(el);
						this.addListener(el);
					}
				}
			}
		}, this);
	},
	
	/*
	Function: dispose
		Allows you to remove a declared field from formCheck
	
	Example:
		(code)
		<script type="text/javascript">
			window.addEvent('domready', function() {
				formcheck = new FormCheck('form_id');
			});
			
			// ...some code...
			
			formcheck.dispose($('obsolete-field'));
		</script>
		(end code)
	
	See also:
		<FormCheck::register>
	*/
	dispose : function(element) {
		this.validations.erase(element);
	},
	
	/*
	Function: addListener
		Private method
		
		Add listener on fields
	*/
	addListener : function(el) {
		el.errors = [];
		
		if (this.options.display.indicateErrorsInit) {
			this.validations.each(function(el) {
				if(!this.manageError(el,'submit')) this.form.isValid = false;
			}, this);
			return true;
		} 
	
		if (el.validation[0] == 'submit') {
			el.addEvent('click', function(e){
				if (this.onSubmit(e)) this.form.submit();
			}.bind(this));
			return true;
		}

		if (this.isChildType(el) == false) el.addEvent('blur', function() {
			(function(){
				if(!this.fxRunning && (el.element || this.options.display.showErrors == 1) && (this.options.display.checkValueIfEmpty || el.value))
				this.manageError(el, 'blur')
			}.bind(this)).delay(100);
		}.bind(this))
		//We manage errors on radio
		else if (this.isChildType(el) == true) {
			//We get all radio from the same group and add a blur option
			var nlButtonGroup = this.form.getElements('input[name="'+ el.getProperty("name") +'"]');
			nlButtonGroup.each(function(radio){
				radio.addEvent('blur', function(){
					(function(){
						if((el.element || this.options.display.showErrors == 1) && (this.options.display.checkValueIfEmpty || el.value)) this.manageError(el, 'click');
					}.bind(this)).delay(100);
				}.bind(this))
			},this);
		}
	},
	
	/*
	Function: validate
		Private method
		
		Dispatch check to other methods
	*/
	validate : function(el) {
		el.errors = [];
		el.isOk = true;
		
		//skip validation and trim if specified
		if (!this.options.validateDisabled && el.get('disabled')) return true;
		if (this.options.trimValue && el.value) el.value = el.value.trim();
		
		el.validation.each(function(rule) {
			if(this.isChildType(el)) {
				if (this.validateGroup(el) == false) {
					el.isOk = false;
				}
			} else {
				var ruleArgs = [];
				
				if(rule.match(/target:.+/)) return;
				
				if(rule.match(/^.+\[/)) {
					var ruleMethod = rule.split('[')[0];
					ruleArgs = eval(rule.match(/^.+(\[.+\])$/)[1].replace(/([A-Z0-9\._-]+)/i, "'$1'"));
				} else var ruleMethod = rule;
				
				if (this.regex.contains(ruleMethod) && el.get('tag') != "select") {
					if (this.validateRegex(el, ruleMethod, ruleArgs) == false) {
						el.isOk = false;
					}
				}
				if (ruleMethod == 'confirm') {
					if (this.validateConfirm(el, ruleArgs) == false) {
						el.isOk = false;
					}
				}
				if (ruleMethod == 'differs') {
					if (this.validateDiffers(el, ruleArgs) == false) {
						el.isOk = false;
					}
				}
				if (ruleMethod == 'words') {
					if (this.validateWords(el, ruleArgs) == false) {
						el.isOk = false;
					}
				}
				if (el.get('tag') == "select" || (el.type == "checkbox" && ruleMethod == 'required')) {
					if (this.simpleValidate(el) == false) {
						el.isOk = false;
					}
				}
				if(rule.match(/%[A-Z0-9\._-]+$/i) || (el.isOk && rule.match(/~[A-Z0-9\._-]+$/i))) {
					if(eval(rule.slice(1)+'(el)') == false) {
						el.isOk = false;
					}
				}
			}
		}, this);
		
		if (el.isOk) return true;
		else return false;
	},
	
	/*
	Function: simpleValidate
		Private method
		
		Perform simple check for select fields and checkboxes
	*/
	simpleValidate : function(el) {
		if (el.get('tag') == 'select' && el.selectedIndex <= 0) {
			el.errors.push(this.options.alerts.select);
			return false;
		} else if (el.type == "checkbox" && el.checked == false) {
			el.errors.push(this.options.alerts.checkbox);
			return false;
		}
		return true;
	},
	
	/*
	Function: validateRegex
		Private method
		
		Perform regex validations
	*/
	validateRegex : function(el, ruleMethod, ruleArgs) {
		var msg = "";
		if (ruleArgs[1] && ruleMethod == 'length') {
			if (ruleArgs[1] == -1) {
				this.options.regexp.length = new RegExp("^[\\s\\S]{"+ ruleArgs[0] +",}$");
				msg = this.options.alerts.lengthmin.replace("%0",ruleArgs[0]);
			} else if(ruleArgs[0] == ruleArgs[1]) {
				this.options.regexp.length = new RegExp("^[\\s\\S]{"+ ruleArgs[0] +"}$");
				msg = this.options.alerts.length_fix.replace("%0",ruleArgs[0]);
			} else {
				this.options.regexp.length = new RegExp("^[\\s\\S]{"+ ruleArgs[0] +","+ ruleArgs[1] +"}$");
				msg = this.options.alerts.length_str.replace("%0",ruleArgs[0]).replace("%1",ruleArgs[1]);
			}
		} else if (ruleArgs[0] && ruleMethod == 'length') {
			this.options.regexp.length = new RegExp("^.{0,"+ ruleArgs[0] +"}$");
			msg = this.options.alerts.lengthmax.replace("%0",ruleArgs[0]);
		} else {
			msg = this.options.alerts[ruleMethod];
		}
		if (ruleArgs[1] && ruleMethod == 'digit') {
			var regres = true;
			if (!this.options.regexp.digit.test(el.value)) {
				el.errors.push(this.options.alerts[ruleMethod]);
				regres = false;
			}
			if (ruleArgs[1] == -1) {
				var valueres = ( el.value.toInt() >= ruleArgs[0].toInt() ); 
				msg = this.options.alerts.digitmin.replace("%0",ruleArgs[0]);
			} else {
				var valueres = ( el.value.toInt() >= ruleArgs[0].toInt() && el.value.toInt() <= ruleArgs[1].toInt() );
				msg = this.options.alerts.digitltd.replace("%0",ruleArgs[0]).replace("%1",ruleArgs[1]);
			}
			if (regres == false || valueres == false) {
				el.errors.push(msg);
				return false;
			}
		} else if (this.options.regexp[ruleMethod].test(el.value) == false)  {
			el.errors.push(msg);
			return false;
		}
		return true;
	},

	/*
	Function: validateConfirm
		Private method
		
		Perform confirm validations
	*/
	validateConfirm: function(el,ruleArgs) {
		
		var confirm = ruleArgs[0];
		if(el.value != this.form[confirm].value){
			if (this.options.display.titlesInsteadNames)
				var msg = this.options.alerts.confirm.replace("%0",this.form[confirm].getProperty('title'));
			else
				var msg = this.options.alerts.confirm.replace("%0",confirm);
			el.errors.push(msg);
			return false;
		}
		return true;
	},
	
	/*
	Function: validateDiffers
		Private method
		
		Perform differs validations
	*/
	validateDiffers: function(el,ruleArgs) {
		var differs = ruleArgs[0];
		if(el.value == this.form[differs].value){
			if (this.options.display.titlesInsteadNames)
				var msg = this.options.alerts.differs.replace("%0",this.form[differs].getProperty('title'));
			else
				var msg = this.options.alerts.differs.replace("%0",differs);
			el.errors.push(msg);
			return false;
		}
		return true;
	},
	
	/*
	Function: validateWords
		Private method
		
		Perform word count validation
	*/
	validateWords: function(el,ruleArgs) {
		var min = ruleArgs[0];
		var max = ruleArgs[1];
		
		var words = el.value.replace(/[ \t\v\n\r\f\p]/m, ' ').replace(/[,.;:]/g, ' ').clean().split(' ');
		
		if(max == -1) {
			if(words.length < min) {
				el.errors.push(this.options.alerts.words_min.replace("%0", min).replace("%1", words.length));
				return false;
			}
		} else {
			if(min > 0)	{
				if(words.length < min || words.length > max) {
					el.errors.push(this.options.alerts.words_range.replace("%0", min).replace("%1", max).replace("%2", words.length));
					return false;
				}
			} else {
				if(words.length > max) {
					el.errors.push(this.options.alerts.words_max.replace("%0", max).replace("%1", words.length));
					return false;
				}
			}
		}
		return true;
	},


	/*
	Function: isFormValid
		public method
		
		Determine if the form is valid
		
		Return true or false
	*/
    isFormValid: function() {
		this.form.isValid = true;
		this.validations.each(function(el) {
			var validation = this.manageError(el,'testonly');
			if(!validation) this.form.isValid = false;
		}, this);
		return this.form.isValid;
	},
	
	/*
	Function: isChildType
		Private method
		
		Determine if the field is a group of radio or not.
	*/
	isChildType: function(el) {
		return ($defined(el.type) && el.type == 'radio') ? true : false;
	},
	
	/*
	Function: validateGroup
		Private method
		
		Perform radios validations
	*/
	validateGroup : function(el) {
		el.errors = [];
		var nlButtonGroup = this.form[el.getProperty("name")];
		el.group = nlButtonGroup;
		var cbCheckeds = false;
		
		for(var i = 0; i < nlButtonGroup.length; i++) {
			if(nlButtonGroup[i].checked) {
				cbCheckeds = true;
			}
		}
		if(cbCheckeds == false) {
			el.errors.push(this.options.alerts.radios);
			return false;
		} else {
			return true;	
		}
	},
	
	/*
	Function: listErrorsAtTop
		Private method
		
		Display errors
	*/
	listErrorsAtTop : function(obj) {
		if(!this.form.element) {
			 this.form.element = new Element('div', {'id' : 'errorlist', 'class' : this.options.errorClass}).injectTop(this.form);
		}
		if ($type(obj) == 'collection') {
			new Element('p').set('html',"<span>" + obj[0].name + " : </span>" + obj[0].errors[0]).injectInside(this.form.element);
		} else {
			if ((obj.validation.contains('required') && obj.errors.length > 0) || (obj.errors.length > 0 && obj.value && obj.validation.contains('required') == false)) {
				obj.errors.each(function(error) {
					new Element('p').set('html',"<span>" + obj.name + " : </span>" + error).injectInside(this.form.element);
				}, this);
			}
		}
		window.fireEvent('resize');
	},
	
	/*
	Function: manageError
		Private method
		
		Manage display of errors boxes
	*/
	manageError : function(el, method) {
		var isValid = this.validate(el);
		if (method == 'testonly') return isValid;
		if ((!isValid && el.validation.flatten()[0].contains('confirm[')) || (!isValid && el.validation.contains('required')) || (!el.validation.contains('required') && el.value && !isValid)) {
			if(this.options.display.listErrorsAtTop == true && method == 'submit')
				this.listErrorsAtTop(el);
			if (this.options.display.indicateErrors == 2 ||this.alreadyIndicated == false || el.name == this.alreadyIndicated.name)
			{
				if(!this.firstError) this.firstError = el;
				
				this.alreadyIndicated = el;
				
				if (this.options.display.keepFocusOnError && el.name == this.firstError.name) (function(){el.focus()}).delay(20);
				this.addError(el);
				return false;
			}
		} else if ((isValid || (!el.validation.contains('required') && !el.value))) {
			this.removeError(el);
			return true;
		}
		return true;
	},
	
	/*
	Function: addError
		Private method
		
		Add error message
	*/
	addError : function(obj) {
		//determine position
		var coord = obj.target ? $(obj.target).getCoordinates() : obj.getCoordinates();
		
		if(!obj.element && this.options.display.indicateErrors != 0) {
			if (this.options.display.errorsLocation == 1) {
				var pos = (this.options.display.tipsPosition == 'left') ? coord.left : coord.right;
				var options = {
					'opacity' : 0,
					'position' : 'absolute',
					'float' : 'left',
					'left' : pos + this.options.display.tipsOffsetX,
					'z-Index' : 900
				}
				obj.element = new Element('div', {'class' : this.options.tipsClass, 'styles' : options}).injectInside(document.body);
				this.addPositionEvent(obj);
			} else if (this.options.display.errorsLocation == 2){
				obj.element = new Element('div', {'class' : this.options.errorClass, 'styles' : {'opacity' : 0}}).injectBefore(obj);
			} else if (this.options.display.errorsLocation == 3){
				obj.element = new Element('div', {'class' : this.options.errorClass, 'styles' : {'opacity' : 0}});
				if ($type(obj.group) == 'object' || $type(obj.group) == 'collection')
					obj.element.injectAfter(obj.group[obj.group.length-1]);
				else
					obj.element.injectAfter(obj);
			}
		}					
		if (obj.element && obj.element != true) {
			obj.element.empty();
			if (this.options.display.errorsLocation == 1) {
				var errors = [];
				obj.errors.each(function(error) {
					errors.push(new Element('p').set('html', error));
				});
				var tips = this.makeTips(errors).injectInside(obj.element);
				if(this.options.display.closeTipsButton) {
					tips.getElements('a.close').addEvent('mouseup', function(){
						this.removeError(obj, 'tip');
					}.bind(this));
				}
				obj.element.setStyle('top', coord.top - tips.getCoordinates().height + this.options.display.tipsOffsetY);
			} else {
				obj.errors.each(function(error) {
					new Element('p').set('html',error).injectInside(obj.element);
				});
			}
			
			if (!this.options.display.fadeDuration || Browser.Engine.trident && Browser.Engine.version == 5 && this.options.display.errorsLocation < 2) {
				obj.element.setStyle('opacity', 1);
			} else {
				obj.fx = new Fx.Tween(obj.element, {
					'duration' : this.options.display.fadeDuration,
					'ignore' : true,
					'onStart' : function(){
						this.fxRunning = true;
					}.bind(this),
					'onComplete' : function() {
						this.fxRunning = false;
						if (obj.element && obj.element.getStyle('opacity').toInt() == 0) {
							obj.element.destroy();
							obj.element = false;
						}
					}.bind(this)
				})
				if(obj.element.getStyle('opacity').toInt() != 1) obj.fx.start('opacity', 1);
			}
		}
		if (this.options.display.addClassErrorToField && this.isChildType(obj) == false){
			obj.addClass(this.options.fieldErrorClass);
			obj.element = obj.element || true;
		}
			
	},
	
	/*
	Function: addPositionEvent
		
		Update tips position after a browser resize
	*/
	addPositionEvent : function(obj) {
		if(this.options.display.replaceTipsEffect) {
			obj.event = function(){
				var coord = obj.target ? $(obj.target).getCoordinates() : obj.getCoordinates();
				new Fx.Morph(obj.element, {
					'duration' : this.options.display.fadeDuration
				}).start({ 
					'left':[obj.element.getStyle('left'), coord.right + this.options.display.tipsOffsetX],
					'top':[obj.element.getStyle('top'), coord.top - obj.element.getCoordinates().height + this.options.display.tipsOffsetY]
				});
			}.bind(this);
			
		} else {
			obj.event = function(){
				var coord = obj.target ? $(obj.target).getCoordinates() : obj.getCoordinates();
				obj.element.setStyles({ 
					'left':coord.right + this.options.display.tipsOffsetX,
					'top':coord.top - obj.element.getCoordinates().height + this.options.display.tipsOffsetY
				});
			}.bind(this)
		}
		window.addEvent('resize', obj.event);
	},
	
	/*
	Function: removeError
		Private method
		
		Remove the error display
	*/
	removeError : function(obj, method) {
		if ((this.options.display.addClassErrorToField && !this.isChildType(obj) && this.options.display.removeClassErrorOnTipClosure) || (this.options.display.addClassErrorToField && !this.isChildType(obj) && !this.options.display.removeClassErrorOnTipClosure && method != 'tip'))
			obj.removeClass(this.options.fieldErrorClass);

		if (!obj.element) return;
		this.alreadyIndicated = false;
		obj.errors = [];
		obj.isOK = true;
		window.removeEvent('resize', obj.event);
		if (this.options.display.errorsLocation >= 2 && obj.element) {
			new Fx.Tween(obj.element, {
				'duration': this.options.display.fadeDuration
			}).start('height', 0);
		}
		if (!this.options.display.fadeDuration || Browser.Engine.trident && Browser.Engine.version == 5 && this.options.display.errorsLocation == 1 && obj.element) {
			this.fxRunning = true;
			obj.element.destroy();
			obj.element = false;
			(function(){this.fxRunning = false}.bind(this)).delay(200);
		} else if (obj.element && obj.element != true) {
			obj.fx.start('opacity', 0);
		}
	},
	
	/*
	Function: focusOnError
		Private method
		
		Create set the focus to the first field with an error if needed
	*/
	focusOnError : function (obj) {
		if (this.options.display.scrollToFirst && !this.alreadyFocused && !this.isScrolling) {
			if (!this.options.display.indicateErrors || !this.options.display.errorsLocation) {
				var dest = obj.getCoordinates().top-30;
			} else if (this.alreadyIndicated.element) {
				switch (this.options.display.errorsLocation){
					case 1 : 
						var dest = obj.element.getCoordinates().top;
						break;
					case 2 :
						var dest = obj.element.getCoordinates().top-30;
						break;
					case 3 :
						var dest = obj.getCoordinates().top-30;
						break;
				}
				this.isScrolling = true;
			}
			if (window.getScroll.y != dest) {
				new Fx.Scroll(window, { duration:"long",
					onComplete : function() {
						this.isScrolling = false;
						if (obj.getProperty('type') != 'hidden') obj.focus();
					}.bind(this)
				}).start(0,dest);
			} else {
				this.isScrolling = false;
				obj.focus();
			}
			this.alreadyFocused = true;
		}
	},
	
	/*
	Function: fixIeStuffs
		Private method
		
		Fix png for IE6
	*/
	fixIeStuffs : function () {
		if (Browser.Engine.trident4) {
			//We fix png stuffs
			var rpng = new RegExp('url\\(([\.a-zA-Z0-9_/:-]+\.png)\\)');
			var search = new RegExp('(.+)formcheck\.css');
			for (var i = 0; i < document.styleSheets.length; i++){
				if (document.styleSheets[i].href.match(/formcheck\.css$/)) {
					var root = document.styleSheets[i].href.replace(search, '$1');
					var count = document.styleSheets[i].rules.length;
					for (var j = 0; j < count; j++){
						var cssstyle = document.styleSheets[i].rules[j].style;
						var bgimage = root + cssstyle.backgroundImage.replace(rpng, '$1');
						if (bgimage && bgimage.match(/\.png/i)){
							var scale = (cssstyle.backgroundRepeat == 'no-repeat') ? 'crop' : 'scale';
							cssstyle.filter =  'progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, src=\'' + bgimage + '\', sizingMethod=\''+ scale +'\')';
							cssstyle.backgroundImage = "none";
						}
					}
				}
			}
		}
	},
	
	/*
	Function: makeTips
		Private method
		
		Create tips boxes
	*/
	makeTips : function(txt) {
		var table = new Element('table');
			table.cellPadding ='0';
			table.cellSpacing ='0';
			table.border ='0';
			
			var tbody = new Element('tbody').injectInside(table);
				var tr1 = new Element('tr').injectInside(tbody);
					new Element('td', {'class' : 'tl'}).injectInside(tr1);
					new Element('td', {'class' : 't'}).injectInside(tr1);
					new Element('td', {'class' : 'tr'}).injectInside(tr1);
				var tr2 = new Element('tr').injectInside(tbody);
					new Element('td', {'class' : 'l'}).injectInside(tr2);
					var cont = new Element('td', {'class' : 'c'}).injectInside(tr2);
						var errors = new Element('div', {'class' : 'err'}).injectInside(cont);
						txt.each(function(error) {
							error.injectInside(errors);
						});
						if (this.options.display.closeTipsButton) new Element('a',{'class' : 'close'}).injectInside(cont);
					new Element('td', {'class' : 'r'}).injectInside(tr2);
				var tr3 = new Element('tr').injectInside(tbody);
					new Element('td', {'class' : 'bl'}).injectInside(tr3);
					new Element('td', {'class' : 'b'}).injectInside(tr3);
					new Element('td', {'class' : 'br'}).injectInside(tr3);			
		return table;
	},
	
	/*
	Function: reinitialize
		Reinitialize form before submit check. You can use this also to remove all tips from a form, passing the argument "forced" ( formcheck.reinitialize('forced'); )
	*/
	reinitialize: function(forced) {
		this.validations.each(function(el) {
			if (el.element) {
				el.errors = [];
				el.isOK = true;
				if(this.options.display.flashTips == 1 || forced == 'forced') {
					el.element.destroy();
					el.element = false;
				}
			}
		}, this);
		if (this.form.element) this.form.element.empty();
		this.alreadyFocused = false;
		this.firstError = false;
		this.elementToRemove = this.alreadyIndicated;
		this.alreadyIndicated = false;
		this.form.isValid = true;
	},
	
	/*
	Function: submitByAjax
		Private method		
		
		Send the form by ajax, and replace the form with response
	*/
	
	submitByAjax: function() {
		var url = this.form.getProperty('action');
		this.fireEvent('ajaxRequest');
		new Request({
			url: url,
			method: this.form.getProperty('method'),
			data : this.form.toQueryString(),
			evalScripts: this.options.ajaxEvalScripts,
			onFailure: function(instance){
				this.fireEvent('ajaxFailure', instance);
			}.bind(this),
			onSuccess: function(result){
				this.fireEvent('ajaxSuccess', result);
				if(this.options.ajaxResponseDiv) $(this.options.ajaxResponseDiv).set('html',result);
			}.bind(this)
		}).send();
	},
	
	/*
	Function: onSubmit
		Private method		
		
		Perform check on submit action
	*/
	onSubmit: function(event) {
		this.reinitialize();
		this.fireEvent('onSubmit');
		
		this.validations.each(function(el) {
			var validation = this.manageError(el,'submit');
			if(!validation) this.form.isValid = false;
		}, this);
	    
		if (this.form.isValid) {
			if (this.options.submitByAjax) {
				new Event(event).stop();
				this.submitByAjax();
			} else if(!this.options.submit) {
				new Event(event).stop();
			}
			this.fireEvent('validateSuccess');
			return true;
		} else {
			new Event(event).stop();
			if (this.elementToRemove && this.elementToRemove != this.firstError && this.options.display.indicateErrors == 1) {
				this.removeError(this.elementToRemove);
			}
			this.focusOnError(this.firstError);
			this.fireEvent('validateFailure');
			return false;
		}
	}
});


var ASlide = new Class({
	options: {
		showControls: false,
		showDuration: 5000,
		showTOC: false,
		tocWidth: 20,
		tocClass: 'toc',
		tocActiveClass: 'toc-active',
		durationEfect:1000
	},
	Implements: [Options,Events],
	initialize: function(container,elements,options) {
		//settings
		this.container = $(container);
		this.elements = $$(elements);
		this.currentIndex = 0;
		this.interval = '';
		if(this.options.showTOC) this.toc = [];
		
		//assign
		this.elements.each(function(el,i){
			var capa= new Element('div',{
			});
			capa.inject(this.container);
			if(this.options.showTOC) {
				this.toc.push(new Element('a',{
					text: i+1,
					href: '#',
					'class': this.options.tocClass + '' + (i == 0 ? ' ' + this.options.tocActiveClass : ''), //modificado para dulce
					//'class': 'toc'+(i+1)+' ' + (i == 0 ? ' ' + 'toc'+(i+1)+'-active' : ''),
					events: {
						click: function(e) {
							if(e) e.stop();
							this.stop();
							this.show(i);
						}.bind(this)
					},
					styles: {
						left: 280+ ((i + 1) * (this.options.tocWidth + 80)) //mpodificado parsa dulce  < ((i + 1) * (this.options.tocWidth + 10)) >
					}
				}).inject(this.container));
				//.inject(capa))
			}
			
			if(i > 0) el.set('opacity',0);
		},this);
		
		//next,previous links
		if(this.options.showControls) {
			this.createControls();
			
		}
		//events
		this.container.addEvents({
			mouseenter: function() { this.stop(); }.bind(this),
			mouseleave: function() { this.start(); }.bind(this)
		});

	},
	show: function(to) {
		//alert(this.currentIndex+1);
		this.elements[this.currentIndex].set("tween",{duration:this.options.durationEfect});
		this.elements[this.currentIndex].tween('opacity',0);
		if(this.options.showTOC) this.toc[this.currentIndex].removeClass(this.options.tocActiveClass);
		this.elements[this.currentIndex = ($defined(to) ? to : (this.currentIndex < this.elements.length - 1 ? this.currentIndex+1 : 0))].tween("opacity",1);
		if(this.options.showTOC) this.toc[this.currentIndex].addClass(this.options.tocActiveClass);
	},
	start: function() {
		this.interval = this.show.bind(this).periodical(this.options.showDuration);
	},
	stop: function() {
		$clear(this.interval);
	},
	//"private"
	createControls: function() {
		var next = new Element('a',{
			href: '#',
			id: 'next',
			text: '>>',
			events: {
				click: function(e) {
					if(e) e.stop();
					this.stop(); 
					this.show();
				}.bind(this)
			}
		}).inject(this.container); 
		var previous = new Element('a',{
			href: '#',
			id: 'previous',
			text: '<<',
			events: {
				click: function(e) {
					if(e) e.stop();
					this.stop(); 
					this.show(this.currentIndex != 0 ? this.currentIndex -1 : this.elements.length-1);
				}.bind(this)
			}
		}).inject(this.container); 
	}
});



/****/		
new Asset.css('css/formcheck.css');
var descuentos = new Descuentos();






