﻿var CIPlayer = new function(){
    var _globalListeners = {};
    var _playerInstances = {};
    var _toArray = function(array){
        var i = array.length;
        var ret = new Array();
        while (i) {
            ret[--i] = array[i]
        };
        return ret;
    }
	
	var _findPlayer=function(lookup){
		if(_playerInstances[lookup]){
			return _playerInstances[lookup].instance;
		}
		for(var id in _playerInstances){
			if(_playerInstances[id].name==lookup){
				return _playerInstances[id].instance;
			}
		}
		return false;
	}
    return {
        STREAMERS: {
            LIGHTTPD: 'lighttpd',
            HTTP: 'http',
            RTMP: 'rtmp'
        },
        events: {
            USER_ACTIONS: {
                PLAY: 'View::PLAY',
                SEEK: 'View::SEEK',
                VOLUME: 'View::VOLUME'
            },
            PLAYER_ACTIONS: {
                RESIZE_VIDEO: 'Controller::RESIZE_VIDEO',
                PLAYER_RESIZE: 'Controller::RESIZE',
                VOLUME: 'Controller::VOLUME',
                FINISHED: 'Controller:FINISHED',
                SEEK: 'Controller::SEEK',
                PAUSE: 'Controller::PAUSE',
                PLAY: 'Controller::PLAY',
				LOAD_ITEM:'Controller::LOAD'
            },
            STATUS: {
                TIME: 'Model::TIME',
				LOADED:"Model::LOADED"
            },
            GLOBAL: {
                INIT: 'View::INIT'
            }
        },
        
        global: {
            register: function(event, callback){
                if (!_globalListeners[event]) {
                    _globalListeners[event] = [];
                }
                _globalListeners[event].push(callback);
                
                
            },
            broadcast: function(event, data, instanceID){
                if (!instanceID) {
                    if (_globalListeners[event] && _globalListeners[event].length) {
                        for (var idx in _globalListeners[event]) {
                            _globalListeners[event][idx].call(null, data);
                        }
                        
                    }
                }
                
                var player = _findPlayer(instanceID);
                
                if (player) {
                    player.forward(event, data);
                }
            }
        },
		/**
		 * Returns all player instances
		 * @see CIPlayer.instance
		 * @return Array<CIPlayerInstance>
		 */
		players:function(){
			var players=[];
			for(var id in _playerInstances){
				players.push(_playerInstances[id].instance);
			}
			return players;
		},
		playerIDs:function(){
			var ids=[];
			for(var id in _playerInstances){
				ids.push(ids)
			}
			return ids;
		},
        instance: function(playerID){
			var CIPlayerInstance;
			CIPlayerInstance=_findPlayer(playerID);
			if(CIPlayerInstance)return CIPlayerInstance;
            var _playerID = playerID;
            var _instanceID = (new Date()).getTime();
            
            var _player = document.getElementById(_playerID);
            
           	/**
           	 * Callback registry
           	 */           
            var _callbacks = [];
            
            var _call = function(){
            
                if (_player) {
                
                    try {
                        var args = _toArray(arguments);
                        var method = args.shift();
                        
                        return _player[method].apply(_player, args);
                    } 
                    catch (e) {
                        //console.log(e);
                    }
                }
                return false;
            }
            CIPlayerInstance={
                getPlayerID: function(){
                    return _playerID;
                },
                getInstanceID: function(){
                    return _instanceID;
                },
                forward: function(event, data){
                    //console.log("video.forward", event, data);
                    for (var idx in _callbacks[event]) {
					
                        _callbacks[event][idx].call(null, data);
                    }
                },
                togglePlayPause: function(){
                
                    _call('jsAction','togglePlayPause');
                },
                unsubscribe: function(event, callback){
                    if (_call("unsubscribe", _instanceID, event)) {
                        if (!callback) {
                            // Remove all events if no callback is passed
                            _callbacks[event] = [];
                        }
                        else {
                        
                            var idx = (_callbacks[event] || []).indexOf(callback);
                            if (idx) {
                                _callbacks[event].splice(idx, 1);
                            }
                        }
                    }
                    return this;
                },
                subscribe: function(event, callback){
                
                    if (_call('subscribe', _instanceID, event)) {
                        if (!_callbacks[event]) {
                            _callbacks[event] = [];
                        }
                        // Register a callback for the requested event
                        _callbacks[event].push(callback);
						
                        
                    }
                    
                    return this;
                },
				enterFullscreen:function(){
					_call("jsAction",'enterFullScreen');
					
				},
                stop: function(){
                    _call('jsAction', 'stop');
					return this;
                },
                play: function(item){
                    if (item) {
                        _call('jsAction', 'play', item.data());
                    }
                    else {
                        _call('jsAction', 'togglePlayPause');
                    }
					return this;
                },
                pause: function(){
                    _call('jsAction', 'togglePlayPause');
                },
                next: function(){
                    _call('jsAction', 'next');
                },
                prev: function(){
                    _call('jsAction','prev');
                },
                seek: function(timecode, isPercentage){
                    _call('jsAction', 'seek', timecode, (typeof isPercentage == "undefined") ? false : isPercentage);
                },
                isFullscreen: function(){
                    return _call('jsAction', 'isFullScreen');
                }
                
                
            }
			_playerInstances[_instanceID]={instance:CIPlayerInstance,id:_instanceID,name:_playerID};
			return CIPlayerInstance;
			
            
        },
        video: function(file){
            
            var _props = {
                streamer: CIPlayer.STREAMERS.HTTP,
				file:file,
				autoplay:true
            }
            return {
				setAutoPlay:function(value){
					_props['autoplay']=value;
				},
                setStreamer: function(streamer){
                    _props['streamer'] = streamer;
                    
                },
                setSeekable: function(seekable){
                    _props["seekable"] = seekable;
                },
                data: function(){
                    var tmp = {};
                    for (var i in _props) {
                        tmp[i] = _props[i];
                    }
                    return tmp;
                }
                
                
            }
        }
    }
    
    
    
}();



