/**
 * Handles all the room selection related javascript for the embedded game page. Please try to keep 100% self contained if possible.
 */
(function($) {
	var methods = {
			
		_isLoading : false,
		
		sortDirection : 0, // ascending, 1 is for descending
			
		isLoading : function() {
			return methods._isLoading;
		},
		
		fixUrl : function(url) {
			if (url) {
				if (url.indexOf('?') < 0) {
					url += '?';
				}
				var lastChar = url.charAt(url.length-1);
				if ((lastChar != '?') && (lastChar != '&')) {
					url += '&';
				}
			}
			return url;
		},
		
		startLoading : function() {
			// Turn 'loading flag' on
			methods._isLoading = true;
			// Disable controls
			var overlay = $('#controls-overlay');
			var controls = $('#controls');
			if (overlay && overlay.length && controls && controls.length) {
				overlay.css('top', controls.css('top'));
				overlay.css('left', controls.css('left'));
				overlay.css('width', controls.css('width'));
				overlay.css('height', controls.css('height'));
				overlay.show();
			}
		},
		
		endLoading : function() {
			// Turn 'loading flag' off
			methods._isLoading = false;
			// Re-enable controls
			var overlay = $('#controls-overlay');
			if (overlay && overlay.length) {
				overlay.hide();
			}
		},

		getGlobalVar : function(varName) {
			if ((typeof(GLOBAL_VARS) === 'object') && GLOBAL_VARS[varName]) {
				return GLOBAL_VARS[varName];
			}
			return null;
		},

		handlePlayNow : function() {
			if (!methods.getGlobalVar('IS_FGF')) {
				if (typeof(JvmTester) != 'undefined') {
					// Craft a return page that will trigger the popup on the post-install return page
					var newLocation = document.location.toString();
					if (newLocation.indexOf('&') < 0) {
						newLocation += '&';
					}
					var newLocation = document.location.toString();
					if (newLocation.indexOf('?') < 0) {
						newLocation += '?';
					}
					if ((typeof(deployJava.isPluginInstalled) == 'function')
							&& !deployJava.isPluginInstalled()) {
						// encode the return page so that parameters are not eaten by Sun' s script.
						//   We might have to remove the "if" if Sun make returnPage encoding uniform between the JDT plugin & online installer 
						newLocation = encodeURIComponent(newLocation);
					}
					deployJava.returnPage = newLocation;
					if (!JvmTester.testJavaVersion()) {
						return;
					}
				}
				else {
					// If JvmTester is not there, have probably forgotten to include java-detect-glue.jsp
					//  Most of the users will have Java so open the popup anyway (uncomment the alert to track those cases)
					pogoLog('java not tested!'); 
				}
			}

			//load the game. see on hashchange event
			location.hash = EGP_STATES.GAME;
		},	

		getRoomSelUrl : function(options) {
			var url = methods.getGlobalVar('ROOM_SEL_URL');
			if (url) {
				url = methods.fixUrl(url);
				url += 'egp=true';
				if (typeof(options) == 'object') {
					if (options['filterType'] && options['filterValue']) {
						var filter = '&' + options['filterType'] + '=';
						filter += options['filterValue']
						url += filter;
					}
				}
			}
			return url;
		},
		
		preLoad : function(json) {
			if (json) {
				if (json['rooms'] && json['rooms'].length && json['rooms'][0]) {
					roomSel.maxPlayers = json['rooms'][0]['maxPlayers'];
				}
				else {
					roomSel.maxPlayers = 0;
				}
			}
			else {
				methods.startLoading();
				// Hide any error currently shown
				var parent = $('#load-error');
				if (parent && parent.length) {
					var children = parent.children('div');
					if (children && children.length) {
						children.hide();
					}
				}
			}
		},
		
		doLoad : function(options) {
			if (methods.isLoading()) {
				return;
			}
			methods.preLoad();
			var url = methods.getRoomSelUrl(options);
			$('#roomsTemplate').processFeed({
				data:url,
				preprocessFeed:methods.preLoad,
				postLoad:methods.postLoad
			});
		},
		
		postLoad : function(success) {
			methods.endLoading();
			if(success){
				var rooms = $('#rooms span.room-name-false');
				if (rooms && rooms.length) {
					rooms.roomSelector('changeRoom');
				}
				methods.setupSort();
				var span = $('span.maxPlayers');
				if (span && span.length) {
					var maxPlayers = '?';
					if (roomSel.maxPlayers) {
						maxPlayers = roomSel.maxPlayers;
					}
					span.text(maxPlayers);
				}
			}
		},
		
		changeFilter : function(element, filterType, controlsSelector) {
			var source = $(element);
			if (source && source.length && !source.hasClass('selected')) {
				var filterValue = source.attr('id');
				if (filterValue) {
					var controls = $(controlsSelector);
					if (controls.length) {
						controls.removeClass('selected');
						source.addClass('selected');
						var radio = source.find('input[type="radio"]');
						if (radio && radio.length) {
							radio.attr('checked', 'true');
						}
					}
					methods.doLoad({
						'filterType'  : filterType,
						'filterValue' : filterValue
					});
				}
			}
		},
		
		changeRoom : function(element) {
			var source = $(element);
			if (source && source.length) {
				var roomId = source.attr('id');
				//update the game playing. See hashchange event
				$(".last-visited .inRoom").hide();
				$(".last-visited .noTnRoom").show();
				if (roomId) {
					$(".last-visited .inRoom."+roomId).show();
					$(".last-visited .notInRoom."+roomId).hide();
					location.hash = EGP_STATES.GAME + "_" + roomId;
					var pageSection = source.attr('pageSection');
					if (pageSection){
						OmnitureLightEvent(pageSection, false);
					}
				} else {
					location.hash = EGP_STATES.GAME;
				}
			}
		},
		
		sortTable : function(sortOption) {
			var roomlist = $('#roomlist');
			if (roomlist && roomlist.length) {
				var column = methods.getColumnIndex(sortOption);
				var sorting = [ [column,0] ];
				roomlist.trigger('sorton', [sorting]);
			}
		},
		
		getColumnIndex : function(arg) {
			if (typeof(arg) === 'string') {
				var headers = $('#roomlist tr th');
				if (headers && headers.length) {
					var column = 0;
					for (var i = 0; i < headers.length; i++) {
						var header = $(headers[i]);
						if (header && header.length) {
							if (arg == header.attr('data-sort-option')) {
								break;
							}
						}
						column++;
					}
					return column;
				}
			}
			else {
				var eventObject = arg;
				if ((typeof(eventObject) === 'object') && eventObject.target) {
					var target = eventObject.target;
					if ((typeof(target) === 'object') && target.config) {
						var config = target.config;
						if ((typeof(config) === 'object') && config.sortList) {
							var sortList = config.sortList;
							if ((typeof(sortList) === 'object') && sortList.length) {
								var firstSortCriteria = sortList[0];
								return firstSortCriteria[0];
							}
						}
					}
				}
			}
			return -1;
		},
		
		updateSortSelector : function(eventObject) {
			methods.setSortDirection(eventObject);
			var columnIndex = methods.getColumnIndex(eventObject) + 1;
			if (columnIndex) {
				var header = $('#roomlist tr th.sorted:nth-child(' + columnIndex + ')');
				if (header && header.length) {
					var sortOption = header.attr('data-sort-option');
					var option = $('select.sort-selector option[value="' + sortOption + '"]');
					if (option && option.length) {
						option.attr('selected', 'selected');
					}
					else {
						var selector = $('select.sort-selector');
						if (selector && selector.length) {
							selector.attr('selectedIndex', '-1');
						}
					}
				}
			}
		},
		
		setSortDirection : function(eventObject) {
			if ((typeof(eventObject) === 'object') && eventObject.target) {
				var target = eventObject.target;
				if ((typeof(target) === 'object') && target.config) {
					var config = target.config;
					if ((typeof(config) === 'object') && config.sortList) {
						var sortList = config.sortList;
						if ((typeof(sortList) === 'object') && sortList.length) {
							var firstSortCriteria = sortList[0];
							if (firstSortCriteria && firstSortCriteria.length > 1) {
								var sortDirection = firstSortCriteria[1];
								if (typeof(sortDirection) != 'undefined') {
									methods.sortDirection = sortDirection;
								}
							}
						}
					}
				}
			}
		},
		
		setupSort : function() {
			var initialSortedColumn = 0;
			var selected = $('select.sort-selector option:selected');
			if (selected && selected.length) {
				var sortOption = selected.attr('value');
				initialSortedColumn = methods.getColumnIndex(sortOption);
			}
			var roomlist = $('#roomlist');
			var sortDirection = methods.sortDirection;
			if (typeof(sortDirection) == 'undefined') {
				sortDirection = 0;
			}
			if (roomlist && roomlist.length) {
				try{
					roomlist.tablesorter({
						debug          : false,
						cssAsc         : 'sortAsc',
						cssDesc        : 'sortDesc',
						cssHeader      : 'sorted',
						headers        : {
							0 : { sorter : 'digit' },
							1 : { sorter : 'digit' },
							2 : { sorter : 'digit' },
							3 : { sorter : 'digit' },
							4 : { sorter : 'digit' },
							5 : { sorter : 'digit' },
							6 : { sorter : 'digit' }
						},
						sortList       : [ [initialSortedColumn,sortDirection] ],
						textExtraction : function(node) {
							var sortOrder = $(node).attr('data-sort-order');
							if (sortOrder) {
								return sortOrder;
							}
							return Number.NaN;
						},
						widgets : [ 'clubPogoAggregate', 'zebra' ]
					});
				} catch (err) {
					//ie7 chokes on this
				}
				roomlist.bind('sortEnd', methods.updateSortSelector);
			}
		}

	};
		
	var roomSel = {
			
		intervalId : null,

		init : function() {
			if (roomSel.intervalId == null) {
				var refreshInterval = 5 * 60 * 1000; // 5 minutes
				var refreshFunction = function() {
					methods.doLoad();
				};
				// Set up the room list refresh
				roomSel.intervalId =  window.setInterval(refreshFunction, refreshInterval);
				// Wire event handlers
				var rules = $('#controls .rule');
				if (rules && rules.length) {
					rules.roomSelector('changeRule');
				}
				var tabs = $('#controls .tab');
				if (tabs && tabs.length) {
					tabs.roomSelector('changeTab');
				}
			}
		},

		show : function() {
			var gameLandingTabs = $("#gameLandingTabs");
			if (gameLandingTabs && gameLandingTabs.length) {
				var numTabs = gameLandingTabs.tabs('length');
				gameLandingTabs.tabs('select', numTabs-1);
			}
		},
		
		load : function() {
			roomSel.init();
			methods.doLoad();
		},
		
		changeRule : function() {
			methods.changeFilter(this, 'rule', '#controls li.rule');
		},
		
		changeTab : function() {
			methods.changeFilter(this, 'tab', '#controls li.tab');
		},
		
		changeRoom : function() {
			methods.changeRoom(this);
		},
		
		sort : function(sortOption) {
			methods.sortTable(sortOption);
		}

	};
	
	$.fn.roomSelector = function(method) {
		//pogoLog('roomSelector(', method, ')');
		$(this).click(function() {
			//pogoLog('egp-room-selector::click()');
			if (roomSel[method]) {
				return roomSel[method].apply(this, Array.prototype.slice.call(arguments, 1));
			}
			if (typeof(method) === 'object' || !method) {
				return roomSel.init.apply(this, arguments);
			}
			alert('Wrong egp-room-selector method: "' + method + '"');
		});
	};
	
	$.tablesorter.addWidget({ 
		id    : 'clubPogoAggregate', 
		format: function(table) {
			var aggregatedRow = $('tr[data-is-aggregated="true"]', table);
			if (aggregatedRow && aggregatedRow.length) {
				aggregatedRow.remove();
				aggregatedRow.prependTo('tbody.roomlist');
			}
		} 
	});
	
	$(document).ready(function() {
		var changeRoomSelLink = $('#roomselLink');
		if (changeRoomSelLink && changeRoomSelLink.length) {
			changeRoomSelLink.roomSelector('show');
		}

		
		var sortSelector = $('select.sort-selector');
		if (sortSelector && sortSelector.length) {
			sortSelector.change(function() {
				var selected = $('select.sort-selector option:selected');
				if (selected && selected.length) {
					var sortOption = selected.attr('value');
					roomSel.sort(sortOption);
				}
			});
		}
		var gameLandingTabs = $("#gameLandingTabs");
		if (gameLandingTabs && gameLandingTabs.length && gameLandingTabs.hasClass('show-room-info-true')) {
			var numTabs = gameLandingTabs.tabs('length');
			gameLandingTabs.bind('tabsshow', function(){
				var curTab = $('#gameLandingTabs .ui-tabs-nav .tab.ui-state-active');
				var selectedTab = curTab.attr('tabtitle');
				if(selectedTab=='roomsel'){
					roomSel.load();
				}
			});
			var numTabs = gameLandingTabs.tabs('length');
			if(numTabs>0){//if initialized show content right away
				var curTab = $('#gameLandingTabs .ui-tabs-nav .tab.ui-state-active');
				var selectedTab = curTab.attr('tabtitle');
				if(selectedTab=='roomsel'){
					roomSel.load();
				}
			}
		}
	});
})(jQuery);
