﻿/**
 * 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);
}