Bug Tracker

Changeset 5961

Show
Ignore:
Timestamp:
12/02/08 23:34:17 (1 month ago)
Author:
malsup
Message:

Numerous fixes/updates.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/plugins/media/jquery.media.js

    r4795 r5961  
    33 * 
    44 * Examples and documentation at: http://malsup.com/jquery/media/ 
    5  * Copyright (c) 2007 M. Alsup 
     5 * Copyright (c) 2007-2008 M. Alsup 
    66 * Dual licensed under the MIT and GPL licenses: 
    77 * http://www.opensource.org/licenses/mit-license.php 
     
    99 * 
    1010 * @author: M. Alsup 
    11  * @version: 0.75 (02/20/2008) 
     11 * @version: 0.84 (12/01/2008) 
    1212 * @requires jQuery v1.1.2 or later 
    1313 * $Id$ 
     
    3030 * Thanks to Dan Rossi for numerous bug reports and code bits! 
    3131 */ 
    32 (function($) { 
     32;(function($) { 
    3333 
    3434/** 
    3535 * Chainable method for converting elements into rich media. 
    3636 * 
    37  * @name media 
    38  * @param Object options Options object 
    39  * @param Function callback fn invoked for each matched element before conversion 
    40  * @param Function callback fn invoked for each matched element after conversion 
    41  * @cat Plugins/media 
     37 * @param options 
     38 * @param callback fn invoked for each matched element before conversion 
     39 * @param callback fn invoked for each matched element after conversion 
    4240 */ 
    4341$.fn.media = function(options, f1, f2) { 
     
    7068 
    7169            $div.css('backgroundColor', o.bgColor).width(o.width); 
    72              
    7370            // post-conversion callback, passes original element, new div element and fully populated options 
    7471            if (typeof f2 == 'function') f2(this, $div[0], o, player.name); 
     
    7875}; 
    7976 
    80 /** 
    81  * Chainable method for preparing elements to display rich media with 
    82  * a page overlay. 
    83  * 
    84  * @name mediabox 
    85  * @param Object options Options object 
    86  * @param Object css values for the media div 
    87  * @cat Plugins/media 
    88  */ 
    89 $.fn.mediabox = function(options, css) { 
    90     return this.click(function() { 
    91         if (typeof $.blockUI == 'undefined' || typeof $.blockUI.version == 'undefined' || $.blockUI.version < 1.26) { 
    92             if (typeof $.fn.mediabox.warning != 'undefined') return this; // one warning is enough 
    93             $.fn.mediabox.warning = 1; 
    94             alert('The mediabox method requires blockUI v1.26 or later.'); 
    95             return false; 
    96         } 
    97         var o, p, div=0, $e = $(this).clone(); 
    98         $e.appendTo('body').hide().css({margin: 0}); 
    99         options = $.extend({}, options, { autoplay: 1 }); // force autoplay in box mode 
    100         $e.media(options, function(){}, function(origEl, newEl, opts, player) { 
    101             div = newEl; 
    102             o = opts; 
    103             p = player; 
    104         }); 
    105         if (!div) return false; 
    106         // don't pull element from the dom on Safari 
    107         var $div = $.browser.safari ? $(div).hide() : $(div).remove(); 
    108  
    109         if (o.loadingImage) 
    110             $div.css({ 
    111                 backgroundImage:    'url('+o.loadingImage+')', 
    112                 backgroundPosition: 'center center', 
    113                 backgroundRepeat:   'no-repeat' 
    114             }); 
    115         if (o.boxTitle) 
    116             $div.prepend('<div style="margin:0;padding:0">' + o.boxTitle + '</div>'); 
    117          
    118         if (css) $div.css(css); 
    119  
    120         $div.displayBox( { width: o.width, height: o.height }, function(el) { 
    121             // quirkiness; sometimes media doesn't stop when removed from the DOM (especially in IE) 
    122             $('object,embed', el).each(function() { 
    123                 try { this.Stop();   } catch(e) {}  // quicktime 
    124                 try { this.DoStop(); } catch(e) {}  // real 
    125                 try { this.controls.stop(); } catch(e) {} // windows media player 
    126                 $(this).remove(); 
    127             }); 
    128         }, p == 'flash'); // <-- mac/ff workaround 
    129         return false; 
    130     }); 
    131 }; 
    132  
    133    
    13477/** 
    13578 * Non-chainable method for adding or changing file format / player mapping 
     
    15093    width:         400, 
    15194    height:        400, 
    152     preferMeta:    1,         // true if markup metadata takes precedence over options object 
    15395    autoplay:      0,         // normalized cross-player setting 
    15496    bgColor:       '#ffffff', // background color 
    155     params:        {},        // added to object element as param elements; added to embed element as attrs 
     97    params:        { wmode: 'transparent'},  // added to object element as param elements; added to embed element as attrs 
    15698    attrs:         {},        // added to object and embed elements as attrs 
     99    flvKeyName:    'file',    // key used for object src param (thanks to Andrea Ercolino) 
    157100    flashvars:     {},        // added to flash content as flashvars param/attr 
    158101    flashVersion:  '7',       // required flash version 
    159     expressInstaller: null, 
    160      
    161     // MediaBox options 
    162     boxTitle:      null,      // MediaBox titlebar 
    163     loadingImage:  null,      // MediaBox loading indicator 
     102    expressInstaller: null,   // src for express installer 
    164103     
    165104    // default flash video and mp3 player (@see: http://jeroenwijering.com/?item=Flash_Media_Player) 
     
    277216        types += $.fn.media.defaults.players[player].types; 
    278217    }; 
    279     return new RegExp('\\.(' + types.replace(/,/g,'|') + ')\\b'); 
     218    return new RegExp('\\.(' + types.replace(/,/g,'|') + ')$\\b'); 
    280219}; 
    281220 
     
    297236    // support metadata plugin (v1.0 and v2.0) 
    298237    var meta = $.metadata ? $el.metadata() : $.meta ? $el.data() : {}; 
     238    meta = meta || {}; 
    299239    var w = meta.width  || parseInt(((cls.match(/w:(\d+)/)||[])[1]||0)); 
    300240    var h = meta.height || parseInt(((cls.match(/h:(\d+)/)||[])[1]||0)); 
     241    
    301242    if (w) meta.width  = w; 
    302243    if (h) meta.height = h; 
     
    304245 
    305246    var a = $.fn.media.defaults; 
    306     var b = (($.meta || $.metadata) && $.fn.media.defaults.preferMeta) ? options : meta; 
    307     var c = b == options ? meta : options; 
     247    var b = options; 
     248    var c = meta; 
    308249 
    309250    var p = { params: { bgColor: options.bgColor || $.fn.media.defaults.bgColor } }; 
     
    324265// 
    325266 
    326 // generate flash using SWFObject if possible 
     267// generate flash using SWFObject library if possible 
    327268$.fn.media.swf = function(el, opts) { 
    328     if (typeof SWFObject == 'undefined') { 
     269    if (!window.SWFObject && !window.swfobject) { 
    329270        // roll our own 
    330271        if (opts.flashvars) { 
     
    341282    var cls = opts.cls ? (' class="' + opts.cls + '"') : ''; 
    342283    var $div = $('<div' + id + cls + '>'); 
    343     $(el).after($div).remove(); 
    344  
    345     var so = new SWFObject(opts.src, 'movie_player_' + counter++, opts.width, opts.height, opts.flashVersion, opts.bgColor); 
    346     if (opts.expressInstaller) so.useExpressInstall(opts.expressInstaller);     
    347  
    348     for (var p in opts.params) 
    349         if (p != 'bgColor') so.addParam(p, opts.params[p]); 
    350     for (var f in opts.flashvars) 
    351         so.addVariable(f, opts.flashvars[f]); 
    352     so.write($div[0]); 
     284 
     285    // swfobject v2+ 
     286    if (window.swfobject) { 
     287        $(el).after($div).appendTo($div); 
     288        if (!el.id) el.id = 'movie_player_' + counter++; 
     289 
     290        // replace el with swfobject content 
     291        swfobject.embedSWF(opts.src, el.id, opts.width, opts.height, opts.flashVersion,  
     292            opts.expressInstaller, opts.flashvars, opts.params, opts.attrs); 
     293    } 
     294    // swfobject < v2 
     295    else { 
     296        $(el).after($div).remove(); 
     297        var so = new SWFObject(opts.src, 'movie_player_' + counter++, opts.width, opts.height, opts.flashVersion, opts.bgColor); 
     298        if (opts.expressInstaller) so.useExpressInstall(opts.expressInstaller);     
     299 
     300        for (var p in opts.params) 
     301            if (p != 'bgColor') so.addParam(p, opts.params[p]); 
     302        for (var f in opts.flashvars) 
     303            so.addVariable(f, opts.flashvars[f]); 
     304        so.write($div[0]); 
     305    } 
    353306 
    354307    if (opts.caption) $('<div>').appendTo($div).html(opts.caption); 
     
    360313    var src = opts.src; 
    361314    var player = /\.mp3\b/i.test(src) ? $.fn.media.defaults.mp3Player : $.fn.media.defaults.flvPlayer; 
     315    var key = opts.flvKeyName; 
     316    src = encodeURIComponent(src); 
    362317    opts.src = player; 
    363     opts.src = opts.src + '?file=' + src; 
    364     opts.flashvars = $.extend({}, { file: src }, opts.flashvars ); 
     318    opts.src = opts.src + '?'+key+'=' + (src); 
     319    var srcObj = {}; 
     320    srcObj[key] = src; 
     321    opts.flashvars = $.extend({}, srcObj, opts.flashvars ); 
    365322    return $.fn.media.swf(el, opts); 
    366323}; 
     
    428385        for (var key in opts.attrs) 
    429386            a.push(key + '="'+opts.attrs[key]+'" '); 
    430         for (var key in o.oAttrs || {}) 
    431             a.push(key + '="'+o.oAttrs[key]+'" '); 
     387        for (var key in o.oAttrs || {}) { 
     388            var v = o.oAttrs[key]; 
     389            if (key == 'codebase' && window.location.protocol == 'https') 
     390                v = v.replace('http','https'); 
     391            a.push(key + '="'+v+'" '); 
     392        } 
    432393        a.push('></ob'+'ject'+'>'); 
    433394        var p = ['<param name="' + (o.oUrl || 'src') +'" value="' + opts.src + '">']; 
     
    446407            a.push(key + '="'+o.eAttrs[key]+'" '); 
    447408        for (var key in opts.params) 
    448             a.push(key + '="'+opts.params[key]+'" '); 
     409            if (key != 'wmode') // FF3/Quicktime borks on wmode 
     410                a.push(key + '="'+opts.params[key]+'" '); 
    449411        a.push('></em'+'bed'+'>'); 
    450412    }