/****************************
La Jaula
Version: 5
Puntopy
Desarrollado por Alvaro Talavera (alvarotala@gmail.com)
*****************************/

var counter = 0;
var topic_box_options = {min: 260, max: 750};
var scroll_slider;
var list_topic_animation = false;
var scroll_topics;
var ScrollEffect;
var NoScrollEffect = false;

var laJaula = Class.create({
  initialize: function(token) {
	this.token = token;
  },
  


  /**********************************  MESSAGES  ***********************************/

  mensaje_seleccion: function(id, op){
	var tr = $("mensaje_"+id);
	var image = tr.down("span", 0);
	var input = tr.down("input", 0);
	if(op == true){
		tr.setStyle({backgroundColor: '#FFFFD4'});
		image.hide();
		input.show();
	}else{
		if(input.checked == false){
			tr.setStyle({backgroundColor: '#f3f9e5'});
			image.show();
			input.hide();
		}	
	}
  },

  mensaje_seleccionar: function(sel) {
	$$("#mensajes tr.no_leido", "#mensajes tr.si_leido").each(function(tr){
		var image = tr.down("span", 0);
		var input = tr.down("input", 0);
		
		function mostrar(tr, input, image){
			input.checked = true;
			tr.setStyle({backgroundColor: '#FFFFD4'});
			image.hide();
			input.show();
		}
		
		function ocultar(tr, input, image){
			input.checked = false;
			tr.setStyle({backgroundColor: '#f3f9e5'});
			image.show();
			input.hide();
		}
		
		switch(sel) {
			case "si_leidas":
				if(tr.hasClassName("si_leido")){
					mostrar(tr, input, image);
				}else{
					ocultar(tr, input, image);
				}
			break;

			case "no_leidas":
				if(tr.hasClassName("no_leido")){
					mostrar(tr, input, image)
				}else{
					ocultar(tr, input, image);
				}
			break;
			
			case "todas":
				mostrar(tr, input, image)
			break;
			
			case "ninguna":
				ocultar(tr, input, image);
			break;
		}

		
	});
	
  },

  mensaje_seleccionar_outbox: function(sel) {
	$$("#mensajes tr.enviado").each(function(tr){
		var image = tr.down("span", 0);
		var input = tr.down("input", 0);

		function mostrar(tr, input, image){
			input.checked = true;
			tr.setStyle({backgroundColor: '#FFFFD4'});
			image.hide();
			input.show();
		}

		function ocultar(tr, input, image){
			input.checked = false;
			tr.setStyle({backgroundColor: '#f3f9e5'});
			image.show();
			input.hide();
		}

		switch(sel) {
			case "todas":
				mostrar(tr, input, image)
			break;

			case "ninguna":
				ocultar(tr, input, image);
			break;
		}


	});

  },
	
  mensaje_borrar: function(){
	if(!confirm("Esta seguro que desea borrar estos mensajes?")){
		return 0
	}
	var formulario = $("mensajes_form").serialize();
	if(formulario.empty()){
		alert("Elija un campo");
		return 0
	}
	new Ajax.Request('/mensajes/destroy', {
		parameters: formulario + '&authenticity_token=' + encodeURIComponent(this.token),
		onComplete: function(){
			$$("#mensajes tr.no_leido", "#mensajes tr.si_leido").each(function(tr){
				var input = tr.down("input", 0);
				if(input.checked == true){
					new Effect.Fade(tr);
				}
			});
		}
	});
  },

  mensaje_borrar_outbox: function(){
	if(!confirm("Esta seguro que desea borrar estos mensajes?")){
		return 0
	}
	var formulario = $("mensajes_form").serialize();
	if(formulario.empty()){
		alert("Elija un campo");
		return 0
	}
	new Ajax.Request('/mensajes/destroy_outbox', {
		parameters: formulario + '&authenticity_token=' + encodeURIComponent(this.token),
		onComplete: function(){
			$$("#mensajes tr.enviado").each(function(tr){
				var input = tr.down("input", 0);
				if(input.checked == true){
					new Effect.Fade(tr);
				}
			});
		}
	});
  },
	

  /**********************************  CREATE TOPIC  ***********************************/


  select_type: function() {
	var select = $('foro_topic_tipo');
	switch(select.value) {
		case 'encuesta':
			$('encuesta_add').show();
		break;
		
		case 'evento':
			$('evento_add').show();
		break;
		
		default:
			$('encuesta_add').hide();
		break;
	}
  },

  check_options_behavior: function(class_options) {
	
	$('todos_' + class_options).observe("click", function(event){
		$$('input.'+ class_options +'').each(function(element){
			element.checked = true;
		});
	});
	
	$('ninguno_' + class_options).observe("click", function(event){
		$$('input.'+ class_options +'').each(function(element){
			element.checked = false;
		});
	});
	
  },

  clasificados_select_intention: function() {
	var select = $('clasificados_articulo_intencion');
	switch(select.value) {
		case 'subasta':
			$('subasta').show();
		break;

		default:
			$('subasta').hide();
		break;
	}
  },

  add_encuesta_item: function() {
	var ul = $('encuesta_add').down('UL', 0);
	var length = ul.childElements().length;
	var pregunta = $('foro_topic_pregunta');
	if(!pregunta.value.empty()){
		var input = "<li><span>"+pregunta.value+"</span> | <a href='javascript:lajaula.del_encuesta_item("+length+");'>Borrar {-}</a> <input type='hidden' name='foro_topic[preguntas]["+length+"]' value='"+pregunta.value+"'/></li>";
		pregunta.value = "";
		ul.insert({bottom: input});
	}else{
		
	}
  },

  del_encuesta_item: function(index) {
	var ul = $('encuesta_add').down('UL', 0);
	var elements = ul.childElements();
	elements[index].hide();
	elements[index].down('INPUT', 0).remove();
  },
	
  mostrar_resultados_encuesta: function() {
	var resultados = $$('span.resultado_encuesta');
	resultados.each(function(resultado){
		resultado.show();
	});
  },

  add_adjuntos: function(element) {
	var conteiner = $('adjuntos_topico');
	var attachments = conteiner.down('UL', 0);
	var inputs = conteiner.down('DIV', 0);
	element.name = 'attachments[' + (counter++)+ ']';
	element.id = 'attachment_' + counter;
	element.multi_selector = this;
	
	var new_input = "<input type=\"file\" onchange=\"lajaula.add_adjuntos(this)\" />"
	inputs.insert({top: new_input})
	
	element.setStyle({
		'position':'absolute',
		'left':'-3000px'
	})
	
	var attach = "<li><span>"+element.value+"</span><a href=\"javascript: void(0);\" onclick=\"lajaula.del_adjuntos(this, 'attachment_"+counter+"')\">{-}</a></li>"
	attachments.insert({bottom: attach})
  },

  del_adjuntos: function(el, input) {
	var element = el.up('LI', 0);
	element.remove();
	
	var element = $(input);
	element.remove();
  },


    /**********************************  CONTACTS  ***********************************/

  listen_contacts_messages: function() {
	var obj = this;
	new PeriodicalExecuter(function(pe) {
	  new Ajax.Request('/contactos/listen_contacts_messages', {
		method: "get",
		onCreate: function() {
			pe.stop();
		},
		onComplete: function(transport) {
			obj.show_messages(transport.responseText.evalJSON());
			obj.listen_contacts_messages();
		}
	  });
	}, 15);
  },

  show_messages: function(messages) {
	var ul = $('incoming_messages').down("UL", 0);
	var tmpl = new Template("<li class='incoming_messages' onclick='lajaula.abrir_mensajero(#{id})' style='display:none;'><h3>#{usuario} te ha escrito</h3><p>#{mensaje}</p></li>");
	messages.each(function(msg){
		var contact = {id: msg.mensaje_contacto.user_id, usuario: msg.mensaje_contacto.usuario, mensaje: msg.mensaje_contacto.mensaje};
		var html = tmpl.evaluate(contact);
		ul.insert({bottom: html});
	});
	this.set_messages_position();
  },

  set_messages_position: function() {
	var ul = $('incoming_messages').down("UL", 0);
	var counter = 1;
	var obj = this;
	ul.childElements().each(function(li){
		var margin = counter * 87;
		var final_margin = '-'+(margin)+'px 0 0 0';
		li.setStyle({
			'margin':final_margin
		});

		li.appear({
			delay: (0.5 * counter),
			afterFinish: function() {
				li.fade({
					delay: ((0.5 * counter)+4),
					afterFinish: function() {
						li.remove();
					}
				});
			}
		});
		counter++;
	});
  },

  abrir_contactos: function() {
	var contactos_area = $('contactos_area');
	new Ajax.Updater('contactos_lista', '/contactos', {
		method: "get",
		onCreate: function() {
			$('lajaula_info_contactos').className = 'active';
		},
		onComplete: function() {
			var margin = "-" + (contactos_area.getHeight() + 3) + "px 0 0 0";
			contactos_area.setStyle({
				'margin' : margin
			});
			contactos_area.show();
		}
	});
	
	document.observe('click', function(event) {
		if(event.target.id != 'contactos_lista' && !event.target.id.empty()) {
			contactos_area.hide();
			$('lajaula_info_contactos').className = '';
		}
	});
  },

  abrir_im: function() {
	var im_area = $('im_area');
	new Ajax.Updater('im_lista', '/contactos/im', {
		method: "get",
		onCreate: function() {
			$('lajaula_messages').addClassName('active');
		},
		onComplete: function() {
			var margin = "-" + (im_area.getHeight() + 3) + "px 0 0 0";
			im_area.setStyle({
				'margin' : margin
			});
			im_area.show();
		}
	});

	document.observe('click', function(event) {
		if(event.target.id != 'im_lista' && !event.target.id.empty()) {
			im_area.hide();
			$('lajaula_messages').removeClassName('active');
		}
	});
  },

  abrir_mensajero: function(contact_id) {
	window.open ("/contactos/mensajero/"+contact_id, "mensajero_" + contact_id,"width=300, height=338, status=no, toolbar=no, location=no, menubar=no, directories=no, resizable=no, scrollbars=no");
  },

  submit_mensaje: function(myfield,e) {
	var keycode;
	if(window.event) {
		keycode = window.event.keyCode;	
	}else if(e) {
		keycode = e.which;
	}else{
		return true;
	}
	if(keycode == 13) {
		this.enviar_mensaje();
		return false;
	}else{
		return true;
	}
  },

  contactos_opciones: function(options) {
	$(options).down('span', 0).show();
	$(options).down('small', 0).down('a', 0).addClassName('showing_contact_option');
  },

  contactos_opciones_cerrar: function(options) {
	$(options).down('span', 0).hide();
	$(options).down('small', 0).down('a', 0).removeClassName('showing_contact_option');
  },

  get_messages: function(contacto_id) {
	var obj = this;
	new PeriodicalExecuter(function(pe) {
	  new Ajax.Request('/contactos/mensajes/'+contacto_id, {
		method: "get",
		onCreate: function() {
			pe.stop();
		},
		onComplete: function(transport) {
			obj.insert_incoming_message(transport.responseText);
			obj.get_messages(contacto_id);
		}
	  });
	}, 5);
  },

  insert_incoming_message: function(transport) {
	if(!transport.empty()) {
		$('mensajes_contacto').insert({bottom: transport});
		$("mensajes_contacto").scrollTop = $("mensajes_contacto").scrollHeight;
	}
  },

  enviar_mensaje: function() {
	var writter = $('mensaje_contacto_mensaje');
	if(writter.value.empty()){
		Effect.Shake('mensaje_contacto_mensaje');
	}else{
		new Ajax.Request('/contactos/enviar', {
			asynchronous:true, 
			evalScripts:true, 
			method: "post",
			parameters: Form.serialize($('mensajero_form')),
			onCreate: function() {
				writter.value = '';
			},
			onComplete: function() {
				$("mensajes_contacto").scrollTop = $("mensajes_contacto").scrollHeight;
			}
		});
	}
  },


  /**********************************  TOPICS LIST  ***********************************/

  initialize_topics_box: function() {
	var obj = this;
	this.resize_topic_box(); 
	
	
	this.scroll_efect = new Effect.Morph('list_topics', {
	  duration: 0.5
	});
	
	Event.observe(window, 'resize', function(){ 
		obj.resize_topic_box();
	});
	
	Event.observe(window, 'scroll', function(){ 
		obj.scroll_topic_box();
	});
	
	
	list_topic_animation = true;
  },

  resize_topic_box: function() {
	var height_viewport = document.viewport.getHeight();
	var offset = $('list_topic_track').cumulativeOffset();
	var new_height = (height_viewport - offset[1] - 100);
	
	if(this.full) {
		new_height += 100;
	}

	var resize_to;
	var resize_pixels;
	
	if(new_height > topic_box_options.min) {
		if(new_height < topic_box_options.max) {
			resize_to =  new_height;
		}else{
			resize_to =  topic_box_options.max;
		}
	}else{
		resize_to =  topic_box_options.min;
	}
	
	resize_pixels = resize_to + 'px';
	if(list_topic_animation) {
		$('list_topics_scroller_conteiner').morph({
			'height': resize_pixels
		});
	}else{
		$('list_topics_scroller_conteiner').setStyle({
			'height': resize_pixels
		});
	}
	
  },

  scroll_topic_box: function() {
	/*
	var diff_time = new Date().getTime() - this.lastScroll;	
	if(!((diff_time) >= 5000)) {
		return ;
	}
	*/
	
	this.lastScroll = new Date().getTime();
	var scroll_viewport = document.viewport.getScrollOffsets().top;
	var offset = $('list_topic_track').cumulativeOffset()[1];
	var new_position = (scroll_viewport - offset + 10) + "px";
	var scroll_to;
	
	if(scroll_viewport > offset) {
		scroll_to = new_position;
		this.full = true
	}else{
		scroll_to = '0px';
		this.full = false
	}
	
	this.resize_topic_box(); // not sure! verify this later...
	
	if(this.scroll_efect != 'undefined') {
		this.scroll_efect.cancel();
	}
	
	this.scroll_efect = new Effect.Morph('list_topics', {
	  style: { marginTop: scroll_to },
	  duration: 0.5
	});
  }

});


function a(a){
	alert(a);
}


function handle(delta) {
	NoScrollEffect = true;
	var listado_drag = scroll_slider.value;
	// var relacion = parseFloat("0." + ($("list_topics_scroller_conteiner").getHeight() / topic_box_options.min))
	var relacion = 0.005;
	
	if(delta > 0){
		var pos = (parseFloat(listado_drag) - relacion);
	}else{
		var pos = (parseFloat(listado_drag) + relacion);
	}	
	scroll_slider.setValue(pos);
}

// extract from http://adomas.org/javascript-mouse-wheel/

function wheel(event){
        var delta = 0;
        
        if (!event) {	/* For IE. */
        	event = window.event;
        }
        if (event.wheelDelta) { 	/* IE/Opera. */
                delta = event.wheelDelta/120;
                /** In Opera 9, delta differs in sign as compared to IE. */
                if (window.opera) {
                    delta = -delta;
                }
        } else if (event.detail) { /** Mozilla case. */
                /** In Mozilla, sign of delta is different than in IE.
                 * Also, delta is multiple of 3.
                 */
                delta = -event.detail/3;
        }
        /** If delta is nonzero, handle it.
         * Basically, delta is now positive if wheel was scrolled up,
         * and negative, if wheel was scrolled down.
         */
        if (delta) {
                handle(delta);
	    }
        /** Prevent default actions caused by mouse wheel.
         * That might be ugly, but we handle scrolls somehow
         * anyway, so don't bother here..
         */
        if (event.preventDefault) {
            event.preventDefault();
        }
	event.returnValue = false;
}








