var NBContact = new Class({
	
	//implements
	Implements: [Options],

	//options, all ids used for actions must to be params
	options: {
		// Options
		ajaxurl: '',
		validator: null,
		token: null
	},
	
	_busy: false,
	
	//initialization
	initialize: function(options) {
		
		//set options
		this.setOptions(options);		
				
		
		// Eventos del formulario
		$('nbcontactform').addEvent('submit', function(e){
			e = new Event(e);
			if (! this.isBusy()) {
				this.submitForm();
			}
			e.stop();
		}.bind(this));		
		
		// Eventos de los selects
		$('catid').addEvent('change', function(e){
			e = new Event(e);
			if (! this.isBusy()) {
				this.updateFAQ();
			}
			e.stop();
		}.bind(this));

		$('faqid').addEvent('change', function(e){
			e = new Event(e);
			if (! this.isBusy()) {
				this.getFAQ();
			}
			e.stop();
		}.bind(this));	
		
		// Eventos de los campos obligatorios		
 		$('nombre').addEvent('change', function(e){
 			this.activateQuestion ();
		}.bind(this));			
 		$('apellidos').addEvent('change', function(e){
 			this.activateQuestion ();
		}.bind(this));
 		$('mail').addEvent('change', function(e){
 			this.activateQuestion ();
		}.bind(this));
 		$('state_id').addEvent('change', function(e){
 			this.activateQuestion ();
		}.bind(this));
 		$('poblacion').addEvent('change', function(e){
 			this.activateQuestion ();
		}.bind(this)); 		

		$('sendMessageLink').addEvent('click', function(e){
			e = new Event(e);
			if (! this.isBusy()) {
				$('sendMessageDiv').slide('out');
				$('sendMessage').slide('in');
			}
			e.stop();
		}.bind(this));			
		
		// Animaciones varias
		new Fx.Slide('answer', {
		    duration: 'short',
		    transition: Fx.Transitions.Bounce.easeOut
		}).hide();

		new Fx.Slide('sendMessage', {
		    duration: 'short',
		    transition: Fx.Transitions.Bounce.easeOut
		}).hide();
		
		new Fx.Slide('sendMessageDiv', {
		    duration: 'short',
		    transition: Fx.Transitions.Bounce.easeOut
		}).hide();
		
		new Fx.Slide('waitMessage', {
		    duration: 'short',
		    transition: Fx.Transitions.Bounce.out
		}).hide();		
		
		new Fx.Slide('errorMessageDiv', {
		    duration: 'short',
		    transition: Fx.Transitions.Bounce.easeOut
		}).hide();
		
		new Fx.Slide('sentMessageDiv', {
		    duration: 'short',
		    transition: Fx.Transitions.Bounce.easeOut
		}).hide();
	},
	
	activateQuestion: function () {
		if (
				($('nombre').value != "") &&
				($('apellidos').value != "") &&
				($('mail').value != "") &&
				($('state_id').value > 0) &&
				($('poblacion').value != "")
		){
			$('catid').setProperty('disabled', false);
			$('faqid').setProperty('disabled', false);
		} else {
			$('catid').setProperty('disabled', true);
			$('faqid').setProperty('disabled', true);			
		}
	},
	
	submitForm: function () {
		if (! this.isBusy()) {
			// Si no se ha validado no enviamos
			if (! this.options.validator.isFormValid()) {
				return false;
			}
			
			// AJAX Request
			this.setBusy();
			$('errorMessageDiv').slide('out');
			var formelements = new Object;
			var form = document.getElementById('nbcontactform');
			for (var i=0; i < form.elements.length; i++){
				if (form.elements[i].name)
				formelements[form.elements[i].name] = form.elements[i].value;
			}
			
			
			var params = new Object;
			params[this.options.token] = 1;
			params.task = 'submitForm';
			params.form = formelements;
			
			var jsonRequest = new Request.JSON({url: this.options.ajaxurl, onSuccess: function(response){
				// Check response				
				try {
					if (response.error)	{
						// Ha ocurrido un error al procesar el mensaje en el servidor
						this.showError(response.error);
					} else {
						// Mensaje enviado, redirect?
						$('sentMessageDiv').slide('in');
					}
				} catch (e) {
					this.showError(e.message);
				}
				
				this.unsetBusy();
				
			}.bind(this),
			
			onFailure: function (xhr) {
				//console.debug(xhr);
				this.unsetBusy();
			}}).get(params);
		}		
	},
		
	showError: function (message) {
		$('errorMessageDiv').innerHTML = message;
		$('errorMessageDiv').slide('in');
	},
	
	setBusy: function () {
		this._busy = true;		
		$('waitMessage').slide('in');
	},
	
	unsetBusy: function () {
		this._busy = false;
		$('waitMessage').slide('out');
	},

	isBusy: function () {
		if (this._busy == true) {			
			//alert("SISTEMA OCUPADO");
			return true;
		}
		return false;
	},
	
	updateFAQ: function (el) {	
		if (! this.isBusy()) {
			// AJAX Request
			this.setBusy();
			var jsonRequest = new Request.JSON({url: this.options.ajaxurl, onSuccess: function(response){
				// Check response				
				$('faqid').removeAllOptions();
				$('faqid').addOption("--- Seleccione una opción ---", "0");
				response.each(function(item, index){
					$('faqid').addOption(item.text, item.value);
				});
				
				// Limpiamos las posibles respuestas anteriores
				$('sendMessageDiv').slide('out');
				$('sendMessage').slide('out');
				$('answer').slide('out');
				$('answer').innerHTML = "";
				
				this.unsetBusy();
			}.bind(this)}).get({'task': 'getFAQList', 'catid': $('catid').value});
		}
	},

	getFAQ: function (el) {
		if (! this.isBusy()) {

			
			// AJAX Request						
			this.setBusy();
			var jsonRequest = new Request.JSON({url: this.options.ajaxurl, onSuccess: function(response){
				// Check response
				try {
					// Si hay respuesta la enseñamos
					if (response.answer != "") {
						$('answer').innerHTML = response.answer;
						$('answer').slide('in');
						
						// Si además se permite el envío de mail lo mostramos
						if (response.send) {
							$('sendMessageDiv').slide('in');
						} else {
							$('sendMessageDiv').slide('out');
						}
						$('sendMessage').slide('out');
					} else {						
						$('answer').slide('out');
						$('answer').innerHTML = "";
						// Si no hay respuesta mostramos en formulario para enviar mensaje
						$('sendMessageDiv').slide('out');
						$('sendMessage').slide('in');
					}
					
					// Si la pregunta trae asunto lo establecemos
					if (response.subject) {
						$('asunto').value = response.subject;
						$('asunto').disabled = true;
					} else {
						$('asunto').value = "";
						$('asunto').disabled = false;
					}					
					
					
				} catch (e) {
					//alert(e.message);
				}
				this.unsetBusy();
			}.bind(this)}).get({'task': 'getFAQ', 'faqid': $('faqid').value, 'state_id': $('state_id').value});
		}
	}
	
});

Element.implement({
	removeAllOptions: function() {
		if(this.get('tag')!='select') return this;
		for(var i=this.options.length-1;i>=0;i--) this.remove(i);
		return this;
	},

	addOption: function(text,value) {
		if(this.get('tag')!='select') return this;
		var optn = new Element('option');
		if(text) optn.text = text;
		if(value) optn.value = value;
		this.options.add(optn);
		return this;
	},

	removeOption: function(prop,value){
		if(this.get('tag')!='select') return this;
		for(var i=this.options.length-1;i>=0;i--) {
			if (prop=='selected' && this.options[i].selected) this.remove(i);
			if (prop=='value' && this.options[i].value==value) this.remove(i);
			if (prop=='text' && this.options[i].text==value) this.remove(i);
			if (prop=='index' && i==value) this.remove(i);
		}
		return this;
	}
});

