﻿/**

 * Project Name:	jActivating

 * Project URI:	http://jactivating.sourceforge.net

 * Description:	Allows website users to interact with embedded content without 'activating' it first

 * Author:		David Muñoz <donraspu AT gmail DOT com>

 * Version:		1.2.0 alpha 2 - May 16, 2007

 * License:		This software is Public Domain (no rights reserved)

 *

 * Installation: 

 * 1) Upload embeddedcontent.js into some directory on your web server.

 * 2) Include the JavaScript file in the <head> of your document like this:

 * 		<script type="text/javascript" src="embeddedcontent.js" defer="defer"></script>

 */

var jActivating =

{



	/**

	 * Declare constants

	 * IS_MSIE	checks for Internet Explorer 6 and later versions

	 * TAGS		array with affected HTML tags

	 */

	IS_MSIE : (document.removeNode && document.createAttribute) ? true : false,

	TAGS : ['object', 'embed', 'applet'],

	

	

	/**

	 * Activates embedded content reinserting it.

	 * @return void

	 */

	activateContent : function()

	{

		var i = 0;

		for(var _tagName; _tagName = jActivating.TAGS[i]; i++)

		{

			var j = 0;

			for(var _node; _node = document.getElementsByTagName(_tagName)[j]; j++)

			{

				if(jActivating.IS_MSIE)

				{

					jActivating.reinsertHtml(_node);

				}

				else

				{

					jActivating.reinsertNode(_node);

				}

			}

			

		}

		jActivating = null;

	},

	

	

	/**

	 * Sets outerHTML property.

	 * @param object	- The node

	 * @return void

	 */

	reinsertHtml : function(_node)

	{

		var _htmlCode = jActivating.getHtmlCode(_node);

		if(_htmlCode)

		{

			_node.outerHTML = _htmlCode;

		}

	},

	

	

	/**

	 * Replaces the node for a clone.

	 * @param object - The original node

	 * @return void

	 */

	reinsertNode : function(_node)

	{

		var _clone = _node.cloneNode(true);

		var _parent = _node.parentNode;

		if(_clone && _parent)

		{

			_parent.replaceChild(_clone, _node);

		}

	},

	

	

	/**

	 * Retrieves the object and its content in HTML.

	 * @param object - The analyzed node

	 * @return string - The HTML received, NULL for malformed syntax (end tag)

	 */

	getHtmlCode : function(_node)

	{

		var _htmlCode = _node.outerHTML;

		var _name = _node.nodeName.toLowerCase();

		if(_name == 'embed')

		{

			return _htmlCode;

		}

		if(_name == 'object' || _name == 'applet')

		{

			var _startTag = _htmlCode.substr(0, _htmlCode.indexOf('>') + 1);

			var _endTag = _htmlCode.substr(_htmlCode.length - 9).toLowerCase();

			// Filters malformed syntax for avoid unexpected results

			if(_endTag != '</object>' && _endTag != '</applet>')

			{

				return null;

			}

			var _innerHtml = jActivating.getInnerHtml(_node);

			_htmlCode = _startTag + _innerHtml + _endTag;

			return _htmlCode;

		}

	},

	

	

	/**

	 * Retrieves the HTML between start and end tags of the object.

	 * @param object - The analyzed node

	 * @return string - The HTML received

	 *

	 * NOTE: the innerHTML property isn't used because Internet Explorer

	 * sometimes returns a empty result.

	 */

	getInnerHtml : function(_node)

	{

		var _innerHtml = '';

		var i = 0;

		for(var _childNode; _childNode = _node.childNodes[i]; i++)

		{

			_innerHtml += _childNode.outerHTML;

		}

		return _innerHtml;

	}

}



// Execute script only for Internet Explorer (6+) and Opera (9+)

if(jActivating.IS_MSIE)

{

	jActivating.activateContent();

}

else if(window.opera)

{

	document.addEventListener('DOMContentLoaded', jActivating.activateContent, false);

}