﻿function swfObjectReplace(item, readyCallBack) {    
    var eId = item.attr("id");
    var objects = item.find('object');
    var hasObjects = false;
    
    if(objects.length > 0) {
        hasObjects = true;
        var replacementDiv = $('<div></div>');
        replacementDiv.attr("id", 'swfObjectContainer' + eId);
        
        objects.each(function(i){
            // extract necessary bits from existing object 
            var o = $(this);                
            var movie = o.find('param[name="movie"]');                
            
            // IE workaround :-|
            if(movie.length == 0) {
                movie = o.find("embed").attr("movie");
            } else {
                movie = movie.attr("value");
            }
            
            if(movie.indexOf('youtube.com') > 0) {
                var reg = /v\/(.*?)&/;
                var parsedUrl = reg.exec(movie);                
                movie = 'http://www.youtube.com/watch?v=' + parsedUrl[1];
            } else {
                movie = escape(movie);
            }	                
            var height = o.attr("height");
            var width = o.attr("width");        
            var customFlashVars = o.find('param[name="flashvars"]');
            
            // insert new container and remove existing object	                	                
            o.before(replacementDiv);
            o.remove();	       
                     
            // re-build with swfobject
            var flashvars = 'file=' + movie + '&autostart=false&playerready=' + readyCallBack;
            if(customFlashVars.length > 0) {            
                 flashvars += "&" + customFlashVars.attr("value");
            }        
            
            var params = { 
                'allowfullscreen': 'true', 
                'allowscriptaccess': 'always', 
                'bgcolor': '#ffffff',
                'wmode': 'transparent',
                'flashvars': flashvars
            };		            
            var attributes = { 'id': 'swfObjectEmbed-' + eId, 'name': 'swfObjectEmbed-' + eId };                    
            swfobject.embedSWF(
                "/app_assets/jwplayer5.swf", 
                'swfObjectContainer' + eId, 
                width, height, '9', '', false, params, attributes
            );                      
        });
    }    
    
    return hasObjects;
}

function swRotator_swfObjectLoaded(obj) {
    var player = document.getElementById(obj['id']);
    player.addViewListener("play", "swRotator_swfObjectPlayListener");
    player.addModelListener("state", "swRotator_swfObjectStateChangeListener");
            
    var rotator = $('#' + obj['id']).closest('.swRotator');
    if(rotator.hasClass('swFader')) {        
        var api = rotator.find('.pager').data("api");
    } else {
        var api = rotator.find('.scrollable').data('scrollable');
    }        
    
    // set rotator to start after an initial delay
    api.timer = setTimeout(function() {
            api.play();
        }, 
        api.interval + 2000
    );
}

function swRotator_swfObjectPlayListener(obj) { 
    var isPlaying = obj.state;
    
    // get API instance; location depends on transition type
    var rotator = $('#' + obj.id).closest('.swRotator');        
    if(rotator.hasClass('swFader')) {        
        var api = rotator.find('.pager').data("api");
    } else {
        var api = rotator.find('.scrollable').data('scrollable');
    }
            
    if(isPlaying) {
        // Clear initial timer if still set and stop to prevent 
        // pager.hover event from restarting the transition
        if(api.timer) clearTimeout(api.timer); 
        api.stop(); 
    } else  {
        setTimeout(function() {
                api.play();
            }, 
            api.interval
        );
    }
}        

function swRotator_swfObjectStateChangeListener(obj) {        
    // auto restart transition once video has finished playing
    if(obj.newstate == "COMPLETED") {
        // get API instance; location depends on transition type
        var rotator = $('#' + obj.id).closest('.swRotator');        
        if(rotator.hasClass('swFader')) {        
            var api = rotator.find('.pager').data("api");
        } else {
            var api = rotator.find('.scrollable').data('scrollable');
        }
                    
        setTimeout(function() {
                api.play();
            }, 
            api.interval
        );
    }
}      


var swRotator = function(options) {        
    var r = this;
    
    var container = null;
    var slider = null;
    var items = null;
    var item = null;
    var pager = null;
    var height = null;
    var width = null;
    var widthUnits = null;
    var transition = null;
    var vertical = null;
    var delay = null;
    var speed = null;
    var showPager = null;
    
    r.init = function(options) {
        r.container = options.container ? options.container : null;
        r.height = options.height ? options.height : null;
        r.width = options.width ? options.width : null;
        r.widthUnits = options.widthUnits ? options.widthUnits : null;
        r.transition = options.transition ? options.transition : null;
        r.vertical = options.vertical;
        r.reversed = options.reversed;
        r.delay = options.delay ? options.delay * 1000 : 3000;
        r.speed = options.speed ? options.speed * 1000 : 400;
        r.showPager = options.showPager;
        
        // abort if no container
        if(!r.container) return false;            
        
        r.container = $('#' + r.container);
        r.slider = r.container.find(".scrollable");
        r.pager = r.container.find(".pager");                
        r.items = r.slider.find('.items');
        r.item = r.items.find('.item');
        r.setDimensions();
        
        // slide setup
        if(r.transition == 'swSlider') {                
            var options = { circular: true, vertical: false, speed: r.speed };
            var autoscroll_options = { autopause: false, autoplay: false, interval: r.delay };
            var nav_options = { navi: '#' + r.container.attr("id") + ' .pager', activeClass: 'current' };
                            
            // set dimensions
            if(r.vertical) {                
                r.items.height('20000em');
                options.vertical = true;
            } else {
                r.items.width('20000em');
                r.item.css({float: 'left'});
            }   
            
            if (r.showPager){
                r.pager.show();
                // set first pager item as current
                r.pager.find('a:first').addClass('current');
            }
            
            
            // initialize slider and pull out api reference
            r.slider = r.slider.scrollable(options).autoscroll(autoscroll_options).navigator(nav_options);
            var api = r.slider.data('scrollable');
            // api doesn't expose interval, so need to create an explicit reference
            api.interval = r.delay;        	    
    	    	    
            // reverse next/prev functions when transition direction is right or down
            if(r.reversed) {   
                api.seekTo(r.item.length - 1, 0)
                     
                api.getConf().prev = '.next';
                api.getConf().next = '.prev';
                api.next = function(time) {	        
                    return api.move(-1, time);
                }
                api.prev = function(time) {	        
                    return api.move(1, time);
                }	    
            }        	    
                      
        } 
        // fade setup
        else {                
            var item_selector = '#' + r.container.attr("id") + ' .scrollable .items .item';                                
            var options = { effect: 'fade', fadeOutSpeed: 'slow', rotate: true, fadeInSpeed: r.speed };                
            var slide_options = {
                api: true,
                autopause: false,
                autoplay: false,
                clickable: false,
                interval: r.delay
            };
            
            if (r.showPager){
                r.pager.show();
            }
            
            // initialize fader    
            var api = r.pager.tabs(item_selector, options).slideshow(slide_options);	    
            api.interval = slide_options.interval;
    	    
            // store api reference for access from jw player api events
            r.pager.data('api', api);
        }
        
        // Replace any object elements with jw players via swfobject
        var hasObjects = false;
        r.item.each(function(i){
            var result = swfObjectReplace($(this), 'swRotator_swfObjectLoaded');
            if(result == true && (i == 0 || (r.reversed && i == r.item.length-1))) hasObjects = true;
        });
	    
        // only start autoplay if no objects found besides the first item, 
        // otherwise start is triggered by swRotator_swfObjectLoaded
        if(!hasObjects) {
            setTimeout(function() { api.play(); }, api.interval );
        }
    }
    
    
    r.setDimensions = function() {
        r.slider.height(r.height + 'px');
        r.slider.width(r.width + r.widthUnits);      
        
        r.item.height(r.height + 'px');        
        if(r.widthUnits == '%') {
            r.item.width(r.slider.width());
        } else {
            r.item.width(r.width + 'px');
        }
    }
    
    
    r.init(options);        
}