/*
 * INTRANET & EXTRANET ARC
 * AUTOR: Tubal Martin @ margenn.com
 *
 */


/*------------------------------------------------------------------------------
 * LIBRERIAS EXTERNAS UTILIZADAS: JQUERY 1.4, YUI 2.8.0r4 y PHPJS 
 *------------------------------------------------------------------------------
 */


/* -----------------------------------------------------------------------------
 * INTRANET & EXTRANET ARC
 * -----------------------------------------------------------------------------
 */


// AMBITO GLOBAL:

var ARC         = ARC || {};

ARC.servidor    = ARC.servidor || {};	
ARC.constantes  = {};
ARC.utilidades  = {};
ARC.funciones   = {}; // helpers
ARC.componentes = {}; // widgets
ARC.init        = function(){};


/* -----------------------------------------------------------------------------
 * ALIASES
 * -----------------------------------------------------------------------------
 */


ARC.serv  = ARC.servidor;
ARC.cons  = ARC.constantes; 
ARC.util  = ARC.utilidades;
ARC.func  = ARC.funciones;
ARC.comp  = ARC.componentes;


/* -----------------------------------------------------------------------------
 * CONSTANTES
 * -----------------------------------------------------------------------------
 */


// Constantes de keyCodes más usadas. Utilizar eventos keyup o keydown.
ARC.cons.keyCodes = {
    ENTER: 13,
    MAC_ENTER: 3,
    PRINT_SCREEN: 44
};



ARC.cons.mensajes = {
	START_HTML_TAG: '<li>',
	END_HTML_TAG: '</li>',
	sistema:{
		TIMEOUT: "Su sesión ha expirado por inactividad. En 3 segundos será redirigido a la pantalla de acceso y podrá acceder de nuevo.",
		CLIENT_ERROR: "Lamentamos informarle de que se ha producido un error al procesar su solicitud. Intentelo de nuevo y si el error persiste pongase en contacto con ARC. Disculpe las molestias.",
		SERVER_ERROR: "Lamentamos informarle de que se ha producido un error en el servidor al procesar su solicitud. Se ha enviado un informe del error al administrador. Disculpe las molestias."
	},
	documentos:{
		CATEGORIA_OBLIGATORIA: "Seleccione una categoría para su documento."
	},
	mensajes:{
		DESTINATARIO_OBLIGATORIO: "Seleccione un destinatario para su mensaje."
	},
	listas:{
		PERSONA_REPETIDA: "La persona seleccionada ya aparece en la lista. Seleccione otra."
	}
				
};

/* -----------------------------------------------------------------------------
 * UTILIDADES
 * -----------------------------------------------------------------------------
 */


// Cargador de dependencias de YUI
ARC.util.yuiLoader = function(componentes /*Array*/, callback /*function*/) {
	
    var yuiLoader = new YAHOO.util.YUILoader({
        //base: "http://ajax.googleapis.com/ajax/libs/yui/2.8.1/build/",
    	require: componentes,
        timeout: 5000, // 5s
        combine: false, // mejor sin combinar, + peticiones HTTP pero + standard, cacheable y flexible
        onSuccess: callback || function(){},
        onTimeout: function() {
            ARC.util.yuiLoader(componentes, callback);
        }
	});
    
    yuiLoader.insert();
    
};


// Redireccionador
ARC.util.redirect = function(url, timeout) {
	
	if (typeof timeout !== "undefined") {
		window.setTimeout(function(){
			window.location.href = url;
		}, timeout);
		return;
	}
	
	window.location.href = url;  
	 
};


// Recarga la pagina (refresh)
ARC.util.reload = function() {
	
	window.location.reload(true);
	
};


ARC.util.trimALL = function(string) {
    return string.replace(/\s/g, "");
};

ARC.util.scrollTop = function(){
	$("html").scrollTop(0);
};

ARC.util.eById = function(id){
	return document.getElementById(id);
};

/*------------------------------------------------------------------------------
 * FUNCIONES
 *------------------------------------------------------------------------------
 */ 

ARC.func.notificarUsuario = function(mensaje, statusMensaje, idContenedor, timeout){
		
	var contenedor = idContenedor || "page_message",
		timeout = timeout || 15000,
		mensaje = (typeof mensaje === "object") ? mensaje.mensaje : mensaje;
		mensaje = (/<\/li>/.test(mensaje) === false) ? '<li>' + mensaje + '</li>' : mensaje;	
	
	contenedor = $("#" + contenedor);
	
	contenedor
	    .hide()
	    .removeClass()
	    .addClass(statusMensaje)
	    .find('ul')
	    	.html(mensaje)
	    .end()	
	    .slideDown("fast");
		
	window.setTimeout(function(){
		contenedor
	    	.slideUp("fast", function(){
	    		$(this).removeClass(statusMensaje);
	    	});   	
	}, timeout);
	
};


/*------------------------------------------------------------------------------
 * COMPONENTES
 *------------------------------------------------------------------------------
 */

/*------------------------------------------------------------------------------
 * COMPONENTE: COLLAPSABLE
 * 
 * <div class="collapsable">
 * 		<div class="cabecera"></div>    <- evento click, el cuerpo colapsa
 * 		<div class="cuerpo"></div>
 * </div>			
 *------------------------------------------------------------------------------
 */

$(function(){
	
	var bullet = $('<span>', {"class" : "bullet"});
    
	$('.collapsable .cabecera')
        .prepend(bullet)
        .live('click', function(e){
            $(this)
                .nextAll('.cuerpo:first')
                    .slideToggle('fast')
                .end()
                .toggleClass('collapsed');
        });  
});

/*------------------------------------------------------------------------------
 * COMPONENTE: LOADER TOGGLER
 * 
 * <div class="ajaxian">
 * 		<a class="ajax">Editar</a>   <- visible
 * 		<img class="loader" src="loader.gif" />    <- invisible
 * </div>
 *------------------------------------------------------------------------------
 */
$(function(){
	$('.all.ajaxian a, .all.ajaxian input, .ajaxian a.ajax, .ajaxian input.ajax')
    .live('loadStart', function(e){
        e.preventDefault();
        $(this)
            .closest('.ajaxian')
                .children()
                    .hide()
                    .filter('.loader')
                        .show();
    })
    .live('loadComplete', function(e){
        e.preventDefault();
        $(this)
            .closest('.ajaxian')
                .children()
                    .hide()
                    .filter(':not(.loader, .dependiente)')
                        .show();
    });
});




/*------------------------------------------------------------------------------
 * COMPONENTE: NOTIFICACIONES ERROR AJAX
 * -----------------------------------------------------------------------------
 */

ARC.comp.ajax = {
	callbacks: {
		failure: function(oResponse){
			var mensajes = ARC.cons.mensajes;
			// Timeout error: En caso de expiracion de sesion en el servidor y peticion via AJAX, avisar y redirigir al LOGIN
			if (oResponse.getResponseHeader['X-Session-Expiration'] === 'expired' &&
			   oResponse.status === 403)
			{
				var mensaje = mensajes.START_HTML_TAG + mensajes.sistema.TIMEOUT + mensajes.END_HTML_TAG;
				ARC.func.notificarUsuario(mensaje, 'warning', 'system_message', 5000); 
				ARC.util.redirect(ARC.serv.siteUrl, 6000);	
			}
			// Client errors
			else if (oResponse.status >= 400 && oResponse.status < 500){
				var mensaje = mensajes.START_HTML_TAG + mensajes.sistema.CLIENT_ERROR + mensajes.END_HTML_TAG;
				ARC.func.notificarUsuario(mensaje, 'warning', 'system_message', 15000);
			}
			// Server errors
			else{
				var mensaje = mensajes.START_HTML_TAG + mensajes.sistema.SERVER_ERROR + mensajes.END_HTML_TAG;
				ARC.func.notificarUsuario(mensaje, 'error', 'system_message', 60000);
			}
		}
	}	
};



/*------------------------------------------------------------------------------
 * COMPONENTE: AUTOCOMPLETE BUSCADOR PERSONAS (1 por pagina)
 * -----------------------------------------------------------------------------
 */

ARC.comp.buscadorPersonas = function(){
	
	var idBuscador = "buscador",
        idCampoBuscador = "campo_buscador",
	    idContenedorResultados = "contenedor_resultados",
		campoBuscador = $("#" + idCampoBuscador),
	
	    init = function(dsUrl, fields, callback){
			
			var ds, ac;
			
			ARC.util.yuiLoader(['autocomplete', 'connection', 'json'], function(){
				ds = crearDataSource(dsUrl, fields);
				ac = crearAutoComplete(ds, callback);
				window.setTimeout(function(){
					campoBuscador.focus();
				}, 500);
			});
			
			return {
				ds: ds,
				ac: ac
			};
		},
		
		crearDataSource = function(dsUrl, fields/*string*/){
			
			var ds = new YAHOO.util.XHRDataSource(ARC.serv.siteUrl + dsUrl);
			
			ds.responseType = YAHOO.util.XHRDataSource.TYPE_JSON;
			ds.connMethodPost = true; // enviamos por POST
			ds.connTimeout = 3000;
			ds.connXhrMode = "ignoreStaleResponses"; //La ultima respuesta es la que se muestra, ignorando las anteriores
			ds.responseSchema = {
			    resultsList : "text", // String pointer to result data
			    // Field order doesn't matter and not all data is required to have a field
			    fields : fields.split(',') // simple location
			};
 
			return ds;
		},
		
		crearAutoComplete = function(ds, callback){
			
			var ac = new YAHOO.widget.AutoComplete( idCampoBuscador, idContenedorResultados, ds);
			
            ac.allowBrowserAutocomplete = false;
            ac.animVert = false;
			ac.forceSelection = true;
			ac.queryDelay = 0.5;
            ac.minQueryLength = 3;
			ac.suppressInputUpdate = true;
            ac.useShadow = true;
			// Evento "itemSelectEvent" sobre la lista de Autocomplete
			ac.itemSelectEvent.subscribe( callback );
			// Errores en el DataSource (timeouts, 500 etc..)
			ac.dataErrorEvent.subscribe(function(sType, aArgs){
				// Pasamos el objeto que devuelve el connection manager oResponse
                ARC.comp.ajax.callbacks.failure(aArgs[2]);
            });
			
			return ac;
		};
	
	return {
		init:init
	};
	
};

/*------------------------------------------------------------------------------
 * COMPONENTE: AUTOCOMPLETE BUSCADOR CLUBES (1 o varios por pagina)
 * -----------------------------------------------------------------------------
 */

ARC.comp.buscadorClubes = function(){
    
    var idCampoBuscador = "campo_buscador", 
	    idContenedorResultados = "contenedor_resultados",
		campoBuscador = $("#" + idCampoBuscador),
		ds,
		dsCreado = false,
		//c = 1,
        
        init = function(dsUrl, fields, oIds, callback){
            
            var oIds = oIds || {}, callback = callback || function(){};
            
			if (dsCreado === false) {
				ds = crearDataSource(dsUrl, fields);
				dsCreado = true;
				//console.log("DS creada");
				crearAutoComplete(oIds, callback);
				//console.log("AC"+ c +"creado");
				//c+=1;
			}
			else{
				crearAutoComplete(oIds, callback);
				//console.log("AC"+ c +"creado");
				//c+=1;
			}
			
			if (campoBuscador.length > 0) {
				window.setTimeout(function(){
					campoBuscador.focus();
				}, 500);
			}
        },
        
	    load = function(callback){
			ARC.util.yuiLoader(['autocomplete', 'connection', 'json'], callback);
		},
		
        crearDataSource = function(dsUrl, fields){
            
            var ds = new YAHOO.util.XHRDataSource(ARC.serv.siteUrl + dsUrl);
            
            ds.responseType = YAHOO.util.XHRDataSource.TYPE_JSON;
            ds.connMethodPost = true; // enviamos por POST
            ds.connTimeout = 3000;
            ds.connXhrMode = "ignoreStaleResponses"; //La ultima respuesta es la que se muestra, ignorando las anteriores
            ds.responseSchema = {
                resultsList : "text", // String pointer to result data
                // Field order doesn't matter and not all data is required to have a field
                fields : fields.split(',') // simple location
            };
 
            return ds;
        },
        
        crearAutoComplete = function(oIds, callback){
			
			var idCampo = oIds.idCampoBuscador || idCampoBuscador,
			    idContenedor = oIds.idContenedorResultados || idContenedorResultados,
			    ac = new YAHOO.widget.AutoComplete( idCampo, idContenedor, ds );
            
			//console.log("AC creado:" + ac);
			
            ac.allowBrowserAutocomplete = false;
            ac.animVert = false;
            ac.forceSelection = true;
            ac.queryDelay = 0.3;
            ac.minQueryLength = 2;
            ac.suppressInputUpdate = false;
            ac.useShadow = true;
			
            // Impedimos que al hacer TAB por el historial se borre del input el valor guardado
			// en la BD y que aparece como valor inicial.
			// ac.inputDefaultValue: propiedad propia: guardamos en cada instancia el valor inicial de cada input
			ac.inputDefaultValue = ac.getInputEl().value;
			ac.selectionEnforceEvent.subscribe(function(sType, aArgs){
				//console.log(aArgs[1]);
				if (ac.inputDefaultValue === aArgs[1]) {
					ac.getInputEl().value = ac.inputDefaultValue;
				}
			});
			
			// Evento "itemSelectEvent" sobre la lista de Autocomplete
			ac.itemSelectEvent.subscribe(callback);
            // Errores en el DataSource (timeouts, 500 etc..)
            ac.dataErrorEvent.subscribe(function(sType, aArgs){
                // Pasamos el objeto que devuelve el connection manager oResponse
                ARC.comp.ajax.callbacks.failure(aArgs[2]);
            });
        };
    
    return {
		load:load,
        init:init
    };
    
};



/*------------------------------------------------------------------------------
 * SECCIONES APLICACION
 *------------------------------------------------------------------------------
 */

/*------------------------------------------------------------------------------
 * L O G I N: main
 *------------------------------------------------------------------------------
 */

ARC.login = function() {
	
	var salt = ARC.serv.salt,
		keyCodes = ARC.cons.keyCodes,
	    formLogin =	$("#form_login"),
	    userInput = $("#user"),    
		passwordInput = $("#password"),
		botonSubmit = $("#boton_acceso"),
	
	    init = function() {
	        userInput.focus();
	        // Si el usuario presiona ENTER, encriptamos y enviamos el formu
	        $(document).keydown(function(e) {
	            if (e.keyCode == (keyCodes.ENTER || keyCodes.MAC_ENTER)) {
	            	encryptDataBeforeSubmit(e);
	            }
	        });
	        // Evento CLICK sobre submit button para compatibilidad con webkit 
	        // porque envia el formu sin coger los valores que le devuelve la funcion "encryptDataBeforeSubmit" 
	        botonSubmit.click(encryptDataBeforeSubmit);
	  
	    },
	    
	    encryptDataBeforeSubmit = function(e) {
	    	
	    	// Evitamos submit
	    	e.preventDefault();
	    	// hasheamos usuario y password
	    	var user = userInput.val().toUpperCase(),
	    		password = passwordInput.val();
	    	
	    	user = (user == '') ? user : hex_sha1(user);
		    password = (password == '') ? password : hex_sha1(salt + hex_sha1(password));
		    
		    // Oops..desaparecieron ;)
	    	userInput.css('color', 'transparent');
	    	passwordInput.css('color', 'transparent');
		    // Asignamos nuevos valores encriptados antes de enviar el formulario 
	    	userInput.val(user);
	    	passwordInput.val(password);
		    // Enviamos usuario y clave hasheada
		    formLogin.submit();
	    	
	    };
	
	return {
		init:init
	};

};

/*------------------------------------------------------------------------------
 * T E M P O R A D A S:
 *------------------------------------------------------------------------------
 */

ARC.temporadas = function(){
	
	var listaTemporadas = $("#lista_temporadas"),
		phpjs = new PHP_JS(),
		
		init = function(){
			ARC.util.yuiLoader(['connection','json'], function(){
				// Eliminar temporada
		        $('.eliminar', listaTemporadas).live('click', eliminarTemporada);
			});    
		},
		
		eliminarTemporada = function(e){
			var link = $(this),
				documento = link.closest('.temporada');
			e.preventDefault();
			link.trigger('loadStart');
			YAHOO.util.Connect.asyncRequest('GET', link.attr('href'), 
				{
					success: function(o){
						var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
						link.trigger('loadComplete');
						documento.fadeOut("fast").remove();
						ARC.func.notificarUsuario(respuesta.text, respuesta.status);
					},
					failure: function(o){
						link.trigger('loadComplete');
						ARC.comp.ajax.callbacks.failure(o);
					}	
				}
			);
		};
	
	return {
		init:init	
	};
	
};



/*------------------------------------------------------------------------------
 * D O C U M E N T O S:
 *------------------------------------------------------------------------------
 */

ARC.documentos = function() {
		
	var filterForm = $("#filter_form"),
		uploaderForm = $("#uploader_form"),
		submitNuevoDocumento = $(':submit', uploaderForm),
		listaDocumentos = $('#lista_documentos'),
		phpjs = new PHP_JS(),
	
		init = function() {
			
			ARC.util.yuiLoader(['connection','json'], function(){
				// Filtrar por orden o categoria (ajax)
				$("select", filterForm).change(filtrar);
				// Mostrar form para subir nuevo documento y resetear form
				$('#boton_nuevo_documento').click(mostrarFormNuevoDocumento);
				$('#uploader_form .submit a').click(ocultarFormNuevoDocumento);
		        // habilitamos boton submit cuando seleccione un archivo
		        $('#nombre_archivo').change(habilitarSubmitNuevoDocumento);
		        // subimos el archivo
		        submitNuevoDocumento.click(subirNuevoDocumento);
		        // Edicion archivo
		        $('.editar, .cancelar', listaDocumentos).live('click', function(e){
		        	e.preventDefault();
		        	toggleMenuEdicion(e);
		        	toggleEdicionDocumento(e);
		        });
		        // Actualizar archivo
		        $('.actualizar', listaDocumentos).live('click', actualizarDocumento);
		        // Eliminar archivo
		        $('.eliminar', listaDocumentos).live('click', eliminarDocumento);
			});
			
		},
	
		filtrar = function(e) {
			
			YAHOO.util.Connect.setForm("filter_form");
            YAHOO.util.Connect.asyncRequest('POST', filterForm.attr('action'),{
            	success: function(o){
            		$('#page_content').html(o.responseText);
            	},
            	failure: ARC.comp.ajax.callbacks.failure
            });
            
		},
		
		subirNuevoDocumento = function(e){
			
			// mostramos mensaje de guardando....
			var submit = $(this);
			e.preventDefault();
			if( $("#categoria_archivo").val() == 0 ){
				ARC.func.notificarUsuario(ARC.cons.mensajes.documentos.CATEGORIA_OBLIGATORIA, "warning");
				return;
			}
			submit.trigger('loadStart');
			// deshabilitamos submit uploader cuando envie el form
			deshabilitarSubmitNuevoDocumento();
			// Subimos archivo a través de iframe
			YAHOO.util.Connect.setForm("uploader_form", true);
            YAHOO.util.Connect.asyncRequest('POST', uploaderForm.attr('action'), 
            	{
	                upload: function(o) {
            			var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
            			submit.trigger('loadComplete');
	                    if (respuesta.status == 'success') {
	                    	window.setTimeout(ocultarFormNuevoDocumento, 1500);
	                    	$("#categoria_defecto").attr("selected", "selected");
	                    	filtrar();
	                    }
	                    ARC.func.notificarUsuario(respuesta.text, respuesta.status);
	                }
                }
            );
            
		},
		
		toggleMenuEdicion = function(e){
			$(e.target).parent().siblings(":not(.loader)").andSelf().toggle();
		},
		
		toggleEdicionDocumento = function(e){
			var nombre = $(e.target).closest(".documento").find(".nombre:first"),
				input = $(".nombre-editado", nombre);
			nombre.children().toggle();
			if (input.css('display') != 'none') {
				input.focus();
			}
		},
		
		actualizarDocumento = function(e){
			var enlaceGuardar = $(this),
				doc = enlaceGuardar.closest(".documento"),
				nombre = doc.find(".nombre:first"),
				nombreActual = nombre.find('.nombre').html(),
				nombreEditado = nombre.find(".nombre-editado").val(),
				ext = nombre.find(".extension").val();
			
			e.preventDefault();
			// Si el nuevo nombre es = al que ya tenia, ocultamos el editor y terminamos
			if (nombreEditado + ext == nombreActual) {
				toggleEdicionDocumento(e);
				toggleMenuEdicion(e);
				return;
			}

			var form = doc.find("form");

			enlaceGuardar.trigger('loadStart');
			
			YAHOO.util.Connect.setForm(form.attr("id"));
			YAHOO.util.Connect.asyncRequest('POST', form.attr('action'), 
				{
					success: function(o){
						var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
						// cambiamos el nombre del archivo por el nuevo
						nombre.find('.nombre').html(nombreEditado + ext);
						enlaceGuardar.trigger('loadComplete');
						toggleEdicionDocumento(e);
						ARC.func.notificarUsuario(respuesta.text, respuesta.status);
					},
					failure: function(o){
						enlaceGuardar.trigger('loadComplete');
						ARC.comp.ajax.callbacks.failure(o);
					}	
				}
			);	
		},
		
		eliminarDocumento =  function(e){
			var link = $(this),
				documento = link.closest('.documento');
			e.preventDefault();
			link.trigger('loadStart');
			YAHOO.util.Connect.asyncRequest('GET', link.attr('href'), 
				{
					success: function(o){
						var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
						link.trigger('loadComplete');
						documento.fadeOut("fast", function(){
							$(this).remove();
						});
						filtrar();
						ARC.func.notificarUsuario(respuesta.text, respuesta.status);
					},
					failure: function(o){
						link.trigger('loadComplete');
						ARC.comp.ajax.callbacks.failure(o);
					}	
				}
			);	
		},
		
		mostrarFormNuevoDocumento = function(){
	        $('#nuevo_documento').slideDown("normal");
	        return false;
		},
		
		ocultarFormNuevoDocumento = function(){
	        $('#nuevo_documento').slideUp("normal", resetFormNuevoDocumento);
	        return false;
		},
		
		resetFormNuevoDocumento = function() {
			document.forms['uploader_form'].reset();
			deshabilitarSubmitNuevoDocumento();
		},
		
		habilitarSubmitNuevoDocumento = function(e){
			submitNuevoDocumento.removeAttr('disabled');
		},
		
		deshabilitarSubmitNuevoDocumento = function(){
			submitNuevoDocumento.attr('disabled', 'disabled');
		};
		
	return {
		init: init
	};
	
};



/*------------------------------------------------------------------------------
 * M E N S A J E S:
 *------------------------------------------------------------------------------
 */


ARC.mensajes = function(){
	
	var phpjs = new PHP_JS(),
	    main = function(){
		
		    var nuevoMensaje = $('#nuevo_mensaje'),
			    formNuevoMensaje = $("#form_nuevo_mensaje"),
				submitFormNuevoMensaje = $(':submit', formNuevoMensaje),
			    botonNuevoMensaje = $('#boton_nuevo_mensaje'),
				
			    init = function(){
					ARC.util.yuiLoader(['connection','json'], function(){
				        botonNuevoMensaje.click(mostrarFormNuevoMensaje);
						$(".submit a", formNuevoMensaje).click(ocultarFormNuevoMensaje);
						submitFormNuevoMensaje.click(enviarConversacion);
						$(".lista-conversaciones .eliminar").live('click', eliminarConversacion);
					});
			    },
				
				enviarConversacion = function(e){
		            var submit = $(this);
					
		            e.preventDefault();
					
					if( $("#destinatario_defecto").is(":selected") ){
		                ARC.func.notificarUsuario(ARC.cons.mensajes.mensajes.DESTINATARIO_OBLIGATORIO, "warning");
		                return;
		            }
					
		            submit.trigger('loadStart');
					
					YAHOO.util.Connect.setForm(formNuevoMensaje.attr('id'));
		            YAHOO.util.Connect.asyncRequest('POST', formNuevoMensaje.attr('action'), 
		                {
		                    success: function(o){
		                        var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
		                        submit.trigger('loadComplete');
		                        ARC.func.notificarUsuario(respuesta.text, respuesta.status);
								if (respuesta.status == 'success') {
									window.setTimeout(ocultarFormNuevoMensaje, 1500);
									actualizarVistaConversaciones();
								} 
		                    },
		                    failure: function(o){
		                        submit.trigger('loadComplete');
		                        ARC.comp.ajax.callbacks.failure(o);
		                    }   
		                }
		            );          
		        },
				
				actualizarVistaConversaciones = function(){
					// TODO: Utilizar constante de ajax en el servidor para aber si una pticion es ajaxiana o no
					var pageContent = $("#page_content"),
					    url = (/enviados/.test(window.location.href) || /recibidos/.test(window.location.href)) ? window.location.href + '/0/1/1' : window.location.href + '/recibidos/0/1/1';
					YAHOO.util.Connect.asyncRequest('GET', url, 
		                {
		                    success: function(o){
		                        var respuesta = o.responseText;
		                        pageContent.html(respuesta);
		                    },
		                    failure: function(o){
		                        ARC.comp.ajax.callbacks.failure(o);
		                    }   
		                }
                    );
				},				
	
				eliminarConversacion = function(e){
					var link = $(this),
					    conversacion = link.closest(".conversacion");
						
					e.preventDefault();
					YAHOO.util.Connect.asyncRequest('GET', link.attr('href'), 
                        {
                            success: function(o){
                                var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
		                        link.trigger('loadComplete');
								if (respuesta.status == "success") {
									conversacion.fadeOut("fast", function(){
	                                    $(this).remove();
	                                });
								}
								ARC.util.scrollTop();
		                        ARC.func.notificarUsuario(respuesta.text, respuesta.status);	
                            },
                            failure: function(o){
								link.trigger('loadComplete');
                                ARC.comp.ajax.callbacks.failure(o);
                            }   
                        }
                    );
				},
				
				mostrarFormNuevoMensaje = function(){
		            nuevoMensaje.slideDown("normal", function(){
						$("input:first", nuevoMensaje).focus();
					});
		            return false;
		        },
		        
		        ocultarFormNuevoMensaje = function(){
		            nuevoMensaje.slideUp("normal", resetFormNuevoMensaje);
		            return false;
		        },
		        
		        resetFormNuevoMensaje = function(){
		            document.forms['form_nuevo_mensaje'].reset();
		        };
			
			return {
				init:init
			};
				  
	    },
	   
	    conversacion = function(){
			var formNuevaRespuesta = $("#form_respuesta"),
			    submitFormNuevaRespuesta = $(":submit", formNuevaRespuesta),
			
			    init = function(){
                    ARC.util.yuiLoader(['connection','json'], function(){
                       submitFormNuevaRespuesta.click(enviarRespuesta);
                    });
                },
				
				enviarRespuesta = function(e){
					var submit = $(this);
                    
                    e.preventDefault();
                    submit.trigger('loadStart');
                    
                    YAHOO.util.Connect.setForm(formNuevaRespuesta.attr('id'));
                    YAHOO.util.Connect.asyncRequest('POST', formNuevaRespuesta.attr('action'), 
                        {
                            success: function(o){
                                var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
                                submit.trigger('loadComplete');
                                ARC.func.notificarUsuario(respuesta.text, respuesta.status);
                                if (respuesta.status == 'success') {
                                    actualizarVistaConversacion();
                                } 
                            },
                            failure: function(o){
                                submit.trigger('loadComplete');
                                ARC.comp.ajax.callbacks.failure(o);
                            }   
                        }
                    );          
				},
				
				actualizarVistaConversacion = function(){
					var pageContent = $("#page_content"),
					    url = window.location.href + '/1';
						
					YAHOO.util.Connect.asyncRequest('GET', url, 
                        {
                            success: function(o){
                                var respuesta = o.responseText;
                                pageContent.html(respuesta);
                            },
                            failure: function(o){
                                ARC.comp.ajax.callbacks.failure(o);
                            }   
                        }
                    );
				};
				
				 
	   	    return {
                init:init
            };
	    };

		
		
		
	
	return {
		main:main(),
		conversacion:conversacion()
	};   
	
};



/*------------------------------------------------------------------------------
 * L I S T A S:
 *------------------------------------------------------------------------------
 */


ARC.listas = function(){
	
	
	// VARIABLES COMPARTIDAS
	var phpjs = new PHP_JS(),
	    
	    pageHeader = $('#page_header'),
		mensajeNoContent = $(".no-content"),
	    enlaceEditarLista = $("#enlace_editar_lista"),
	    botonGuardarLista = $("#boton_guardar_lista"),
	    botonEnviarLista = $("#boton_enviar_lista"),
		botonAprobarLista = $("#boton_aprobar_lista"),
	    tabDeportistas = $('#tab_deportistas'),
	    tabDirectivos = $('#tab_directivos'),
	    sideCol = $('#side_col'),
	    template = $(".template.listas-temporada-persona"),
	    lista = $("#lista"),
	    form = $("#form_lista"),
	    
	    numPersonasEnLista = $(".persona", lista).length, // numero personas en Lista
	    idsPersonas = {};
	
	
	// Eventos comunes a todos los estados de lista
	var eventosComunesEstados = function(){
		// Evento click sobre tabs directivos y deportistas
        tabDeportistas.click(togglePersonas);
        tabDirectivos.click(togglePersonas);
	};
	
	
		
    var editable = function(){
        
            var init = function(){
				
				eventosComunesEstados();
				
				var eventosComunes = function(){
                        // Iniciamos buscador
                        ARC.comp.buscadorPersonas().init(
						   "/" + ARC.serv.nombreCategoriaUsuario + "/personas/get_datasource_buscador_personas_listas_temporada", 
						   "nombre_completo,Id,foto,es_patron", 
						   ARC.listas.addDeportista
						);
                        // Control personas repetidas
                        $("input:hidden", form).each(function(){
                            idsPersonas[$(this).attr('value')] = "added";
                        });
                        // Evento click sobre icono basura "eliminar"
                        $(".eliminar", lista).live('click', eliminarPersona);
                        // Evento click sobre enlace "Editar roles"
                        $(".propiedades", lista).live('click', toggleMenuPropiedades);
                        // Evento click sobre boton "Guardar"
                        botonGuardarLista.click(guardarLista);
                        // Evento click sobre boton "Enviar"
                        botonEnviarLista.click(enviarLista);
                        // Evento click sobre checkboxes roles
                        $("input.deportista, input.entrenador, input.directivo", lista).live('click', gestionarRoles);   
                    },
                
                    eventosIntranet = function(){
                        // Evento click sobre checkboxes roles
                        $("input.rse, input.baja, input.patron", lista).live('click', toggleEtiqueta);
						// evento click sobre boton "Aprobar Lista"
                        botonAprobarLista.click(aprobarLista);
                    },
                    
                    eventosExtranet = function(){
                        // Evento click sobre icono basura "eliminar en seccion "Altas pendientes"
                        $(".altas-pendientes .eliminar", sideCol).live('click', eliminarAltaIncompleta);
                    };    
                
                if ($(document.body).is(".edition-off")) {
                    // Evento click sobre boton "Editar"
                    enlaceEditarLista.click(function(e){
                        e.preventDefault();
                        // Habilitar edición
                        editarLista();
						//Eventos comunes
                        eventosComunes();
                        // Eventos Intranet o Extranet  
                        if (ARC.serv.esIntranet) {
                            eventosIntranet();      
                        }
                        else {
                            eventosExtranet();
                        }
                    });
					
					// evento click sobre boton "Aprobar Lista"
					if (ARC.serv.esIntranet) {
						ARC.util.yuiLoader(['connection','json'], function(){	
						   botonAprobarLista.click(aprobarLista);
						});  
					}
                }
                else {
                    // Evento click sobre boton "Editar"
                    enlaceEditarLista.click(editarLista);
					//Eventos comunes
                    eventosComunes();
                    // Eventos Intranet o Extranet
                    if (ARC.serv.esIntranet) {
                        eventosIntranet();    
                    }
                    else {
                        eventosExtranet();
                    }
                }   
            };
            
            return {
                init:init
            };
        },
		
		noEditable = function(){
			
			var init = function(){
				eventosComunesEstados();
			};
			
			return {
				init:init
			};
			
		},
        
        revisable = function(){
			
            var enlaceImpugnarLista = $("#enlace_impugnar_lista"),
			    nuevoMensaje = $('#nuevo_mensaje'),
                formNuevoMensaje = $("#form_nuevo_mensaje"),
                submitFormNuevoMensaje = $(':submit', formNuevoMensaje),
			
			    init = function(){
					ARC.util.yuiLoader(['connection','json'], function(){
	                    eventosComunesEstados();
					    enlaceImpugnarLista.click(mostrarFormNuevoMensaje);
	                    $(".submit a", formNuevoMensaje).click(ocultarFormNuevoMensaje);
	                    submitFormNuevoMensaje.click(enviarConversacion);
				    });
                },
				
				enviarConversacion = function(e){
                    var submit = $(this);
                    
                    e.preventDefault();
                    submit.trigger('loadStart');
                    
                    YAHOO.util.Connect.setForm(formNuevoMensaje.attr('id'));
                    YAHOO.util.Connect.asyncRequest('POST', formNuevoMensaje.attr('action'), 
                        {
                            success: function(o){
                                var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
                                submit.trigger('loadComplete');
                                ARC.func.notificarUsuario(respuesta.text, respuesta.status);
                                if (respuesta.status == 'success') {
                                    window.setTimeout(ocultarFormNuevoMensaje, 1500);
                                } 
                            },
                            failure: function(o){
                                submit.trigger('loadComplete');
                                ARC.comp.ajax.callbacks.failure(o);
                            }   
                        }
                    );          
                },
				
				mostrarFormNuevoMensaje = function(){
                    nuevoMensaje.slideDown("normal", function(){
                        $("input:first", nuevoMensaje).focus();
                    });
                    return false;
                },
                
                ocultarFormNuevoMensaje = function(){
                    nuevoMensaje.slideUp("normal", resetFormNuevoMensaje);
                    return false;
                },
                
                resetFormNuevoMensaje = function(){
                    document.forms['form_nuevo_mensaje'].reset();
                };
            
            return {
                init:init
            };
        },
		
		
		// METODOS COMPARTIDOS
		addDeportista = function(sType /*event type*/, aArgs /*event arguments*/){
            var oData     = aArgs[2], // object literal of data
                nombre    = oData[0],
                idPersona = oData[1],
                foto      = (oData[2].length < 3) ? ARC.serv.imgUrl + "person.gif" : ARC.serv.photoPersonaUrl + oData[2],
                es_patron = (oData[3] == 1) ? true : false,
                nuevaPersona, menuPropiedades, propiedades;
            
			// Eliminamos mensaje "lista vacía"
			if (mensajeNoContent.length > 0) {
				mensajeNoContent.fadeOut();
				mensajeNoContent.length = 0;
			}        
                        
            // Control personas repetidas       
            if (typeof idsPersonas[idPersona] !== "undefined") {
                ARC.func.notificarUsuario(ARC.cons.mensajes.listas.PERSONA_REPETIDA, "warning");
                return;
            }
            else{
                idsPersonas[idPersona] = "added";
            }
            
            // Creamos la persona: TODO: al enlace incluir una clase css que no subraye el vinculo
            nuevaPersona = template.clone()
                    .find(".foto").attr("src", foto).end()
                    .find(".num-ficha").text(idPersona).end()
                    .find(".nombre a").attr('href', '#').text(nombre).end()
                    .removeClass("template");
            menuPropiedades = $(".menu-propiedades", nuevaPersona);
            propiedades = $(".propiedades", nuevaPersona);      
            
            // Es patron?       
            if (es_patron) {
                $(".patron", propiedades).removeClass("oculto");
            }
    
            // Roles
            $(".id-persona", menuPropiedades).attr({
                "name": "personas[" + numPersonasEnLista + "][Id_persona]",
                "value": idPersona
            });  
            $(".deportista", menuPropiedades).attr("name", "personas["+ numPersonasEnLista +"][rol_deportista]");
            $(".entrenador", menuPropiedades).attr("name", "personas["+ numPersonasEnLista +"][rol_entrenador]");
            $(".directivo", menuPropiedades).attr("name", "personas["+ numPersonasEnLista +"][rol_directivo]");
			
			if (ARC.serv.esIntranet) {
				$(".rse", propiedades).removeClass("oculto");
				$(".rse", menuPropiedades).attr({
					"name": "personas[" + numPersonasEnLista + "][firma_rse]",
					"checked": "checked"
				});
				$(".baja", menuPropiedades).attr("name", "personas[" + numPersonasEnLista + "][es_baja]");
			}
    
            // Si el usuario esta con la seccion Directivos activa, insertamos un directivo
            if ( $(tabDeportistas).is(".selected") ) {
                $(".deportista", propiedades).removeClass("oculto");
                $(".deportista", menuPropiedades).attr("checked", "checked");
                nuevaPersona.addClass("deportista");
            }
            else {
                $(".directivo", propiedades).removeClass("oculto");
                $(".directivo", menuPropiedades).attr("checked", "checked");
                nuevaPersona.addClass("directivo");
            }        
            
            numPersonasEnLista += 1;
            
            // Insertamos persona en lista  
            lista.append(nuevaPersona); 
        },
        
        eliminarPersona = function(e){
            var persona = $(this).closest(".persona"),
                idPersona =  $(".id-persona", persona).attr('value');
                
            e.preventDefault(); 
            // Control personas repetidas
            delete idsPersonas[idPersona];  
            // Control numero personas en lista
            if (numPersonasEnLista > 0) {
                numPersonasEnLista -= 1;
            }
            // Quitamos la persona de la lista
            persona.fadeOut("fast", function(){
                $(this).remove();
            });
        },
		
		eliminarAltaIncompleta = function(e){
			var url = $(this).attr("href"),
			    li  = $(this).closest("li");
			
			e.preventDefault(); 
			if (window.confirm("¿Estas seguro de que quieres eliminar esta persona en proceso de alta?")) {
				YAHOO.util.Connect.asyncRequest('GET', url, {
					success: function(o){
						var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
						// Quitamos de la sección el alta pendiente eliminada
						li.remove();
						// Notificamos
						ARC.func.notificarUsuario(respuesta.text, respuesta.status);
					},
					failure: function(o){
						ARC.comp.ajax.callbacks.failure(o);
					}
				});
			}
		},
        
        guardarLista =  function(e){
            botonGuardarLista.trigger('loadStart');
            YAHOO.util.Connect.setForm("form_lista");
            YAHOO.util.Connect.asyncRequest('POST', form.attr('action'), 
                {
                    success: function(o){
                        var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
                        botonGuardarLista.trigger('loadComplete');
                        ARC.func.notificarUsuario(respuesta.text, respuesta.status);
                        if (respuesta.status == 'success' && ! ARC.serv.esIntranet) {
                            mostrarFechaHoraGuardado(respuesta.text.fechaHoraGuardado);
                        }
                        
                    },
                    failure: function(o){
                        botonGuardarLista.trigger('loadComplete');
                        ARC.comp.ajax.callbacks.failure(o);
                    }   
                }
            );
        },
        
        enviarLista =  function(e){
			// Altas pendientes
			if (checkAltasPendientes() === true) {
				botonEnviarLista.trigger('loadStart');
				YAHOO.util.Connect.setForm("form_lista");
				YAHOO.util.Connect.asyncRequest('POST', form.attr('action').replace(/guardar/, 'enviar'), {
					success: function(o){
						var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
						botonEnviarLista.trigger('loadComplete');
						ARC.func.notificarUsuario(respuesta.text, respuesta.status);
						if (respuesta.status == 'success') {
							// ocultamos controles de edicion
							window.setTimeout(function(){
								$(".altas-pendientes", sideCol).closest('.seccion-lateral').hide();
								toggleEdicion();
								mostrarFechaHoraEnvio(respuesta.text.fechaHoraGuardado);
							}, 250);
						}	
					},
					failure: function(o){
						botonEnviarLista.trigger('loadComplete');
						ARC.comp.ajax.callbacks.failure(o);
					}
				});
			} 
        },
		
		aprobarLista = function(e){
			e.preventDefault();
			if (window.confirm("¿Estas seguro de que quieres aprobar esta lista? Recuerda que esta acción es irreversible.")) {
				botonAprobarLista.trigger('loadStart');
				YAHOO.util.Connect.asyncRequest('GET', botonAprobarLista.attr('href'), {
					success: function(o){
						var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
						botonGuardarLista.trigger('loadComplete');
						ARC.func.notificarUsuario(respuesta.text, respuesta.status);
						if (respuesta.status == 'success' || respuesta.status == 'warning') {
						   // Eliminamos boton del DOM y marcamos el estado aprobado como "done"
						   botonAprobarLista.closest(".ajaxian").slideUp("normal", function(){$(this).remove()});
						   $(".estado.aprobacion", sideCol).addClass("done");
						}
					},
					failure: function(o){
						botonGuardarLista.trigger('loadComplete');
						ARC.comp.ajax.callbacks.failure(o);
					}
				});
			} 
        },
		
		checkAltasPendientes = function(){
			if ($(".altas-pendientes li", sideCol).length > 0) {
				if (window.confirm("Si envias la lista, las personas que no se hayan dado de alta se eliminarán. ¿Estas seguro de que quieres eliminar las personas en proceso de alta y enviar la lista?")) {
				    return true;
				}
				else{
					return false;
				}
			}
			else{
				return true;
			}		
		},
        
        editarLista = function(){
            toggleEdicion();
			
			if (ARC.serv.esIntranet) {
				return false;
			}
			
            YAHOO.util.Connect.asyncRequest('GET', $(this).attr('href'),
                {
                    success: function(o){
                        var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
                        ARC.func.notificarUsuario(respuesta.text, respuesta.status);
                    },
                    failure: function(o){
                        ARC.comp.ajax.callbacks.failure(o);
                    }
                }
            );
			return false;
        },
        
        mostrarFechaHoraGuardado = function(fechaHoraGuardado){
            $('.estado.guardado', sideCol)
                .addClass('done')
                .find('.fecha').text(fechaHoraGuardado).end();
        },
        
        mostrarFechaHoraEnvio = function(fechaHoraEnvio){
            $('.estado.envio', sideCol)
                .addClass('done')
                .find('.fecha').text(fechaHoraEnvio).end();
        },
        
        toggleEdicion = function(){
			if (ARC.serv.esIntranet) {
			    $(".buscador, .listas-acciones", pageHeader).slideToggle();
				if ($(document.body).is(".edition-off")){
					enlaceEditarLista.text("He terminado");
					$(document.body).removeClass("edition-off");
				}
				else{
					enlaceEditarLista.text("Editar");
					$(document.body).addClass("edition-off");
				}
				$('.lista-menu-acciones', lista).toggleClass('invisible');
                $('.menu-propiedades', lista).hide();	
			}
			else {
				$('#page_header_actions, .buscador, .listas-acciones', pageHeader).add('.boton.nuevo, .estado.guardado', sideCol).slideToggle();
				$('.estado.guardado .fecha', sideCol).text($('.estado.envio .fecha', sideCol).text());
				$('.lista-menu-acciones', lista).toggleClass('invisible');
				$('.estado.envio', sideCol).toggleClass('done');
			}
        },
        
        togglePersonas = function(e){
            var tab = $(this);
            
            e.preventDefault();

            if ( tab.is(".selected") ) { 
                return; 
            }

            var directivos = $(".persona.directivo:not(.deportista)", lista),
                deportistas = $(".persona.deportista:not(.directivo)", lista),
                tabDeportistasSeleccionado = (tab.attr("id") === "tab_deportistas") ? true : false,
                tabNoSeleccionado = (tabDeportistasSeleccionado) ? tabDirectivos : tabDeportistas,
                personasRolSeleccionado = (tabDeportistasSeleccionado) ? deportistas : directivos,
                personasRolNoSeleccionado = (tabDeportistasSeleccionado) ? directivos : deportistas;

            tabNoSeleccionado.removeClass("selected");
            tab.addClass("selected");

            if ( personasRolNoSeleccionado.length > 0 ) {
                personasRolNoSeleccionado.hide();
            }

            if ( personasRolSeleccionado.length > 0 ) {
                personasRolSeleccionado.show();
            }
        },
        
        toggleMenuPropiedades = function(e){
            var enlace = $(this),
                menuPropiedades = $(".menu-propiedades", enlace.closest(".persona"));
            
            e.preventDefault();
            
            if ( enlace.hasClass("show-propiedades") ) {
                menuPropiedades.hide();
                enlace.text("Editar propiedades").removeClass("show-propiedades");
            }
            else {
                menuPropiedades.show();
                enlace.text("Ocultar propiedades").addClass("show-propiedades");
            }
        },
		
		toggleEtiqueta = function(e){
			var checkbox = $(this),
			    persona = checkbox.closest(".persona"),
			    etiquetaRol = $(".propiedades ." + checkbox.attr("class"), persona);
				
			if (checkbox.is(":checked")) {
				etiquetaRol.show();
			}
			else {
				etiquetaRol.hide();
			}	
		},
        
        gestionarRoles = function(e){
            var checkbox = $(this),
                persona = checkbox.closest(".persona"),
                menuPropiedades = $(".menu-propiedades", persona),
                deportistaDeseleccionado = $(".deportista", menuPropiedades).is(":not(:checked)"),
                entrenadorDeseleccionado = $(".entrenador", menuPropiedades).is(":not(:checked)"),
                directivoDeseleccionado = $(".directivo", menuPropiedades).is(":not(:checked)"),
                tabDeportistasOn = tabDeportistas.is(".selected"),
                etiquetaRol = $(".propiedades ." + checkbox.attr("class"), persona);

            if (checkbox.is(":checked")) {
                // Mostramos etiqueta rol
                (checkbox.is(".deportista")) ? persona.addClass("deportista") : persona.addClass("directivo");
                etiquetaRol.show();
            }
            else {
                // Si se pretende deseleccionar todos lo roles, lo impedimos
                if ( deportistaDeseleccionado && entrenadorDeseleccionado && directivoDeseleccionado ) {
                    e.preventDefault();
                }
                else {
                    if (deportistaDeseleccionado){
                        persona.removeClass("deportista");
                        if (tabDeportistasOn) {
                            persona.fadeOut("fast");  
                        }   
                    }
                    else{
                        if (entrenadorDeseleccionado && directivoDeseleccionado) {
                            persona.removeClass("directivo");
                            if (!tabDeportistasOn) {
                                persona.fadeOut("fast");
                            }  
                        }
                    }
                    // Escondemos etiqueta rol
                    etiquetaRol.hide();
                }
            }
        };
		
	return {
		editable:editable(),
		noEditable:noEditable(),
		revisable: revisable(),
		addDeportista:addDeportista
	};	
    
};




/*------------------------------------------------------------------------------
 * P E R S O N A S:
 *------------------------------------------------------------------------------
 */

ARC.personas = function(){
	
	var phpjs = new PHP_JS(),	
	    tipoPersona,
	    bSubmitDarAlta = $("#bSubmitDarAlta"),
	    bSubmitGuardar = $("#bSubmitGuardar"),
		bSubmitActualizar = $("#bSubmitActualizar"),
		template = $(".template.personas-main"),
        lista = $("#lista"),
		sideCol = $("#side_col"),
		formEdicionImagen = $("#form_edicion_imagen"),
		enlaceRecortarImagen = $("#enlace_recortar_imagen"),
		opcionRedimensionarFoto = $("#redimension_foto"),
		panel, crop,
		
		main =  function(){
			
            var init = function(){
				// Iniciamos buscador
                ARC.comp.buscadorPersonas().init(
				    "/" + ARC.serv.nombreCategoriaUsuario + "/personas/get_datasource_buscador_personas",
					"nombre_completo,Id,foto,revisada,activa", 
					ARC.personas.addPersona
				);
				// Evento click sobre icono basura "eliminar en seccion "Altas pendientes"
                $(".altas-pendientes .eliminar", sideCol).live('click', eliminarAltaIncompleta);
			};
			
			return {
				init:init
			}
        },
		
	    directivo = function(){
		
           var init = function(){
			   	   ARC.util.yuiLoader(['connection','json'], function(){
				       tipoPersona = "directivo";
                       bSubmitDarAlta.click(darAlta);
                       bSubmitGuardar.click(guardar);
					   // Recorte y redimensión de imágenes
					   if (ARC.serv.esIntranet && formEdicionImagen.length > 0){
					   	   //console.log("iniciando eventos para edicion foto...");
					   	   // Cuando se seleccione una imagen, mostramos opción de redimensionar
                           $("#foto").change(function(e){
                               opcionRedimensionarFoto.removeClass("oculto");
                           }); 
					       initRecorteImagen();
					   }
			       });
               };
            
            return {
                init: init
            };     
        },
	
	    deportista = function(){
		
			var init = function(){
				    ARC.util.yuiLoader(['connection','json'], function(){
						tipoPersona = "deportista";
						bSubmitDarAlta.click(darAlta);
						bSubmitGuardar.click(guardar);
						bSubmitActualizar.click(actualizar);
						
						ARC.comp.buscadorClubes = ARC.comp.buscadorClubes();
						ARC.comp.buscadorClubes.load(function(){
							$("#datos_deportivos input:text").each(function(){
                                var input = $(this),
                                    inputId = input.attr('id'),
                                    resultsContainerId = input.next().attr('id'),
                                    oIds = {
                                        idCampoBuscador: inputId,
                                        idContenedorResultados: resultsContainerId
                                    };
                                
                                ARC.comp.buscadorClubes.init( ARC.serv.nombreCategoriaUsuario + "/clubs/get_datasource_buscadores_clubes", "nombre,Id", oIds);
                            });
						});
						
						// Recorte y redimension de imágenes
                        if (ARC.serv.esIntranet && formEdicionImagen.length > 0){
							// Cuando se seleccione una imagen, mostramos opción de redimensionar
							$("#foto").change(function(e){
								opcionRedimensionarFoto.removeClass("oculto");
							});
							initRecorteImagen();
                        }
					});				
				 }
			
			 return {
				 init: init
			 };
	    },
		
		//crop, panel,
		
		initRecorteImagen = function(){
			//console.log("initRecorteImagen called...es imagen recortable?");
			// Si es recortable: enlace visible    	
			if ( ! enlaceRecortarImagen.hasClass("oculto") ){
				//console.log("Sí, la imagen es recortable");
                ARC.util.yuiLoader(['container','dragdrop', 'imagecropper', 'resize'], function(){
					var panelRecorteImagen = $("#panel_recorte_imagen"),
                        imagen = $("#imagen"),
						imagenPanel = $("#imagen_panel"),
                        preview = $('#preview'),
					    bSubmitRecortarImagen = $("#b_submit_recortar_imagen");
					// globales porque sobreescribimos el objeto que crean, sino conflicto, no funciona	
					panel = new YAHOO.widget.Panel(panelRecorteImagen.attr("id"), { 
                        width: "auto",
                        modal: true, 
                        visible: false, 
                        constraintoviewport: true,
                        fixedcenter: "contained" 
                    });
                    crop = new YAHOO.widget.ImageCropper(imagenPanel.attr("id"), { 
                        ratio: true,
                        initWidth: 120,
                        initHeight: 140,
                        minWidth: 120,
                        minHeight: 140,
                        initialXY: [0, 0], 
                        keyTick: 1, 
                        shiftKeyTick: 5 
                    });
					var alinearPreview = function(){
                        var maxHeight = 754;
                        var height = (imagen.height() > maxHeight) ? maxHeight : imagen.height();
                        
                        $("#preview_top_container").css({
                            marginTop: (Math.round(height / 2) - 70) + 'px'
                        });
                    }
                    var actualizarPreview = function() { 
                        var coords = crop.getCropCoords(); 
                        var rx = 120 / coords.width;
                        var ry = 140 / coords.height;
    
                        preview.css({
                            width: Math.round(rx * imagen.width()) + 'px',
                            height: Math.round(ry * imagen.height()) + 'px',
                            marginLeft: '-' + Math.round(rx * coords.left) + 'px',
                            marginTop: '-' + Math.round(ry * coords.top) + 'px'
                        });   
                    };
					var setCropCoords = function(){
                        var coords = crop.getCropCoords();
                        $("#panelhiddeninput_width").val(coords.width);
                        $("#panelhiddeninput_height").val(coords.height);
                        $("#panelhiddeninput_top").val(coords.top);
                        $("#panelhiddeninput_left").val(coords.left);
                    };
					var cropImage = function(e){
						e.preventDefault();
						// Insertamos coordenadas en inputs ocultos del form
						setCropCoords();
			            bSubmitRecortarImagen.trigger('loadStart');

			            YAHOO.util.Connect.setForm(formEdicionImagen.attr("id"));
			            YAHOO.util.Connect.asyncRequest('POST', formEdicionImagen.attr('action'), {
			                success: function(o){
		                        var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
		                        // si todo ha ido bien, refrescamos foto
								if (respuesta.status === "success") {
									// ocultamos accion "recortar imagen"
									enlaceRecortarImagen.addClass("oculto");
									// actualizamos foto, mostramos la nueva
									actualizarFoto(respuesta.text.nombreNuevaImagen, respuesta.text.esNuevaImagenRecortable);
									// Si se recorta una foto, se redimensiona, luego ocultamos la opcion de redimensionar
									opcionRedimensionarFoto.addClass("oculto");
								}
								bSubmitRecortarImagen.trigger('loadComplete');
                                ARC.util.scrollTop();
								// ocultamos panel
								panel.hide();
		                        ARC.func.notificarUsuario(respuesta.text, respuesta.status);	
		                    },
		                    failure: function(o){
                                // ocultamos panel
                                panel.hide();
		                        ARC.comp.ajax.callbacks.failure(o);
		                    }
					    });
				    };
					
					
					// Cuando carge por completo la imagen, arrancamos (funciona con cache)
					imagen.one("load",function(e){
						//console.log("iniciando panel de edicion...");
						// Renderizamos panel (visibility hidden)
					    panel.render();
	                    panelRecorteImagen.removeClass("oculto");
						// Alineamos el preview a la mitad de la altura de la imagena recortar
	                    alinearPreview();
						// Mostramos en el preview la vista de recorte inicial
	                    actualizarPreview();
						// Evento, cuando la mascara de recorte se mueva, actualiza el preview
	                    crop.on('moveEvent', actualizarPreview);
						// Evento sobre accion "recortar imagen", muestra el panel de edicion
	                    enlaceRecortarImagen.click(function(){
	                        panel.show();
	                    });
						// evento sobre el submit del panel, recorta la imagen
	                    bSubmitRecortarImagen.click(cropImage);
					})
					.each(function(){
					    if (this.complete) {
					   	    $(this).trigger("load");
					    }	
					});
                           
                });
            } 
		},
		
		actualizarFoto = function(nombreFoto, esRecortable){
            var urlFoto = (nombreFoto.length < 3) ? ARC.serv.imgUrl + "person.gif" : ARC.serv.photoPersonaUrl + nombreFoto;
            var imagen = $("#imagen"), url, idPersona;
            // actualizamos foto con la nueva subida
            imagen.attr("src", urlFoto);
			// Limpiamos campo file de foto
			$("#foto").val("");
            // Si es recortable, pedimos html para crear nuevo panel de edicion
            if (esRecortable == 1) {
				// Id de la persona
                idPersona = $("#id_persona").val();
                url = ARC.serv.siteUrl + "admin/personas/get_panel_edicion_foto/" + nombreFoto + "/" + idPersona; 
				
                YAHOO.util.Connect.asyncRequest('GET', url, {
                    success: function(o){
						// Sustituimos panel
						formEdicionImagen.html(o.responseText);
						// Mostramos accion "recortar imagen"
                        enlaceRecortarImagen.removeClass("oculto");
                        // Inicializamos panel de edicion
                        initRecorteImagen();
                    },
                    failure: function(o){
                        ARC.comp.ajax.callbacks.failure(o);
                    }
                }); 
            }
			else{
				// Si no es recortable, ocultamos accion "recortar imagen"
				enlaceRecortarImagen.addClass("oculto");
			}     
        },
		
		addPersona = function(sType /*event type*/, aArgs /*event arguments*/){
            var oData     = aArgs[2], // object literal of data
                nombre    = oData[0],
                idPersona = oData[1],
                foto      = (oData[2].length < 3) ? ARC.serv.imgUrl + "person.gif" : ARC.serv.photoPersonaUrl + oData[2],
                revisada  = (oData[3] == 1) ? true : false,
				activa    = (oData[4] == 1) ? true : false,
                nuevaPersona, menuPropiedades, propiedades;
            
            // Creamos la persona
            nuevaPersona = template.clone()
                    .find(".foto").attr("src", foto).end()
                    .find(".num-ficha").text(idPersona).end()
                    .find(".nombre a").attr('href', ARC.serv.siteUrl + "admin/personas/ver/" + idPersona + "/1").text(nombre).end()
                    .removeClass("template");
            propiedades = $(".propiedades", nuevaPersona);      
            
            if (revisada) {
				$(".revisada", propiedades).removeClass("oculto");
			} 
			
			if (activa) {
				$(".activa", propiedades).removeClass("oculto");
			}

            // Insertamos persona en lista  
            lista.append(nuevaPersona); 
		},
		
		
		actualizar = function(e){
			var submit = $(this),
                form = submit.closest("form");
                
            e.preventDefault();
            submit.trigger('loadStart');
            // Subimos archivo a través de iframe
            YAHOO.util.Connect.setForm(form.attr("id"), true);
            YAHOO.util.Connect.asyncRequest('POST', form.attr('action') + "/actualizar/", {
                upload: function(o){
                    var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
                    submit.trigger('loadComplete');
					if (respuesta.status === "success")
					{
						actualizarFoto(respuesta.text.nombreNuevaImagen, respuesta.text.esNuevaImagenRecortable);
					}
					ARC.util.scrollTop();  
                    ARC.func.notificarUsuario(respuesta.text, respuesta.status);
                }
            });
		},
		
		guardar = function(e){
            var submit = $(this),
			    form = submit.closest("form");
                
            e.preventDefault();
            submit.trigger('loadStart');
            // Subimos archivo a través de iframe
            YAHOO.util.Connect.setForm(form.attr("id"), true);
            YAHOO.util.Connect.asyncRequest('POST', form.attr('action') + "/guardar/" + tipoPersona, {
                upload: function(o){
                    var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
                    submit.trigger('loadComplete');
					if (respuesta.text.resetForm == 1) {
						document.forms[form.attr('name')].reset();
					}
					else{
						actualizarFoto(respuesta.text.nombreNuevaImagen, respuesta.text.esNuevaImagenRecortable);
					}
					ARC.util.scrollTop();	
                    ARC.func.notificarUsuario(respuesta.text, respuesta.status);
                }
            });                           
        },
        
        darAlta = function(e){
             var submit = $(this),
			     form = submit.closest("form");
                
             e.preventDefault();
             submit.trigger('loadStart');
             // Subimos archivo a través de iframe
             YAHOO.util.Connect.setForm(form.attr("id"), true);
             YAHOO.util.Connect.asyncRequest('POST', form.attr('action') + "/dar_alta/" + tipoPersona, 
                 {
                     upload: function(o) {
                        var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
                        submit.trigger('loadComplete');
						ARC.util.scrollTop(); 
                        ARC.func.notificarUsuario(respuesta.text, respuesta.status);
						if (respuesta.status == "success") {
							ARC.util.redirect(ARC.serv.siteUrl + ARC.serv.nombreCategoriaUsuario + (ARC.serv.esIntranet ? '/personas' : '/listas'), 6000);
						}
                     }
                 }
             );
         },
		 
		 eliminarAltaIncompleta = function(e){
            var url = $(this).attr("href"),
                li  = $(this).closest("li");
            
            e.preventDefault(); 
            if (window.confirm("¿Estas seguro de que quieres eliminar esta persona en proceso de alta?")) {
                YAHOO.util.Connect.asyncRequest('GET', url, {
                    success: function(o){
                        var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
                        // Quitamos de la sección el alta pendiente eliminada
                        li.remove();
                        // Notificamos
                        ARC.func.notificarUsuario(respuesta.text, respuesta.status);
                    },
                    failure: function(o){
                        ARC.comp.ajax.callbacks.failure(o);
                    }
                });
            }
        };

	return {
		main:main(),
		deportista:deportista(),
		directivo:directivo(),
		addPersona:addPersona
	};
	
};



/*------------------------------------------------------------------------------
 * C L U B E S:
 *------------------------------------------------------------------------------
 */

ARC.clubs = function(){
	
	var phpjs = new PHP_JS(),
	    template = $(".template.clubs-main"),
        lista = $("#lista"),

	    main = function(){
	 
			var init = function(){
				// Iniciamos buscador
				ARC.comp.buscadorClubes = ARC.comp.buscadorClubes();
                ARC.comp.buscadorClubes.load(function(){
	                ARC.comp.buscadorClubes.init(
	                    "admin/clubs/get_datasource_buscador_clubes",
	                    "nombre,Id,escudo,tlf_1,activo",
						{}, 
	                    ARC.clubs.addClub
	                );
				});
			};
			
			return {
				init:init
			};   
	    },
		 
	    club = function(){
			
			var formClub = $("#form_club"), 
				bSubmitGuardar = $("#bSubmitGuardar"),
				 
				init = function(){
					ARC.util.yuiLoader(['connection','json'], function(){
				        bSubmitGuardar.click(guardar);
				    });
				},

				guardar = function(e){
					e.preventDefault();
					bSubmitGuardar.trigger('loadStart');
					// Subimos archivo a través de iframe
					YAHOO.util.Connect.setForm(formClub.attr("id"), true);
					YAHOO.util.Connect.asyncRequest('POST', formClub.attr('action'), {
						upload: function(o){
							var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
							bSubmitGuardar.trigger('loadComplete');
							if (respuesta.text.resetForm == 1) {
								document.forms[formClub.attr('name')].reset();
							}
							ARC.util.scrollTop();
							ARC.func.notificarUsuario(respuesta.text, respuesta.status);
						}
					});
				};
				
			return {
				init:init
			};	
	    },
	   
	    addClub = function(sType /*event type*/, aArgs /*event arguments*/){
            var oData     = aArgs[2], // object literal of data
                nombre    = oData[0],
				idClub    = oData[1],
                escudo    = ARC.serv.assetsUrl.replace(/net/, "img") + 'clubes/' + ((oData[2].length > 3) ? oData[2] : 'no_escudo.png'),
                tlf       = oData[3],
                activo    = (oData[4] == 1) ? true : false,
                nuevoClub, menuPropiedades, propiedades;
            
            // Creamos la persona
            nuevoClub = template.clone()
                    .find(".escudo").attr("src", escudo).end()
                    .find(".nombre a").attr('href', ARC.serv.siteUrl + "admin/clubs/ver/" + idClub).text(nombre).end()
					.find(".tlf").text(tlf).end()
					.removeClass("clubs-main")
                    .removeClass("template");
            propiedades = $(".propiedades", nuevoClub);      
			
            if (activo) {
                $(".activo", propiedades).removeClass("oculto");
            }

            // Insertamos persona en lista  
            lista.append(nuevoClub);         
        };
	
	return {
		main:main(),
		club:club(),
		addClub:addClub
	}
};





/*------------------------------------------------------------------------------
 * E Q U I P O S:
 *------------------------------------------------------------------------------
 */

ARC.equipos = function(){
    
    var phpjs = new PHP_JS(),
	    listaEquipos = $(".lista-equipos"),
		formEquipo = $("#form_equipo"),
		bSubmitGuardar = $("#b_guardar_equipo"),

        main = function(){
     
            var init = function(){
				ARC.util.yuiLoader(['connection','json'], function(){
                    listaEquipos.delegate(".eliminar", "click", eliminar);
				});
            };
            
            return {
                init:init
            };   
        },
		
		edicion = function(){
			
			var init = function(){
                // Iniciamos buscador
				if ($("#campo_buscador").length > 0) {
					ARC.comp.buscadorClubes = ARC.comp.buscadorClubes();
					ARC.comp.buscadorClubes.load(function(){
						ARC.comp.buscadorClubes.init(ARC.serv.nombreCategoriaUsuario + "/clubs/get_datasource_buscadores_clubes", "nombre,Id", {}, ARC.equipos.setIdClub);
						bSubmitGuardar.click(guardar);
					});
				}
				else{
					ARC.util.yuiLoader(['connection','json'], function(){
						bSubmitGuardar.click(guardar);
					});
				}	
            };
            
            return {
                init:init
            };
		},
		
		playoff = function(){
			
			var form = $("#form_equipos"),
			    bSubmitGuardar = $("#b_guardar_equipos"),
			    
			    init = function(){
			        ARC.util.yuiLoader(['connection','json'], function(){
                        bSubmitGuardar.click(guardarEquiposPlayoff);
                    });
			    },
				
				guardarEquiposPlayoff = function(e){
					e.preventDefault();
					bSubmitGuardar.trigger('loadStart');
					YAHOO.util.Connect.setForm(form.attr("id"));
                    YAHOO.util.Connect.asyncRequest('POST', form.attr('action'), {
                        success: function(o){
                            var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
                            bSubmitGuardar.trigger('loadComplete');
                            ARC.util.scrollTop();
                            ARC.func.notificarUsuario(respuesta.text, respuesta.status);    
                        },
                        failure: function(o){
                            ARC.comp.ajax.callbacks.failure(o);
                        }
                    });
				};
				
			return {
                init:init
            };
		},
        
		setIdClub = function(sType /*event type*/, aArgs /*event arguments*/){
            var oData     = aArgs[2], // object literal of data
                idClub    = oData[1];
				
			$("#id_club").val(idClub);	
		},
		
		guardar = function(e){
			e.preventDefault();
            bSubmitGuardar.trigger('loadStart');
            // Subimos archivo a través de iframe
            YAHOO.util.Connect.setForm(formEquipo.attr("id"), true);
            YAHOO.util.Connect.asyncRequest('POST', formEquipo.attr('action'), {
                upload: function(o){
                    var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
                    bSubmitGuardar.trigger('loadComplete');
					if (respuesta.text.resetForm == 1) {
                        document.forms[formEquipo.attr('name')].reset();
                    }
					if (typeof respuesta.text.url_imagen_patrocinadores !== "undefined") {
                        var img = $("#imagen_patrocinadores");
						if (img.length > 0){
							img.attr("src", respuesta.text.url_imagen_patrocinadores);
						}
						else{
							img = $("<img/>", {
								id: "imagen_patrocinadores",
								src: respuesta.text.url_imagen_patrocinadores
						    });
							if (img.width() > 560) {
								img.attr("width", "560px");
							}
							img.appendTo("#contenedor_imagen_patrocinadores");
						}
						$("#nombre_imagen_patrocinadores_actual").val(respuesta.text.nombre_imagen_patrocinadores);
                    }
					ARC.util.scrollTop();
                    ARC.func.notificarUsuario(respuesta.text, respuesta.status);
                }
            });
		},
		 
        eliminar =  function(e){
			var a = $(this),
			    url = a.attr("href"),
                li  = a.closest(".equipo");
            
            e.preventDefault();
			 
            if (window.confirm("¿Estas seguro de que quieres eliminar este equipo?")) {
				a.trigger('loadStart');
				YAHOO.util.Connect.asyncRequest('GET', url, {
					success: function(o){
						var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
						a.trigger('loadComplete');
						// Quitamos de la sección el alta pendiente eliminada
						li.remove();
						// Notificamos
						ARC.func.notificarUsuario(respuesta.text, respuesta.status);
					},
					failure: function(o){
						ARC.comp.ajax.callbacks.failure(o);
					}
				});
			}
		};
       
        
    
    return {
        main:main(),
		edicion:edicion(),
		playoff:playoff(),
		setIdClub:setIdClub
    }
};



/*------------------------------------------------------------------------------
 * R E G A T A S:
 *------------------------------------------------------------------------------
 */


ARC.regatas = function(){

	var phpjs = new PHP_JS(), 
		
		
		main = function(){
			
			var listaRegatas = $('#calendario'),
			    
			    init = function(){
				    ARC.util.yuiLoader(['connection','json'], function(){
	                    listaRegatas.delegate('.eliminar', 'click', eliminar);
	                    listaRegatas.delegate('.imprimir', 'click', imprimir);
	                });
			    },
				
			    eliminar = function(e){
                    var a = $(this),
					    url = a.attr('href'),
                        li = a.closest('.regata');
						
                    e.preventDefault();
                    
                    if (window.confirm('¿Estas seguro de que quieres eliminar esta regata?')) {
						a.trigger("loadStart");
						YAHOO.util.Connect.asyncRequest('GET', url, {
		                    success: function(o){
		                        var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
		                        a.trigger('loadComplete');
								if (respuesta.status == 'success'){
			                        // Quitamos la regata eliminada
			                        li.remove();
								}
								ARC.util.scrollTop();	
		                        ARC.func.notificarUsuario(respuesta.text, respuesta.status);
		                    },
		                    failure: function(o){
		                        ARC.comp.ajax.callbacks.failure(o);
		                    }
		                });       
                    }
                },
                
                imprimir = function(e){
                    var a = this;
                    	url = a.href;
                    
                    e.preventDefault();	
                    	
	                if (window.confirm('¿Quieres logos de patrocinadores en las hojas?')) {
	                	window.open(url + "/0/1", '_blank').focus();
	                }
	                else {
	                	window.open(url, '_blank').focus();
	                }
	            }; 
				
		    return {
				init:init
			};
		},
		
	    edicion = function(){
	        var formRegata = $("#form_regata"), 
                bSubmitGuardar = $("#b_guardar_regata"),
				tandasDropdown = $("#tandas"),
				callesDropdown = $("#calles"),
				listaCallesTandas = $("#lista_calles_tandas"),
				templateCallesTanda = $("#template_calles_tanda"),
				templateCalle = templateCallesTanda.find('.num-calles').children().first(),  
			    
				init = function(){
					ARC.util.yuiLoader(['connection','json'], function(){
						// Cogemos el template, lo clonamos, limpiamos, copiamos y eliminamos de la vista
						var template = templateCallesTanda.clone();
						templateCallesTanda.remove();
						templateCallesTanda = template.removeAttr('id').removeAttr('class');
						
						// Evento change cuando cambia el numero max de calles
                        callesDropdown.change(updateNumCallesDisponibles);
						
						// Evento change cuando cambia el numero de tandas
						tandasDropdown.change(updateListaCallesTandas);
						
						// Evento change para selects de num de calles
						listaCallesTandas.delegate('select', 'change', function(e){
							var select = $(this),
							    numCallesSeleccionado = this.value,
							    numMaxCalles = callesDropdown.val(),
								checkboxes, checkboxesSeleccionados;	

							if (numCallesSeleccionado <= numMaxCalles) {
								checkboxes = select.next().children();
								checkboxesSeleccionados = checkboxes.find(':checked').length;
								
								if (checkboxesSeleccionados >= numCallesSeleccionado) {
									checkboxes.slice(numCallesSeleccionado).each(function(){
	                                    $(this).find('input:checkbox').removeAttr('checked');
	                                });
								}
								else {
									checkboxes.slice(checkboxesSeleccionados - 1, numCallesSeleccionado).each(function(){
                                        $(this).find('input:checkbox').attr('checked', 'checked');
                                    });
								}
							}
							
							if (numCallesSeleccionado > numMaxCalles) {
                                this.value = numMaxCalles;
                            }
							else{
								this.value = numCallesSeleccionado;
							}	
						});
						
						// Evento click para checkboxes de calle
						listaCallesTandas.delegate('input:checkbox', 'click', function(e){
							var checkbox = $(this),
							    checkboxSeleccionados = checkbox.closest('.num-calles').find(':checked').length,
							    numCallesTanda = checkbox.closest('li').find('select').val();
							
							if ( checkbox.is(':not(:checked)') && checkboxSeleccionados + 1 == numCallesTanda){
								e.preventDefault();
							}	
						});
						
						// Acción "Cambiar" archivo
			            formRegata.find(".archivo a").click(function(e){
							e.preventDefault();
			                $(this).parent().addClass('oculto').next().removeClass("oculto");
			            });
			
			            // Al elegir un archivo, mostramos enlace "Cancelar"
			            formRegata.find("input:file").change(function(){
			                $(this).next().removeClass("oculto");
			            })
			
			            // Al pinchar en "Cancelar" un archivo:
			            formRegata.find(".seleccion-archivo a").click(function(e){
			                var a = $(this),
			                    fileInput = a.prev(),
			                    parent = a.parent();
							e.preventDefault();	
			                // ocultamos el enlace "cancelar"
			                a.addClass("oculto");
			                // vaciamos el valor del input
			                fileInput.val('');
			                // Si ya existía un archivo en el server, lo mostramos
			                if ( parent.hasClass("full") ) {
			                    parent.addClass("oculto").prev().removeClass("oculto");
			                }
							
			            });

	                    // Envio de formulario
	                    bSubmitGuardar.click(guardar);
		            });
				},
				
				guardar = function(e){
					var submit = bSubmitGuardar,
					    form = formRegata;
						
					e.preventDefault();
					submit.trigger('loadStart');	
					// Subimos archivos a través de iframe
		            YAHOO.util.Connect.setForm(form.attr("id"), true);
		            YAHOO.util.Connect.asyncRequest('POST', form.attr('action'), {
		                upload: function(o){
		                    var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
		                    submit.trigger('loadComplete');
		                    ARC.util.scrollTop();  
		                    ARC.func.notificarUsuario(respuesta.text, respuesta.status);
		                }
		            });
				},
				
				updateNumCallesDisponibles = function(e){
					var numCallesSeleccionado = this.value,
					    listaCallesDisponiblesTemplate = templateCallesTanda.find('.num-calles'),
						numCallesDisponiblesMostradasTemplate = listaCallesDisponiblesTemplate.children().length,
						docFrag = document.createDocumentFragment();
					
					// Actualizamos vista  
					listaCallesTandas.find('select').each(function(){
						var listaCallesDisponibles = $(this).next(),
						    numCallesDisponiblesMostradas = listaCallesDisponibles.children().length;
						
						this.value = numCallesSeleccionado;
						
						if (numCallesDisponiblesMostradas == numCallesSeleccionado){
							return;
						}
						else if (numCallesDisponiblesMostradas < numCallesSeleccionado){
							diff = numCallesSeleccionado - numCallesDisponiblesMostradas;
	                        for (var i = 1; i <= diff; i++) {
								docFrag.appendChild(
								    templateCalle.clone()
								        .find('span').text(numCallesDisponiblesMostradas + i).end()
										.find('input:checkbox').val(numCallesDisponiblesMostradas + i).end()
										[0]
								);
	                        }
							listaCallesDisponibles.append(docFrag);
							docFrag.innerHTML = '';
						}
						else {
                            diff = numCallesDisponiblesMostradas - numCallesSeleccionado;
                            for (var i = 0; i < diff; i++) {
                                listaCallesDisponibles.children().last().remove();
                            }
                        }  
					});
					
					// Actualizamos template
					templateCallesTanda.find('select').children().each(function(){
						if (this.value == numCallesSeleccionado){
							this.setAttribute('selected','selected');
						}
						else{
							this.removeAttribute('selected');
						}
					});
					
					if (numCallesDisponiblesMostradasTemplate == numCallesSeleccionado){
                        return;
                    }
                    else if (numCallesDisponiblesMostradasTemplate < numCallesSeleccionado){
                        diff = numCallesSeleccionado - numCallesDisponiblesMostradasTemplate;
                        for (var i = 1; i <= diff; i++) {
							docFrag.appendChild(
							    templateCalle.clone()
								    .find('span').text(numCallesDisponiblesMostradasTemplate + i).end()
									.find('input:checkbox').val(numCallesDisponiblesMostradasTemplate + i).end()
									[0]
						    );
                        }
						listaCallesDisponiblesTemplate.append(docFrag);
                    }
                    else {
                        diff = numCallesDisponiblesMostradasTemplate - numCallesSeleccionado;
                        for (var i = 0; i < diff; i++) {
                            listaCallesDisponiblesTemplate.children().last().remove();
                        }
                    }  
				},
				
				updateListaCallesTandas = function(e){
					var numTandasSeleccionado = this.value,
					    numTandasMostradas = listaCallesTandas.find("li").length,
						docFrag = document.createDocumentFragment(),
						diff; 
						
					if (numTandasSeleccionado == numTandasMostradas) {
						return;
					}
					else if (numTandasSeleccionado > numTandasMostradas) {
						diff = numTandasSeleccionado - numTandasMostradas;
						for (var i = 0; i < diff; i++) {
							docFrag.appendChild(templateCallesTanda.clone()[0]);
						}
						listaCallesTandas.append(docFrag);
					}
					else{
						diff = numTandasMostradas - numTandasSeleccionado;
						for (var i = 0; i < diff; i++) {
                            listaCallesTandas.children().last().remove();
                        }
					}	
				};

			return {
				init:init
			};
		},		
	   
	    hojas = function(){
	        
			var enlaceGuardar = $("#guardar_hoja"),
			    enlaceEditar = $("#editar_hoja"),
                enlaceCancelar = $("#terminar_edicion"),
                enlaceImprimir = $("#imprimir_hoja"),
				loader = $("#loader"),
                nodoClubesGrupo = $("#clubes_grupo"),
                nodoPersonasSeleccionables = $("#personas_seleccionables"),
			    personasDD = $(".persona-seleccionable.deportista, .persona-seleccionable.directivo"),
	            DDs = [], // draggable objects
	
		        init = function() {

					ARC.util.yuiLoader(["connection","json"], function(){ 
			            enlaceEditar.click(function(e){
							toggleMenuEdicion(e);
			                nodoClubesGrupo.fadeOut("fast", function(){
			                    nodoPersonasSeleccionables.fadeIn("fast", function(){
			                        initDD(); 
			                    });
			                });
			            });
						
						enlaceGuardar.click(guardar);
						
						enlaceCancelar.click(function(e){
	                        toggleMenuEdicion(e);
	                        endDD();
	                        nodoPersonasSeleccionables.fadeOut("fast", function() {
	                            nodoClubesGrupo.fadeIn("fast");
	                        });
	                    });
						
						enlaceImprimir.click(imprimir);
					});
		        },
				
				toggleMenuEdicion = function(e){
		            $(e.target).parent().siblings(":not(.loader)").andSelf().toggle();
		        },

		        guardar = function(e) {
		            var formRegata = ARC.util.eById("form_hoja_regata");
					
					e.preventDefault();
					enlaceGuardar.trigger('loadStart');
		            YAHOO.util.Connect.setForm(formRegata.id);
		            YAHOO.util.Connect.asyncRequest('POST', formRegata.action,
		                {
		                    success: function(o) {
		                        var respuesta = YAHOO.lang.JSON.parse(phpjs.htmlspecialchars_decode(o.responseText));
								ARC.func.notificarUsuario(respuesta.text, respuesta.status);
								if (respuesta.status == 'error') {
									enlaceGuardar.parent().show();
									enlaceCancelar.parent().show();
									loader.parent().hide();
								}
								if (respuesta.status == 'success'){
									enlaceGuardar.trigger('loadComplete');
	                                endDD();
	                                nodoPersonasSeleccionables.fadeOut("fast");
	                                nodoClubesGrupo.fadeIn("fast");
								}   
		                    }
		                }
		            );
		        },
		        
		        imprimir = function(e){
                    var a = this;
                    	url = a.href;
                    
                    e.preventDefault();	
                    	
	                if (window.confirm('¿Quieres logos de patrocinadores en la hoja?')) {
	                	window.open(url + "/1", '_blank').focus();
	                }
	                else {
	                	window.open(url, '_blank').focus();
	                }
	            },

		        initDD = function() {
		            // Cargar dependencias
		            ARC.util.yuiLoader(["dragdrop","animation"], function(){
		
		                // Controlamos si ya hemos iniciado el DD, si lo hemos hecho,
		                // desbloqueamos los draggables
		                var nDDs = DDs.length;
		
		                if (nDDs > 0) {
		                    for (var i = nDDs - 1; i >= 0; i--) {
		                        // desbloqueamos los draggables
		                        DDs[i].unlock();
		                    }
		                    // Cambiamos el cursor
		                    personasDD.addClass("draggable");
		                    // salimos
		                    return;
		                }
		                // Fin control
		
		
		                // Iniciamos DD
		                var hojaInscripcion = $("#hoja_inscripcion"),
		                    personasInscritas = hojaInscripcion.find(".persona-seleccionable"),
		                    DDM = YAHOO.util.DragDropMgr;
		
		                
						// DD TARGETS
						
		                // Targets del menu
		                var menuDirectivos = new YAHOO.util.DDTarget("menu_directivos", "directivos"),
		                    menuDeportistas = new YAHOO.util.DDTarget("menu_deportistas", "deportistas");
		                
						// Targets Hoja
		                new YAHOO.util.DDTarget("d", "delegado"); // Delegado
		                
						// Suplentes
		                hojaInscripcion.find(".persona.suplente").each(function(){
		                    var id = this.id;
							
		                    new YAHOO.util.DDTarget(id, "suplentes");
		                });
		                
						// Remeros en trainera
		                hojaInscripcion.find(".persona.remero").each(function(){
		                    var id = this.id;
		
		                    if ( ! $(this).hasClass("patron") ) {
		                        new YAHOO.util.DDTarget(id, "remeros");
		                    } else {
		                        // Patron
		                        new YAHOO.util.DDTarget(id, "patron");
		                    }
		
		                });
		
		
		                // DD DRAGABLES
						
		                personasDD.each(function(){
		                    var el = $(this),
							    id = this.id, //console.log(id);
		                        dd = new YAHOO.util.DD(id);
								
		                    // Añadimos el draggable a la lista para poder bloquearlos luego
		                    DDs.push(dd);
		                    // Indicamos que los elementos draggable no son targets de otros draggable
		                    dd.isTarget = false;
		
		                    if (el.hasClass("directivo")) {
		                        dd.addToGroup("directivos"); // Menu
		                        dd.addToGroup("delegado"); // Hoja
		                        dd.menu = menuDirectivos;
		                    }
		
		                    if (el.hasClass("deportista")) {
		                        dd.addToGroup("deportistas"); // Menu
		                        if ( ! el.hasClass("patron") ) {
		                            dd.addToGroup("remeros");// Hoja
		                        }
		                        dd.addToGroup("suplentes");// Hoja
		                        dd.addToGroup("patron");// Hoja
		                        dd.menu = menuDeportistas;
		                    }
		
		
		                    // CARGA INICIAL DE LA HOJA CON PERSONAS/FICHAS YA GUARDADAS:
		                    // Debemos introducir en la memoria de cada casilla y ficha sus referencias
		                    if (personasInscritas.length > 0) {
		                        personasInscritas.each(function() {
									var el = $(this), idCasilla, oCasilla;
									
		                            if (this.id == id) {
		                                idCasilla = el.parent().attr('id'); //console.log(idCasilla);
		                                oCasilla = DDM.getDDById(idCasilla);
		
		                                dd.casilla = oCasilla;
		                                oCasilla.ficha = dd;
		
		                                return false;
		                            }
		                        });
		                    }
		                    
		                    // EVENTOS
		                    // e: event object
		                    // id: (string) id del target
		                    dd.onMouseDown = function(e) {
		                         // Nodo en el DOM del elemento draggable
		                         var el = this.getEl();
		                         // Guardamos en la instancia draggable los Targets relacionados / available con nuestra ficha draggable
		                         this.targetsValidos = DDM.getRelated(this, true);
		                         // Guardamos en la instancia draggable las coordenadas de la posición inicial
		                         this.posicionInicial = YAHOO.util.Dom.getXY(el);
		                         // Hacemos highlight de los targets válidos para esa ficha draggable que no contengan ya una ficha
								 for (var i=0, numTargetsValidos = this.targetsValidos.length; i < numTargetsValidos; i++){
								     ARC.util.eById(this.targetsValidos[i].id).className += ' highlight';
		                         }
		                    };
		
		                    dd.onDragDrop = function(e, id) {
		
		                        var oCasilla = DDM.getDDById(id), // objeto DDT (target) de la casilla en la que hemos dejado caer una ficha
		                            nCasilla = $("#" + id), // Nodo en el DOM de la casilla (target)
		                            inputCasilla = nCasilla.find('input'),
		                            numFichaCasilla = inputCasilla.val(),
									nFicha = this.getEl(), // Nodo en el DOM de la ficha (draggable)
		                            numFicha = $(".num-ficha", nFicha).text(), // Numero ficha persona
		                            casillaOrigen, inputCasillaOrigen, nFichaResidente, numFichaResidente;
		
		                        // Si existe una ficha previamente en esta casilla
		                        if (oCasilla.ficha) {
		                            //console.log("Existe ficha en esta casilla");
		                            // Si la ficha que había antes es la misma que la nueva, no hagas nada más
		                            if (oCasilla.ficha === this) {
		                                //console.log("Misma Ficha");
		                                this.goToPosicionInicial();
		                                return;
		                            }
		                            // Comprobamos si la ficha viene directamente del menú o de otra casilla
		                            if (this.casilla) {
		                                //console.log("La ficha viene de otra casilla");
		                                casillaOrigen = $("#" + this.casilla.id);
										inputCasillaOrigen = casillaOrigen.find('input');
		                                nFichaResidente = oCasilla.ficha.getEl();
		                                numFichaResidente = $(".num-ficha", nFichaResidente).text();
		                                // Si la ficha insertada previamente en esta casilla puede ser insertada en la casilla
		                                // de la que viene esta nueva ficha (DD), hacemos intercambio de casillas
		                                // Params: ficha que reside en esta casilla, casilla de la ficha DD que quiere insertarse
		                                if ( DDM.isLegalTarget(oCasilla.ficha , this.casilla) ) {
		                                    //console.log("Intercambiamos las casillas de las fichas");
		                                    // Movemos la ficha residente a la nueva casilla de destino (casilla de donde viene este dd)
		                                    casillaOrigen.append(nFichaResidente);
		                                    // Actualizamos numero de ficha en casilla origen
		                                    inputCasillaOrigen.val(numFichaResidente);
		                                    // Guardamos (actualizamos) en el objeto DDT de la nueva Casilla una referencia a la ficha movida que la ocupará
		                                    this.casilla.ficha = oCasilla.ficha;
		                                    // Guardamos (actualizamos) en la ficha movida una ref a la nueva casilla que ocupará
		                                    oCasilla.ficha.casilla = this.casilla;
		                                } else {
		                                    //console.log("Movemos la ficha residente a su menu");
		                                    // Movemos la ficha residente al menu del que provenía
		                                    $("#" + oCasilla.ficha.menu.id).append(nFichaResidente);
		                                    // Borramos de la casilla el numero de ficha
		                                    inputCasillaOrigen.val('');
		                                    // Eliminamos de la memoria de la casilla la ficha que hospedaba.
		                                    this.casilla.ficha = null;
		                                    // Eliminamos de la memoria de la ficha movida la casilla en la que ha estado.
		                                    oCasilla.ficha.casilla = null;
		                                }
		                            } else { // La ficha viene del menu de fichas
		                                //console.log("La ficha viene de un menu -> movemos la ficha residente a su menu");
		                                // Movemos la ficha residente al menu del que provenía
		                                $("#" + oCasilla.ficha.menu.id).append(oCasilla.ficha.getEl());
		                                // Eliminamos de la memoria de la ficha movida la casilla en la que ha estado.
		                                oCasilla.ficha.casilla = null;
		                            }
		                        }
		                        else {
		                            // Casilla vacía
		                            //console.log("Casilla vacía");
		                            // Si una ficha se mueve de una casilla a otra vacía, debe eliminar su huella en la que deja libre
		                            if (this.casilla) {
		                                //console.log("la ficha viene de otra casilla");
		                                casillaOrigen = $("#" + this.casilla.id);
		                                // Borramos de la casilla el numero de ficha
		                                casillaOrigen.find('input').val('');
		                                // Eliminamos de la memoria de la casilla la ficha que tenía.
		                                this.casilla.ficha = null;
		                                // Eliminamos de la memoria de la ficha la casilla en la que estaba
		                                // Importante cuando insertamos de una casilla al menu
		                                this.casilla = null;
		                            } else {
		                                if (id == "menu_directivos" || id == "menu_deportistas") {
		                                    //console.log("Ficha del menu al menu");
		                                    this.goToPosicionInicial();
		                                    return;
		                                }
		                            }
		                        }
		                        //console.log(" ---------------------- Insertamos ficha en casilla ----------------------");
		                        // Insertamos la ficha en la casilla
		                        nCasilla.append(nFicha);
		                        // Quitamos estilos de posicionamiento en la página
		                        nFicha.removeAttribute("style");
		                        // Asignamos al input el numero de ficha de la persona
		                        inputCasilla.val(numFicha);
		                        // Si la casilla objetivo no es alguno de los menus de fichas, guardamos/actualizamos referencias
		                        if (id != "menu_directivos" && id != "menu_deportistas") {
		                            // Guardamos en la casilla (objeto DDT) una referencia a la ficha que hemos insertado
		                            oCasilla.ficha = this;
		                            // Guardamos en nuestra ficha draggable una referencia a la casilla que hemos ocupado
		                            this.casilla = oCasilla;
		                        }
		
		                    };
		
		                    dd.onInvalidDrop = function(e) {
		                         this.goToPosicionInicial();
		                    }
		
		                    dd.onMouseUp = function(e) {
								 var target, classNameArray;
		                         // Quitamos highlight de los targets válidos para esa ficha draggable
		                         for (var i=0, numTargetsValidos = this.targetsValidos.length; i < numTargetsValidos; i++){
                                     target = ARC.util.eById(this.targetsValidos[i].id);
									 classNameArray = target.className.split(' ');
									 classNameArray.splice(classNameArray.indexOf('highlight'), 1);
									 target.className = classNameArray.join(' ');
                                 }
		                    };
		
		                    dd.goToPosicionInicial = function() {
		                        var ficha = this.getDragEl();
		
		                        new YAHOO.util.Motion(
		                            ficha, {
		                                points: {
		                                    to: this.posicionInicial
		                                }
		                            },
		                            0.2,
		                            YAHOO.util.Easing.easeOut
		                        ).animate();
		                    };
		                });
		                // Cambiamos el cursor
		                personasDD.addClass("draggable");
		            });
	            },
	
		        endDD = function(){
		            var nDDs = DDs.length;
		            for (var i = nDDs - 1; i >= 0; i--) {
		                DDs[i].lock();
		            }
		            // Cambiamos el cursor
		            personasDD.removeClass("draggable");
		        };
				
				
				return {
					init:init
				};
        };    
		
	return {
		main:main(),
		edicion:edicion(),
		hojas:hojas()
	}; 

};


/*------------------------------------------------------------------------------
 * FRONT CONTROLLER
 *------------------------------------------------------------------------------
 */


ARC.init = function(){

	var bodyId = document.body.id, section = bodyId.split('_')[0];
	
	switch (section) {
	
		case "login":
			ARC.login = ARC.login();
			ARC.login.init();
			break;
			
		case "mensajes":
			ARC.mensajes = ARC.mensajes();
			switch (bodyId) {
				case "mensajes_main":
					ARC.mensajes.main.init();
					break;
				case "mensajes_conversacion":
					ARC.mensajes.conversacion.init();
					break;
			}
			break;
			
		case "listas":
			ARC.listas = ARC.listas();
			switch (bodyId) {
				case "listas_editable":
					ARC.listas.editable.init();
					break;
				case "listas_no_editable":
				case "listas_no_revisable_cruzada":
					ARC.listas.noEditable.init();
					break;
				case "listas_revisable_cruzada":
					ARC.listas.revisable.init();
					break;
			}
			break;
			
		case "regatas":
			ARC.regatas = ARC.regatas();
			switch (bodyId) {
				case "regatas_main":
					ARC.regatas.main.init();
					break;
				case "regatas_nueva":
				case "regatas_edicion":
					ARC.regatas.edicion.init();
					break;
				case "regatas_hoja_editable":
				    ARC.regatas.hojas.init();
					break;	
			}
			break;	
			
		case "personas":
			ARC.personas = ARC.personas();
			switch (bodyId) {
				case "personas_main":
					ARC.personas.main.init();
					break;
				case "personas_nueva_ficha":
				case "personas_edicion_ficha":
					ARC.personas.deportista.init();
					break;
				case "personas_nueva_ficha_directivo":
				case "personas_edicion_ficha_directivo":
					ARC.personas.directivo.init();
					break;
			}
			break;
			
		case "clubs":
			ARC.clubs = ARC.clubs();
			switch (bodyId) {
				case "clubs_main":
					ARC.clubs.main.init();
					break;
				case "clubs_nueva_ficha":
				case "clubs_edicion_ficha":
					ARC.clubs.club.init();
					break;
			}
			break;
			
		case "documentos":
			ARC.documentos = ARC.documentos();
			switch (bodyId) {
				case "documentos_main":
					ARC.documentos.init();
					break;
			}
			break;
			
		case "equipos":
			ARC.equipos = ARC.equipos();
			switch (bodyId) {
				case "equipos_main":
					ARC.equipos.main.init();
					break;
				case "equipos_nuevo":
				case "equipos_edicion":
					ARC.equipos.edicion.init();
					break;
				case "equipos_playoff":
					ARC.equipos.playoff.init();
					break;
			}
			break;
			
		case "temporadas":
			ARC.temporadas = ARC.temporadas();
			switch (bodyId) {
				case "temporadas_main":
					ARC.temporadas.init();
					break;
			}
			break;
	}
		
};	
	



$(ARC.init);

