﻿if (!SproutJS) SproutJS = {};
Object.extend(SproutJS, {
    TPlayer: function() {
        var Controls = function() {
            //takes an element, and wraps the onclick handler with a method that toggles the state of the button.
            //that state is then passed to the underlying click handler as the only argument
            //if the state becomes true the className provided in states.on is added to the element and vice versa
            var toggleButton = function(element, click, classStates, titleStates) {//{on:'imon', off:'imoff'}
                var setState = function(_state) {
                    element.removeClassName(_state ? classStates.off : classStates.on);
                    element.addClassName(_state ? classStates.on : classStates.off);
                    element.setAttribute('title', _state ? titleStates.on : titleStates.off);
                    return state = _state;
                }
                var toggleState = function() {
                    return setState(!state);
                }
                var element = $(element),
                    state = element ? element.hasClassName(classStates.on) : null;

                if (element) {
                    if (click) {
                        element.observe('click', function() {
                            setState(click.apply(null, [!state]));
                        });
                    }
                    return Object.extend(element, {
                        setState: setState,
                        toggleState: toggleState
                    });
                }
                return;
            }

            var wrapper = function(handler) {
                return handler.wrap(function() {
                    if (!disabled) {
                        var args = $(arguments);
                        args.shift().apply(null, args);
                    }
                });
            }

            var disable = function(val) {
                disabled = val;
            }

            var block = function(val) {
                if (val) {
                    root.addClassName('disabled');
                    root.insert(roadblock);
                    document.getElementById('player-extras').style.display = 'none';
                } else {
                    root.removeClassName('disabled');
                    if (roadblock.up())
                    {
                        roadblock.remove();
                        document.getElementById('player-extras').style.display = 'block';
                    }
                }
            }

            var root = $('player-controls'),
                roadblock = new Element('div', { id: 'roadblock' }).update('Advertisement'),
                disabled = false,
                muteBtn = toggleButton(root.select('button.mute').first(), mute, { on: 'muted', off: 'mute' }, { on: 'Sound On', off: 'Sound Off' }),
                fs = root.select('button.fs').first(),
                back = root.select('button.back').first(),
                pauseBtn = toggleButton(root.select('button.pause, button.play').first(), pause, { on: 'play', off: 'pause' }, { on: 'Play', off: 'Pause' }),
                next = root.select('button.next').first();

            if (fs) fs.observe('click', showFullScreen);
            if (back) back.observe('click', playPrev);
            if (next) next.observe('click', playNext);

            return {
                mute: muteBtn,
                fs: fs,
                back: back,
                pause: pauseBtn,
                next: next,
                block: block,
                disable: disable
            }
        };
        var ids = [],
	        playingId = null,
	        baseUrl = null,
	        loaded = false,
	        repeat = false,
	        buttons = null,
	        pendingId = null,
	        waitingForCreate = false,
	        autoPlay = true,
	        adPlaying = false,
	        adVars = null,
	        isPlaying = false,
            player = null,
	        comm = null;

        var create = function() {
            player.create();
            tpController.addEventListener("OnMediaStart", "SproutJS.TPlayer.onMediaStart");
            tpController.addEventListener("OnPlayerLoaded", "SproutJS.TPlayer.onPlayerLoaded");
            tpController.addEventListener("OnSetRelease", "SproutJS.TPlayer.onSetRelease");
            tpController.addEventListener("OnSetReleaseUrl", "SproutJS.TPlayer.onSetReleaseUrl");
            tpController.addEventListener("OnMediaLoadStart", "SproutJS.TPlayer.onReleaseStart");
            tpController.addEventListener("OnReleaseEnd", "SproutJS.TPlayer.onReleaseEnd");
            tpController.addEventListener("OnShowFullScreen", "SproutJS.TPlayer.onShowFullScreen");
            if (!buttons)
                buttons = Controls();
        };

        var recreate = function(nextId) {
            autoPlay = false;
            adPlaying = false;
            pendingId = nextId;

            tpSetCommManagerID(comm.id);
            tpRegisterID(player.id);

            waitingForCreate = true;
            comm.create();
        }

        var finishRecreate = function() {
            waitingForCreate = false;
            create();
            playById(pendingId);
        }

        var ready = function() {
            return (ids && ids.length > 0 && tpController && loaded);
        };

        var init = function(_player, _comm) {
            if (_player && _comm) {
                player = _player;
                comm = _comm;
                tpSetCommManagerID(comm.id);
                tpRegisterID(player.id);
                comm.create();
                create();
            }
        }

        var getTrackingVars = function(vid) {
            return { "eVar39": vid, "prop39": vid };
        }

        var fireVideoPlay = function(vid) {
            SproutJS.Controls.OmniTrack({ vars: getTrackingVars(vid), events: ['event12'], name: 'Video Start Event' });
        }

        function fireVideoDone(vid) {
            SproutJS.Controls.OmniTrack({ vars: getTrackingVars(vid), events: ['event13'], name: 'Video End Event' });
        }

        var setIds = function(list, bu, rpt, _adVars) {
            ids = list;
            if (bu)
                baseUrl = bu;
            if (rpt)
                repeat = rpt;

            //build ad vars
            var delim = baseUrl.include('?') ? '&' : '?',
	            adVarString = Object.toQueryString(Object.extend({
	                kw: '',
	                s1: ''
	            }, _adVars));

            baseUrl += delim + adVarString;

            if (autoPlay)
                play();
        }

        var playById = function(id) {
            if (!ready()) return false;
            try {
                if (adPlaying) return recreate(id);
                fireVideoPlay(id);
                tpController.setReleaseURL(baseUrl + "&pid=" + id);
                playingId = id;
                if (buttons && buttons.pause)
                    buttons.pause.setState(false);
                return true;
            } catch (e) {
                log(e);
                isPlaying = false;
            }
            return false;
        }

        var playIndex = function(idx) {
            if (!ready())
                return;
            playById(ids[idx]);
        }

        var playPrev = function() {
            if (!ready()) return;
            var prev = ids.indexOf(playingId) - 1;
            if (prev > -1) {
                playIndex(prev);
            }
        }

        var stop = function() {
            isPlaying = false;
        }

        var playNext = function() {
            if (!ready()) return;
            var next = ids.indexOf(playingId) + 1;
            if (next >= ids.length) {
                next = 0;
                if (!repeat) {
                    return stop();
                }
            }
            return playIndex(next);
        }

        var play = function() {
            if (!ready())
                return;
            var hash = window.location.hash.substr(1, window.location.hash.length - 1);
            if (hash && ids.member(hash)) {
                playById(hash);
            } else {
                playIndex(0)
            }
        }

        var showFullScreen = function() {
            tpController.showFullScreen(true)
        }

        var pause = function(val) {
            if (ready()) {
                tpController.pause(val);
                buttons.pause.setState(val);

                if (!isPlaying && !val)
                    play();
                    
                return val;
            } return !val;
        }

        var mute = function(val) {
            if (ready()) {
                tpController.mute(val);
                buttons.mute.setState(val);
                return val;
            } return !val;
        }

        var onPlayerLoaded = function(evt) {
            loaded = true;
            if (autoPlay)
                play();
            if (SproutJS.Util.Cookies.getCookie('shhh') == 'true') {
                mute(true);
            }
        }

        var fireNowPlaying = function(id) {
            //            window.location.hash = id;
            //disable buttons until the requested video plays
            buttons.disable(true);
            document.fire("TPlayer:nowPlaying", { id: id });
        }

        var onSetRelease = function(evt) {
            playingId = evt.data;
            fireNowPlaying(playingId);
            log(evt);
        }

        var onSetReleaseUrl = function(evt) {
            playingId = evt.data.toQueryParams().pid;
            fireNowPlaying(playingId);
            log(evt);
        }

        var onReleaseEnd = function(evt) {
            buttons.pause.setState(true);
            if (!evt.data || evt.data.isComplete) {
                fireVideoDone(playingId);
                playNext();
            }
            log(evt);
        }

        var onReleaseStart = function(evt) {
            //reenable buttons
            buttons.disable(false);
            log(evt);
        }

        var onMediaStart = function(evt) {
            buttons.pause.setState(false);
            isPlaying = true;
            if (evt && evt.data && evt.data.isAd) {
                document.fire('TPlayer:adStart', evt.data);
                adPlaying = true;
                buttons.block(true);
            } else {
                document.fire('TPlayer:noAdStart', evt.data);
                adPlaying = false;
                buttons.block(false);
            }
            log(evt);
        }

        var onShowFullScreen = function(evt) {
            tpController.disablePlayerControls(false);
            log(evt);
        }

        var log = function(msg) {
            if (window.console && SproutJS.Config.shouldDebug)
                console.log(msg);
        }

        //ugly i know, but required to stop video play during roadblocks        
        tpReceiveMessage = tpReceiveMessage.wrap(function() {
            if (waitingForCreate && arguments[1] == 'commReady') {
                waitingForCreate = false;
                finishRecreate();
            }
            var args = $A(arguments);
            args.shift().apply(null, args);
        });

        return {
            init: init,
            setIds: setIds,
            playById: playById,
            playIndex: playIndex,
            playPrev: playPrev,
            playNext: playNext,
            play: play,
            showFullScreen: showFullScreen,
            pause: pause,
            mute: mute,
            onShowFullScreen: onShowFullScreen,
            onMediaStart: onMediaStart,
            onReleaseEnd: onReleaseEnd,
            onSetReleaseUrl: onSetReleaseUrl,
            onSetRelease: onSetRelease,
            onPlayerLoaded: onPlayerLoaded
        }
    } ()
});