/*

File: AC_WindowsMedia.js

Abstract: This file contains functions to generate OBJECT and EMBED tags for Windows Media 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 gWMGeneratorVersion		= 1.0;

//function AC_WindowsMediaVersion()	{ return gWMGeneratorVersion; }

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

function _WMAddAttribute(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 _WMAddObjectAttr(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 _WMAddAttribute("obj#", slotName, tagName);
}

function _WMAddEmbedAttr(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 _WMAddAttribute("emb#", slotName, tagName);
}


function _WMAddObjectParam(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 _WMDeleteTagAttrs()
{
	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 _WMGenerate(callingFcnName, generateXHTML, args)
{
	// is the number of optional arguments even?
	if ( args.length < 4 || (0 != (args.length % 2)) )
	{
		_WMComplain(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:22D6f312-B0F6-11D0-94AB-0080C74C7E95";
		//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.microsoft.com/windows/windowsmedia/player/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,4,7,1112";
	gTagAttrs["codebase"] = "http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.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 '
					+ _WMAddObjectAttr("classid")
					+ _WMAddObjectAttr("width")
					+ _WMAddObjectAttr("height")
					+ _WMAddObjectAttr("codebase")
					+ _WMAddObjectAttr("standby")
					+ _WMAddObjectAttr("filename")
					+ _WMAddObjectAttr("type")
					+ _WMAddObjectAttr("name", "id")
					+ _WMAddObjectAttr("tabindex")
					+ _WMAddObjectAttr("hspace")
					+ _WMAddObjectAttr("vspace")
					+ _WMAddObjectAttr("border")
					+ _WMAddObjectAttr("align")
					+ _WMAddObjectAttr("class")
					+ _WMAddObjectAttr("title")
					+ _WMAddObjectAttr("accesskey")
					+ _WMAddObjectAttr("noexternaldata")
					+ '>'
					+ _WMAddObjectParam("src", generateXHTML);
	var embedTag = '<embed '
					+ _WMAddEmbedAttr("src")
					+ _WMAddEmbedAttr("width")
					+ _WMAddEmbedAttr("height")
					+ _WMAddEmbedAttr("pluginspage")
					+ _WMAddEmbedAttr("name")
					+ _WMAddEmbedAttr("align")
					+ _WMAddEmbedAttr("tabindex");

	// delete the attributes/params we have already added
	_WMDeleteTagAttrs("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 += _WMAddEmbedAttr(attrName);
			objTag += _WMAddObjectParam(attrName, generateXHTML);
		}
	} 

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

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

function WM_GenerateOBJECTText_XHTML()
{
	return _WMGenerate("WM_GenerateOBJECTText_XHTML", true, arguments);
}

function WM_WriteOBJECT()
{
	document.writeln(_WMGenerate("WM_WriteOBJECT", false, arguments));
}

function WM_WriteOBJECT_XHTML()
{
	document.writeln(_WMGenerate("WM_WriteOBJECT_XHTML", true, arguments));
}


