(function(window, undefined) {
	
	var document = window.document;
	
	/*
	   Configuration filter for a UVP player.  
	   Consume a session XML and use it to filter the playlist based on m_driver and m_visitID.
	 */
	window.iEngageSessionManager = (function () {
			
		var playerInstance,
			parseCallback,
			sessionDict;
		
		//--------------------------------------------------------------------------
		//
		//  Private methods
		//
		//--------------------------------------------------------------------------
	
		function parseSession(jsonData) {
			sessionDict = {};
		
			if (!jsonData.visit instanceof Array) {
				jsonData.visit = [jsonData.visit];
			}
				
			$.each(jsonData.visit, function() {
				if (!this.slot instanceof Array) {
					this.slot = [this.slot];
				}
			
				if (!sessionDict[this.driver]) {
					sessionDict[this.driver] = {};
				}
			
				sessionDict[this.driver][this.visit] = this;
			});
		}
	
		function filterChapters(chapters, sourceID) {
			var chapterDict = {},
				driverID,
				visitID,
				searchType,
				driver,
				session;
		
			$.each(chapters, function() {
				chapterDict[this.id] = this;
			});
		
			chapters = [];
			
			if (sourceID == "idle") {
				driverID = "idle";
				visitID = 0;
				searchType = undefined;
			}
			else {
				driverID = uvp.getQueryParam("m_driver");
				if (driverID === undefined) {
					driverID = playerInstance.params.m_driver;
					
					if (driverID === undefined) {
						driverID = "F1";
					}
				}
				
				visitID = playerInstance.params.m_visitID;
				
				searchType = uvp.getQueryParam("m_searchType");
				if (searchType === undefined) {
					searchType = playerInstance.params.m_searchType;
				}
			}
			
			uvp.log("Filtering on driver: "+driverID+" visit: "+visitID);
			driver = sessionDict[driverID];
			if (driver) {
				session = driver[visitID];			
				if (session) {
					$.each(session.slot, function() {
						var chapter;
						if (searchType && chapterDict[this.vidId + " " + searchType]) {
							uvp.log("Using search type: "+searchType);
							chapter = chapterDict[this.vidId + " " + searchType];
						}
						else {
							chapter = chapterDict[this.vidId];
						}
						
						if (chapter) {
							if (this.hasOwnProperty("jumpTo")) {
								chapter.jumpTo = this.jumpTo;
							}
							else {
								delete chapter.jumpTo;
							}
							chapters.push(chapter);
						}
					});
				}
			}
		
			return chapters;
		}
		
		//--------------------------------------------------------------------------
		//
		//  Callbacks
		//
		//--------------------------------------------------------------------------

		function load_success(data, textStatus, xhr) {
			var jsonData = $.xml2json(data);
		
			if (jsonData) {
				parseSession(jsonData);
			}
			else {
				playerInstance.dispatchEvent("uvpError", ["unable to parse session config"]);
			}
		
			if (parseCallback) {
				parseCallback();
			}
		}

		function load_error(xhr, textStatus, errorThrown) {
		    playerInstance.dispatchEvent("uvpError", [errorThrown]);
		}
	
		//--------------------------------------------------------------------------
		//
		//  Public methods
		//
		//--------------------------------------------------------------------------
	
		return {
			init: function (player, callback) {		
				playerInstance = player;
				parseCallback = callback;	
				$.ajax({url: playerInstance.params.sessionConfigURL, type: 'GET', dataType: 'xml', success: load_success, error: load_error});
			},
		
			filter: function(chapters, sourceID) {
				return filterChapters(chapters, sourceID);
			}
		}
	}());

	/*
	   Add a convienence method to UVPlayerInstance which returns the visit type
	 */
	window.uvp.fn.getVisitType = function() {
		var visitType = "Unknown";
		
		switch (this.params.m_visitID) {
			case 0:
				visitType = "FF";
				break;
			case 1:
				visitType = "FR";
				break;
			case 2:
				visitType = "RF";
				break;
			case 3:
				visitType = "RR";
				break;
		}
		
		return visitType;
	};
})(window);
