From e4b937a92f94e94ac1e1e6cfa2c27ef68554114e Mon Sep 17 00:00:00 2001
From: David Norman <drupal@deekayen.net>
Date: Thu, 11 May 2006 22:17:09 +0000
Subject: XHTML improvements and ActiveX bugfix related to
 http://www.microsoft.com/downloads/details.aspx?familyid=B7D9801B-4FB5-492E-903E-3400ABF1D731&displaylang=en

---
 AC_QuickTime.js | 263 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 video.module    |  71 ++++++++-------
 2 files changed, 297 insertions(+), 37 deletions(-)
 create mode 100644 AC_QuickTime.js

diff --git a/AC_QuickTime.js b/AC_QuickTime.js
new file mode 100644
index 0000000..998d42c
--- /dev/null
+++ b/AC_QuickTime.js
@@ -0,0 +1,263 @@
+/*
+
+File: AC_QuickTime.js
+
+Abstract: This file contains functions to generate OBJECT and EMBED tags for QuickTime content.
+
+Version: <1.1>
+
+Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
+Computer, Inc. ("Apple") in consideration of your agreement to the
+following terms, and your use, installation, modification or
+redistribution of this Apple software constitutes acceptance of these
+terms.  If you do not agree with these terms, please do not use,
+install, modify or redistribute this Apple software.
+
+In consideration of your agreement to abide by the following terms, and
+subject to these terms, Apple grants you a personal, non-exclusive
+license, under Apple's copyrights in this original Apple software (the
+"Apple Software"), to use, reproduce, modify and redistribute the Apple
+Software, with or without modifications, in source and/or binary forms;
+provided that if you redistribute the Apple Software in its entirety and
+without modifications, you must retain this notice and the following
+text and disclaimers in all such redistributions of the Apple Software.
+Neither the name, trademarks, service marks or logos of Apple Computer,
+Inc. may be used to endorse or promote products derived from the Apple
+Software without specific prior written permission from Apple.  Except
+as expressly stated in this notice, no other rights or licenses, express
+or implied, are granted by Apple herein, including but not limited to
+any patent rights that may be infringed by your derivative works or by
+other works in which the Apple Software may be incorporated.
+
+The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
+MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
+THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
+OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
+OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
+MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
+AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
+STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+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 + '\n';
+	}
+
+	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 Array();
+	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")
+					+ '>\n'
+					+ _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>\n</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));
+}
diff --git a/video.module b/video.module
index f3e46a8..c49ae98 100644
--- a/video.module
+++ b/video.module
@@ -1169,7 +1169,7 @@ function theme_video_play_flash($node) {
                <param name="movie" value="'.$loader_location.'" />
                <param name="quality" value="high" />
                <param name="FlashVars" value="baseURL='. $url .'&videoFile='. $file .'&autoPlay=true&bufferLength=5" />
-               <embed src="'.$loader_location.'" flashvars="baseURL='. $url .'&videoFile='. $file .'&autoPlay=true&bufferLength=5"  width="'.$node->videox.'" height="'.$node->videoy.'" name="Player" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
+               <embed src="'.$loader_location.'" flashvars="baseURL='. $url .'&videoFile='. $file .'&autoPlay=true&bufferLength=5"  width="'.$node->videox.'" height="'.$node->videoy.'" name="Player" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed>
              </object>';
   $output = _theme_video_format_play($output, t('http://www.macromedia.com/go/getflashplayer'),
                                       t('Link to Macromedia Flash Player Download Page'),
@@ -1190,7 +1190,7 @@ function theme_video_play_swf($node) {
   $output = "<object width=\"$node->videox\" height=\"$node->videoy\">
                <param name=\"movie\" value=\"$node->vidfile\" />"
                . _video_get_parameters($node->serialized_data) .
-               "<embed src=\"$node->vidfile\" width=\"$node->videox\" height=\"$node->videoy\"></embed>
+               "<embed src=\"$node->vidfile\" width=\"$node->videox\" height=\"$node->videoy\" />
              </object>";
   $output = _theme_video_format_play($output, t('http://www.macromedia.com/go/getflashplayer'), t('Link to Flash player download'), t('Download the latest Flash player'));
   return theme('page', $output);
@@ -1199,6 +1199,7 @@ function theme_video_play_swf($node) {
 /**
  * Play videos from in Quicktime format
  *
+ * @see http://developer.apple.com/internet/ieembedprep.html
  * @param $node
  *   object with node information
  *
@@ -1206,14 +1207,11 @@ function theme_video_play_swf($node) {
  *   string of content to display
  */
 function theme_video_play_quicktime($node) {
+  drupal_set_html_head('<script src="'. drupal_get_path('module', 'video') .'/AC_QuickTime.js" language="JavaScript" type="text/javascript"></script>');
   $height = $node->videoy + 16; //Increase the height to accommodate the player controls on the bottom.
-  $output = '<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" width="'.$node->videox.'" height="'.$height.'" scale="tofit" codebase="http://www.apple.com/qtactivex/qtplugin.cab">
-                <param name="SRC" value="'.$node->vidfile.'" />
-                <param name="AUTOPLAY" value="true" />
-                <param name="KIOSKMODE" value="false" />
-                <embed src="'.$node->vidfile.'" width="'.$node->videox.'" height="'.$height.'" scale="tofit" autoplay="true" kioskmode="false" pluginspage="http://www.apple.com/quicktime/download/">
-                </embed>
-             </object>';
+  $output = '<script language="JavaScript" type="text/javascript">';
+  $output .= "QT_WriteOBJECT_XHTML('$node->vidfile','{$node->videox}','$height','','autoplay','true','kioskmode','false');";
+  $output .= '</script>';
   $output = _theme_video_format_play($output, t('http://www.apple.com/quicktime/download'),
                                       t('Link to QuickTime Download Page'),
                                       t('Download latest Quicktime Player'));
@@ -1233,22 +1231,22 @@ function theme_video_play_realmedia($node) {
   // Real's embeded player includes the controls
   // in the height
   $node->videoy += 40;
-  $output = '<object id="video1" CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" height="'.$node->videoy.'" width="'.$node->videox.'">
-              <param name="_ExtentX" value="7276">
-              <param name="_ExtentY" value="3307">
-              <param name="AUTOSTART" value="1">
-              <param name="SHUFFLE" value="0">
-              <param name="PREFETCH" value="0">
-              <param name="NOLABELS" value="0">
-              <param name="SRC" value="'.$node->vidfile.'" ref>
-              <param name="CONTROLS" value="All">
-              <param name="CONSOLE" value="Clip1">
-              <param name="LOOP" value="0">
-              <param name="NUMLOOP" value="0">
-              <param name="CENTER" value="0">
-              <param name="MAINTAINASPECT" value="0">
-              <param name="BACKGROUNDCOLOR" value="#000000">
-              <embed src="'.$node->vidfile.'" type="audio/x-pn-realaudio-plugin" console="Clip1" controls="All" height="'.$node->videoy.'" width="'.$node->videox.'" autostart="true">
+  $output = '<object id="video1" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" height="'.$node->videoy.'" width="'.$node->videox.'">
+              <param name="_ExtentX" value="7276" />
+              <param name="_ExtentY" value="3307" />
+              <param name="AUTOSTART" value="1" />
+              <param name="SHUFFLE" value="0" />
+              <param name="PREFETCH" value="0" />
+              <param name="NOLABELS" value="0" />
+              <param name="SRC" value="'.$node->vidfile.'" ref />
+              <param name="CONTROLS" value="All" />
+              <param name="CONSOLE" value="Clip1" />
+              <param name="LOOP" value="0" />
+              <param name="NUMLOOP" value="0" />
+              <param name="CENTER" value="0" />
+              <param name="MAINTAINASPECT" value="0" />
+              <param name="BACKGROUNDCOLOR" value="#000000" />
+              <embed src="'.$node->vidfile.'" type="audio/x-pn-realaudio-plugin" console="Clip1" controls="All" height="'.$node->videoy.'" width="'.$node->videox.'" autostart="true"></embed>
             </object>';
   $output = _theme_video_format_play($output, t('http://www.real.com/'),
                                       t('Link to Real'),
@@ -1269,24 +1267,23 @@ function theme_video_play_windowsmedia($node) {
   // Windows Media's embeded player includes the controls in the height
   $node->videoy += 68;
   $vidfile = _video_get_fileurl($node->vidfile) . basename($node->vidfile);
-  $output = '<OBJECT id="video1" width="'.$node->videox.'" height="'.$node->videoy.'"
+  $output = '<object id="video1" width="'.$node->videox.'" height="'.$node->videoy.'"
               classid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95"
               codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701"
               standby="Loading Microsoft Windows Media Player components..." type="application/x-oleobject">
-              <param name="fileName" value="'.$vidfile.'">
-              <param name="animationatStart" value="true">
-              <param name="transparentatStart" value="true">
-              <param name="autoStart" value="true">
-              <param name="showControls" value="true">
-              <param name="loop" value="true">
-              <EMBED type="application/x-mplayer2"
+              <param name="fileName" value="'.$vidfile.'" />
+              <param name="animationatStart" value="true" />
+              <param name="transparentatStart" value="true" />
+              <param name="autoStart" value="true" />
+              <param name="showControls" value="true" />
+              <param name="loop" value="true" />
+              <embed type="application/x-mplayer2"
                 pluginspage="http://microsoft.com/windows/mediaplayer/en/download/"
                 id="mediaPlayer" name="mediaPlayer" displaysize="4" autosize="-1"
                 showcontrols="true" showtracker="-1"
                 showdisplay="0" showstatusbar="-1" videoborder3d="-1" width="'.$node->videox.'" height="'.$node->videoy.'"
-                src="'.$vidfile.'" autostart="true" loop="true">
-              </EMBED>
-             </OBJECT>';
+                src="'.$vidfile.'" autostart="true" loop="true"></embed>
+             </object>';
 
   $output = _theme_video_format_play($output, t('http://windowsupdate.microsoft.com/'),
                                       t('Link to Windows Update'),
@@ -1309,7 +1306,7 @@ function theme_video_play_youtube($node) {
   $width = ($node->videox ? $node->videox : '425');
   $height = ($node->videoy ? $node->videoy : '350');
   $output = '<object width="'.$width.'" height="'.$height.'">
-               <param name="movie" value="http://www.youtube.com/v/' . $node->vidfile . '"></param>
+               <param name="movie" value="http://www.youtube.com/v/' . $node->vidfile . '" />
                <embed src="http://www.youtube.com/v/' . $node->vidfile . '" type="application/x-shockwave-flash" width="'.$width.'" height="'.$height.'"></embed>
              </object>';
   $output = _theme_video_format_play($output, t('http://www.youtube.com/help.php'), t('Link to youtube.com'), t('youtube.com'));
-- 
cgit v1.2.3