// jquery.vplayer.js
// replaces video information on page with flash or html video player

(function($){                
    $.vplayer = {
        players: [],
        containers: [],
        count: 0
    };  
    $.vplayer.defaults = {  
        support: ['flowplayer', 'html'],
        width: 480,
        height: 270,
        src: '',
        autoplay: false
    };           
    $.vplayer.defaults.flowplayer = {
        swf: '/swf/flowplayer-3.1.5.swf',
        id: 'flowplayer',   
        scaling: 'fit',   
        autoBuffering: true,  
        key: '#@ad6933049a88872eba6',
        controls: {
            autoHide: "always",
            height: 22,
            backgroundColor: '#000000',
            backgroundGradient: 'none',
            fontColor: '#ffffff'
        }
    };
    $.vplayer.defaults.flash = {
        version: '9.0.0', 
        allowFullScreen:'true', 
        allowScriptAccess: 'always',
        wmode: 'opaque',
        bgcolor: '#000000'
    };
                       
    $.vplayer.options = $.vplayer.defaults;
        
    $.vplayer.linkState = {
        generate: function(obj) {
            obj.prepend($('<a href="'+$.vplayer.options.src+'">'+$.vplayer.options.src+'</a>'));
        },
        isSupported: function() {
            return true;
        }
    };  
    $.vplayer.htmlState = {
        generate: function(obj) {
            var options = $.vplayer.options;
            obj.prepend($('<video width="'+options.width+'" height="'+options.height+'" src="'+options.src+
                (options.autoplay? '" autoplay="true"': '')+'" controls="controls"/>'));
        },
        isSupported: function() {
            return $.vplayer.nativeVideoSupport();
        }
    };
    $.vplayer.flowplayerState = {
        generate: function(obj) {
            var options = $.vplayer.options;
            var objectId = options.flowplayer.id+ $.vplayer.count;
            obj.prepend($('<a href="'+options.src+'" id="'+objectId+'"/>'));
            $('#'+objectId).css({
                 height: options.height + 'px', width: options.width + 'px'
            });
            var videoPlayer = flowplayer(objectId, options.flowplayer.swf, {
                 plugins: {
                     controls: options.flowplayer.controls
                 },
                 key: options.flowplayer.key, 
                 clip: {
                     autoPlay: options.autoplay? true: false,
                     scaling: options.flowplayer.scaling,
                     autoBuffering: options.flowplayer.autoBuffering
                 },
                 canvas: {
                    backgroundGradient: 'none'
                 },
                 logo: {opacity: 0}
            });
        },
        isSupported: function() {
            return (window.flowplayer && (parseInt($.vplayer.getFlashVersion()) >= 9)) ? true : false;
        }
    };
    $.vplayer.pickState = function() {        
        var supportArray = $.vplayer.options.support;
        var stateName, state = false;
        for (var i=0; i < supportArray.length; i++) if (!state){
             stateName = supportArray[i] + 'State';
             if ($.vplayer[stateName] && $.vplayer[stateName].isSupported()) {
                 state = $.vplayer[stateName];
             }
        };
        if (!state) {
            state = $.vplayer.linkState;
        };
        return state;
    };
    $.vplayer.pushPlayer = function(obj) {
        //add a video player to array at $.vplayer.players     
        var playerJQuery = $('*:first', obj) 
        var vplayerIndex = obj[0].vplayerIndex;
        $.vplayer.player = playerJQuery[0]; 
        //add that element to the players array if it has a pause function.
        if ((playerJQuery.length > 0) && (typeof playerJQuery[0].pause == 'function')) {
            $.vplayer.player = playerJQuery[0];
            $.vplayer.index = vplayerIndex;
            $.vplayer.players[vplayerIndex] = $.vplayer.player;
            $.vplayer.containers[vplayerIndex] = obj[0];
            if (typeof playerJQuery[0].unpause == 'function') {
                playerJQuery[0].play = function() {this.unpause()};
            };
        } else if (window.flowplayer && $f(vplayerIndex)) {
            $.vplayer.player = $f(vplayerIndex);
            $.vplayer.index = vplayerIndex;
            $.vplayer.players[vplayerIndex] = $.vplayer.player;
            $.vplayer.containers[vplayerIndex] = obj[0];
        } else {
            setTimeout(function(){$.vplayer.pushPlayer(obj)}, 200);
            return false;
        }
        if (typeof $.vplayer.pushPlayerCallBack == 'function') {
            $.vplayer.pushPlayerCallBack($.vplayer.player);
        }
    };
    $.vplayer.getFlashVersion = function(){
        try {    
            try {   // ie
                var axo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.6');
                try { axo.AllowScriptAccess = 'always'; }
                catch(e) { return '6,0,0'; }
            } catch(e) {}
            return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
        } catch(e) {    
            try {   // other browsers
                if(navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin){
                    return (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g, ",").match(/^,?(.+),?$/)[1];
                }
            } catch(e) {};
        };
        return '0,0,0';
    };
    $.vplayer.nativeVideoSupport = function() {
        return $.browser.webkit || $.browser.safari ? true : false;
    };
    $.vplayer.getVideoInfo = function(selector, obj) {
         var text = $(selector, obj).text();
         var cleanString = function(s){ s=s||''; return s.replace(/^\s*|\s*$/g,'')};
         var param, params = cleanString(text).split(',');
         for (var p=0; p < params.length; p++) {
             param = params[p].split('=');
             $.vplayer.options[cleanString(param[0])] = cleanString(param[1]);
         }
    };
    $.vplayer.getVideoTagInfo = function(obj) {
        var videoTag = $('video', obj);
        videoTag.each(function() {
            for (var prop in $.vplayer.options) if (this.getAttribute(prop)) {
                $.vplayer.options[prop] = this.getAttribute(prop);
            }
        });
        videoTag.remove();
    };
    $.vplayer.onPlayerAdded = function(obj, vplayerIndex) {
    };
    $.fn.vplayer = function(options) {   
        if (typeof options == 'undefined') {
            options = {};
        } 
        return this.each(function() {
            obj = $(this);
            obj.children().hide();
            $.vplayer.getVideoTagInfo(obj)            
            if (options.videoInfo) {
                $.vplayer.getVideoInfo(options.videoInfo, obj);
            };
            $.vplayer.options = $.extend(true, $.vplayer.defaults, options);
            if (options.support) {
                $.vplayer.options.support = options.support;    
            };
            obj.css({width: $.vplayer.options.width+'px', height: $.vplayer.options.height+'px'});
            var state = $.vplayer.pickState();
            state.generate(obj);
            $(this)[0].vplayerIndex = $.vplayer.count;
            $.vplayer.pushPlayer(obj);
            $.vplayer.onPlayerAdded(obj, $.vplayer.count);
            $.vplayer.count++;
        });
    };
})(jQuery);

