diff options
-rw-r--r-- | AC_QuickTime.js | 263 | ||||
-rw-r--r-- | video.module | 71 |
2 files changed, 297 insertions, 37 deletions
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')); |