/**********************************************************************
 * Software:	JS Embedded Content
 * Versión:	1.1 beta 2 (Sep 21, 2006)
 * Autor:	Raspu (donraspu arroba gmail punto com)
 * Licencia:	GNU General Public License (GPL) - http://www.gnu.org/copyleft/gpl.html
 *
 *
 * DESCRIPCIÓN:
 * ------------
 * "JS Embedded Content" es una pequeña aplicación desarrollada
 * mediante Javascript no intrusivo ni obstructivo, que permite la
 * activación automática de todos los elementos incrustados en un
 * documento HTML mediante las etiquetas OBJECT, EMBED y/o APPLET.
 *
 * El script se ejecutará solamente en Internet Explorer y Ópera (aunque
 * en estricto rigor sólo es necesario para algunas versiones). El resto 
 * de agentes de usuario no la activarán ya que no lo necesitan (por ahora).
 *
 *
 * INSTRUCCIONES DE USO:
 * ---------------------
 * Simplemente debes incluir el archivo "embeddedcontent.js" usando
 * el siguiente código entre las etiquetas <HEAD> y </HEAD> de tus 
 * documentos HTML:
 *
 *	<script type="text/javascript" src="embeddedcontent.js"></script>
 **********************************************************************/
var embeddedContent = 
{

	isMSIE : (document.all && !window.opera) ? true : false,
	
	
	/**
	 * Reinserta en el documento HTML los elementos que han sido incrustados mediante
	 * las etiquetas OBJECT, EMBED y/o APPLET, redefiniendo su propiedad outerHTML
	 */
	reinsertContent : function()
	{	
	var totalNodes = new Array(3);
		totalNodes['OBJECT'] = document.getElementsByTagName('OBJECT').length;
		totalNodes['EMBED'] = document.getElementsByTagName('EMBED').length;
		totalNodes['APPLET'] = document.getElementsByTagName('APPLET').length;
		for(var tagName in totalNodes)
		{
			var counter = totalNodes[tagName] - 1;
			for(var node; node = document.getElementsByTagName(tagName)[counter]; counter--)
			{
				var skipNode = false;
				var isVideo = embeddedContent.detectVideoFile(node);
				if(embeddedContent.isMSIE && isVideo)
				{
					/* En Internet Explorer se debe omitir el script para los nodos que 
					están llamando a un archivo de video debido a un fallo que se provocaría 
					al momento de reinsertar el contenido */
					skipNode = true;
				}
				var sourceCode = null;
				if(skipNode == false)
				{
					sourceCode = embeddedContent.getSourceCode(node);
				}
				if(sourceCode)
				{
					node.outerHTML = sourceCode;
				}
			}
		}
		embeddedContent.isMSIE = null;
	},
	
	
	/**
	 * Comprueba si se está utilizando el nodo para cargar un archivo de video (no incluye
	 * los archivos de video llamados desde una película Flash.
	 * @param	node (object) - El nodo que será analizado
	 * @return	isVideo (boolean) - TRUE o FALSE según el resultado obtenido
	 */
	detectVideoFile : function(node)
	{
		var videoFileTypes = 'mov|avi|wmv|rtv|rm|mpg|mpeg';
		switch(node.nodeName)
		{
			case 'EMBED':
				var fileName = node.getAttribute('src');
			break;
			case 'OBJECT':
				var counter = node.getElementsByTagName('PARAM').length - 1;
				for(var child; child = document.getElementsByTagName('PARAM')[counter]; counter--)
				{
					var attribute = child.getAttribute('name').toLowerCase();
					if(attribute == 'src' || attribute == 'filename' || attribute == 'movie')
					{
						var fileName = child.getAttribute('value');
						break;
					}
				}
			break;
			default: return false;
		}
		var fileType = fileName.substr(fileName.lastIndexOf('.') + 1).toLowerCase();
		var isVideo = (videoFileTypes.indexOf(fileType) != -1) ? true : false;
		return isVideo;
	},
	
	
	/**
	 * Obtiene el código HTML completo de un determinado nodo.
	 * @param	node (object) - El nodo analizado
	 * @return	sourceCode (string) - El código HTML obtenido
	 */
	getSourceCode : function(node)
	{
		var sourceCode = node.outerHTML;
		switch(node.nodeName)
		{
			case 'EMBED':
				return sourceCode;
			break;
			case 'OBJECT':
			case 'APPLET':
				var openTag = sourceCode.substr(0, sourceCode.indexOf('>') + 1).toLowerCase();
				var closeTag = sourceCode.substr(sourceCode.length - 9).toLowerCase();
				if(closeTag != '</object>' && closeTag != '</applet>')
				{
					/* Si el nodo está mal formado (etiquetas de apertura y cierre) se debe 
					anular el script ya que podría devolver un resultado incorrecto */
					return null;
				}
				if(embeddedContent.isMSIE)
				{
					/* Para I. Explorer se debe obtener aparte el código HTML de los nodos hijos,
					ya que la propiedad outerHTML en ocasiones devolverá un resultado incompleto */
					var innerCode = embeddedContent.getInnerCode(node);
					sourceCode = openTag + innerCode + closeTag;
				}
				return sourceCode;
			break;
		}
	},
	
	
	/**
	 * Obtiene el código HTML de los nodos hijos de un determinado nodo. No se debe utilizar directamente
	 * la propiedad innerHTML ya que en ciertos casos I. Explorer devolverá un resultado incompleto.
	 * @param	node (object) - El nodo padre que será analizado
	 * @return	innerCode (string) - El código HTML obtenido
	 */
	getInnerCode : function(node)
	{
		var innerCode = '';
		var totalChilds = node.childNodes.length - 1;
		for(var counter = totalChilds, child; child = node.childNodes[counter]; counter--)
		{
			innerCode += child.outerHTML;
		}
		return innerCode;
	}
	
}


/*
Debemos verificar que el agente de usuario cumpla con los requisitos míminos 
para que el script se pueda ejecutar correctamente:

1) Soporte para la propiedad outerHTML y el método getElementsByTagName()
2) El agente de usuario debe ser Internet Explorer u Ópera
*/
if(verifyOuterHTML = document.getElementsByTagName('HEAD')[0].outerHTML)
{
	verifyOuterHTML = null;
	if(document.all || window.opera)
	{
		window.attachEvent('onload', embeddedContent.reinsertContent);
	}
}