var BadModal = new Class({

	Implements: [Events, Chain],

	overlay: null,
	actual: null,
	modalList: new Hash(),
	onHideCallbacks: new Hash(),
	onShowCallbacks: new Hash(),

	initialize: function(options) {
		this.doc = document;
		this.overlay = new Element('div', {
			'id': 'badmodal-overlay',
			'styles':{'opacity':0,'visibility':'hidden','height':0,'overflow':'hidden'}
		}).inject($(document.body));

		this.addOptions(options);
		this.bound = {
			window: this.reposition.bind(this, [null]),
			hide: this.hide.bind(this),
			key: this.onKey.bind(this)
		};
		this.doc.addEvent('keydown', this.bound.key);
		this.doc.addEvent('resize', this.bound.window);
		this.doc.getWindow().addEvent('resize', this.bound.window);
		this.doc.getWindow().addEvent('scroll', this.bound.window);
		this.overlay.addEvent('click', this.bound.hide);
	},

	addOptions: function(options) {
		if(options) {
			var that = this;
			options.each(function(modalOptions){
				that.addModal(modalOptions.name);
				modalOptions.triggers.each(function(el) {
					that.addTrigger(el, modalOptions.name);
				});

				if(modalOptions.onShow) {
					that.onShowCallbacks.set(modalOptions.name, modalOptions.onShow);
				}
				if(modalOptions.onHide) {
					that.onHideCallbacks.set(modalOptions.name, modalOptions.onHide);
				}
			});
		}
	},

	addModal: function(el) {
		var that = this;
		var el = $(el);
		if (el) {
			el.style.display = 'none';
			var entry = {};
			entry[$(el).id] = el;
			this.modalList.extend(entry);
			var closeElements = el.getElements('.closeModal');
			closeElements.forEach(function(close){
				close.addEvent('click', function(e) {
					new Event(e).stop();
					that.hide();
				});
			});
		}
	},

	addTrigger: function(trigger, modal) {
		var that = this;
		var varTrigger = $(trigger);
		if(varTrigger) {
			varTrigger.addEvent('click', function() {
				that.show(modal);
			});
		}
	},

	disposeActual: function() {
		this.actual.style.display = 'none';
		var clbk = this.onHideCallbacks.get(this.actual.id);
		if(clbk) {
			clbk();
		}
	},

	hide: function(e) {
		["object", window.ie ? "select" : "embed"].forEach(function(tag) {
			Array.forEach(document.getElementsByTagName(tag), function(el1) {
				el1.style.visibility = el1._mediabox;
			});
		});
		if(this.actual) {
			this.disposeActual();
			this.chain(
				function(){this.overlay.tween('opacity',0);},
				function(){this.overlay.setStyles({'top': 0,'height':0})}
			);
			this.callChain();
			this.clearChain();
		}
	},

	show: function(el) {
		["object", window.ie ? "select" : "embed"].forEach(function(tag) {
			Array.forEach(document.getElementsByTagName(tag), function(el1) {
				el1._mediabox = el1.style.visibility;
				el1	.style.visibility = "hidden";
			});
		});
		
		if(this.modalList && el) {
			var panel = $(el);
			if(panel) {
				var el = this.modalList.get(panel.id);
				if(el){
					var clbk = this.onShowCallbacks.get(el.id);
					if(clbk) {
						clbk();
					}
					if(this.actual) {
						this.disposeActual();
					}
					this.actual = el;
					el.style.display = 'block';
					this.reposition();
					this.overlay.tween('opacity', 0.7);
				}
			}
		}
	},

	onKey: function(e) {
		switch (e.key) {
			case 'esc': this.hide(e);
			case 'up': case 'down': return false;
		}
	},

	reposition: function() {
		var size = this.doc.getSize(), scroll = this.doc.getScroll(), ssize = this.doc.getScrollSize();
		this.overlay.setStyles({top: window.getScrollTop(), height: window.getHeight()});
		if(this.actual) {
			if (this.actual.getStyle('position') !== 'absolute') {
				this.actual.setStyle('position','absolute');
			}
			var newTop = this.getCenteredVerticalPosition(this.actual,window,window.getSize().y/4);
			this.actual.setStyle('top', newTop + 'px');
		}
	},
	
	reposition2: function() {
		var size = document.getSize(), scroll = document.getScroll();
		this.overlay.setStyles({
			left: scroll.x + 'px',
			top: scroll.y + 'px',
			width: size.x + 'px',
			height: size.y + 'px'
		});
		this.win.setStyles({
			left: (scroll.x + (size.x - this.win.offsetWidth) / 2).toInt() + 'px',
			top: (scroll.y + (size.y - this.win.offsetHeight) / 2).toInt() + 'px'
		});
		return this.fireEvent('onMove', [this.overlay, this.win]);
	},


	getCenteredVerticalPosition: function(element,parentEl,defaultTop,height) {
		var calcedTop, newTop;
		var yoffset = parentEl.getScrollTop();
		var windowHeight = parentEl.getSize().y;
		//Height is usually set to element's height.
		//if (windowHeight > height) {
			calcedTop = ((windowHeight / 2) - (height / 2));
			if (calcedTop > defaultTop) {
				newTop = calcedTop + yoffset;
			} else {
				newTop = defaultTop + yoffset;
			}
		//} else {
		// if content is taller than the parent
		//		newTop = defaultTop;
		//		}
		return newTop;
	}

});

BadModalController = {
		badModal: null,

		getModal: function() {
			if (this.badModal == null) {
				this.badModal = new BadModal();
			}
			return this.badModal;
		}
}

function validateRegister() {
	var form = $('registerForm');
	if(form) {
		var day = $('day');
		var month = $('month');
		var year = $('year');
		var birthDate = $('birthDate');
		var valueDate = '';
		day.addEvent('change', function() {
			valueDate = ((day.value.length == 1)? '0' + day.value : day.value) + '/';
			valueDate += ((month.value.length == 1)? '0' + month.value : month.value);
			if(year.value != "0") valueDate += '/' + year.value;
			birthDate.value = valueDate;
		});
		month.addEvent('change', function(){
			valueDate = ((day.value.length == 1)? '0' + day.value : day.value) + '/';
			valueDate += ((month.value.length == 1)? '0' + month.value : month.value);
			if(year.value != "0") valueDate += '/' + year.value;
			birthDate.value = valueDate;
		});
		year.addEvent('change', function(){
			valueDate = ((day.value.length == 1)? '0' + day.value : day.value) + '/';
			valueDate += ((month.value.length == 1)? '0' + month.value : month.value);
			if(year.value != "0") valueDate += '/' + year.value;
			birthDate.value = valueDate;
		});
		//Rules
		formValidatorManager = new FormValidatorManager(form, {
			display: 'registerErrorShadow',
			rules: [
				["userName", new NotEmptyValidator(), "No ha ingresado un nombre de usuario"],
				["password", new LengthValidator({min: 5,max:500}), "La contraseña ingresada no puede tener menos de 6 caracteres"],
				["passwordTwo", new LengthValidator({min: 5,max:500}), "La contraseña ingresada no puede tener menos de 6 caracteres"],

				["name", new NotEmptyValidator(), "No ha ingresado su nombre"],
				["lastName", new NotEmptyValidator(), "No ha ingresado su apellido"],
				["email", new EmailValidator(), "La dirección de correo no es correcta"],
				["birthDate", new SpanishDateValidator(), "La fecha no es correcta"],

				["country", new NotEmptyValidator(), "No ha ingresado un país"],
				["state", new NotEmptyValidator(), "No ha ingresado una provincia"],
				["city", new NotEmptyValidator(), "No ha ingresado una ciudad"]
			],
			preSubmit: function() {
				return {
					validator: new EqualsFieldsValidator($("password"), $("passwordTwo")),
					message: "Las contraseñas no coinciden"
				}
			}
		});
	}
}

function loginErrorMessage(badModal, loginError, messages) {
	if(messages.has(loginError.get('text'))) {
		var message = messages.get(loginError.get('text'));
		var sibling = $('loginPanel').getElement('a.closeModal');
		var el = new Element('div', {
			'class': "authenticationError loginError",
			'html': message
		});
		el.inject(sibling, 'before');
		badModal.show('loginPanel');
	}
}

window.addEvent('domready', function() {

	var clearMessageCallback = function() {
		if(!this.count) this.count = 0;
		this.count++;
		if(this.count == 1) {
			if($('loginError')) {
				$('closeLoginPanel').getPrevious().dispose();
			} else {
				var msg = $('loginPanel').getElement('.authenticationSuccess');
				if(msg) {
					msg.dispose();
				}
			}
		}
	}
	
	var form = $('registerForm');
	if(form) {
		var birthDateInput = $('birthDate');
		var dayInput = $('day');
		var monthInput = $('month');
		var yearInput = $('year');
		var value = birthDateInput.value.split("/");
		if (value.length > 0) {
			dayInput.options[new Number(value[0])].selected="selected";
			if (value.length > 1) {
				monthInput.options[new Number(value[1])].selected="selected";
				if (value.length > 2) {
					var selected = new Number(value[2]);
					var len = yearInput.options.length;
					var i = 0;
					var found = false;
					while(i<len && !found) {
						if(yearInput.options[i].value == value[2]) {
							found = true;
						}
						i++;
					}
					if(found) {
						yearInput.options[i-1].selected="selected";
					}
				}
			}
		}
	}

	var clearVideo = function() {
		if(Browser.Engine.trident) {
			if($('livePlayer')) {
				$('livePlayer').stop();
			}
		}
	}
	
	var playVideo = function() {
		if(Browser.Engine.trident) {
			if($('livePlayer')) {
				$('livePlayer').play();
			}
		}
	} 

	var badModal = BadModalController.getModal();
	badModal.addOptions([
	    {
	    	"name": "registerPanel",
	    	"triggers": ["registerOpen"]
	    },
	    {
	    	"name": "loginPanel",
	    	"triggers": ["showLogin"],
	    	"onHide":  clearMessageCallback
	    },
	    {
	    	"name": 'ver-vivo-target',
	    	"triggers": ["ver-vivo"],
	    	"onShow": playVideo,
	    	"onHide": clearVideo
	    }
	]);

	var registerSuccess = $('registerSuccess');

	var messages = new Hash({
	    'code-0': 'Error no identificado',
	    'code-1': 'Cuenta desactivada',
	    'code-2': 'No existe el usuario o la contraseña es incorrecta',
	    'code-3': 'No tiene permiso'
	});

	if(registerSuccess) {
		var loginError = $('loginError'); 
		if(loginError) {
			loginErrorMessage(badModal, loginError, messages);
		} else {
			var sibling = $('loginPanel').getElement('a.closeModal');
			var el = new Element('div', {
				'class': "authenticationSuccess",
				'html': registerSuccess.get('text')
			});
			el.inject(sibling, 'before');
			badModal.show('loginPanel');
		}
	} else {
		if(!$('welcomeUser')) {
			var registerError = $('registerErrorShadow');
			if(registerError && registerError.hasClass('registerError')) {
				badModal.show('registerPanel');
				registerError.set('class', 'authenticationError');
			} else {
				var loginError = $('loginError'); 
				if(loginError) {
					loginErrorMessage(badModal, loginError, messages);
				}
			}
		}
	}

});
