var KwgPlayerController = document.KwgPlayerController = function KwgPlayerController(pFlashId, options) {
	var self = {};
	self.defaultTimeout				= 10000; // 10 Seconds
	self.options					= options;
	self.registered					= false;
	self.ON_CAPTURE_EVENT			= "onImageCaptured";
	self.ON_CHAPTER_CHANGED_EVENT	= "onChapterChanged";
	self.ON_COMPLETE_EVENT			= "onComplete";
	self.ON_READY_EVENT				= "onReady";
	self.ON_PLAY_EVENT				= "onPlay";
	self.ON_PAUSE_EVENT				= "onPause";
	self.ON_VOLUME_CHANGE_EVENT		= "onVolumeChange";
	self.ON_SUBTITLE_CHANGE_EVENT	= "onSubtitleChange";
	self.ON_METADATA				= "onMetadata";
	
	//self.ON_PERCENT_EVENT			= "onPercentPlay";
	
	//self.ON_STOP_EVENT			= "onStop";
	//self.ON_STOP_EVENT				= "onSeekChange";
	//self.ON_MUTE_EVENT				= "onMute";
	//self.ON_SUBTITLE_CHANGED_EVENT	= "onSubtitleChange";
	//self.ON_ACTIVATE_EVENT			= "onActivate";
	//self.ON_DEACTIVATE_EVENT		= "onDeactivate";
	
	
	/* Finding right node (First embed in the list). */
	self.getPlayerInstance = function () {
		var l = 0, i = 0,
			o = window[pFlashId] ? window[pFlashId] : document[pFlashId];
		
		if (o === undefined || o.length == 0) {
			return false;
		}
		
		if (o.length > 1) {
			for (i,l=o.length;i<l;i++) {
				if (o[i].tagName.toUpperCase() == 'OBJECT') {
					self.playerInstance = o[i];
					return true;
				}
			}
		}
		
		self.playerInstance = o;
		return true;
	}


	self.register = function () {
		self.cbHandler = self.options.callbackHandler;
		self.playerInstance.registerJSController(self.options.baseObjectReference);
		self.registered = true;
	};
	
	self.kewegoPlayerEvent = function (event, arg1, arg2) {
		self.cbHandler(event, arg1, arg2);
	};
	
	
	self.setVolume = function (level){
		if (!self.registered) {
			throw new Error('[KwgPlayerController.setVolume] Connexion to Flash Component unavailable.');
			return false;
		}
		self.playerInstance.setVolume(level);
	}
	
	self.kseek = function (percent){
		if (!self.registered) {
			throw new Error('[KwgPlayerController.kseek] Connexion to Flash Component unavailable.');
			return false;
		}
		self.playerInstance.kseek(percent);
	}
	
	self.kseekTo = function (timecode){
		if (!self.registered) {
			throw new Error('[KwgPlayerController.kseekTo] Connexion to Flash Component unavailable.');
			return false;
		}
		self.playerInstance.kseekTo(timecode);
	}
	
	self.kpause = function (){
		if (!self.registered) {
			throw new Error('[KwgPlayerController.kpause] Connexion to Flash Component unavailable.');
			return false;
		}
		self.playerInstance.kpause();
	}
	
	self.kplay = function (){
		if (!self.registered) {
			throw new Error('[KwgPlayerController.kplay] Connexion to Flash Component unavailable.');
			return false;
		}
		self.playerInstance.kplay();
	}
	
	self.togglePlay = function (){
		if (!self.registered) {
			throw new Error('[KwgPlayerController.togglePlay] Connexion to Flash Component unavailable.');
			return false;
		}
		self.playerInstance.togglePlay();
	}
	
	self.toggleMute = function (){
		if (!self.registered) {
			throw new Error('[KwgPlayerController.toggleMute] Connexion to Flash Component unavailable.');
			return false;
		}
		self.playerInstance.toggleMute();
	}
	
	self.gotoChapter = function (chapterNb){
		if (!self.registered) {
			throw new Error('[KwgPlayerController.gotoChapter] Connexion to Flash Component unavailable.');
			return false;
		}
		self.playerInstance.gotoChapter(chapterNb);
	}
	
	self.previousChapter = function (){
		if (!self.registered) {
			throw new Error('[KwgPlayerController.previousChapter] Connexion to Flash Component unavailable.');
			return false;
		}
		self.playerInstance.previousChapter();
	}
	
	self.nextChapter = function (){
		if (!self.registered) {
			throw new Error('[KwgPlayerController.nextChapter] Connexion to Flash Component unavailable.');
			return false;
		}
		self.playerInstance.nextChapter();
	}
	
	self.setSubtitle = function (language_code){
		if (!self.registered) {
			throw new Error('[KwgPlayerController.setSubtitle] Connexion to Flash Component unavailable.');
			return false;
		}
		self.playerInstance.setSubtitle(language_code);
	}
		
	self.captureImage = function (width, height) {
		if (!self.registered) {
			throw new Error('[KwgPlayerController.captureImage] Connexion to Flash Component unavailable.');
			return false;
		}
		
		var width = width || 128,
			height = height || 96;
		
		return self.playerInstance.captureImage(width, height);
	}
	
	self.setChaptersList = function (chaptersList){
		if (!self.registered) {
			throw new Error('[KwgPlayerController.setChaptersList] Connexion to Flash Component unavailable.');
			return false;
		}
		self.playerInstance.setChaptersList(chaptersList);
	}
	
	self.playSig = function (sig, autostart){
		if (!self.registered) {
			throw new Error('[KwgPlayerController.playSig] Connexion to Flash Component unavailable.');
			return false;
		}
		self.playerInstance.playSig(sig, autostart);
	}
	

	
	/* init */
	var step = 10, d = new Date(); 
	var timeout = d.getTime() + ((self.options.timeout && self.options.timeout > 100)?self.options.timeout:self.defaultTimeout), 
		iterations = 0, 
		t = function playerInstanceWaiter() {
			iterations++;
			if (new Date().getTime() >= timeout) {
				throw new Error('[KwgPlayerController.playerInstanceWaiter] Timeout reached while waiting for DOM ready');
			}
			
			if (!self.getPlayerInstance()) {
				setTimeout(playerInstanceWaiter, step);
				return false;
			} 
			else {
				var ASTimeout = function ASAPIWaiter() {
					iterations++;
					if (new Date().getTime() >= timeout) {
						throw new Error('[KwgPlayerController.ASAPIWaiter] Timeout reached while waiting for Flash registration');
					}
					
					if (!self.playerInstance.registerJSController) {
						setTimeout(ASAPIWaiter, step);
						return false;
					}
					self.register();
					return true;
				}()
				return true;
			}
		}();
	
	return self;
}
