function LaMaga()
{
	this.runtime = {'node_id':0};
	this.wasMovedRight = false;
	this.LaMaga();
}

LaMaga.vars = {
	wasMovedRight:false
}

LaMaga.statics = {
	hide:function(el)
	{
		var att = {opacity:{from:0.8, to:0}};
		var element = new yd.Anim(el, att, 1, YAHOO.util.Easing.easeOut);
		element.animate();
	}
} 

LaMaga.prototype.LaMaga = function()
{
	yd.Dom.setStyle('responseRequest', 'opacity', '0');
	yd.Dom.setStyle('responseRequest', 'position', 'absolute');
	//comentarios
	// yd.Event.addListener(yd.Dom.getElementsByClassName('findComentarios', 'a'), 'click', this.requestComentarios, this, true);
	// yd.Event.addListener(yd.Dom.getElementsByClassName('findComentar', 'a'), 'click', this.requestComentar, this, true);
	//asterisco && convocatoria
	// yd.Event.addListener(yd.Dom.getElementsByClassName('findAsterisco', 'a'), 'click', this.prepareAsterisco, this, true);
	yd.Event.addListener(yd.Dom.getElementsByClassName('findConvocatoria', 'a'), 'click', this.requestConvocatoria, this, true);
	//contacto 
	yd.Event.addListener(yd.Dom.getElementsByClassName('findContacto', 'a'), 'click', this.requestContacto, this, true);
	//save list
	yd.Event.addListener(yd.Dom.getElementsByClassName('enviarListaBtn', 'input'), 'click', this.requestLista, this, true);

	yd.Event.addListener('navegateBySelect', 'change', this.navigate, this, true);
	
	
	new formInputLabel({form:'listaForm', className:'input'});
	
	var gif = {el:'wraper', img:'/img/ajax-loader.gif', position:'center', width:32, height:32};
	
	// var html = '<img class="obra" alt="Nombre artista" src="/uploaded/img/11_portada.png" id="image_17" _height="562" _width="900">';
	// var html = html.replace(/_width="[0-9]*"/, 'width="800"');
	// var html = html.replace(/_height="[0-9]*"/, 'height="500"');

	this.screenWidth = screen.availWidth;
	this.screenHeight = screen.availHeight;

	if(this.screenWidth <= 1280)
		new AJAX({loading:gif, url:'/page/obras/'+window.location.search, onSuccess:'onResponseEvents', idUpdaterNode:'wraper', forceCallback:true, scope:this});
	else
		new AJAX({loading:gif, url:'/page/obras/'+window.location.search, onSuccess:'onResponseEvents', idUpdaterNode:'wraper', scope:this});
	


}
LaMaga.prototype.debug = function(msg){console.log(''+msg+'');}
LaMaga.prototype.onResponseEvents = function(o,a)
{
	//comentar events
	yd.Event.addListener(yd.Dom.getElementsByClassName('enviarComentarBtn', 'input'), 'click', this.postComentar, this, true);
	yd.Event.addListener(yd.Dom.getElementsByClassName('cerrarComentarBtn', 'input'), 'click', this.hideComentar, this, true);
	
	//get the screen dimensions
	if(this.screenWidth <= 1280)
	{
		var html = o.html;
		// html = html.replace(/_width="[0-9]*"/, 'width="800"', 'g');
		var regex = new RegExp(/_width="[0-9]*"/g);
		var html = html.replace(regex, 'width="750"');
		yd.Dom.get('wraper').innerHTML = html;
		
		var containers = yd.Dom.getElementsByClassName('ContenedorArtista', 'div', 'moveMe');
		yd.Dom.setStyle(containers, 'width', '800px');
		
	}

	//move obras
	if(o)
	{
		yd.Event.addListener(yd.Dom.getElementsByClassName('moveRight', 'a'), 'mouseover', this.moveRight, this, true);
		yd.Event.addListener(yd.Dom.getElementsByClassName('moveRight', 'a'), 'mouseout', this.moveRight, this, true);

		yd.Event.addListener(yd.Dom.getElementsByClassName('moveLeft', 'a'), 'mouseover', this.moveLeft, this, true);
		yd.Event.addListener(yd.Dom.getElementsByClassName('moveLeft', 'a'), 'mouseout', this.moveLeft, this, true);

		//comentarios
		yd.Event.addListener(yd.Dom.getElementsByClassName('findComentarios', 'a'), 'click', this.requestComentarios, this, true);
		yd.Event.addListener(yd.Dom.getElementsByClassName('findComentar', 'a'), 'click', this.requestComentar, this, true);

		//asterisco
		yd.Event.addListener(yd.Dom.getElementsByClassName('findAsterisco', 'a'), 'click', this.prepareAsterisco, this, true);

		//again the Listener
		//yd.Event.addListener(yd.Dom.getElementsByClassName('findComentar', 'a'), 'click', this.requestComentar, this, true);
	}

}

LaMaga.prototype.navigate = function(e,a)
{
	var el = yd.Event.getTarget(e);
	if(el.value != -1)
		yd.Dom.get('navegateBy').submit();
}

LaMaga.prototype.moveLeft = function(e,a)
{
	this.hideComentar();
	this.hideComentarios();
	
	if(!this.wasMovedRight)
		return;
	
	// if(e=='complete')
	// {
	// 	var xy = yd.Dom.getXY('moveMe');
	// 	var att = {points: { from:xy, to:[xy[0]+500, xy[1]] }};
	// 	this.attributes = att;
	// 	this.animate();
	// }
	// else 
	if(e.type=='mouseover')
	{
		var xy = yd.Dom.getXY('moveMe');
		var att = {points: { from:xy, to:[xy[0]+yd.Dom.get('moveMe').clientWidth, xy[1]] }};
		this.movement = new yd.Motion('moveMe', att, 100, YAHOO.util.easeNone);
		// this.movement.onComplete.subscribe(this.moveLeft)
		this.movement.animate();
	}
	else
	{
		this.movement.onTween.subscribe(function(){
			this.stop();
		});
	}
}


LaMaga.prototype.moveRight = function(e,a)
{
	this.hideComentar();
	this.hideComentarios();
	
	this.wasMovedRight = true;
	
	// if(e=='complete')
	// {
	// 	var xy = yd.Dom.getXY('moveMe');
	// 	var att = {points: { from:xy, to:[xy[0]-yd.Dom.get('moveMe').clientWidth, xy[1]] }};
	// 	this.attributes = att;
	// 	this.animate();
	// }
	//else 
	if(e.type=='mouseover')
	{
		var xy = yd.Dom.getXY('moveMe');
		var att = {points: { from:xy, to:[xy[0]-yd.Dom.get('moveMe').clientWidth, xy[1]] }};
		this.movement = new yd.Motion('moveMe', att, 100, YAHOO.util.easeNone);
		//this.movement.onComplete.subscribe(this.moveRight)
		this.movement.animate();
	}
	else
	{
		this.movement.onTween.subscribe(function(){
			this.stop();
		});
	}
}

LaMaga.prototype.requestLista = function(e,a)
{
	yd.Event.stopEvent(e);
	var gif = {el:'btnListaSend', img:'/img/ajax-loader.gif', position:'right', width:32, height:32};
	new AJAX({loading:gif, url:'/page/lista/', onSuccess:'responseLista',idUpdaterNode:'responseLista',form:'listaForm', scope:this});
}

LaMaga.prototype.responseLista = function(o,a)
{
	yd.Event.addListener(yd.Dom.getElementsByClassName('enviarListaBtn', 'input'), 'click', this.requestLista, this, true);
	new formInputLabel({form:'listaForm', className:'input'});
}

LaMaga.prototype.requestComentarios = function(e,a)
{
	var id = yd.Event.getTarget(e).id.split('_')[1];
	if(this.InFront && this.InFront=='comentar')
	{
		var xy = yd.Dom.getXY('image_'+id);
		//var imgHeight = yd.Dom.get('image_'+id).clientHeight;
		var att = {width: { from:250 , to: 0 },opacity:{from:0.8, to:0}};
		this.motion = new yd.Motion('wpComentar', att, 1, YAHOO.util.Easing.easeOut);
		this.motion.Obj = this;
		this.motion.ElId = id;
		this.motion.onStart.subscribe(function(){
			this.Obj.runtime = {'node_id':this.ElId};
			var gif = {el:'image_'+this.ElId, img:'/img/ajax-loader.gif',position:'center', width:32, height:32};
			new AJAX({loading:gif, url:'/page/comentarios/'+this.ElId+'/', onSuccess:'responseComentarios',idUpdaterNode:'responseRequest',scope:this.Obj});
		}); 
		this.motion.animate();
	}
	else//(this.InFront && this.InFront!='comentarios')
	{
		this.runtime = {'node_id':id};
		var gif = {el:'image_'+id, img:'/img/ajax-loader.gif',position:'center', width:32, height:32};
		new AJAX({loading:gif, url:'/page/comentarios/'+id+'/', onSuccess:'responseComentarios',idUpdaterNode:'responseRequest',scope:this});
	}
}

LaMaga.prototype.hideComentarios = function(e,a)
{
	if(this.motion && this.motion.isAnimated())
		return;
	
	if(yd.Dom.get('wpComentarios') && yd.Dom.get('wpComentarios').clientWidth > 30)
	{
		var att = {width: { from:250, to: 0 },opacity:{from:0.8, to:0}};
		this.motion = new yd.Motion('wpComentarios', att, 1, YAHOO.util.Easing.easeOut);
		this.motion.onComplete.subscribe(function(){
			//yd.Dom.setStyle('responseRequest', 'opacity', '0');
			yd.Dom.get('wpComentarios').innerHTML = '';
		}); 
		this.motion.animate();
	}
	this.runtime.node_id = 0;
	this.InFront = '';
}

LaMaga.prototype.responseComentarios = function(o,a)
{
	//comentar ta el frente esconda y saque comentarios
	var xy = yd.Dom.getXY('image_'+this.runtime.node_id);
	yd.Dom.setXY('wpComentarios', [xy[0],xy[1]]);
	yd.Dom.setStyle('wpComentarios', 'opacity', '0');
	yd.Dom.setStyle('wpComentarios', 'width', '0px');
	yd.Dom.removeClass('wpComentarios', 'invisible');
	yd.Dom.setStyle('responseRequest', 'opacity', '1');
	
	var att = {width: { from:0, to: 250 },opacity:{from:0, to:0.8}};
	this.motion = new yd.Motion('wpComentarios', att, 1, YAHOO.util.Easing.easeOut);
	this.motion.animate();
	this.runtime.node_id = 0;
	this.InFront = 'comentarios';
	yd.Event.addListener(yd.Dom.getElementsByClassName('findComentarComentarios', 'a'), 'click', this.requestComentar, this, true);
	yd.Event.addListener(yd.Dom.getElementsByClassName('findComentarCerrar', 'a'), 'click', this.hideComentarios, this, true);
	$('#pane1').jScrollPane();
	$('#pane2').jScrollPane({showArrows:true});
	$('#pane3, #pane4').jScrollPane({scrollbarWidth:20, scrollbarMargin:10});
    
	// this allows you to click a link to add content to #pane4 and shows how to 
	// reinitialise the scrollbars when you have done this.
	$('#add-content').bind(
		'click',
		function()
		{
			$('#pane4').append($('<p></p>').html($('#intro').html())).jScrollPane({scrollbarWidth:20, scrollbarMargin:10});
		}
	);
	// and this allows you to click the link to reduce the amount of content in
	// #pane4 and reinitialise the scrollbars.
	$('#remove-content').bind(
		'click',
		function()
		{
			$('#pane4').empty().append($('<p></p>').html($('#intro').html())).jScrollPane({scrollbarWidth:20, scrollbarMargin:10});
		}
	);
}

LaMaga.prototype.requestComentar = function(e,a)
{
	var id = yd.Event.getTarget(e).id.split('_')[1];
	if(this.runtime && this.runtime.node_id != id)
	{
		if(this.motion && this.motion.isAnimated())
			return;
			
		if(this.InFront && this.InFront=='comentarios')
		{
			var xy = yd.Dom.getXY('image_'+id);
			var att = {width: { from:250, to: 0 },opacity:{from:0.8, to:0}};
			this.motion = new yd.Motion('wpComentarios', att, 1, YAHOO.util.Easing.easeOut);
			this.motion.ElId = id;
			this.motion.Obj = this;
			this.motion.onComplete.subscribe(function(){
				this.Obj.runtime = {'node_id':this.ElId};
				var gif = {el:'image_'+this.ElId, img:'/img/ajax-loader.gif',position:'center', width:32, height:32};
				new AJAX({loading:gif, url:'/page/comentar/'+this.ElId+'/', onSuccess:'responseComentar',idUpdaterNode:'responseRequest', scope:this.Obj});
			}); 
			this.motion.animate();
		}
		else
		{
			this.runtime = {'node_id':id};
			var gif = {el:'image_'+id, img:'/img/ajax-loader.gif',position:'center', width:32, height:32};
			new AJAX({loading:gif, url:'/page/comentar/'+id+'/', onSuccess:'responseComentar',idUpdaterNode:'responseRequest', scope:this});
		}
	}
	else
	{
		this.runtime = {'node_id':id};
		this.hideComentar();
	}
		
}

LaMaga.prototype.postComentar = function(e,a)
{
	yd.Event.stopEvent(e);
	var gif = {el:'comentarForm', img:'/img/ajax-loader.gif',position:'center', width:32, height:32};
	new AJAX({loading:gif, url:'/page/comentar/'+this.runtime.node_id, onSuccess:'responseComentar',idUpdaterNode:'responseRequest', form:'comentarForm', scope:this});
}

LaMaga.prototype.responseComentar = function(o,a)
{
	if(o.show == 'FORM')
	{
		this.showComentar();
	}
	else if(o.show == 'COMMENTS')
	{
		this.hideAndShow(o.node_id);
	}
	else if(o.show == 'ERR_VALID')
	{
		var xy = yd.Dom.getXY('image_'+this.runtime.node_id);
		yd.Dom.setXY('wpComentar', xy);
	}

	this.onResponseEvents();
}

LaMaga.prototype.hideAndShow = function(node_id)
{
	var id = node_id;
	var xy = yd.Dom.getXY('image_'+node_id);
	yd.Dom.setXY('wpComentar', xy);
	var att = {width: { from:250 , to: 0 }, opacity:{from:0.8, to:0}};
	this.motion = new yd.Motion('wpComentar', att, 1, YAHOO.util.Easing.easeOut);
	this.motion.Obj = this;
	this.motion.ElId = id;
	this.motion.onStart.subscribe(function(){
		this.runtime = {'node_id':this.ElId};
		var gif = {el:'image_'+this.ElId, img:'/img/ajax-loader.gif',position:'center', width:32, height:32};
		new AJAX({loading:gif, url:'/page/comentarios/'+this.ElId+'/', onSuccess:'responseComentarios',idUpdaterNode:'responseRequest',scope:this.Obj});
	}); 
	this.motion.animate();
	this.InFront=='comentarios';
}

LaMaga.prototype.showComentar = function()
{
	if(this.motion && this.motion.isAnimated())
		return;

	var xy = yd.Dom.getXY('image_'+this.runtime.node_id);
	var img = yd.Dom.get('image_'+this.runtime.node_id);
	
	// yd.Dom.setStyle('moveMe', 'z-index', '-1');
	// yd.Dom.setStyle(img, 'position', 'relative');
	// yd.Dom.setStyle(img, 'z-index', '-2');
	//ta al frente comentarios esconda y saque el otro
	//var height = yd.Dom.get('image_'+this.runtime.node_id).clientHeight;
	
	yd.Dom.setStyle('wpComentar', 'width', '0px');
	// yd.Dom.setStyle('wpComentar', 'position', 'absolute');
	yd.Dom.setStyle('wpComentar', 'opacity', '0');
	yd.Dom.setStyle('responseRequest', 'opacity', '1');
	yd.Dom.setXY('wpComentar', xy);

	var att = {width: {from:0, to: 250}, opacity:{from:0, to:0.8}};
	this.motion = new yd.Motion('wpComentar', att, 1, YAHOO.util.Easing.easeIn);
	this.motion.LaMaga = this;
	this.motion.onComplete.subscribe(function(){
		//this.LaMaga.onResponseEvents();
	}); 
	this.motion.animate();
	this.InFront = 'comentar';
	
	new formInputLabel({form:'comentarForm', className:'input'});
}

LaMaga.prototype.hideComentar = function()
{
	if(this.motion && this.motion.isAnimated())
		return;
	
	// var xy = yd.Dom.getXY('image_'+this.runtime.node_id);
	// var height = yd.Dom.get('image_'+this.runtime.node_id).clientHeight;
	if(yd.Dom.get('wpComentar') && yd.Dom.get('wpComentar').clientWidth > 30)
	{
		var att = {width: { from:250 , to: 0 }, opacity:{from:0.8, to:0}};
		this.motion = new yd.Motion('wpComentar', att, 1, YAHOO.util.Easing.easeOut);
		this.motion.onComplete.subscribe(function(){
			//yd.Dom.setStyle('responseRequest', 'opacity', '0');
			yd.Dom.get('wpComentar').innerHTML = '';
		}); 
		this.motion.animate();
	}
	
	this.runtime.node_id = 0;
	this.InFront = '';
}

LaMaga.prototype.prepareAsterisco = function(e,a)
{
	if(e=='complete')
	{
		var opacity = [
			{opacity:{from:1, to:0}},{opacity:{from:0, to:1}},{opacity:{from:1, to:0}},{opacity:{from:0, to:1}},
			{opacity:{from:1, to:0}},{opacity:{from:0, to:1}},{opacity:{from:1, to:0}},{opacity:{from:0, to:1}}
		];
		
		var att = opacity[this.Count];
		if(this.Count == 4)
			this.Obj.requestAsterisco(this.El);

		this.terisco = new yd.Anim(this.El, att, 0.5, YAHOO.util.Easing.easeOut);
		this.terisco.Obj = this.Obj;
		this.terisco.El = this.El;
		this.terisco.Count = this.Count+1;
		this.terisco.onComplete.subscribe(this.Obj.prepareAsterisco);
		this.terisco.animate();
	}
	else
	{
		var el = yd.Event.getTarget(e);
		var att = {opacity:{from:1, to:0}};
		this.terisco = new yd.Anim(el, att, 0.5, YAHOO.util.Easing.easeOut);
		this.terisco.Obj = this;
		this.terisco.El = el;
		this.terisco.Count = 1;
		this.terisco.onComplete.subscribe(this.prepareAsterisco);
		this.terisco.animate();
	}
}

LaMaga.prototype.requestAsterisco = function(el)
{
	this.teriscoId = el.id.split('_')[1];
	var gif = {el:'noElements', img:'/img/ajax-loader.gif',position:'center', width:32, height:32};
	new AJAX({loading:gif, url:'/page/asterisco/'+this.teriscoId, onSuccess:'responseAsterisco',idUpdaterNode:'responseRequest', scope:this});
}

LaMaga.prototype.responseAsterisco = function(o,a)
{
	var el = 'terisco_'+this.teriscoId;
	var att = {opacity:{from:1, to:0}};
	var terisco = new yd.Anim(el, att, 0.5, YAHOO.util.Easing.easeOut);
	terisco.El = el;
	terisco.Count = o.votes;
	terisco.onComplete.subscribe(function(){
		yd.Dom.get(this.El).innerHTML = this.Count;
		var att = {opacity:{from:0, to:1}};
		var terisco = new yd.Anim(this.El, att, 0.5, YAHOO.util.Easing.easeOut);
		terisco.animate();
	}); 
	terisco.animate();
}

LaMaga.prototype.requestConvocatoria = function(e,a)
{
	var gif = {el:'cabezaLaMaga', img:'/img/ajax-loader.gif',position:'left', width:32, height:32, padding:{x:-40}};
	new AJAX({loading:gif, url:'/page/convocatoria/', onSuccess:'responseConvocatoria',idUpdaterNode:'responseRequest', scope:this});
}

LaMaga.prototype.responseConvocatoria = function(o,a)
{
	Element.centerInFront({front:{el:'responseRequest'}, back:{el:'wraper'}, block:true});
}

LaMaga.prototype.requestContacto = function(e,a)
{
	yd.Event.stopEvent(e);
	var el = yd.Event.getTarget(e);
	if(el.className=='findContacto')
	{
		var gif = {el:'cabezaLaMaga', img:'/img/ajax-loader.gif',position:'left', width:32, height:32, padding:{x:-40}};
		new AJAX({loading:gif, url:'/page/contacto/', onSuccess:'responseContacto',idUpdaterNode:'responseRequest', scope:this});
	}
	else
	{
		var gif = {el:'contactoForm', img:'/img/ajax-loader.gif',position:'center', width:32, height:32};
		new AJAX({loading:gif, url:'/page/contacto/', onSuccess:'responseContacto',idUpdaterNode:'responseRequest', form:'contactoForm', scope:this});
	}
		
}

LaMaga.prototype.responseContacto = function(o,a)
{
	Element.centerInFront({front:{el:'responseRequest'}, back:{el:'wraper'}, block:true});
	new formInputLabel({form:'contactoForm', className:'input'});
	yd.Event.addListener('sendFormContact', 'click', this.requestContacto, this, true);
}


//----------------|----------------|----------------|----------------|----------------|----------------|----------------|----------------|----------------//
if(typeof YAHOO != "undefined")
{
	yd=YAHOO.util;
	yd.ua=YAHOO.env.ua;
	//yd.Event.onContentReady('wp', function(){new LaMaga()});
	yd.Event.addListener(window, 'load', function(){new LaMaga();});
}else if(confirm('No YAHOO object, do you want to add the script source from Yahoo hosting')) window.location.href = 'http://developer.yahoo.com/yui/articles/hosting/';
//----------------|----------------|----------------|----------------|----------------|----------------|----------------|----------------|----------------//

var inputFile = {
	render:function()
	{
		yd.Dom.setStyle(yd.Dom.getElementsByClassName('uploadFile', 'input'), 'opacity', '0');
	}
}

var Element = {
	
	options:{},
	
	centerInFront:function(opt)
	{
		this.options = opt;
		var bodyWidth = yd.Dom.getViewportWidth();
		var bodyHeight = yd.Dom.getViewportHeight();

		var widthForm = yd.Dom.get(opt.front.el).clientWidth;
		if(!yd.Dom.getDocumentScrollLeft())
			var left = Math.round((bodyWidth-widthForm)/2);
		else
			var left = Math.round(yd.Dom.getDocumentScrollLeft()+((bodyWidth/2)-widthForm/2));
		
		var heightForm = yd.Dom.get(opt.front.el).clientHeight;
		if(heightForm > bodyHeight)
			var top = Math.round(yd.Dom.getDocumentScrollTop());
		else
			var top = Math.round(yd.Dom.getDocumentScrollTop()+((bodyHeight/2)-heightForm/2));

		this.setCssFrontEl();
		yd.Dom.setXY(opt.front.el, [left, top]);
		
		if(opt.back)
			this.setCssBackEl();
		
		if(opt.block && opt.block)
			this.createBlockDiv();

		var att = {opacity:{to:1}};
		var anim = new yd.Anim(opt.front.el, att, 1.5, YAHOO.util.Easing.easeOut);
		anim.onStart.subscribe(function(){
			yd.Dom.removeClass(opt.front.el, 'hide');
			var att = {opacity:{to:0.2}};
			var anim = new yd.Anim(opt.back.el, att, 1, YAHOO.util.Easing.easeOut);
			anim.animate();
		}); 
		anim.animate();
		
	},
	setCssFrontEl:function()
	{
		yd.Dom.setStyle(this.options.front.el, 'position', 'absolute');
		yd.Dom.setStyle(this.options.front.el, 'top', '0');
		yd.Dom.setStyle(this.options.front.el, 'left', '0');
		yd.Dom.setStyle(this.options.front.el, 'z-index', '3');
	},
	setCssBackEl:function()
	{
		yd.Dom.setStyle(this.options.back.el, 'position', 'relative');
		yd.Dom.setStyle(this.options.back.el, 'z-index', '-1');
	},
	createBlockDiv:function()
	{
		var div = yd.Dom.getElementsByClassName('blockAll', 'div')[0];
		if(!div)
		{
			var div = document.createElement('div');
			div.className = 'blockAll';
			yd.Dom.insertBefore(div, this.options.front.el);
		}

		var width = yd.Dom.get(this.options.back.el).clientWidth;
		var height = yd.Dom.get(this.options.back.el).clientHeight;

		yd.Dom.setStyle(div, 'position', 'absolute');
		yd.Dom.setStyle(div, 'top', '0');
		yd.Dom.setStyle(div, 'left', '0');
		yd.Dom.setStyle(div, 'height', height+'px');
		yd.Dom.setStyle(div, 'width', width+'px');
		yd.Dom.setStyle(div, 'z-index', '2');
		yd.Dom.addClass(div, 'blockAll');
		
		this.options.blockDiv = div;
	},
	close:function(){
		var att = {opacity:{to:0}};
		var front = new yd.Anim(this.options.front.el, att, 1, YAHOO.util.Easing.easeOut);
		front.scope = this;
		front.onStart.subscribe(function(){
			// yd.Dom.removeClass('blockAll', 'blockAll');
			// yd.Dom.setStyle('blockAll', 'height', '0px');
			yd.Dom.setStyle(this.scope.options.back.el, 'z-index', '0');
			
			var att = {opacity:{from:0.2, to:1}};
			var back = new yd.Anim(this.scope.options.back.el, att, 1, YAHOO.util.Easing.easeOut);
			back.onComplete.subscribe(function(){
				// yd.Dom.removeClass('blockAll', 'blockAll');
				// yd.Dom.setStyle('blockAll', 'height', '0px');
			});
			back.animate();
		}); 
		front.onComplete.subscribe(function(){
			yd.Dom.addClass(this.scope.options.front.el, 'hide');
			yd.Dom.setStyle(this.scope.options.blockDiv, 'height', '0px');
			yd.Dom.setStyle(this.scope.options.blockDiv, 'width', '0px');
			yd.Dom.get(this.options.front.el).innerHTML = '';
		}); 
		front.animate();
	}
};

/* form with labes in the inputs */
function formInputLabel(opt)
{
	this.options = opt;
	this.formInputLabel();
}

formInputLabel.prototype.formInputLabel = function()
{
	var inputs = yd.Dom.getElementsByClassName(this.options.className, '*', this.options.form);
	this.getDefaultValues(inputs);
	yd.Event.addListener(inputs, 'click', this.click, this, true);
	yd.Event.addListener(inputs, 'blur', this.blur, this, true);
	yd.Event.addListener(inputs, 'focus', this.focus, this, true);
	if(inputs[0])
	{
		this.firstOne = inputs[0];
		yd.Dom.get(inputs[0]).focus();
	}
}

formInputLabel.prototype.click = function(e,a)
{
	var el = yd.Event.getTarget(e);
	var isDefault = this.isDefaultValue(el.value);
	if(!this.currentValue)
		this.currentValue = el.value;
	if(this.currentValue == el.value)
	{
		if(isDefault)
			el.value = '';
	}
}

formInputLabel.prototype.focus = function(e,a)
{
	var el = yd.Event.getTarget(e);
	var isDefault = this.isDefaultValue(el.value);
	if(el != this.firstOne)
	{
		if(this.currentValue && this.currentValue != el.value)
		{
			this.currentValue = el.value;
			if(isDefault)
				el.value = '';
		}
	}
	
	this.firstOne = '';
}

formInputLabel.prototype.blur = function(e,a)
{
	var el = yd.Event.getTarget(e);
	if(this.currentValue && el.value=='')
		el.value = this.currentValue;
}

formInputLabel.prototype.getDefaultValues = function(inputs)
{
	this.defaultValues = [];
	for(var a=0 in inputs)
		this.defaultValues[a] = inputs[a].value;
}

formInputLabel.prototype.isDefaultValue = function(value)
{
	var def = this.defaultValues;
	for(var a=0 in def)
	{
		if(def[a]==value)
			return true;
	}
	return false;
}


/* opacity */
Opacity = function(opt){
	yd = YAHOO.util;
	this.opt = opt;
	this.init();
}

Opacity.prototype.init = function(){
	var images = yd.Dom.getElementsByClassName('opacity', '*', this.opt.container);
	
	//if have over preload all images
	if(this.opt.over)
		this.preload(images);
	
	//atach events handlers
	yd.Event.addListener(images, 'mouseover', this.animate, {type:'over'}, true);
	yd.Event.addListener(images, 'mouseout', this.animate, {type:'out'}, true);
}

Opacity.prototype.preload = function(images){
	for(var a in images){
		var origSrc = images[a].src;
		var ext = origSrc.substring((origSrc.length-4),origSrc.length);
		var url = origSrc.substring(0,origSrc.length-4);
		var img = new Image();
		img.src = url+'-over'+ext;
	}
}

Opacity.prototype.animate = function(e,a){
	var el = yd.Event.getTarget(e);
	if(a.type=='over'){
		var att = {opacity:{to:0.4}};
		var anim = new yd.Anim(el, att, 0.5, YAHOO.util.Easing.easeOut);
		anim.image = el;
		anim.onStart.subscribe(function(){
			var ext = this.image.src.substring((this.image.src.length-4),this.image.src.length);
			var url = this.image.src.substring(0,this.image.src.length-4);
			this.image.src = url+'-over'+ext;
		}); 
		anim.animate();
	}
	if(a.type=='out'){
		var att = {opacity:{to:1}};
		var anim = new yd.Anim(el, att, 0.5, YAHOO.util.Easing.easeIn);
		anim.image = el;
		anim.onStart.subscribe(function(){
			var ext = this.image.src.substring((this.image.src.length-4),this.image.src.length);
			var url = this.image.src.substring(0,this.image.src.length-4);
			var url = url.replace('-over','');
			this.image.src = url+ext;
		}); 
		anim.animate();
	}
}

/* checkboxes like radio */
function GroupChecks (opt)
{
	this.opt = opt;
	this.init();
}

GroupChecks.prototype.init = function()
{
	var checkboxes = yd.Dom.getElementsByClassName(this.opt.className, 'input');
	yd.Event.addListener(checkboxes, 'click', this.wasClicked, this, true);
}

GroupChecks.prototype.wasClicked = function(e,a)
{
	var el = yd.Event.getTarget(e);
	var classNames = el.className.split(' ');

	for(n in classNames)
	{
		var groupArr = classNames[n].split('_');
		if(groupArr.length>0){
			if(groupArr[0]==this.opt.group)
				var group = classNames[n];
		}
	}
	
	//desactivate all group
	this.unCheck(group);
	
	//set check the element was clicked
	el.checked = true;
}

GroupChecks.prototype.unCheck = function(group){
	var elements = yd.Dom.getElementsByClassName(group, 'input');
	for(n in elements)
	{
		elements[n].checked = false;
	}
}


/* opacity */
Over = function(opt){
	this.opt = opt;
	this.init();
}

Over.prototype.init = function(){
	var images = yd.Dom.getElementsByClassName('opacity', '*');
	
	//if have over preload all images
	if(this.opt.over)
		this.preload(images);
	
	//atach events handlers
	yd.Event.addListener(images, 'mouseover', this.animate, {type:'over', obj:this}, true);
	yd.Event.addListener(images, 'mouseout', this.animate, {type:'out', obj:this}, true);
}

Over.prototype.preload = function(images){
	for(var a in images){

		var origSrc = images[a].src;
		var ext = origSrc.substring((origSrc.length-4),origSrc.length);
		var url = origSrc.substring(0,origSrc.length-4);
		
		if(yd.Dom.hasClass(images[a], 'admin'))
			this.preloadAdmin(images[a],url,ext);
		else
		{
			var img = new Image();
			img.src = url+'-over'+ext;
		}
	}
}

Over.prototype.preloadAdmin = function(img,url,ext)
{
	var cl = img.className.split(' ');
	for(var a in cl)
	{
		if(cl[a].split('_')[0]=='over')
		{
			var name = cl[a].replace('over_','');
			var path = url.substring(0,url.lastIndexOf('/')+1);
			var img = new Image();
			img.src = path+name+ext;
		}
	}
}

Over.prototype.animate = function(e,a){
	var el = yd.Event.getTarget(e);
	if(a.type=='over')
	{
		var ext = el.src.substring((el.src.length-4),el.src.length);
		var url = el.src.substring(0,el.src.length-4);
		var url = url.replace('-over','');
		if(yd.Dom.hasClass(el, 'admin'))
			a.obj.overAdmin(el, url, ext);
		else
			el.src = url+'-over'+ext;
	}
	if(a.type=='out')
	{
		var ext = el.src.substring((el.src.length-4),el.src.length);
		var url = el.src.substring(0,el.src.length-4);
		var url = url.replace('-over','');

		if(yd.Dom.hasClass(el, 'admin'))
			a.obj.outAdmin(el, url, ext);
		else
			el.src = url+ext;
	}
}

Over.prototype.overAdmin = function(img, url, ext)
{
	var cl = img.className.split(' ');
	for(var a in cl)
	{
		if(cl[a].split('_')[0]=='over')
		{
			var name = cl[a].replace('over_','');
			var path = url.substring(0,url.lastIndexOf('/')+1);
			img.src = path+name+ext;
		}
	}
}

Over.prototype.outAdmin = function(img, url, ext)
{
	var cl = img.className.split(' ');
	for(var a in cl)
	{
		if(cl[a].split('_')[0]=='def')
		{
			var name = cl[a].replace('def_','');
			var path = url.substring(0,url.lastIndexOf('/')+1);
			img.src = path+name+ext;
		}
	}
}
var Select = {
	populate:function(id, val){
		var el = yd.Dom.get(id);
		var len = el.options.length;
		for(var a=0;a<len;a++){
			if(el.options[a].value==val)
				el.options[a].selected='true';
		}
	}
}

function AJAX(opt)
{
	this.debug = true;//si estamos debuggiando al app true, sino false	
	/*
		opt = {}
	*/
	
	//parametros para el success global
	this.loading 		= opt.loading;
	this.url 			= opt.url;
	this.onSuccess 		= opt.onSuccess;
	this.idUpdaterNode 	= opt.idUpdaterNode;
	this.form 			= opt.form;
	this.arguments 		= opt.arguments;
	this.forceCallback 	= opt.forceCallback;
	this.data 			= opt.data;
	this.arguments		= opt.arguments;
	this.hasFile		= opt.upload;
	this.scope			= opt.scope ? opt.scope : this;


	//show loading
	this.showLoading();

	//Prepare el objeto callback
	this.callback = {success: this.load, upload:this.upload, failure: this.error, timeout: 60000, scope: this, argument: [] };
	if(typeof this.arguments != 'undefined' && this.arguments != null)
		this.callback.argument = this.arguments;
		
	//si se va a mandar un form.
	if(typeof this.form != 'undefined')
	{
		this.callback.argument.form = this.form;
		if(this.hasFile)
			YAHOO.util.Connect.setForm(this.form, true);
		else
			YAHOO.util.Connect.setForm(this.form);
	}
	
	//Envíe el request
	if(typeof this.form != 'undefined' || typeof this.data != 'undefined')
		var method = 'POST';
	else
		var method = 'GET';
	YAHOO.util.Connect.asyncRequest(method, this.url, this.callback, this.data); 
};

//success global
AJAX.prototype.load = function(o) 
{
	//hide loading
	this.hideLoading();

	//fijese que devolvió el servidor
	try
	{
		//var response = eval('(' + o.responseText + ')');
		var response = YAHOO.lang.JSON.parse(o.responseText); 
	}
	catch(err)
	{
		var error = '[JAVASCRIPT ERROR] <br>fileName = '+err.fileName+'<br>lineNumber = '+err.lineNumber+'<br> message = '+err.message+'<br> name = '+err.name+'<br>[RESPONSETEXT] = '+o.responseText;
		this.showError(error);
		return;
	}

	switch(response.type)
	{
		case 'HTML':
			//ponga el html devuelto dentro de un nodo
			
			if(this.forceCallback === true)
			{
				this.checkSuccess(response, o.argument);
				return;
			}

			if (this.idUpdaterNode){
				yd.Dom.removeClass(this.idUpdaterNode, 'hide');
				yd.Dom.get(this.idUpdaterNode).innerHTML = response.html;
			}
			this.checkSuccess(response, o.argument);
		break;

		case 'JSON':
			this.checkSuccess(response, o.argument);
		break;

		case 'REDIRECT':
			this.checkSuccess(response, o.argument);
			//redireccione
			window.location = response.path;
		break;

		case 'SUCCESS':
			// if(response.msg)
			// 	GENERAL_muestreSuccess(response.msg);
			this.checkSuccess(response, o.argument);
		break;
		
		case 'ERR_VALID':
			//el id del form que fué enviado viene en el último argumento (si es que fué enviado)
			this.showValitationErrors({'errors':response.errors, 'form':o.argument.form});
							
			//callback
			if(this.forceCallback === true)
				this.checkSuccess(response, o.argument);
		break;		
		
		default: //case 'ERR_SERVER'
			if(this.forceCallback === true)
				this.checkSuccess(response, o.argument);
			else
				this.showError(response.msg);
		break;
	}
};
//upload files
AJAX.prototype.upload=function(o){
	this.load(o);
}

AJAX.prototype.checkSuccess = function(response, argument){

	if(this.onSuccess)
	{
		if(typeof this.onSuccess == 'string')
			eval('this.scope.'+this.onSuccess+'(response, argument)');

		if(typeof this.onSuccess == 'function')
			this.onSuccess(response, argument);
	}
}


//failure global
AJAX.prototype.showError = function(response)
{
	//if debugging the app
	if(this.debug)
	{
		var debug = yd.Dom.get('debug');
		//the div don't exits
		if(!debug)
		{
			var div = document.createElement('div');
			div.id = 'debug';
			div.className='debug';
			div.innerHTML = response;
			document.body.appendChild(div);
		}
		else
			debug.innerHTML = response;
	} 
	else 
		alert(response);
};

AJAX.prototype.showLoading = function()
{
	//if we send object, why try show loading next the one element
	if(typeof this.loading == 'object')
	{
		var el = yd.Dom.get(this.loading.el);
		if(!el) return;
		
		var xy 	= yd.Dom.getXY(el);
		var w = el.offsetWidth;
		var h = el.offsetHeight;

		var image = yd.Dom.get(this.loading.el+'_loading');
		//if the image don't exists
		if(!image)
		{
			var imgLoading = new Image();
			imgLoading.id = this.loading.el+'_loading';
			yd.Dom.setStyle(imgLoading, 'position', 'absolute');
			imgLoading.src = this.loading.img;
			

			if(this.loading.width)  imgLoading.width = this.loading.width;
			if(this.loading.height) imgLoading.height = this.loading.height;

			//atach to the body
			document.body.appendChild(imgLoading);
			
			//save the element to loading object
			this.loading.image = imgLoading;
		}
		else//the image exits only change the class
		{
			//save the element to loading object
			this.loading.image = image;
			
			yd.Dom.removeClass(this.loading.image, 'hide');
		}

		//always look
		yd.Dom.setStyle(this.loading.image, 'z-index', '10');
		var xpad = 0;
		var ypad = 0;
		if(this.loading.padding)
		{
			if(this.loading.padding.x)
				xpad = this.loading.padding.x;

			if(this.loading.padding.y)
				ypad = this.loading.padding.y;
		}
		
		//set left or right
		if(this.loading.position == 'right')
			yd.Dom.setXY(this.loading.image, [(xy[0]+w+xpad), xy[1]+ypad]);
		if(this.loading.position == 'left')
			yd.Dom.setXY(this.loading.image, [(xy[0]-this.loading.image.width-xpad), xy[1]+ypad]);
		if(this.loading.position == 'center'){
			yd.Dom.setXY(this.loading.image, [((xy[0]+(w/2))-((this.loading.width/2))+xpad), (xy[1]+((h/2)-(this.loading.height/2))+ypad)]);
		}

	}

};

AJAX.prototype.hideLoading = function()
{
	//if we send object, why try show loading next the one element hide it
	if(typeof this.loading == 'object')
		yd.Dom.addClass(this.loading.image, 'hide');
};

AJAX.prototype.showValitationErrors = function(opt)
{
	//if is a upload form the errors must has show in the form so find class error in span
	//and has hide class
	if(this.hasFile)
	{
		var errors = yd.Dom.getElementsByClassName('error', 'span', opt.form);
		//first hide all errors
		yd.Dom.addClass(errors, 'hide');
		
		
		//only remove the error with same the class has errors 
		var len = errors.length;
		for(var a=0;a<len;a++) for(var err in opt.errors)
		{
			if(yd.Dom.hasClass(errors[a], err))
				yd.Dom.removeClass(errors[a], 'hide');
			// else
			// 	yd.Dom.addClass(errors[a], 'hide');
			// 	
		}
	}
};
