//SC:2008
//use jquery with conflict mode
//var $j = jQuery.noConflict();

SBCOM.namespace("modules");

SBCOM.modules.buddyListUrl				=	"/ajax/user/buddies/";
SBCOM.modules.activityVideosUrl 		=	"/ajax/user/activity/videos/";
SBCOM.modules.activityVideosFavsUrl 	= 	"/ajax/user/activity/videos/favs/";
SBCOM.modules.activityVideosFavsUrlNC	= 	"/ajax/user/activity/videos/favs/nc/";
SBCOM.modules.activityVideosTopUrl		=	"/ajax/user/activity/videos/top/";
SBCOM.modules.activityGamesUrl			=	"/ajax/user/activity/games/";
SBCOM.modules.activityGamesFavsUrl		=	"/ajax/user/activity/games/favs/";
SBCOM.modules.activityGamesFavsUrlNC	=	"/ajax/user/activity/games/favs/nc/";
SBCOM.modules.activityGamesTopUrl		=	"/ajax/user/activity/games/top/";
SBCOM.modules.activityScoresUrl			=	"/ajax/user/activity/scores/";

SBCOM.modules.activityGamesStudioSaved 		=	"/ajax/user/activity/game-builder/saved/";
SBCOM.modules.activityGamesStudioPublished 	=	"/ajax/user/activity/game-builder/published/";
SBCOM.modules.activityGamesStudioFavs		=	"/ajax/user/activity/game-builder/favs/";
SBCOM.modules.activityGamesStudioFavsNC		=	"/ajax/user/activity/game-builder/favs/nc/";
SBCOM.modules.activityGamesStudioPlayed		=	"/ajax/user/activity/game-builder/played/";

SBCOM.modules.activeUsers		=	"/ajax/users/most-active/";

SBCOM.modules.profileHomeUrl		=	"/fans/profile/";
SBCOM.modules.ERROR_LOGIN			=	"notLoggedIn";
SBCOM.modules.STATUS_LOGGED_OUT		=	"loggedOut";
SBCOM.modules.MSG_LOGIN				=	"Please login";
SBCOM.modules.MSG_NO_ACTIVITY				= 	"Play games & watch videos and they'll show up here!";
SBCOM.modules.MSG_NO_ACTIVITY_GAMES			= 	"Play games and they'll show up here!";
SBCOM.modules.MSG_NO_ACTIVITY_VIDEOS		= 	"Watch videos and they'll show up here!";
SBCOM.modules.MSG_NO_ACTIVITY_BUDDIES		= 	"Add buddies and they'll show up here!";
SBCOM.modules.MSG_NO_ACTIVITY_GAMES_FAVS	= 	"Add games to your favorites and they'll show up here!";
SBCOM.modules.MSG_NO_ACTIVITY_VIDEOS_FAVS	= 	"Add videos to your favorites and they'll show up here!";
SBCOM.modules.MSG_NO_ACTIVITY_GAMES_STUDIO	= 	"You haven't created any games yet.  Why not try making one now? Go to 'Create a Game'";
SBCOM.modules.MSG_NO_ACTIVITY_GAMES_STUDIO_PLAYED	= 	"Play game builder games and they'll show up here!";
SBCOM.modules.MSG_NO_ACTIVITY_GAMES_STUDIO_FAVORITE	= 	"Add game builder games to your favorites and they'll show up here!";


SBCOM.modules.moduleList = new Array();

// username coming from url translation -- requested user's profile
SBCOM.modules.defaultProfileUser = 'sbcom-myprofile'; //Profile.ftl
SBCOM.modules.requestedUser = null;

// Called from Profile.ftl
SBCOM.modules.doLoadProfile = function(user) {
	//SBCOM.utils.doLog("SB: doLoadProfile: "+user);
	SBCOM.modules.requestedUser = user;
	doCheckLogin(SBCOM.modules.doLoadProfileQueued);
}

SBCOM.modules.doLoadProfileQueued = function() {
	var user = SBCOM.modules.requestedUser;

	if(user == null || user == SBCOM.modules.defaultProfileUser) {
		SBCOM.modules.doLoadUserData(user);		
		SBCOM.profile.settings.enableSettings(user);
	} else {
		// check for private profile -- todo: add check for buddies
		SBCOM.profile.getAttribute(SBCOM.profile.attributePrivacy, function(response) {
			if(response.attributeValue == 'private') {
				SBCOM.utils.doMessage('msg_profile_private');
				return;
			}
			SBCOM.modules.doLoadUserData(response.screenName);
		}, null, user);
	}
}

// User logged in: iterate through the queued profile module requests and initiate a data load
SBCOM.modules.doLoadUserData = function(user) {
	var loggedInUser = getLoggedInUser().screenName;

	if(user == null || user == SBCOM.modules.defaultProfileUser) {
		// No user requested by client -- load current user's profile if logged in
		if(SBCOM.utils.isEmptyString(loggedInUser)) {
			doDisplayLogin();
			return;
		} else {
			user = loggedInUser;
		}
	}

	if(SBCOM.modules.moduleList == null) return;
	SBCOM.utils.doLog('SB: doLoadUserData: user: '+user);

	//SBCOM.utils.printObj(user);
	$('username').set('html', user);
	SBCOM.profile.getInfo(user);

	/*
	for(var i = 0; i < SBCOM.modules.moduleList.length; i++) {
		SBCOM.utils.doLog('SB: doLoadUserData: '+SBCOM.modules.moduleList[i].moduleId);
		SBCOM.modules.doLoadProfileModule(SBCOM.modules.moduleList[i].moduleId, SBCOM.modules.moduleList[i].maxItems, user);
	}
	*/
	SBCOM.modules.doLoadModules(user);
}

SBCOM.modules.doLoadModules = function(user) {
	if(SBCOM.modules.moduleList == null) return;

	for(var i = 0; i < SBCOM.modules.moduleList.length; i++) {
		//SBCOM.utils.doLog('SB: doLoadModules: '+SBCOM.modules.moduleList[i].moduleId);
		SBCOM.modules.doLoadProfileModule(SBCOM.modules.moduleList[i].moduleId, SBCOM.modules.moduleList[i].maxItems, user);
	}
}

// queue a profile module load
SBCOM.modules.addModule = function(moduleId, maxItems) {
	if(SBCOM.modules.moduleList == null) SBCOM.modules.moduleList = new Array();
	SBCOM.modules.moduleList.push({moduleId:moduleId, maxItems:maxItems});	
}

// Load profile data feeds
SBCOM.modules.doLoadProfileModule = function(moduleId, maxItems, user) {
	//if(!user || user == '' || typeof(user) != 'string') return;

	SBCOM.utils.hideElement(moduleId +'DivModel');

	var dataUrl;
	var dataParser;
	var type;
	var loggedInUser = getLoggedInUser().screenName;
	var params = {};

	if(moduleId == 'myBuddies') {
		dataUrl = SBCOM.modules.buddyListUrl + user;
		dataParser = SBCOM.modules.getBuddyData;
		type = 'buddies';
	} else if(moduleId == 'watchedVideos') {
		dataUrl = SBCOM.modules.activityVideosUrl + user + '/0/';
		dataParser = SBCOM.modules.getVideosData;
		type = 'videos';
	} else if(moduleId == 'myGames') {
		dataUrl = SBCOM.modules.activityGamesUrl + user + '/0/';
		dataParser = SBCOM.modules.getGamesData;
		type = 'games';
	} else if(moduleId == 'favVideos') {
		if(user == loggedInUser) {
			dataUrl = SBCOM.modules.activityVideosFavsUrlNC + user + '/0/';
		} else {
			dataUrl = SBCOM.modules.activityVideosFavsUrl + user + '/0/';
		}
		dataParser = SBCOM.modules.getVideosFavsData;
		type = 'videosfavorites';
	} else if(moduleId == 'favGames') {
		if(user == loggedInUser) {
			dataUrl = SBCOM.modules.activityGamesFavsUrlNC + user + '/0/';
		} else {
			dataUrl = SBCOM.modules.activityGamesFavsUrl + user + '/0/';
		}
		dataParser = SBCOM.modules.getGamesFavsData;
		type = 'gamesfavorites';
	} else if(moduleId == 'topRatedGames') {
		SBCOM.utils.doLog('> TopGames');
		dataUrl = SBCOM.modules.activityGamesTopUrl;
		dataParser = SBCOM.modules.getGamesData;
		type = 'games';
	} else if(moduleId == 'topRatedVideos') {
		SBCOM.utils.doLog('> TopVideos');
		dataUrl = SBCOM.modules.activityVideosTopUrl;
		dataParser = SBCOM.modules.getVideosData;
		type = 'videos';
	} else if(moduleId == 'mostActiveFans') {
		SBCOM.utils.doLog('> ActiveUsers');
		dataUrl = SBCOM.modules.activeUsers;
		dataParser = SBCOM.modules.getActiveUsersData;
	} else if(moduleId == 'SavedGames') {
		//dataUrl = SBCOM.modules.activityGamesStudioSaved + user + '/';
		var rand = Math.random();
		dataUrl = 'http://' + SBCOM.utils.getNickDomain() + '/gamestudio/data/getSavedGamesJSON.jhtml?nickName=' + user + "&rand=" + rand;
		dataParser = SBCOM.modules.getGamesStudioDataSaved;
		type = 'games_studio_saved';
	} else if(moduleId == 'PublishedGames') {
		dataUrl = SBCOM.modules.activityGamesStudioPublished;
		dataParser = SBCOM.modules.getGamesStudioDataPublished;
		params = {memberName:user};
		type = 'games_studio_published';
	} else if(moduleId == 'GamesStudioPlayed') {
		dataUrl = SBCOM.modules.activityGamesStudioPlayed + user + '/0/';
		dataParser = SBCOM.modules.getGamesStudioDataPublished;
		type = 'games_studio_played';
	} else if(moduleId == 'GamesStudioFavorite') {
		if(user == loggedInUser) {
			dataUrl = SBCOM.modules.activityGamesStudioFavsNC  + user + '/';
		} else {
			dataUrl = SBCOM.modules.activityGamesStudioFavs  + user + '/';
		}
		dataParser = SBCOM.modules.getGamesStudioDataPublished;
		type = 'games_studio_favorite';
	}

	if(moduleId == 'SavedGames')
	{
		SBCOM.moojax.json.doRequest(dataUrl, null, dataParser);
	}
	else
	{
		var modulePackage = {moduleId:moduleId, maxItems:maxItems, parser:dataParser, moduleType:type};
		SBCOM.moojax.doLoadData(dataUrl, 'get', params, modulePackage);
	}
}

// Module specifc: Parse xml and return data objects 
SBCOM.modules.getBuddyData = function(xml, requestPackage) {
	var moduleId = requestPackage.moduleId;
	var maxItems = requestPackage.maxItems;

	var entry;
	var data = new Array();
	var nodes = xml.getElementsByTagName("buddylist")[0].getElementsByTagName("user");

	for(var i = 0; i < nodes.length; i++) {
		entry = {name:nodes[i].getAttribute('name'),
			icon:nodes[i].getAttribute('icon'),
			link:"/fans/profile/"+ nodes[i].getAttribute('name')};
		data.push(entry);
	}
	SBCOM.modules.doDisplayModuleList(data, moduleId, maxItems, SBCOM.modules.getNoActivityMessage('buddies'));
}

SBCOM.modules.getActiveUsersData = function(xml, requestPackage){
	var moduleId = requestPackage.moduleId;
	var maxItems = requestPackage.maxItems;

	var entry;
	var data = new Array();
	var nodes = xml.getElementsByTagName('user');
	var username;

	for(var i = 0; i < nodes.length; i++) {
		entry = {name: nodes[i].getAttribute('username'), icon:'/images/temp/avatar110x110.gif', link:'/fans/profile/' + nodes[i].getAttribute('username') + '/'};			
		data.push(entry);
	}
	SBCOM.modules.doDisplayModuleList(data, moduleId, maxItems, SBCOM.modules.getNoActivityMessage(requestPackage.moduleType));	
}

SBCOM.modules.getVideosData = function(xml, requestPackage) {
	var moduleId = requestPackage.moduleId;
	var maxItems = requestPackage.maxItems;

	var entry;
	var data = new Array();
	var nodes = xml.getElementsByTagName('activity');
	var type;

	for(var i = 0; i < nodes.length; i++) {
		type = nodes[i].getAttribute('type');

		entry = {name:nodes[i].getElementsByTagName('shortTitle')[0].firstChild.nodeValue, // firstChild - handles CDATA 
			icon:nodes[i].getElementsByTagName('icon')[0].firstChild.nodeValue,
			link:"/"+type+"/play/"+nodes[i].getElementsByTagName('urlAlias')[0].firstChild.nodeValue+"/"};

		if(SBCOM.utils.isEmptyString(entry.icon)) {
			entry.icon = 'http://' + SBCOM.utils.getDomain() +'/'+ SBCOM.utils.getImageDefault(type, entry.icon); 
		} else {
			entry.icon = 'http://' + SBCOM.utils.getNickDomain() +'/'+ entry.icon; 
		}
		data.push(entry);
	}
	SBCOM.modules.doDisplayModuleList(data, moduleId, maxItems, SBCOM.modules.getNoActivityMessage(requestPackage.moduleType));
}

SBCOM.modules.getGamesStudioDataSaved = function(response) {
	var moduleId = "SavedGames";
	var maxItems = 4;
	var moduleType = 'games_studio_saved';
	var data = new Array();
	
	data = SBCOM.modules.savedGamesHelper(response, "profile");
	
	SBCOM.modules.doDisplayModuleList(data, moduleId, maxItems, SBCOM.modules.getNoActivityMessage(moduleType));
}

SBCOM.modules.savedGamesHelper = function(response, pageProperty)
{
	var data = new Array();
	var entry;
	var editLink;
	
	if(response.success == true)
	{
		for(var i = 0; i < response.used; i++) 
		{	
			var propertyAlias = response.games[i].propertyAlias;
			var gameIcon = 'http://' + SBCOM.utils.getDomain() + SBCOM.utils.getImageDefault('games_studio');
			
			editLink = "/game-builder/build/"+response.games[i].slot+"/";
			if(propertyAlias == "gs_shorts")
			{
				editLink = "/game-builder/shorts/build/"+response.games[i].slot+"/";
				gameIcon = 'http://' + SBCOM.utils.getDomain() + '/images/characters/gamestudio/shorts_icon.jpg';
			}
			
			if(pageProperty!="profile")
			{
				if(propertyAlias == pageProperty)
				{
					editLink = "javascript:loadGameStudio('"+response.games[i].slot+"')";
				}
			}

			var dateFormatted = SBCOM.utils.dateFormat(response.games[i].date, "longDate");
			var dateSorted = SBCOM.utils.dateFormat(response.games[i].date, "shortDate");

			entry = {title:response.games[i].title,
					link:editLink,
					deleteLink:"javascript:overlayObj('/overlay/deletegame/?slotid="+response.games[i].slot+"')",
					date:dateFormatted,
					dateSort:dateSorted,
					icon:gameIcon};
	
			data.push(entry);
		}
	}
	else
	{
		SBCOM.utils.doLog("getGamesStudioDataSaved: Error Saved Game Data");
		data = null;
	}
	
	data.sort(SBCOM.utils.mdyOrdD);
	return data;
}

SBCOM.modules.getGamesStudioData = function(xml, requestPackage) {
	var moduleId = requestPackage.moduleId;
	var maxItems = requestPackage.maxItems;
	var data = new Array();
	
	data = SBCOM.modules.publishedGamesHelper(xml, requestPackage);
	
	SBCOM.modules.doDisplayModuleList(data, moduleId, maxItems, SBCOM.modules.getNoActivityMessage(requestPackage.moduleType));
}

SBCOM.modules.publishedGamesHelper = function(xml, requestPackage)
{
	var playLink;
	if(requestPackage.playLink)
	{
		playLink = requestPackage.playLink;
	}
	else
	{
		playLink = "/game-builder/play/";
	}
	var data = new Array();
	var entry;
	var type;
	var nodes = xml.getElementsByTagName('activity');
	for(var i = 0; i < nodes.length; i++) {
	
		type = nodes[i].getElementsByTagName('contentType')[0].firstChild.nodeValue;
		
		if((!requestPackage.currentUrl) || (requestPackage.currentUrl && requestPackage.currentUrl != nodes[i].getElementsByTagName('urlAlias')[0].firstChild.nodeValue))
		{
			entry = {title:nodes[i].getElementsByTagName('title')[0].firstChild.nodeValue, // firstChild - handles CDATA 
					icon:nodes[i].getElementsByTagName('icon')[0].firstChild.nodeValue,
					link:playLink+nodes[i].getElementsByTagName('gameId')[0].firstChild.nodeValue+"/",
					name:nodes[i].getElementsByTagName('memberName')[0].firstChild.nodeValue};
			entry.icon=entry.icon.replace("http://www.nick.com","");
			if(SBCOM.utils.isEmptyString(entry.icon)) {
				entry.icon = 'http://' + SBCOM.utils.getDomain() + SBCOM.utils.getImageDefault("games_studio", entry.icon);
			} else {
				entry.icon = 'http://' + SBCOM.utils.getNickDomain() + entry.icon;	
			}
	
			data.push(entry);
		}
	}
	
	return data;
}

//Displays lists in divs - uses a div "model" as a clone target and then disposes of it.
SBCOM.modules.doDisplayModuleList = function(moduleData, moduleId, maxItems, noActivityMessage, optionalOffset, isScroll) {
	var divModelId = moduleId + 'DivModel';
	var total = moduleData.length;
	var totalPages = 1;

	if(moduleData == null || total <= 0) {
		$(divModelId).dispose();
		SBCOM.utils.hideElement(moduleId + 'Controls');
		noActivityMessage = SBCOM.utils.isEmptyString(noActivityMessage) ? '' : noActivityMessage;
		$(moduleId + 'NodeParent').set("html", noActivityMessage);
		return;
	}
	
	if(isScroll && isScroll == 'false')
	{
		if(moduleData.length > 2)
			total = 2;
	}
	else
	{
		totalPages = (Math.floor(moduleData.length / maxItems)) + (moduleData.length % maxItems > 0 ? 1 : 0);
		totalPages = totalPages <= 0 ? 1 : totalPages;
	
		if(totalPages <= 1) {
			//SBCOM.utils.hideElement(moduleId + 'Controls');
			$(moduleId + 'slidetotal').set("text", 1);		
		}
		else
		{
			$(moduleId + 'slidetotal').set("text", totalPages);
		}
	}

	var clone;
	var offset;
	for(var i = 0; i < total; i++) {
		// create a new page div 
		if(i != 0 && i % maxItems == 0) {
			// create the new div
			var newPage = new Element('div', {
				'class':$(divModelId).getParent().get("class")
			});
			// add div to the model's parent
			$(divModelId).getParent().getParent().grab(newPage, 'bottom');
			// move the model to the new page
			newPage.adopt($(divModelId));
		}// end: create a new page div

		clone = $(divModelId).clone(true, true).inject(divModelId, 'before');
		clone.setProperty('id', moduleId + 'CloneDiv'+(i));

		if(optionalOffset)
		{
			SBCOM.modules.initClone(moduleId, clone, moduleData[i]);
			offset = optionalOffset;
		}
		else
		{
			offset = SBCOM.modules.initClone(moduleId, clone, moduleData[i]);
		}
		SBCOM.utils.showElement(moduleId + 'CloneDiv'+(i));
	}
	$(divModelId).dispose(); // remove the model div

	if(totalPages > 1) SBCOM.utils.doInitPagination(moduleId, totalPages, offset);
}

SBCOM.modules.initClone = function(moduleId, clone, moduleData) {
	var offset;
	switch(moduleId) {
		case 'SavedGames' : {
			offset = SBCOM.modules.initCloneSavedGames(moduleId, clone, moduleData);
			break;
		} case 'PublishedGames' : 
		  case 'GamesStudioFavorite' :
		  case 'GamesStudioPlayed' :
		{
			offset = SBCOM.modules.initClonePublishedGames(moduleId, clone, moduleData);
			break;
		} default : {
			offset = SBCOM.modules.initCloneGeneric(moduleId, clone, moduleData);
		}
	}

	return offset;
}

SBCOM.modules.initCloneGeneric = function(moduleId, clone, moduleData) {
	clone.getElement('img').set("src", moduleData.icon);
	clone.getElement('img').set("width", 58);
	clone.getElement('img').set("height", 58);
	clone.getElement('img').set("alt", moduleData.name);
	clone.getElement('span').set("text", moduleData.name);

	$each(clone.getElements('a'), function(element, index) {
		element.href = moduleData.link;
	});

	return moduleId == 'mostActiveFans' ? offset = 920 : offset = 392;
}

SBCOM.modules.initCloneSavedGames = function(moduleId, clone, moduleData) {
	clone.getElement('img').set("src", moduleData.icon);
	clone.getElement('img').set("alt", moduleData.icon);
	clone.getElement('img').set("width", 150);
	clone.getElement('img').set("height", 100);
	clone.getElements('span')[1].set("text",moduleData.title);
	clone.getElements('span')[2].set("text",moduleData.date);
	clone.getElements('a')[0].href=moduleData.link;
	clone.getElements('a')[1].href=moduleData.link;
	if(clone.getElements('a')[2])
	{
		clone.getElements('a')[2].href=moduleData.deleteLink;
	}
	return 780;
}

SBCOM.modules.initClonePublishedGames = function(moduleId, clone, moduleData) {
	clone.getElement('img').set("src", moduleData.icon);
	clone.getElement('img').set("alt", moduleData.icon);
	clone.getElement('img').set("width", 150);
	clone.getElement('img').set("height", 100);
	clone.getElements('span')[1].set("text", moduleData.title);
	clone.getElement('a').href=moduleData.link;
	if(moduleData.name=="empty")	{
		SBCOM.utils.hideElement(moduleId + 'author');
	} else {
		clone.getElements('span')[2].set("text", moduleData.name);
	}

	return 780;
}

SBCOM.modules.getNoActivityMessage = function(type) {
	//SBCOM.utils.doLog('type: '+type);
	if(!type) return '';
	switch(type) {
		case 'games' : {
			return SBCOM.modules.MSG_NO_ACTIVITY_GAMES;
			break;
		} case 'gamesfavorites' : {
			return SBCOM.modules.MSG_NO_ACTIVITY_GAMES_FAVS;
			break;
		} case 'videos' : {
			return SBCOM.modules.MSG_NO_ACTIVITY_VIDEOS;
			break;
		} case 'videosfavorites' : {
			return SBCOM.modules.MSG_NO_ACTIVITY_VIDEOS_FAVS;
			break;
		} case 'buddies' : {
			return SBCOM.modules.MSG_NO_ACTIVITY_BUDDIES;
			break;
		} case 'games_studio_saved' : {
			return SBCOM.modules.MSG_NO_ACTIVITY_GAMES_STUDIO;
			break;
		} case 'games_studio_published' : {
			return SBCOM.modules.MSG_NO_ACTIVITY_GAMES_STUDIO;
			break;
		} case 'games_studio_played' : {
			return SBCOM.modules.MSG_NO_ACTIVITY_GAMES_STUDIO_PLAYED;
			break;
		} case 'games_studio_favorite' : {
			return SBCOM.modules.MSG_NO_ACTIVITY_GAMES_STUDIO_FAVORITE;
			break;
		} default : {
			return SBCOM.modules.MSG_NO_ACTIVITY;
			break;
		}
	}
	return '';
}

SBCOM.modules.getGamesStudioDataPublished = function(xml, requestPackage) {
	return SBCOM.modules.getGamesStudioData(xml, requestPackage);
}

SBCOM.modules.getVideosFavsData = function(xml, requestPackage) {
	return SBCOM.modules.getVideosData(xml, requestPackage);
}

SBCOM.modules.getGamesData = function(xml, requestPackage) {
	return SBCOM.modules.getVideosData(xml, requestPackage);
}

SBCOM.modules.getGamesFavsData = function(xml, requestPackage) {
	return SBCOM.modules.getVideosData(xml, requestPackage);
}

