/*

File: AC_QuickTime.js

Abstract: This file contains functions to generate OBJECT and EMBED tags for QuickTime content.

Version: <1.1>

Copyright © 2006 Apple Computer, Inc., All Rights Reserved

*/

/*
 * This file contains functions to generate OBJECT and EMBED tags for QuickTime content. 
 */

/************** LOCALIZABLE GLOBAL VARIABLES ****************/

var gArgCountErr =  'The "%%" function requires an even number of arguments.'
                +   '\nArguments should be in the form "atttributeName", "attributeValue", ...';

/******************** END LOCALIZABLE **********************/

var gTagAttrs               = null;
var gQTGeneratorVersion     = 1.0;

function AC_QuickTimeVersion()  { return gQTGeneratorVersion; }

function _QTComplain(callingFcnName, errMsg)
{
    errMsg = errMsg.replace("%%", callingFcnName);
    alert(errMsg);
}

function _QTAddAttribute(prefix, slotName, tagName)
{
    var     value;

    value = gTagAttrs[prefix + slotName];
    if ( null == value )
        value = gTagAttrs[slotName];

    if ( null != value )
    {
        if ( 0 == slotName.indexOf(prefix) && (null == tagName) )
            tagName = slotName.substring(prefix.length); 
        if ( null == tagName ) 
            tagName = slotName;
        return '' + tagName + '="' + value + '"';
    }
    else
        return "";
}

function _QTAddObjectAttr(slotName, tagName)
{
    // don't bother if it is only for the embed tag
    if ( 0 == slotName.indexOf("emb#") )
        return "";

    if ( 0 == slotName.indexOf("obj#") && (null == tagName) )
        tagName = slotName.substring(4); 

    return _QTAddAttribute("obj#", slotName, tagName);
}

function _QTAddEmbedAttr(slotName, tagName)
{
    // don't bother if it is only for the object tag
    if ( 0 == slotName.indexOf("obj#") )
        return "";

    if ( 0 == slotName.indexOf("emb#") && (null == tagName) )
        tagName = slotName.substring(4); 

    return _QTAddAttribute("emb#", slotName, tagName);
}


function _QTAddObjectParam(slotName, generateXHTML)
{
    var     paramValue;
    var     paramStr = "";
    var     endTagChar = (generateXHTML) ? ' />' : '>';

    if ( -1 == slotName.indexOf("emb#") )
    {
        // look for the OBJECT-only param first. if there is none, look for a generic one
        paramValue = gTagAttrs["obj#" + slotName];
        if ( null == paramValue )
            paramValue = gTagAttrs[slotName];

        if ( 0 == slotName.indexOf("obj#") )
            slotName = slotName.substring(4); 
    
        if ( null != paramValue )
            paramStr = '<param name="' + slotName + '" value="' + paramValue + '"' + endTagChar;
    }

    return paramStr;
}

function _QTDeleteTagAttrs()
{
    for ( var ndx = 0; ndx < arguments.length; ndx++ )
    {
        var attrName = arguments[ndx];
        delete gTagAttrs[attrName];
        delete gTagAttrs["emb#" + attrName];
        delete gTagAttrs["obj#" + attrName];
    }
}

        

// generate an embed and object tag, return as a string
function _QTGenerate(callingFcnName, generateXHTML, args)
{
    // is the number of optional arguments even?
    if ( args.length < 4 || (0 != (args.length % 2)) )
    {
        _QTComplain(callingFcnName, gArgCountErr);
        return "";
    }
    
    // allocate an array, fill in the required attributes with fixed place params and defaults
    gTagAttrs = new Object();
    gTagAttrs["src"] = args[0];
    gTagAttrs["width"] = args[1];
    gTagAttrs["height"] = args[2];
    gTagAttrs["classid"] = "clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B";
        //Impportant note: It is recommended that you use this exact classid in order to ensure a seamless experience for all viewers
    gTagAttrs["pluginspage"] = "http://www.apple.com/quicktime/download/";

    // set up codebase attribute with specified or default version before parsing args so
    //  anything passed in will override
    var activexVers = args[3]
    if ( (null == activexVers) || ("" == activexVers) )
        activexVers = "6,0,2,0";
    gTagAttrs["codebase"] = "http://www.apple.com/qtactivex/qtplugin.cab#version=" + activexVers;

    var attrName,
        attrValue;

    // add all of the optional attributes to the array
    for ( var ndx = 4; ndx < args.length; ndx += 2)
    {
        attrName = args[ndx].toLowerCase();
        attrValue = args[ndx + 1];

        // "name" and "id" should have the same value, the former goes in the embed and the later goes in
        //  the object. use one array slot 
        if ( "name" == attrName || "id" == attrName )
            gTagAttrs["name"] = attrValue;

        else 
            gTagAttrs[attrName] = attrValue;
    }

    // init both tags with the required and "special" attributes
    var objTag =  '<object '
                    + _QTAddObjectAttr("classid")
                    + _QTAddObjectAttr("width")
                    + _QTAddObjectAttr("height")
                    + _QTAddObjectAttr("codebase")
                    + _QTAddObjectAttr("name", "id")
                    + _QTAddObjectAttr("tabindex")
                    + _QTAddObjectAttr("hspace")
                    + _QTAddObjectAttr("vspace")
                    + _QTAddObjectAttr("border")
                    + _QTAddObjectAttr("align")
                    + _QTAddObjectAttr("class")
                    + _QTAddObjectAttr("title")
                    + _QTAddObjectAttr("accesskey")
                    + _QTAddObjectAttr("noexternaldata")
                    + '>'
                    + _QTAddObjectParam("src", generateXHTML);
    var embedTag = '<embed '
                    + _QTAddEmbedAttr("src")
                    + _QTAddEmbedAttr("width")
                    + _QTAddEmbedAttr("height")
                    + _QTAddEmbedAttr("pluginspage")
                    + _QTAddEmbedAttr("name")
                    + _QTAddEmbedAttr("align")
                    + _QTAddEmbedAttr("tabindex");

    // delete the attributes/params we have already added
    _QTDeleteTagAttrs("src","width","height","pluginspage","classid","codebase","name","tabindex",
                    "hspace","vspace","border","align","noexternaldata","class","title","accesskey");

    // and finally, add all of the remaining attributes to the embed and object
    for ( var attrName in gTagAttrs )
    {
        attrValue = gTagAttrs[attrName];
        if ( null != attrValue )
        {
            embedTag += _QTAddEmbedAttr(attrName);
            objTag += _QTAddObjectParam(attrName, generateXHTML);
        }
    } 

    // end both tags, we're done
    return objTag + embedTag + '></em' + 'bed></ob' + 'ject' + '>';
}

// return the object/embed as a string
function QT_GenerateOBJECTText()
{
    return _QTGenerate("QT_GenerateOBJECTText", false, arguments);
}

function QT_GenerateOBJECTText_XHTML()
{
    return _QTGenerate("QT_GenerateOBJECTText_XHTML", true, arguments);
}

function QT_WriteOBJECT()
{
    document.writeln(_QTGenerate("QT_WriteOBJECT", false, arguments));
}

function QT_WriteOBJECT_XHTML()
{
    document.writeln(_QTGenerate("QT_WriteOBJECT_XHTML", true, arguments));
}


