

/**
 * Javascript de la administración
 *
 * @category javascript
 * @copyright Copyright © 2010, BITTIA - Grupo BITTIA
 * @filesource
 * @package javascript
 * @version 2.0 2010/03/04
 */

/**
 * Ruta web de instalación. Constante
 */
var INSTALATION_DIR = $('link[rel="index"]').attr('href');
var selected_days = new Array(0);
var tp_loaded = false;


/**
 * Mostrar captura de un video
 */
function resultado_snapshot_video(imagen, error)
{
	Boxy.alert('<img src="'+INSTALATION_DIR+'/uploads/photos/99/'+imagen+'" width="300" />', null,
	{
		title: 'Capura de video'
	});
}


/**
 * Mostrar símbolo de carga 
 * @param e object Elemento al que superponer el cargador
 * @param opac floor Opacidad a aplicar. Por defecto 0.5
 * @param type string Tipo de posición de la capa, (absolute | fixed). Por defecto absolute
 */
function loading(e, opac, type)
{
	var opac = opac || '0.5';
	var lwidth = '100%';
	var lheight = $(window).height();
	var container = 'body';
	var ltop = lleft = 0;
	var lposition = 'fixed';
	//Ventana contenedora
	if(e == 'parent')//Contenedor
	{
		lwidth = '100%';
		lheight = '100%';
		container = window.parent.document.getElementById('content');		
	}
	else if(type == 'fixed')//Loading fijo
	{
		lwidth = $(e).outerWidth(true);
		lheight = $(e).outerHeight(true);
		container = e;
		ltop = $(e).offset().top;
		lleft = $(e).offset().left;
		lposition = 'fixed';
	}
	else if(e)//Posición absoluta
	{
		lwidth = $(e).outerWidth(false);
		lheight = $(e).outerHeight(false);
		container = e;
		ltop = (parseInt($(e).css('top')) > $(e).offset().top)? parseInt($(e).css('top')) : $(e).offset().top;
		lleft = (parseInt($(e).css('left')) > $(e).offset().left)? parseInt($(e).css('left')) : $(e).offset().left;
		lposition = 'absolute';
	}
	else//Toda la ventana
	{
		lwidth = '100%';
		lheight = $(window).height();
		container = window.document.getElementById('content');
	}

	//Crea loading si no existe
	if($('#loading').length < 1)
	{
		$('body').append('<div id="loading"></div>');
		$('#loading').css({opacity: opac, left: lleft, top: ltop, width: lwidth, height: lheight, position: lposition});
	}
	return true;
}
function loadingEnd()
{
	while($('#loading').length > 0)
	{
		$('#loading').remove();
	}
	return true;
}


/**
 * Remarcar un elemento
 */
function highlight(el)
{
	//Color de fondo original
	var aux_bg = $(el).css('backgroundColor');

	//Degradado de resaltado a color original
	$(el).css({'backgroundColor': '#FBFB8B'}).animate({'backgroundColor': aux_bg}, 'normal', function()
	{
		$(this).css({'backgroundColor': ''});
	});
}


/**
 * Cargar interFace con parámetros
 */
function loadIf()
{
	/**
	 * Elementos de interface
	 */
	$("[rel=interface]").interFace();

	/**
	 * Borrar valor en los campos de buscar
	 */
	$('#searcher input').live('focus', function(event)
	{
		$('#searcher input').val('');
	});
	
	/**
	 * Eventos de click generales
	 */
	$('body').die('click').live('click', function(event)
	{
		var $el = $(event.target);

		//Orden de los registros de una sección desde la página
		if($el.hasClass('order'))
		{
			event.preventDefault();
			loading();
			//Cambia el contenido viejo por el nuevo y activa javascript
			$('#content').load($(event.target).attr('href')+'show_full/ #content > *', {}, function()
			{
				loadingEnd();
			});
		}
		//Posición arriba y abajo por ajax
		else if($el.closest('.action_up, .action_down').length > 0)
		{
			event.preventDefault();
			var rel = $($el.closest('li[rel]')).attr('rel');//li movido			
			//Cambia el contenido viejo por el nuevo y activa javascript
			$('#content').load($el.attr('href')+'show_full/ #content > *', {}, function()
			{
				//Ocultar cartel
				$('div.info').hide();
				//Ocultar actions
				$('#show li[rel!="'+rel+'"] .row_actions').css({'visibility':'hidden'});
				//Remarcar fila movida
				highlight('#show li[rel="'+rel+'"]');			
			});
		}
		//Avisar de página en edición
		else if($el.closest('#header, #footer').length > 0 && $('#content[class!="boxy-content"] #add_edit').length > 0)
		{
			event.preventDefault();
			if(confirm('¿Está seguro de que quiere salir de esta página?\n\n'+
				'Tienes cambios sin guardar. Haz clic ahora en "Cancelar" y después en "Guardar" para guardarlos. Haz clic ahora en "Aceptar" para descartarlos.\n\n'+
				'Pulse Aceptar para continuar, o Cancelar para permanecer en la página actual.'))
			{
				document.location.href = $el.attr('href');
			}
		}
		//Enlaces externos
		else if($.inArray($el.closest("a").attr('rel'), ['nofollow', 'external']) > 0 || $el.closest("a").hasClass('view'))
		{
			event.preventDefault();
			window.open($el.closest("a").attr("href"));
		}
		//Password generado automáticamente
		else if($el.closest('#add_edit .password .random').length > 0)
		{
			event.preventDefault();
			var pass = $.password(10);
			alert('Contraseña: '+pass);
			$('#add_edit .password input').val(pass);
		}
	});

	/**
	 * Iconos de acciones ocultos, mostrar al hover
	 */
	$('#show .row_actions').css({'visibility':'hidden'});
	$('#show li[rel]').live('mouseenter', function()
	{
		$('.row_actions:first', this).css({'visibility':'visible'});
	});
	$('#show li[rel]').live('mouseleave', function()
	{
		$('.row_actions').css({'visibility':'hidden'});
	});

	/**
	 * Campos Edit Inline
	 */
	$('.edit_inline').editable(INSTALATION_DIR+'/admin/ajax/ajax_actions.php',
	{
		submitdata : function()//Parámetros a enviar
		{
			var parts = $(this).parent().attr('class').split(' ');
			return {
				action : 'inline_edit',
				input : parts[0],
				type : parts[1],
				id : $(this).parents('li[rel]').attr('rel')
			};
		},
		cancel : lng.cancel,
		cssclass : 'edit_inline_form',
		height: 'none',
		indicator : '<img src="'+INSTALATION_DIR+'/img/admin/spinner.gif"/>',
		onblur : 'ignore',
		placeholder : '',
		submit: lng.submit_data,
		tooltip : lng.click_edit,
		width : 'none'
	}).hover(function()//Hover, color de fondo
	{
		if($(this).children().length == 0)
			$(this).addClass('active');
	}, function()
	{
		$(this).removeClass('active');
		$('.edit_inline_form').css({'background-color':'transparent'});
	});
	//Editar elemento inline tipo bool
	$('.edit_inline_bool').live('click', function()
	{
		var eib_element = $(this);//Elemento
		//No está editándose
		if( ! eib_element.hasClass('editing'))
		{
			eib_element.addClass('editing');//Ahora sí
			
			//Click, cambiar a siguiente valor y enviar a db
			var posible_values = JSON.parse($(this).attr('rel'));//Posibles valores
			
			//Índice del actual (atributo rev)
			var selected = eib_element.attr('rev');
			var position = $.inArray(selected, posible_values);
			if(position >= 0)//Existe elemento, índice del siguiente (+1 o 1º)
			{
				position = (position+1 >= posible_values.length)? 0 : ++position;//Siguiente elemento o 1º si termina array
			}
			
			//Enviar a db
			$.post(INSTALATION_DIR+'/admin/ajax/ajax_actions.php',
			{
				action : 'inline_edit',
				input : $(this).parent().attr('class').split(' ')[0],
				type : 'bool',
				id : eib_element.parents('li[rel]').attr('rel'),
				value : posible_values[position]
			},
			function(data)
			{
				//Enviado, cambiar estilo elemento, cambiar dato mostrado, quitar cargador
				eib_element.removeClass('editing').removeClass(selected).addClass(posible_values[position]).attr('rev', posible_values[position]).text(data);
			});
		}
	});
	$('.edit_inline_bool').hover(function()//Hover, color de fondo
	{
		$(this).addClass('active').attr('title', lng.click_edit);
	}, function()
	{
		$(this).removeClass('active');
	});

	/**
	 * Árbol de elementos
	 */
	if($('#tree_elements').length > 0)
	{
		var simpleTree = $('.simpleTree');
		var simpleTreeCollection = simpleTree.simpleTree(
		{
			animate: false,
			autoclose: false,
			docToFolderConvert: true
		});

		//Mostrar acciones al hover en árbol
		$('li[rev]', simpleTree).live('mouseenter', function(event)
		{
			var class_item = $(event.target).attr('class');
			if(class_item != 'line' && class_item != 'line-last' && class_item != 'line-over')
			{
				$('.row_actions:first', this).css({'visibility': 'visible', 'display': 'block'});
			}	
		});
		$('li[rev]', simpleTree).live('mouseleave', function()
		{
			$('.row_actions').css({'visibility': 'hidden', 'display': 'none'});
		});
		
		//Guardar orden de elementos
		$('#order_save').bind('click', function(event)
		{
			event.preventDefault();
			loading('#content');
			//Elementos existentes
			var items = new Array();
			var items_total = $('ul[class!="row_actions"] > li[id]', simpleTree).length;
			//Recorrer li
			$('.simpleTree ul[class!="row_actions"] > li[id]').each(function(i, el)
			{
				items[i] = new Array($(el).attr('id'), $($(el).parents('li')).attr('id'), items_total--);
			});
			//Enviar array
			$.post(INSTALATION_DIR+'/admin/ajax/ajax_actions.php',
			{
				'action': 'tree_save',
				'section': $('body').attr('id'),
				'items': JSON.stringify(items)
			}, function(response, data)
			{
				loadingEnd();
				if(data == '"ok"')
				{
					alert('Posición guardada');
				}
			});
		});
		
		//Mostrar todos
		$('.view_all').bind('click', function(event)
		{
			event.preventDefault();
			//ul ocultos sin class mostrar
			$('ul:hidden', simpleTree).css({'display': 'block'});
			//Cambiar folder-close por folder-open
			$('.folder-close', simpleTree).removeClass('folder-close').addClass('folder-open');
			$('.folder-close-last', simpleTree).removeClass('folder-close-last').addClass('folder-open-last');
		});
		//Ocultar todos
		$('.hide_all').bind('click', function(event)
		{
			event.preventDefault();
			//ul ocultos sin class mostrar
			$('.root ul ul:visible[class!="row_actions"]', simpleTree).css({'display': 'none'});
			//Cambiar folder-close por folder-open
			$('.folder-open', simpleTree).removeClass('folder-open').addClass('folder-close');
			$('.folder-open-last', simpleTree).removeClass('folder-open-last').addClass('folder-close-last');
		});
	}

	/**
	 * Cargar tinymce
	 */
	if($('.tinymce:visible').length > 0)
	{
		$('textarea.tinymce:visible').tinymce(
		{
			script_url : INSTALATION_DIR+'/js/tiny_mce/tiny_mce.js',
			language : "es",
			theme : "advanced",
			button_tile_map : true,
			convert_fonts_to_spans : true,
			fix_list_elements : true,
			fix_table_elements : true,
			fix_nesting : true,
			plugins : "style,adminimage,adminmedia,media,advlink,inlinepopups,paste,xhtmlxtras",
			theme_advanced_buttons1 : "pastetext,undo,redo,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,bullist,numlist,outdent,indent,styleselect,formatselect,forecolor,|,link,unlink,|,adminmedia,|,sub,sup,abbr,acronym,|,removeformat,code",
			theme_advanced_buttons2 : "",
			theme_advanced_buttons3 : "",
			theme_advanced_toolbar_location : "top",
			theme_advanced_toolbar_align : "left",
			theme_advanced_statusbar_location : "bottom",
			theme_advanced_resizing : true,
			content_css : INSTALATION_DIR+"/css/reset.css,"+INSTALATION_DIR+"/css/styles.css",
			theme_advanced_styles : "Alineación derecha=right;Alineación izquierda=left,Introducción=intro",
			theme_advanced_blockformats : "p,h3,h4,h5,h6,blockquote,code,address,pre",
			width: "100%",
			theme_advanced_resize_horizontal : false,
			relative_urls : false,
			document_base_url : INSTALATION_DIR,
			inlinepopups_skin : 'admin',
			setup : function(ed) //Cargar mapa google si hay
			{
				ed.onInit.add(function(ed)
				{
					if($('#map_canvas').length > 0)
					{
						init_gmap();
					}
				});
			}
		});
	}
	//Cargar tinymce_table
	if($('.tinymce_table:visible').length > 0)
	{
		$('textarea.tinymce_table:visible').tinymce(
		{
			script_url : INSTALATION_DIR+'/js/tiny_mce/tiny_mce.js',
			language : "es",
			theme : "advanced",
			button_tile_map : true,
			convert_fonts_to_spans : true,
			fix_list_elements : true,
			fix_table_elements : true,
			apply_source_formatting : false,
			plugins : "style,adminimage,adminmedia,media,advlink,inlinepopups,paste,xhtmlxtras,table",
			//Theme options
			theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,|,forecolor,backcolor,|,link,unlink,anchor,|,charmap,adminmedia,image,|,styleprops",
			theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,bullist,numlist,|,outdent,indent,blockquote,|,sub,sup,|,undo,redo,|,code,cleanup,removeformat,|,cite,abbr,acronym,del,ins,attribs",
			theme_advanced_buttons3 : "tablecontrols",
			theme_advanced_toolbar_location : "top",
			theme_advanced_toolbar_align : "left",
			theme_advanced_statusbar_location : "bottom",
			theme_advanced_resizing : true,
			spellchecker_languages : "English=en,+Español=es,French=fr,Italian=it,Portuguese=pt",
			content_css : INSTALATION_DIR+"/css/reset.css,"+INSTALATION_DIR+"/css/styles.css",
			theme_advanced_styles : "Alineación derecha=right;Alineación izquierda=left,Introducción=intro",
			width: "100%",
			theme_advanced_resize_horizontal : false,
			relative_urls : false,
			document_base_url : INSTALATION_DIR,
			inlinepopups_skin : 'admin',
			setup : function(ed) //Cargar mapa google si hay
			{
				ed.onInit.add(function(ed) {
					if($('#map_canvas').length > 0)
					{
						init_gmap();
					}
				});
			}
		});
	}

	/**
	 * Relation_n
	 */
	if($(".relation_n select[multiple]:visible").length > 0)
	{
		//Carga selector múltiple visual
		$(".relation_n select[multiple]:visible").asmSelect({
			listType: 'ul',
			highlight: true,
			addItemTarget: 'top',
			sortable: true,
			removeLabel: lng.del,
			highlightAddedLabel: lng.added+': ',
			highlightRemovedLabel: lng.deleted+': '
		});
	}

	/**
	 * Relation list
	 */
	if($('div.relation_list').length > 0)
	{
		$('div.relation_list').relationList();
	}

	/**
	 * Campos permalink
	 */
	if($('div.permalink').length > 0)
	{
		$('div.permalink').each(function()
		{
			//Campo de permalink
			var $permalink = $('input', this);
			//Escribir letras
			$('#'+$(this).attr('rel')).bind('keyup', function(event)
			{
				var $permalink_source = $(this);//Origen para el permalink
				var value = $permalink_source.val().toLowerCase();
				value = value.replace(/(á|ä|à|â|å)/gi, 'a')
							 .replace(/(é|ë|è|ê|€)/gi, 'e')
							 .replace(/(í|ï|ì|î)/gi, 'i')
							 .replace(/(ó|ö|ò|ô)/gi, 'o')
							 .replace(/(ú|ü|ù|û)/gi, 'u')
							 .replace(/ñ/gi, 'n')
							 .replace(/ç/gi, 'c')
							 .replace(/ /gi, '-')
							 .replace(/[^%a-z0-9_-]/gi, '');
				$permalink.val(value);
			});
		});
	}

	/**
	 * Tooltips
	 */
	$("label:has('ul'), h3:has('ul'), h4:has('ul')").tooltip(
	{
		top: 14,
		left: 10,
		track: true,
		delay: 0,
		bodyHandler: function()
		{
			return $(this).parent('div,fieldset,h3,h4').find('.text:first').clone();
		}
	});

	/**
	 * Ajax upload de imagen
	 */
	if($('.fields .image').length > 0)
	{
		//Campo a aplicar subida ajax y crop
		var input = $('.fields .image :file').attr('id');
		new AjaxUpload('#'+input,
		{
			action: INSTALATION_DIR+'/admin/ajax/ajax_actions.php',
			responseType: 'json',
			data:
			{
				action : 'upload_multimedia'
			},
			onSubmit: function(file, ext)
			{
				//Comprobar tipo de archivo
				if( ! (ext && /^(jpg|jpeg|png|gif)$/.test(ext.toLowerCase()) ))
				{
					Boxy.alert(lng.err_img_format, null, {title: 'Error'});
					return false;
				}
				
				//Cargando mientras sube
				loading($(this._button).parents('.image'));
				//Deshabilitar botón de enviar
				$('#add_edit').live('submit', function(event)
				{
					event.preventDefault();
				});
			},
			onComplete: function(file, response)		
			{
				//Hay respuesta no error y se puede parsear el resultado
				if(response && response != 'error')
				{
					//Borrar anterior imagen a recortar
					$('#jcrop_container').remove();
		
					//Añadir imagen y campo con dimensiones
					$(this._button).parents('fieldset:first').append('<div id="jcrop_container"><img src="'+INSTALATION_DIR+'/uploads/photos/99/'+response.img+'" id="cropbox" /><input value=\'{"x":0,"y":0,"w":'+response[0]+',"h":'+response[1]+'}\' id="'+input+'_crop" name="'+input+'_crop" type="hidden"/><input type="hidden" value="'+response.img_abs+'" id="'+input+'_url" name="'+input+'_url"/></div>');

					//Crop imagen
					jQuery('#cropbox').Jcrop(
					{
						onSelect: function(c)//Tamaño recorte en campo oculto
						{
							$('#'+input+'_crop').val(JSON.stringify(c));
						},
						trueSize: [response[0], response[1]] //Tamaño real de imagen
					});
				}
				else
				{
					Boxy.alert(lng.err_img_upload, null, {title: 'Error'});
				}
				loadingEnd();
				$('#add_edit').die('submit');
			}
		});
	}

	/**
	 * Ajax upload video. SOBRA?
	 */
	if($('.fields .video').length > 0)
	{
		//Campo a aplicar subida ajax y crop
		var input_video = $('.fields .video :file').attr('id');
		new AjaxUpload('#'+input_video,
		{
			action: INSTALATION_DIR+'/admin/ajax/upload_file.php',
			responseType: 'json',
			onSubmit: function(file, ext)
			{
				//Comprobar tipo de archivo
				if( ! (ext && /^(flv|mov)$/.test(ext.toLowerCase())))
				{
					Boxy.alert(lng.err_video_format, null, {title: 'Error'});
					return false;
				}
				//Cargando mientras sube
				loading();
				//Deshabilitar botón de enviar
				$('#add_edit').live('submit', function(event)
				{
					event.preventDefault();
				});
			},
			onComplete: function(file, response)		
			{
				//Hay respuesta no error y se puede parsear el resultado
				if(response && response != 'error')
				{
					//Borrar anterior archivo subido
					$('#'+input+'_element, #video_chapters').remove();
					//Añadir video en reproductor
					$(this._button).parents('fieldset:first').append('<div id="'+input_video+'_element" class="element">'+
																	 '<object id="player_api" height="417" width="512" type="application/x-shockwave-flash" data="'+INSTALATION_DIR+'/img/admin/flowplayer-3.1.5.swf">'+
																	 '<param value="true" name="allowfullscreen"/>'+
																	 '<param value="always" name="allowscriptaccess"/>'+
																	 '<param value="high" name="quality"/>'+
																	 '<param value="#000000" name="bgcolor"/>'+
																	 '<param name="wmode" value="transparent"></param>'+
																	 '<param value="video='+response.file+'" name="flashvars"/>'+
																	 '</object>'+
																	 '<input value="'+response.file+'" id="'+input_video+'_url" name="'+input_video+'_url" type="hidden"/></div>');
				}
				else
				{
					Boxy.alert(lng.err_video_upload, null, {title: 'Error'});
				}
						
				loadingEnd();
				$('#add_edit').die('submit');
			}
		});
	}

	/**
	 * Ajax upload de elemento multimedia
	 */
	if($('.fields .multimedia').length > 0)
	{
		//Campo a aplicar subida ajax y crop
		var input = $('.fields .multimedia  :file').attr('id');

		//Subir por ajax el archivo
		new AjaxUpload('#'+input,
		{
			action: INSTALATION_DIR+'/admin/ajax/ajax_actions.php',
			responseType: 'json',
			data:
			{
				action : 'upload_multimedia'
			},
			onSubmit: function(file, ext)
			{
				//Comprobar tipo de archivo
				if( ! (ext && /^(jpg|png|jpeg|gif|swf|flv|mp3|doc|docx|pdf|zip|rar)$/.test(ext.toLowerCase())))
				{
					Boxy.alert(lng.err_file_format, null, {title: 'Error'});
					return false;
				}

				//Cargando mientras sube
				loading($(this._button).parents('.multimedia'));
				//Deshabilitar botón de enviar
				$('#add_edit').live('submit', function(event)
				{
					event.preventDefault();
				});
			},
			onComplete: function(file, response)		
			{
				//Borrar anterior elemento subido
				$('#'+input+'_container').remove();
				$('#'+input+'_url').val('');
				
				//Hay respuesta no error y se puede parsear el resultado
				if(response && response != 'error')
				{
					//Imagen subida
					if(response.img && response.img_abs)
					{
						//Añadir imagen y campo con dimensiones
						$(this._button).parents('fieldset:first').after('<div id="'+input+'_container"><div id="jcrop_container"><img src="'+INSTALATION_DIR+'/uploads/photos/99/'+response.img+'" id="cropbox" /><input value=\'{"x":0,"y":0,"w":'+response[0]+',"h":'+response[1]+'}\' id="'+input+'_crop" name="'+input+'_crop" type="hidden"/><input type="hidden" value="'+response.img_abs+'" id="'+input+'_url" name="'+input+'_url"/></div></div>');
	
						//Crop imagen
						jQuery('#cropbox').Jcrop(
						{
							onSelect: function(c)//Tamaño recorte en campo oculto
							{
								$('#'+input+'_crop').val(JSON.stringify(c));
							},
							trueSize: [response[0], response[1]] //Tamaño real de imagen
						});
					}
					//Vídeo subido
					else if(response.video && response.video_abs)
					{
						//Añadir video en reproductor
						$(this._button).parents('fieldset:first').after('<div id="'+input+'_container" class="element">'+
																	 '<object id="player_api" height="417" width="512" type="application/x-shockwave-flash" data="'+INSTALATION_DIR+'/img/admin/flowplayer-3.1.5.swf">'+
																	 '<param value="true" name="allowfullscreen"/>'+
																	 '<param value="always" name="allowscriptaccess"/>'+
																	 '<param value="high" name="quality"/>'+
																	 '<param value="#000000" name="bgcolor"/>'+
																	 '<param name="wmode" value="transparent"></param>'+
																	 '<param value="video='+response.video+'" name="flashvars"/>'+
																	 '</object>'+
																	 '<input value="'+response.video_abs+'" id="'+input+'_url" name="'+input+'_url" type="hidden" class="hidden"/></div>');
					}
					//Otro archivo, enlace
					else 
					{
						var ext = response.file.split('.').pop();
						//Mostrar enlace al archivo subido
						$(this._button).parents('fieldset:first').after('<div id="'+input+'_container"><input class="hidden" type="hidden" value="'+response.file_abs+'" id="'+input+'_url" name="'+input+'_url"/><a class="'+ext+'" href="'+response.file_abs+'" rel="external" title="">Archivo '+response.file+'</a></div>');
					}
				}
				else
				{
					Boxy.alert(lng.err_img_upload, null, {title: 'Error'});
				}
				loadingEnd();
				$('#add_edit').die('submit');
			}
		});
		
		//Editar imagen, crop imagen
		$('#jcrop_container img').load(function()
		{
			jQuery('#cropbox').Jcrop(
			{			
				onSelect: function(c)//Tamaño recorte en campo oculto
				{
					$('#'+input+'_crop').val(JSON.stringify(c));
				},
				trueSize: [$('#cropbox').width(), $('#cropbox').height()] //Tamaño real de imagen
			});
		});
	}

	/**
	 * Subir archivo a través de Ajax Upload
	 */
	if($('.uploadbatch').length > 0)
	{
		//Cargar Ajax Upload
		function ajaxUploadId(id)
		{
			new AjaxUpload('#'+id,
			{
				action: INSTALATION_DIR+'/admin/ajax/upload_file.php',
				responseType: 'json',
				autoSubmit: true,
				onSubmit: function(file, ext)
				{
					//Comprobar tipo de archivo
					if( ! (ext && /^(jpg|png|jpeg|gif|swf|flv|mp3|doc|docx|pdf|zip|rar)$/.test(ext.toLowerCase()) ))
					{
						Boxy.alert(lng.err_file_format, null, {title: 'Error'});
						return false;
					}
					
					//Desactivar botón y poner como subiendo
					$(this._button).attr('disabled', 'disabled').css({'opacity': 0.7});
					$($(this._button).parents('.item')).css({'background-image': 'url('+INSTALATION_DIR+'/img/admin/lightbox-ico-loading.gif)'});

					//Añadir otro input
					$('.uploadbatch .clone').trigger('click');
				},
				onComplete: function(file, response)		
				{
					//Quitar fondo
					$($(this._button).parents('.item')).css({'background-image': ''});

					//Respuesta subida archivo
					if(response && response != 'error')
					{
						//Mostrar archivo subido y quitar campo input
						$(this._button).before('<div class="uploaded">Subido <span><a href="'+response.file_abs+'" target="_blank">'+file+'</a></span></div><input type="hidden" name="'+$(this._button).attr('name')+'" value="'+response.file_abs+'"/>').remove();
					}
					else
					{
						//Reactivar campo y mensaje de error
						Boxy.alert(lng.err_file_upload+' '+file, null, {title: 'Error'});
						$(this._button).attr('disabled', '');
					}
				}
			});
		}

		//Primer campo
		ajaxUploadId($(':file:first').attr('id'));
		//Campos clonados, funcionalidad ajax upload al último elemento creado
		$('.uploadbatch .clone').bind('click', function(event)
		{
			ajaxUploadId($('.fields div.item:visible:last :file').attr('id'));
		});
		
		//Mostrar campos tras cargar todo
		$('#add_edit').css({'display':'block'});
	}

	/**
	 * Tags
	 */
	if($('.tags input').length > 0)
	{
		//Autocompletador de etiquetas existentes
		var input_tags = $(".tags input[type='text']").attr('name')
		var field_tags = input_tags.replace('_input', '');
		var $fl_tags = $($('#'+field_tags).parents('.facelist'));
		$("#"+input_tags).autocomplete(INSTALATION_DIR+"/admin/ajax/ajax_actions.php",
		{
			extraParams:
			{
				'action': 'tag_get'
			},
			matchContains: true,
			minChars: 2,
			selectFirst: false,
			cacheLength: 10,
			delay: 400
		}).result(function(event, item)
		{
			//Añadir a listado de etiquetas
			if($('li[id="bit-'+item[1]+'"]', $fl_tags).length <= 0)
			{
				//Actualizar ids de elementos seleccionados
				var values_input = '';
				$('li[id]', $fl_tags).each(function()
				{
					values_input += $(this).attr('id').split('-')[1]+',';
				});
				//Campo oculto con ids
				$('#'+field_tags).val(values_input+item[1]+',');
				$('.token-input', $fl_tags).before('<li id="bit-'+item[1]+'" class="token"><span><span><span><span>'+item[0]+'</span></span></span></span><span class="x"> .x</span></li>');
			}
			//Vaciar input buscador
			$('#'+input_tags).val('');
		});
		
		//Borrado de tokens en campos tags
		$('.token .x', $fl_tags).live('click', function(event)
		{
			var $li = $($(this).parent());
			//Borrado del valor en input
			var values = $('#'+field_tags).val().split($li.attr('id').split('-')[1]+',');
			$('#'+field_tags).val(values.join(''));
			//Quitar token
			$li.remove();
		});
		
		//Añadir etiquetas pulsando
		$(".tags input").live('keydown', function(event)
		{
			//Pulsar intro, añadir opción
			if(event.keyCode == 13)
			{
				event.preventDefault();
				var txt = $(event.target).val();
				if(txt)//Existe texto de tag
				{
					$(event.target).attr('disabled', 'disabled');
					//Añadir tag por ajax
					$.get(INSTALATION_DIR+"/admin/ajax/ajax_actions.php", {q: txt, 'action':'tag_add'}, function(data)
					{
						if(data == -1)
						{
							$(event.target).removeAttr('disabled');
							return;
						}
						//Ids de tags
						var to_user = $('#'+field_tags);
						//No está seleccionada
						if(to_user.val().search(data+',') < 0)
						{
							//Añadir opción
							elemLI = $('<li id="bit-'+data+'" class="token"><span><span><span><span>'+txt+'</span></span></span></span></li>').click(function()
							{
								$('.token').removeClass('token_selected');
								$(this).addClass("token_selected");
							}, function(){ $(this).removeClass("token_selected");});
							//Botón borrar
							elemA = $('<span class="x"> .x</span>').click(function()
							{
								$('#bit-'+data).remove();
								//var dat = ;
								$(to_user).val(to_user.val().replace(data+',', ''));
								return false;
							});
							$(elemLI).append(elemA);
							$('#result_list ul').remove();
							$('.token-input').before(elemLI);
							to_user.val(to_user.val()+data+',');//Id elemento en lista
							$(event.target).val('');
							$('.tags input[autocomplete]').focus();
						}
						$(event.target).removeAttr('disabled');
					});
				}
			}
		});
	}

	/**
	 * Relation_n tags
	 */
	if($('.relation_n .asmTagsContainer').length > 0)
	{
		//Autocompletador de etiquetas existentes
		var input_rn = $(".relation_n .asmTagsContainer input[type='text']").attr('id');
		var $fl_rn = $($('#'+input_rn).parents('.asmTagsContainer'));
		var values_rn = JSON.parse($('#'+input_rn).attr('accept'));
		$("#"+input_rn).autocomplete(INSTALATION_DIR+"/admin/ajax/ajax_actions.php", 
		{ 
			extraParams:
			{
				action: 'relation_n_tags',
				field: values_rn.table_source,
				id: values_rn.id,
				'show[]': values_rn.show
			},
			matchContains: true,
			minChars: 1,
			selectFirst: false,
			cacheLength: 20,
			delay: 400
		}).result(function(event, item)
		{
			//Añadir a listado de etiquetas si no existe
			if($('li[id="bit-'+item[1]+'"]', $fl_rn).length <= 0)
			{
				$('.asmList', $fl_rn).prepend('<li id="bit-'+item[1]+'" class="asmListItem">'+
											'<span class="asmListItemLabel">'+item[0]+'</span>'+
											'<a href="#" class="asmListItemRemove">Borrar</a>'+
											'<input type="hidden" name="'+input_rn.replace('_input', '')+'[]" value="'+item[1]+'"/></li>');
				highlight('.asmTagsContainer #bit-'+item[1]);
			}
			//Vaciar input buscador
			$('#'+input_rn).val('');
		});
		
		//Borrado de tokens en campos tags
		$('.asmListItemRemove', $fl_rn).live('click', function(event)
		{
			event.preventDefault();
			$($(this).closest("li")).remove();//Quitar token
		});
	}
}


/**
 * Cargar lightbox con parámetros 
 */
function loadLb()
{
	$('a[rel*=lightbox]').lightBox(
	{
		imageLoading: INSTALATION_DIR+'/img/admin/lightbox-ico-loading.gif',
		imageBtnClose: INSTALATION_DIR+'/img/admin/lightbox-btn-close.gif',
		imageBtnPrev: INSTALATION_DIR+'/img/admin/lightbox-btn-prev.gif',
		imageBtnNext: INSTALATION_DIR+'/img/admin/lightbox-btn-next.gif',
		imageBlank: INSTALATION_DIR+'/img/admin/lightbox-blank.gif',
		containerResizeSpeed: 250,
		txtImage: lng.image,
		txtOf: lng.of,
		keyToPrev: lng.lightbox_prev,
		keyToNext: lng.lightbox_next
	});
}


/**
 * Carga User Interface de jquery
 */
function loadUI()
{
	var d = new Date().getFullYear()+2;
	//Fecha
	$('input.date_picker').datepicker({
		yearRange: "1800:"+d,
		firstDay: 1,
		dateFormat: 'd-m-yy',
		clearText: lng.clear,
		clearStatus: '',
		closeText: lng.close,
		closeStatus: '',
		prevText: lng.prev,
		prevStatus: '',
		nextText: lng.next,
		nextStatus: '',
		currentText: lng.today,
		currentStatus: '',
		monthNames: lng.months,
		monthNamesShort: lng.months_short,
		weekHeader: 'Sm',
		dayNames: lng.days,
		dayNamesShort: lng.days_short,
		dayNamesMin: lng.days_min,
		dayStatus: 'DD',
		changeMonth: true,
		changeYear: true
	});	

	//Fecha con múltiples días seleccionados
	$('.time_n > div[id!=dp]').datepicker({
		yearRange: "1800:"+d,
		firstDay: 1,
		dateFormat: 'd-m-yy',
		clearText: lng.clear,
		clearStatus: '',
		closeText: lng.close,
		closeStatus: '',
		prevText: lng.prev,
		prevStatus: '',
		nextText: lng.next,
		nextStatus: '',
		currentText: lng.today,
		currentStatus: '',
		monthNames: lng.months,
		monthNamesShort: lng.months_short,
		weekHeader: 'Sm',
		dayNames: lng.days,
		dayNamesShort: lng.days_short,
		dayNamesMin: lng.days_min,
		dayStatus: 'DD',
		changeMonth: true,
		changeYear: true,
		onSelect: function(date, dp)//Seleccionar día, añade a la lista
		{
			for(var i=0; selected_days && i < selected_days.length; i++)
			{
				//Fecha coincide con algun día, lo borra de la lista
				if(dp.selectedYear == selected_days[i][0] && dp.selectedMonth+1 == selected_days[i][1] && dp.selectedDay == selected_days[i][2])
				{
					selected_days.splice(i,1);
					$(this).children('input')[0].value = JSON.stringify(selected_days);
					return true;
				}
			}
			//No está en lista, añade y actualiza campo
			selected_days[selected_days.length] = new Array(dp.selectedYear, dp.selectedMonth+1, dp.selectedDay);
			if($(this).children('input').length > 0)
			{
				$(this).children('input')[0].value = JSON.stringify(selected_days);
			}
			return true;
		},
		beforeShowDay: function(date)//Marca los días seleccionados en el input
		{
			if(selected_days.length === 0)
			{
				if($(this).children('input').length > 0 && $(this).children('input')[0].value)
				{
					selected_days = JSON.parse($(this).children('input')[0].value);
				}
			}
			for(var i=0; selected_days && i < selected_days.length; i++)
			{
				//Fecha coincide con algun día
				if(date.getFullYear() == selected_days[i][0] && date.getMonth()+1 == selected_days[i][1] && date.getDate() == selected_days[i][2])
				{
					return [true, 'selected'];
				}
			}
			return [true, ''];//Dia habilitado sin seleccionar
		}
	});

	//Hora
	if($("input.time_picker").length >= 1)
	{
		tp_loaded = false;
		if( ! tp_loaded)//JS y CSS de clockpick no cargado
		{
			$("input.time_picker").clockpick({
				starthour : 0,
				endhour : 23,
				showminutes : true,
				minutedivisions : 12,
				military : true			
			});
			tp_loaded = true;
		}
		else //Archivos cargados, solo inicializar campos
		{
			$("input.time_picker").clockpick({
				starthour : 0,
				endhour : 23,
				showminutes : true,
				minutedivisions : 12,
				military : true			
			});			
		}
	}
	
	/**
	 * Debug
	 */
	$("#debug").draggable(
	{
		handle: 'h4'
	});
	$("#debug").live('dblclick', function()
	{
		$("#debug").toggleClass('minimized');
		$("#debug .text").toggleClass('hidden');
	});
}


/**
 * Cargar ventanas comportamiento con parámetros 
 */
function loadBoxy()
{
	var url_data = window.document.location; //Url a cargar
	var url_aux = window.document.location; //Url actual

	/**
	 * Cerrar todos los boxys al pulsar ESC
	 */
	$(window).keydown(function(event)
	{
		if(event.keyCode == 27)
		{
			$('.boxy-wrapper, .boxy-modal-blackout').fadeOut('fast', function()
			{
				$(this).remove();
				loadingEnd();
			});
		}
	});

	/**
	 * Boxy para relation_n, controla el formulario
	 */
	$("[rel='boxy']").live('click', function(event)
	{
		loading('body');
		event.preventDefault();
		event.target = $(event.target).closest('a');//El primer enlace válido (o propio elemento)

		//Crear boxy
		Boxy.load($(event.target).attr('href')+'show_full/',
		{
			title: $(event.target).attr('title'),
			closeText: lng.close_boxy,
			modal: true,
			actuator: $(event.target),
			unloadOnHide: true,
			afterHide: function()//Tras ocultar, restaurar url de carga de datos
			{
				url_data = window.document.location;
			},
			afterShow: function()//Tras mostrar
			{
				//Ventana creada dentro de un boxy, como ruta de vuelta la referencia
				if($(event.target).closest('boxy-content').length > 0)
				{
					url_data = url_aux;
				}
				else if(url_aux == window.document.location)//Ventana original, url aux para futuras a ella misma
				{
					url_aux = this.options.actuator.attr('href');//Ruta de llamada la nuevo boxy
				}

				//Session timeout, mostrar formulario de login
				if($('#login_footer').length > 0)
				{
					alert('La sesión ha terminado. Por favor, vuelva a identificarse');
					window.document.location.href = INSTALATION_DIR+'/admin/';
				}
				
				//Focus en primer input
				$('.boxy-content input[type="text"]').focus();

				//Cargar UI
				loadUI();
				loadIf();
			},
			behaviours: function(r) //Tras cambiar contenido
			{
				loadingEnd();
				var boxy_element = this;//Mantener el objeto boxy para llamadas siguientes

				//Session timeout, mostrar formulario completo
				if($('#login', boxy_element).length > 0)
				{
					$(window.document).html(r);
					return false;
				}

				//Enlaces deshabilitados
				$('a', r).click(function(e)
				{
					e.preventDefault();
				});

				//Pregunta, cerrar al click
				$('#question a', r).click(function(event)
				{
					$('#content').load($(event.target).attr('href')+' #content > *');
					boxy_element.hide();
				});
				
				//Action del form, llamada ajax. Mirar resultado
				$('form', r).unbind('submit.bif').bind('submit.bif', function handler(event)
				{
					event.preventDefault();
					loading('.boxy-wrapper', 0.5, 'fixed');//Cargando
					
					$.post($(event.target).attr('action')+'show_full/', $(event.target).serialize(), function(text, status)
					{
						//Estado de la llamada ajax
						if(status == 'success')
						{
							//Tipo del mensaje de aviso
							switch($("div:first", text).attr('class'))
							{
								//Resultado correcto, cerrar cuadro y recargar web parent
								case 'info':
									//Mensaje éxito
									boxy_element.setContent($(text).find("div:first"));
									
									var id_element = $(boxy_element.options.actuator).parent().attr('id');
									//Si elemento por encima 2 posiciones tiene id es formulario, cambiar solo esa parte
									if(id_element.toString().length > 2)
									{
										//Es un select, carga los options uno a uno
										if($('#'+id_element).hasClass('relation_n'))
										{
											loading('.boxy-wrapper', 0.5, 'fixed');//Cargar
											//Obtener nuevo select para añadir los nuevos option
											$.get(url_data+'show_full/', function(text, status)
											{
												//Opciones existentes en el array
												var arr = new Array();
												var i = 0;
												//Seleccionar multiple o no
												if($('#'+id_element, text).hasClass('multiple_no'))
												{
													var item_selector = '#'+id_element+' select option';
												}
												else
												{
													var item_selector = '#'+id_element+' select[multiple] option';
												}
												//Obtener elementos
												$(item_selector).each(function()
												{
													arr[i++] = '-'+this.value+this.text;
												})
												var arr2str = arr.toString();

												//Selector en el archivo cargado
												$(text).find('#'+id_element+' select option').each(function()
												{
													//Añadir options nuevos si no existe ya, tiene valor, texto y no está en el select actualmente
													if(this.value && this.text && arr2str.search('-'+this.value+this.text) < 0)
													{
														var option = $("<option value="+this.value+"></option>").text(this.text).attr("selected", false);
														//Relation no multiple, individual
														if($('#'+id_element, text).hasClass('multiple_no'))
														{
															$('#'+id_element+' select').append($(option).attr("selected", true));
														}
														else//relation_n multiple
														{
															$('#'+id_element+' select[multiple]').append(option).change();//Añadir como seleccionado
														}
													}
												});
												//Ocultar boxy
												boxy_element.hide();
												//Quitar carga
												loadingEnd();
											}, 'html');
										}
										else //Recarga de la parte modificada
										{
											//Cargar
											loading('.boxy-wrapper', 0.5, 'fixed');
											//Llamada ajax
											$('#'+id_element).load(url_data+'show_full/ #'+id_element+' > *', {}, function()
											{
												loadLb();
												loadIf();
												boxy_element.hide();
												loadingEnd();
											});
										}
									}
									else //Cambiar todo el contenido
									{
										//Cargar
										loading('.boxy-wrapper', 0.5, 'fixed');
										//Obtener url sin parámetros en url ( /param_value)
										var url = String();
										var parts = (url_data).toString().split("/");
										for(i in parts)
										{
											if(parts[i].indexOf('_') == -1 || parts[i].substring(0,3) == 'pag')//No tiene parámetros con _ o es número de página, meter en url
											{
												url = url+parts[i]+'/';
											}
										}

										//Cambia el contenido viejo por el nuevo y activa javascript
										$('#content').load(url+'show_full/ #content > *', {}, function()
										{
											loadLb();
											loadIf();
											boxy_element.hide();
											loadingEnd();
										});
									}
									
									break;
									
								//Error, sigue mostrando ventana y todo el contenido devuelto
								case 'warning':
									boxy_element.setContent(text);
									loadIf();
									break;
								case 'error':
									boxy_element.setContent(text);
									loadIf();
									break;
								default: //Error, mostrar lo que sale
									boxy_element.setContent(text);
									loadIf();
									break;
							}
							return true;
						}
						else
						{
							return false;	
						}
						//Final de cargar
						loadingEnd();

					}, 'xhtml');
				});
			}
		});		
	});

	/**
	 * Boxy para gallery. Al hacer click en un elemento lo añade en el container
	 */
	$("[rel='boxy-gallery']").live('click', function(event)
	{
		loading($(event.target).parent());
		event.preventDefault();		

		//Crear boxy
		Boxy.load($(event.target).attr('href')+'show_full/',
		{
			title: $(event.target).attr('title'),
			closeText: lng.close_boxy,
			actuator: $(event.target),
			afterHide: function()//Tras ocultar, restaurar url de carga de datos
			{
				url_data = window.document.location;
			},
			afterShow: function(r)//Tras mostrar
			{
				loadingEnd();
				//Ventana creada dentro de un boxy, como como ruta de vuelta la referencia
				if($(event.target).closest('boxy-content').length > 0)
				{
					url_data = url_aux;
				}
				else if(url_aux == window.document.location)//Ventana original, url aux para futuras a ella misma
				{
					url_aux = this.options.actuator.attr('href');//Ruta de llamada la nuevo boxy
				}
				
				//--- Session timeout, mostrar formulario de login ---
				if($('#login_footer', r).length > 0)
				{
					alert('La sesión ha terminado. Por favor, vuelva a identificarse');
					window.document.location.href = INSTALATION_DIR+'/admin/';
				}

				//Tamaño más grande de ventana
				this.resize(620, 380);
				this.center();
				
				//Marcar fotos seleccionadas
				var photos_selected = $('.'+$(this.options.actuator).attr('rev')+'_container').find('img');//fotos seleccionadas
				//Fotos mostradas, marcar
				$('img', r).each(function()
				{
					for(var i=0; i < photos_selected.length; i++)
					{
						if($(photos_selected[i]).attr('src') == $(this).attr('src'))
						{
							$(this).parents("a").css('opacity', '0.4');
						}
					}
				});
				
				//Cargar UI
				loadUI();
			},
			behaviours: function(r) //Tras cambiar contenido
			{
				//Tamaño más grande de ventana. Mantener posición del usuario
				this.resize(620, 380);
				this.center();
				
				var boxy_element = this;//Mantener el objeto boxy para llamadas siguientes
				var text_button = '';//Texto del botón, usado para mostrar formulario de subir
				
				//Estilo de galería al contenido
				$(r).addClass('gallery');
				
				//Nombre campo de las fotos
				var field = $(boxy_element.options.actuator).attr('rev');
				//Contenedor de fotos
				var photos_container = $('.'+field+'_container');
				//Marcar fotos seleccionadas
				$('img', photos_container).each(function(i, el)
				{
					$('.gallery img[src="'+$(el).attr('src')+'"]').closest("a").css('opacity', '0.4');
				});
				
				//Deshabilitar lightbox
				$('a[rel="lightbox"], a[rel="boxy"], a[rel="external"]', r).attr('rel', '');

				//Enviar formulario
				$('form', r).unbind('submit').bind('submit', function(event)
				{
					event.preventDefault();
					loading('.boxy-wrapper', 0.5, 'fixed');//Cargando

					//Buscador controlado a mano
					var form = $(event.target);
					$.get(form.attr('action')+'show_full/', form.serialize(), function(text, status)
					{
						//Estado de la llamada ajax
						if(status == 'success')
						{
							//Cargar contenido
							boxy_element.setContent(text);
						}
						loadingEnd();
					}, 'html');
				});
				
				//Click en algún sitio
				$(r).unbind('click keypress').bind('click keypress', function(event)
				{
					//**********
					//Click en foto, copiar en el contenedor
					if($(event.target).parents('#show').length > 0 && $(event.target).closest("a").length > 0)
					{
						var $item_click = $($(event.target).closest("a"));//Enlace cercano al elemento
						
						event.preventDefault();
						loading('.boxy-wrapper', 0.5, 'fixed');//Cargando
						
						//Id de la photo
						var photo_id = $item_click.parents("li[class^='row_']").attr('rel');
											
						//Evitar imagen repetida
						if($('#'+field+'_multimedia_'+photo_id, photos_container).length === 0)
						{
							var block = field.split('_')[1];//Nombre bloque
							var block_real = $('body').attr('id');//Nombre bloque en el que se está
							var icon = '';
							
							//Imagen de youtube, poner icono
							if($('img', $item_click).attr('src').search('ytimg.com') > 1)
							{
								icon = '<img class="youtube" src="'+INSTALATION_DIR+'/img/icons/youtube.png" alt="YouTube"/>';
							}

							var html = $item_click.html();
							//Elemento a insertar
							photos_container.append('<li id="'+field+'_multimedia_'+photo_id+'">'
									+html
									+'<a href="" rel="interface" rev="#'+field+'_multimedia_'+photo_id+'" title="'+lng.del_quest_media+'" class="delete">'+lng.del+'</a><input type="hidden" name="'+block_real+'_'+field+'[]" value="'+photo_id+'"/>'
									+icon
									+'</li>');
							highlight($('#'+field+'_multimedia_'+photo_id));
							$("[rev*="+field+"_multimedia_"+photo_id+"]").interFace();//Evento de borrar
							
							$item_click.css('opacity', 0.4);
						}
						else //Existe imagen en contenedor, quitar
						{
							$('#'+field+'_multimedia_'+photo_id, photos_container).remove();
							$item_click.css('opacity', 1);
						}
						loadingEnd();
					}
					//**********
					//Click en enlace de nuevo elemento
					else if($(event.target).closest('.buttons').length > 0 && $(event.target).parents('.buttons').children().attr('class') == 'action_new')
					{
						event.preventDefault();//Parar comportamiento normal
						$(event).trigger('blur');//Deseleccionar el botón
						loading('.boxy-wrapper', 0.5, 'fixed');//Cargando
						var url_list = $(event.target).attr('href').substring(0, $(event.target).attr('href').length - 1);
						
						//Texto del botón
						if( ! text_button)
						{
							text_button = $(event.target).text();
						}
						
						//Crear formulario de subir si no hay
						if($('.upload_file:visible').length == 0)
						{
							//Ocultar lista de fotos y paginador
							$('.paginator, #show', r).css('display', 'none');
							//Insertar contenedor de formulario
							$(r).append('<div class="upload_file"></div>');
							//Cargar form
							$('.upload_file', r).load($(event.target).attr('href')+'show_full/ #content > *', function(response, data)
							{
								//Texto del botón de añadir, cambiado
								$(event.target).text(lng.photos_list);
								//Cargar cosas de interface
								loadIf();
								
								//Acción del form
								$('.upload_file form', r).attr('action', $('.upload_file form', r).attr('action')+'show_full/');
								//Enviar form
								$('.upload_file form', r).submit(function(event)
								{
									event.preventDefault();
									loading('.boxy-wrapper', 0.5, 'fixed');//Enviar formulario
									
									//Enviar form por ajax
									$.post(INSTALATION_DIR+'/admin/ajax/ajax_actions.php',
									{
										'action': 'new_multimedia',
										'vars': $('.upload_file form', r).serialize()
									}, function(data, response)
									{
										if(data == '"ok"')
										{
											//Página a cargar con la lista. Quitar / final
											var str = url_list;// $(event.target).attr('href').substring(0, $(event.target).attr('href').length - 1);
											var index = str.lastIndexOf('/');//Quitar partes tras último /
											str = str.substring(0, index)+'/show_full/';
		
											$.get(str, function(text, status)
											{
												if(status == 'success')//Estado de la llamada ajax
												{
													boxy_element.setContent(text);
													
												}
												loadingEnd();
											});
										}
										else
										{
											alert('Error al guardar: '+data);
											loadingEnd();
										}
									});
								});
								//Termina de cargar el formulario
								loadingEnd();
							});
						}
						else //Hay subir archivos, mostrar lista fotos
						{
							//Mostrar lista de fotos y paginador
							$('.paginator, #show', r).show();
							$('.upload_file', r).remove();//Quitar formulario
							$(event.target).text(text_button);
							text_button = '';
							
							loadingEnd();
						}
					}
					//**********
					//Demás enlaces (paginador, volver, etc...)
					else if(event.target.nodeName.toLowerCase() == 'a')
					{
						//Tab, comportamiento normal del tab
						if(event.keyCode == 9)
						{
							return;
						}
						else if($(event.target).children().length > 0)//Si tiene hijos, no ejecutar nada
						{
							return false;
						}						
						
						event.preventDefault();
						loading('.boxy-wrapper', 0.5, 'fixed');//Cargando

						//Añadir show_full antes de ?
						var page_load;
						if($(event.target).attr('href').lastIndexOf('?') > 0)
						{
							var index = $(event.target).attr('href').lastIndexOf('?');
							var str = $(event.target).attr('href').substring(0, index-1);
							page_load = str+'/show_full/'+$(event.target).attr('href').substring(index, $(event.target).attr('href').length);
						}
						else
						{
							page_load = $(event.target).attr('href')+'show_full/';
						}
						
						$.get(page_load, function(text, status)
						{
							//Estado de la llamada ajax
							if(status == 'success')
							{
								//Cargar contenido
								boxy_element.setContent(text);
							}
							loadingEnd();
						}, 'html');	
					}
					//**********
					//Otro click, por si acaso dejar cargar
					else
					{
					}
				});
			}
		});
	});

	/**
	 * Boxy para listado. Al hacer click en un elemento lo añade en el container
	 */
	$("[rel='boxy-list']").live('click', function(event)
	{
		loading($(event.target).parent());
		event.preventDefault();

		//Crear boxy
		Boxy.load($(event.target).attr('href')+'show_full/',
		{
			title: $(event.target).attr('title'),
			closeText: lng.close_boxy,
			actuator: $(event.target),
			modal: true,
			afterHide: function()//Tras ocultar, restaurar url de carga de datos

			{
				url_data = window.document.location;
			},
			afterShow: function(r)//Tras mostrar
			{
				//Ventana creada dentro de un boxy, como como ruta de vuelta la referencia
				if($(event.target).closest('boxy-content').length > 0)
				{
					url_data = url_aux;
				}
				else if(url_aux == window.document.location)//Ventana original, url aux para futuras a ella misma
				{
					url_aux = this.options.actuator.attr('href');//Ruta de llamada la nuevo boxy
				}

				//--- Session timeout, mostrar formulario de login ---
				if($('#login_footer', r).length > 0)
				{
					alert('La sesión ha terminado. Por favor, vuelva a identificarse');
					window.document.location.href = INSTALATION_DIR+'/admin/';
				}

				//Tamaño más grande de ventana
				this.resize(650, 400);
				this.center();
				
				//Campo select donde añadir el elemento seleccionado. Elementos seleccionados aqui
				var id_element = $(this.options.actuator).parent().attr('id');
				id_element = id_element.substr(5, id_element.length-5);
				
				//Marcar seleccionados
				$('#'+id_element+'_1 :selected').each(function(el, it)
				{
					$('#show li[rel="'+$(it).val()+'"]').addClass('active');
				})
				
				//Cargar UI
				loadUI();
			},
			behaviours: function(r) //Tras cambiar contenido
			{
				loadingEnd();
				
				//Estilo de galería al contenido				
				$(r).addClass('list');
				$(r).attr('id', 'content_list');
				
				//Tamaño más grande de ventana. Mantener posición del usuario
				this.resize(650, 400);
				this.center();
				
				var boxy_element = this;//Mantener el objeto boxy para llamadas siguientes
				var text_button = '';//Texto del botón, usado para mostrar formulario de subir
				
				//Mensaje click para añadir
				$('[class*="row_"][class!=row_header]', r).attr('title', lng.add_click);
				
				//Campo select donde añadir el elemento seleccionado. Elementos seleccionados aqui
				var id_element = $(boxy_element.options.actuator).parents().attr('id');
				id_element = id_element.substr(5, id_element.length-5);
				
				//Marcar seleccionados
				$('#'+id_element+'_1 :selected').each(function(el, it)
				{
					$('#show li[rel="'+$(it).val()+'"]').addClass('active');
				})

				//Formulario por ajax
				$('form', r).unbind('submit').bind('submit', function(event)
				{
					event.preventDefault();
					loading('.boxy-wrapper', 0.5, 'fixed');//Cargando

					//Buscador controlado a mano
					var form = $(event.target);
					$.ajax(
					{
						'type' : (form.parents('#searcher').length > 0)? 'get' : 'post',
						'url' : form.attr('action')+'show_full/',
						'data' : form.serialize(),
						'success' : function(text, status)
						{
							//Estado de la llamada ajax
							if(status == 'success')
							{
								//Cargar contenido
								boxy_element.setContent(text);
							}
							loadingEnd();
						},
						'dataType' : 'html'
					});
				});

				//Click en algún sitio
				$(r).unbind('click').bind('click', function(event)
				{
					//**********
					//Click en alguna fila del listado
					if($(event.target).parents('#show').length > 0)
					{
						//Desactivar todos los enlaces
						$('#show a').bind('click', function(event){event.preventDefault()});
						event.preventDefault();
						
						//Click en el li
						if($(event.target).is('li') && $(event.target).attr('rel'))
						{
							//Elemento para id de la fila
							var row_id = $(event.target).attr('rel');
							//Elemento a copiar
							var element = $(event.target).children();
							//Fila seleccionada
							$(event.target).addClass('active');
						}
						else if($(event.target).parents('[class*="row_"][class!="row_header"]'))
						{
							//Elemento para id de la fila
							var row_id = $(event.target).parents('li[class^="row_"]').attr('rel');
							//Elemento a copiar
							var element = $(event.target).parents('[class*="row_"]');
							//Fila seleccionada
							$(event.target).parents('[class*="row_"]').addClass('active');
						}
						
						//Datos de la fila visibles

						var texto = sep = '';
						$('div.data', element).each(function(i)
						{
							//Añadir elemento si se ve
							if($(this).attr('display') != 'none' && $(this).css('display') != 'none')
							{
								texto += sep+$(this).text();
								sep = ' ';
							}
						});
						
						//Existe elemento, marcar como seleccionado
						if($("#"+id_element+"_1 option[value='"+row_id+"']").length > 0)
						{
							$("#"+id_element+"_1 option[value='"+row_id+"']").attr("selected",true);
							$('#'+id_element+'_1').change();
						}
						else //No existe, crear
						{
							//Option a añadir
							var $option = $("<option value="+row_id+"></option>").text(texto).attr("selected",true);
							$('#'+id_element+'_1').append($option).change();
						}
					}
					//Demás enlaces (paginador, volver, etc...)
					else if(event.target.nodeName.toLowerCase() == 'a')
					{
						//Tab, comportamiento normal del tab
						if(event.keyCode == 9)
						{
							return;
						}
						else if($(event.target).children().length > 0)//Si tiene hijos, no ejecutar nada
						{
							return false;
						}						
						
						event.preventDefault();
						loading('.boxy-wrapper', 0.5, 'fixed');//Cargando

						//Añadir show_full antes de ?
						var page_load;
						if($(event.target).attr('href').lastIndexOf('?') > 0)
						{
							var index = $(event.target).attr('href').lastIndexOf('?');
							var str = $(event.target).attr('href').substring(0, index-1);
							page_load = str+'/show_full/'+$(event.target).attr('href').substring(index, $(event.target).attr('href').length);
						}
						else
						{
							page_load = $(event.target).attr('href')+'show_full/';
						}
						
						$.get(page_load, function(text, status)
						{
							//Estado de la llamada ajax
							if(status == 'success')
							{
								//Cargar contenido
								boxy_element.setContent(text);
							}
							loadingEnd();
						}, 'html');	
					}
					//**********
					//Otro click, por si acaso dejar de cargar
					else
					{
					}
				});
			}
		});
	});
}


/**
 * Defuscador de email
 * Uso: $(enlace elemento).defuscate();
 */ 
jQuery.fn.defuscate = function()
{
	return this.each(function()
	{
		var email = String($(this).html()).replace(/\s*\(.+\)\s*/, "@");
		$(this).before('<a href="mailto:' + email + '">' + email + "</a>").remove();
	});
}; 


/**
 * Generador de cadenas aleatorias
 * @param length Longitud de la cadena
 * @param special Usar caracteres especiales
 * Uso: $.password(12, [true]);
 */
$.extend({ 
	password: function (length, special)
	{
		var randomNumber = password = "";
		var special = (special == undefined)? false : special;
		
		for(var i = 0; i < length; )
		{
			randomNumber = (Math.floor((Math.random() * 100)) % 94) + 33;
			if( ! special &&
				((randomNumber >=33) && (randomNumber <=47)) ||
				((randomNumber >=58) && (randomNumber <=64)) ||
				((randomNumber >=91) && (randomNumber <=96)) ||
				((randomNumber >=123) && (randomNumber <=126)) )
				{
					continue;
				}
			i++;
			password += String.fromCharCode(randomNumber);
		}
		return password;
	}
});


/**
 * Cargar funcionalidades js tras cargar DOM
 */
$(document).ready(function()
{
	//Carga de lightbox
	loadLb();
	//UI
	loadUI();
	//Carga elementos de interfaz
	loadIf();
	//Carga boxy, cuadros emergentes. Boxy incluye UI
	loadBoxy();
});
