var rewards = (function($) {

	var config = {
			basePluginUrl: '/wp-content/plugins/social-rewards/',
			connector: null,
			followingCookieName: 'REWARDSFOLLOWING',
			settingsCookieName: 'REWARDSETTINGS',
			settingsCookieValue: 'console=0|userId=0',
			callback: null,
			connectorWindow: null,
			userTimeout: null,
			reputationTimeout: null,
			profileUrl: '/social-rewards/'
	};
	
	var actions = {
		BLOG_POST_INFLUENCER : 82,
		TWEET: 85,
		FACEBOOK_LIKE: 81,
		VIDEO_PLAY : 65
	};
	
	var websites = {
		CISCO_BLOGS: 81	
	};
	
	var errorCodes = {
		DUPLICATEACCOUNT: 7	
	};
	
	function populateConnector() {
		
		var connector = {
				name: config.connector['connectorName'],
				meta: [
				       	{ key : 'userId', value : config.connector['userId'] },
				       	{ key : 'accessToken', value : config.connector['accessToken'] },
				       	{ key : 'accessTokenSecret', value : config.connector['secret'] }
				      ]
		};
		
		return connector;
	}
	
	return {
		
		getConnectorTypes: function() {
			return connectorType;
		},
		
		getPluginUrl: function() {
			return config.basePluginUrl;
		},
		
		init: function (options) {
			
			api.init();

			// Set Settings
			$.extend(true, config, options);
			
			// Rewards Logged In Visibility
			if(typeof(api.getSession()) == 'string') {
				
				if(api.getSession().length > 0) {
				
					var model= {
						id: 0,
						includeBadges: true,
						includeActivities: true,
						includeFollowingActivities: true,
						includeFollowing: (rewards.getFollowingCache() == null)
					};

					api.getMember(model, function(data) {
						
						if(!rewards.hasErrors(data.validator)) {
							
						} else {

							api.clearSession();
							rewards.reloadPage();
						}
					});
					
					if(rewards.getSetting('console') == 1) {
						$('.rewards .console .loggedin').removeClass('closed');
					}
					
					// Add All Actions
					rewards.addActions();
				} else {                                                
                                            
                                                api.clearSession();
                                                rewards.reloadPage();
				}
			} else {
                                console.info('c');
                        }
			
		},
		
		repositionTip: function(html, reference, offset) {
			html.show().position({
                of: reference,
                at: 'center top',
                my: 'center bottom',
                offset: offset
            });
		},
		
		getId: function(name) {
			
			var parts = name.split('-');
			
			if(parts.length > 1)
				return parseInt(parts[0]);
			else
				return 0;
		},
		
		getClassId: function(name) {
			
			var parts = name.split('-');
			
			if(parts.length > 1)
				return parseInt(parts[1]);
			else
				return 0;
		},
		
		openConnector: function(options, callback) {
			config.callback = callback;
			config.connectorWindow = window.open(("/blogs/wp-content/plugins/cisco-rewards/connectors/init.php?name=" + options.name), "Authenticate", "height=500,width=800,top=100,left=250,status=1,toolbar=0");
			config.connectorWindow.moveTo(380, 200);	
		},
		
		closeConnector: function() {
			config.connectorWindow.close();
			config.callback = null;
		},
		
		callbackConnector: function(connector) {
			config.callback(connector);
			rewards.closeConnector();
		},
		
		reloadPage: function() {
			window.location.href = window.location.href.replace('#', '');
		},
		
		hasErrors: function(validator) {
		if ((typeof validator.errors != 'null') || 
			(typeof validator.errors != 'undefined') || 
			(typeof validator.errors == 'object') 
			)
			{
			return validator.errors && validator.errors.length > 0;
			}
		},
		
		hasErrorCode: function(validator, code) {
			
			$(validator.errors).each(function() {
				
				if(this.code == code)
					return true;
			});
			
			return true;
		},
		
		showError: function(message) {
			
			var error =  {
				message: message
			};
			
			var model = {
				errors: [error]	
			};
			
			rewards.showErrors(model);
		},
		
		showErrors: function(validator) {
			
			var html = '<div><ul>';
			
			if(rewards.hasErrors(validator)) {
			
				$(validator.errors).each(function() {
					html = html + '<li>' + this.message + '</li>';
				});
				
				html = html + '</ul></div>';
				
				console.error(this.message);
                                console.debig('need to make a modal' + html);
				
				return false;
			}
			else {
				return true;
			}
		},
		
		createSession: function(sessionToken, memberId) {
			api.createSession(sessionToken);
			$.cookie("REWARDSID", sessionToken, { path: '/' });
			rewards.deleteCookie(config.settingsCookieName);
			rewards.createCookie(config.settingsCookieName, config.settingsCookieValue);
			rewards.setSetting('userId', memberId);
		},

		createCookie : function(name, value) {
			var expirationDate = new Date();
			expirationDate.setDate(expirationDate.getDate() + 30);
			var cookieValue = escape(value) + ((expirationDate==null) ? "" : "; expires=" + expirationDate.toUTCString()) + "; path=/";
			document.cookie = name + "=" + cookieValue;
			return value;
		},
		
		deleteCookie : function(name) {
			var date = new Date();
			date.setTime(date.getTime()+(-1*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
			document.cookie = name +"="+expires+"; path=/";
		},
		
		getSetting: function(name) {
			var cookie = rewards.getCookie(config.settingsCookieName);
			
			if(cookie) {
				
				var settings = cookie.toLowerCase().split('|');
				
				for (i = 0; i < settings.length; i++) {
					var setting = settings[i].split('=');
					
					if(setting.length == 2) {
						if(setting[0] == name.toLowerCase()) {
							return setting[1];
						}
					}
				}
			}
			
			return null;
		},
		facebookLike: function(){
				var model = 
				{
					actions: 
					[
					 	{actionId: actions.BLOG_POST_INFLUENCER, websiteId: websites.CISCO_BLOGS},
					 	{actionId: actions.FACEBOOK_LIKE},
					]
				};
				rewards.call('influencer-facebook', model, function() { });
		},
		videoPlay: function(){
				var model = 
				{
					actions: 
					[
					 	{actionId: actions.VIDEO_PLAY, websiteId: websites.CISCO_BLOGS},
					]
				};
				rewards.call('play-video', model, function() { });
		},
		
		addActions: function() {
			
			// Tweet Action
			$('body').delegate('.twitter-share-button', 'click', function() {
				
				var model = 
				{
					actions: 
					[
					 	{actionId: actions.BLOG_POST_INFLUENCER, websiteId: websites.CISCO_BLOGS},
					 	{actionId: actions.TWEET},
					]
				};

				api.sendAction(model);
				return false;
			});
			
			$('body').delegate('.facebooklike', 'click', function() {
				
				var model = 
				{
					actions: 
					[
					 	{actionId: actions.BLOG_POST_INFLUENCER, websiteId: websites.CISCO_BLOGS},
					 	{actionId: actions.FACEBOOK_LIKE},
					]
				};

				api.sendAction(model);
				return false;
			});
		},
		
		setSetting: function(name, value) {
			var cookie = rewards.getCookie(config.settingsCookieName);
			
			if(!cookie) {
				cookie = rewards.createCookie(config.settingsCookieName, config.settingsCookieValue);
			}
			
			var newSettings = '';
			
			var settings = cookie.toLowerCase().split('|');
			
			for (i = 0; i < settings.length; i++) {
				var setting = settings[i].split('=');
				
				if(setting.length == 2) {
					
					newSettings = newSettings + setting[0] + '=';
					
					if(setting[0] == name.toLowerCase()) {
						newSettings = newSettings + value;
					}
					else {
						newSettings = newSettings + setting[1] ;
					}
					
					newSettings = newSettings + '|';
				}
			}
			
			rewards.createCookie(config.settingsCookieName, newSettings);
		},
		
		getCookie: function(name) {
			var i, x, y, cookies = document.cookie.split(";");
			for (i = 0; i < cookies.length; i++) {
				x = cookies[i].substr(0, cookies[i].indexOf("="));
				y = cookies[i].substr(cookies[i].indexOf("=") + 1);
				x = x.replace(/^\s+|\s+$/g, "");
				if (x == name) {
					return unescape(y);
				}
			}
			return null;
		},
		
		authenticate: function(connector) {
			
			config.connector = eval('(' + connector + ')');

			var model = {
					connector : populateConnector()
			};
			
			api.authenticate(model, function(data) {
				if(!rewards.hasErrors(data.validator)){
			 		rewards.createSession(data.sessionToken, data.member.id);
					rewards.reloadPage();
			 	} else {
			 		rewards.openRegistrationModal(connector);
			 	}
			});
		},
		
		getFollowDisplay: function(memberId) {
			
			var following = rewards.userIsFollowing(memberId);
			
			if(following == null)
				return '';

			return '<a data="' + memberId + '-memberfollow" class="' + (following ? 'unfollow' : 'follow') + '" href="#"><span>' + (following ? 'unfollow' : 'follow') + '</span><span class="icon"></span></a>';
		},
		
		getBadgeDisplay: function(badge) {
			return ('<li data="' + badge.id +'-badge" class="badge"><img class="badgehover" src="' + badge.image.medium + '" alt =" ' + badge.badge.name + '"/><div class="tooltip"><span class="tool_title">' + badge.badge.name + '</span><p class="tooltipp">' + badge.badge.description + '</p></div></li>');
		},
		getActivityDisplay2: function(activity) {
			return ('<li data="' + badge.id +'-badge" class="activitylist"><div data="' + activity.directObjectId +'-Badge" class="act_image"><img src="' + activity.objectImagePath + '" alt="" /></div><div class="act_text"><span>Congratulations! You\'ve just earned the <span class="DirectObject">' + activity.directObject + ' badge</span></div><div class="clear"></div></li>');
		},
		getActivityDisplay3: function(activity) {
			return ('<li data="' + badge.id +'-badge" class="badge badgehover"><img  src="' + badge.image.medium + '" alt ="test' + badge.title + '"/></li>');
		},
		
		getFollowerCount: function(member) {
			return member.followerCount + " follower" + (member.followerCount == 1 ? "" : "s")
		},
		
		getProfileUrl: function(memberId) {
			return config.profileUrl + memberId;
		},
		
		getMemberName: function(member, onlyFirst) {
			return (member.firstName != undefined && member.firstName.length > 0 ? (member.firstName + (onlyFirst ? "" : " " + member.lastName)) : member.userName);
		},
		
		getMembers: function(memberIds) {
			
			var model = {
				memberIds: memberIds	
			};
			
			api.getMembers(model, function(data) {
				
				for(var i = 0; i < data.members.length; i++) {
					
					var member = data.members[i];
					
					var authorMember = $('.rewards .' + member.id + '-authormember .author-info .user .profile')
                         .find('.followers').html(rewards.getFollowerCount(member)).end();
					
					for(var j=0; j< member.badges.length; j++) {
						var authorMember2 = $('.rewards .' + member.id + '-authormember .author-info')
						authorMember2.find('.badges').append(rewards.getBadgeDisplay(member.badges[j]));
						}
					
					$('.rewards .' + member.id + '-badgecomment')
						.find('img.avatar').attr('src', member.image).end()
						.find('.fn').html(rewards.getMemberName(member, false)).end();
				}
				
			});
		},
		
		getMembersReputation: function(memberIds) {
			
			if(!memberIds) {
				memberIds = new Array();
			}
			
			var memberId = rewards.getSetting("userId");
			
			if(memberId) {
				memberIds.push(parseInt(memberId));
			}

			var model = {
				memberIds: memberIds	
			};
			
			setTimeout(function() {
				api.getMembersReputation(model, function(data) {

					for(var i = 0; i < data.reputations.length; i++) {
						
						var percentage = (data.reputations[i].reputation);
						var value = 0;
						
						if(percentage < 12) {
							value = 0;
						} else if(percentage < 25) {
							value = 12;
						} else if(percentage < 33) {
							value = 25;
						} else if(percentage < 50) {
							value = 33;
						} else if(percentage < 66) {
							value = 50;
						} else if(percentage < 75) {
							value = 66;
						} else if(percentage < 88) {
							value = 75;
						} else if(percentage < 100) {
							value = 88;
						} else {
							value = 100;
						}
						
						jQuery('.reputation[data=' + data.reputations[i].id + '-reputationmember]').addClass('reputation-' + value);
					}
				});
			}, 2000);
		},
		
		createFollowingCache: function(following) {
			rewards.createCookie(config.followingCookieName, $.toJSON(following));
		},
		
		getFollowingCache: function() {
			return eval(rewards.getCookie(config.followingCookieName));
		},
		
		addToFollowingCache: function(memberId) {
			
			var following = rewards.getFollowingCache();
			following.push(memberId);
			
			rewards.createFollowingCache(following);
		},
		
		removeFromFollowingCache: function(memberId) {
			var following = rewards.getFollowingCache();
			
			for(var i=0; i<following.length;i++ )
			{ 
				if(following[i]==memberId)
					following.splice(i,1); 
			} 
			
			rewards.createFollowingCache(following);
		},
		
		userIsFollowing: function(memberId) {
			
			// Is Authenticated User, Can't Follow Self
			if(rewards.getSetting("userId") == memberId)
				return null;
			
			var found = false;
			
			$(rewards.getFollowingCache()).each(function() {
				if(this == memberId){
					found = true;
					return true;
				}
			});
			
			return found;
		},
		
		openSmallModal: function(title, body, className) {
			
			$.get(config.basePluginUrl + 'widgets/small_modal.php', function(data) {
				
				$(data).dialog({ 
					modal: true, 
					width: 453, 
					dialogClass: 'modal smallmodal ' + className,
					position: 'center',
					open: function(event, ui) {
						
						var dialog = this;
						
						$(this)
							.find('.modalheader').html(title).end()
							.find('.body').html(body);

						// Cancel Button
						$(this).find('a.cancel').click(function() {
							$(dialog).dialog("close");
							return false;
						});
					}
				});
			});
		},
		
		openConnectModal: function() {
			
			$.get(config.basePluginUrl + 'widgets/connect_modal.php', function(data) {
				
				$(data).dialog({ 
					modal: true, 
					width: 583, 
					dialogClass: 'modal connectmodal',
					position: 'center',
					open: function(event, ui) {
						
						var dialog = this;
						
						// Cancel Button
						$(this).find('a.cancel').click(function() {
							$(dialog).dialog("close");
							return false;
						});
					}
				});
			});
		},
		
		connect: function(connector) {
			
			config.connector = eval('(' + connector + ')');
			
			var model = {
					connector: populateConnector()	
			};
			
			api.connect(model, function(data) { 
				
			 	if(data.valid){
			 		rewards.reloadPage();
			 	}
			 	else {
			 		$.get(config.basePluginUrl + 'widgets/duplicate_modal.php', function(data) {
			 			
			 		});
			 	}
			});
		},
		
		updateAvatar: function(imageUrl) {
			
			api.getMember(0, function(data) {
				
				var model = 
				{
					firstName: data.member.firstName,
					lastName: data.member.lastName,
					email: data.member.email,
					title: data.member.title,
					biography: data.member.biography,
					userName: data.member.userName,
					hideEmail: data.member.hideEmail,
					hideName: data.member.hideName,
					hideConnectors: data.member.hideConnectors,
					imageUrl: imageUrl
				};
				
				api.updateMember(model, function(data) {
					if(rewards.showErrors(data.validator)) {
						rewards.reloadPage();
					}
				});
			});
		},
		
		openRegistrationModal: function(connector) {
			
			config.connector = eval('(' + connector + ')');
			
			$.get(config.basePluginUrl + 'widgets/register_modal.php', function(data) {
		
				$(data).dialog({ 
					modal: true, 
					width: 583, 
					dialogClass: 'modal registermodal',
					position: 'center',
					open: function(event, ui) {
						
						// Populate Connector
						if(config.connector) {
							$(this).find('.social')
								.find('.connector .icon').addClass(config.connector['connectorname'] + 'image').end()
								.find('.firstname').html(config.connector['firstName']).end()
								.find('.lastname').html(config.connector['lastName']).end()
								.find('.profileimage').attr('src', config.connector['profileImage']).end()
								.end();
							
							if(config.connector['screenname']) {
								$(this).find('.username input').val(config.connector['screenname']).end();
							}
							
							if(config.connector['email']) {
								$(this).find('.email input').val(config.connector['email']).end();
							}
						}
						
						var dialog = this;
						
						// Cancel Button
						$(this).find('a.cancel').click(function() {
							$(dialog).dialog("close");
							return false;
						});
						
						// Register Button
						$(this).find('.submit a.button').click(function() {
							
							// Is Terms Checked
							if($(dialog).find('.terms input').is(':checked')) {
							
								var model = 
								{
									firstName: config.connector['firstName'],
									lastName: config.connector['lastName'],
									email: $(this).parents('.modal').find('.register .email input').val(),
									userName: $(this).parents('.modal').find('.register .username input').val(),
									hideEmail: false,
									hideName: false,
									hideConnectors: false,
									imageUrl: config.connector['profileImage'],
									connector: populateConnector()
								};
								
								rewards.registerProxy(model, function(data) { 
								 	if(!rewards.hasErrors(data.validator)) {
								 		rewards.createSession(data.sessionToken, data.member.id);
								 		
								 		$(dialog).dialog('close');
								 		
								 		$.get(config.basePluginUrl + 'widgets/register_thanks_modal.php', function(html) {
								 			
								 			$(html).dialog({ 
												modal: true, 
												width: 583, 
												dialogClass: 'modal registerthanksmodal',
												position: 'center',
												open: function(event, ui) {
													
														$(this).find('.submit a.button').click(function() {

															delete model.connector;
														
															model.hideEmail = $('body').find('.modal .settings .email input').is(':checked');
															model.hideName = $('body').find('.modal .settings .name input').is(':checked');
															model.hideConnectors = $('body').find('.modal .settings .social input').is(':checked');
															
															api.updateMember(model, function() {
																$(".ui-dialog-content").dialog("close");
															 	// rewards.reloadPage();
															});
														});
														
														// Cancel Button
														$(this).find('a.cancel').click(function() {
															$(".ui-dialog-content").dialog("close");
															rewards.reloadPage();
															return false;
														});
													}
								 				});
								 		});
								 	} else {
								 		// Test For Duplicate Account Error
										if(rewards.hasErrorCode(data.validator, errorCodes.DUPLICATEACCOUNT)) {
											
											// Close All Dialogs
											$(".ui-dialog-content").dialog("close");
											
											// Login User Automatically Since They Were Verified, Show Login Modal
											$.get(config.basePluginUrl + 'widgets/authenticate_modal.php', function(html) {
									 			
									 			$(html).dialog({ 
													modal: true, 
													width: 583, 
													dialogClass: 'modal authenticatemodal',
													position: 'center',
													open: function(event, ui) {
														
															var name = config.connector.connectorName;
														
															var displayName = name;
															
															if(name.toLowerCase() == 'linkedin')
															{
																name = 'Linked In';
															}
															
															$(this).find('.connection').addClass(name + 'connect')
																.find('a:first').attr('rel', name).addClass(name + 'image').end()
																.find('.text a').attr('rel', name).html('Login to ' + name).end();
															
															// Cancel Button
															$(this).find('a.cancel').click(function() {
																$(".ui-dialog-content").dialog("close");
																return false;
															});
														}
									 				});
									 		});
											
										} else {
											// Show Registration Errors
											rewards.showErrors(data.validator);
										}
								 	}
								});
							}
							else {
								rewards.showError('Please confirm you have read and understand our terms and condtions.');
							}
							
							return false;
						});
					}
				});
			});
		},
		
		influencer: function(influencer, postId) {
			
			var model = {
				meta : postId
			}
			
			rewards.call('influencer-' + influencer, model, function() { });
		},
		
		registerProxy: function(model, callback) {	
			rewards.call('register', model, callback);
		},
		
		playVideoProxy: function(model, callback) {	
			setTimeout("rewards.call('play-video', '', null);", 6000);
		},
		
		updateMemberProxy: function(model, callback) {	
			rewards.call('member/update', model, callback);
		},
		
		call: function(method, model, callback) {
			$.post('/wp-content/plugins/social-rewards/actions.php?method=' + method, $.toJSON(model), function(data) {
				try {
					var json = data;
					if (typeof data === "String" || typeof data == "string") {
						json = (eval('(' + data + ')'));
					}
					
					if(typeof(callback) == 'function') {
						if ('object' === typeof json) {
							callback(json);
						} else {
							callback(data);
						}
					}
					
				} catch (e) {
					if(typeof(callback) == 'function') {
						callback(data);
					}
				}
			});
		}
	};
})(jQuery);



