(function() {
	

	$.fn.personaCard = function(options) {
		
		var opts = $.extend({}, $.fn.personaCard.defaults, options);
		var infoRequest;
		return this.each(function() {
			var $this = $(this);
			var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
			
			var allowPopup, popupTimeout, hoverIntent, hoverInterval, position, defaultXPos, defaultYPos, xPos, yPos, deltaY;
			var maxPosX = 980;
			
			if($this.hasClass('PersonOnly')) {
				return;
			}
			
			$this.click(function() {
				$.fn.personaCard.killPopups(infoRequest);
				if(infoRequest) {
					infoRequest.abort();
				}
				var loc = $('a[href^=/connectodex]:first', $this).attr('href');
				if(loc != '') {
					window.location.href = loc;
				}
			});
			
			$this.hover(function() {
				clearTimeout(popupTimeout);
				hoverIntent = setTimeout(function() {
					$.fn.personaCard.killPopups(infoRequest);
					
					if($('#PersonaCard_' + $this.attr('rel')).size() == 0) {
						var $personaCardWrapper;
						var personaCardWrapper = document.createElement('div');
						personaCardWrapper.innerHTML =  $.fn.personaCard.template;
						$personaCardWrapper = $(personaCardWrapper);
						$personaCardWrapper.addClass('PersonaCardWrapper');
						
						var $personaCard = $('.PersonaCard', $personaCardWrapper);
						var personaKey = new Date();
						$this.attr('rel', personaKey.getTime());
						$personaCard.attr('id', 'PersonaCard_' + $this.attr('rel'));
						$personaCardWrapper.appendTo('body');
						$personaCardWrapper.hover(function() {
							clearTimeout(popupTimeout);
						}, function() {
							popupTimeout = setTimeout(function() {
								$.fn.personaCard.killPopups(infoRequest);
							}, 1);
						});

						position = $this.offset();
						xPos = position.left + o.offsetX;
						yPos = position.top + o.offsetY - o.loadingHeight;
						var shiftCardUpwards = true;

						if(xPos + o.loadingWidth > maxPosX) {
							xPos = xPos - o.loadingWidth + o.offsetX;
						}
						if(yPos - o.loadingBufferHeight < $(window).scrollTop()) {
							yPos = position.top + 2*o.offsetY;
							shiftCardUpwards = false;
						}
						var footerBreak = $('#Footer').size() > 0 ? $('#Footer').offset().top - (o.loadingHeight + o.loadingBufferHeight + yPos) : 0;
						if( footerBreak < 0 ) {
							yPos = yPos + footerBreak;
						}

						$personaCardWrapper.css({
							left: xPos,
							top: yPos
						});

						var jsonStream = $this.attr('href') ? $this.attr('href') : $('p.Avatar a', $this).attr('href');

						infoRequest = $.ajax({
							url: jsonStream,
							type: 'get',
							dataType: 'json',
							data: 'component=business-card',
							global: false,
							cache: false,
							success: function(data) {
								var business = data.business;
								var loggedIn = data.user_state && data.user_state == 'LoggedInMember' ? true : false;

								$('.PersonaInfo .BusinessAvatar img', $personaCard).attr({
									src: business.profile_img_url,
									alt: business.name
								});
								$('.BusinessInfo h5 a', $personaCard).html(business.name).attr('href', business.profile_url);
								$('.BusinessLocation', $personaCard).html(business.location);
								$('.BusinessInfo p:eq(2)', $personaCard).html(business.profile_blurb);
								if(loggedIn && business.share_msg != '') {
										$('.BusinessInfo .ShareMessage a', $personaCard).html(business.share_msg).attr('href', business.profile_url);
								} else {
									$('.BusinessInfo .ShareMessage', $personaCard).remove();
								}

								$('.BusinessInfo p a', $personaCard).attr('href', business.profile_url);

								if(business.expert) {
									$personaCard.addClass('ExpertCard');
								}

								if(business.members && business.members.length > 0) {
									// set up full nav popup
									$('.BusinessSeeksAndProvides', $personaCard).remove();
									$('.PersonaNavigation .BusinessAvatar img', $personaCard).attr({
										src: business.avatar_img_url,
										alt: business.name
									});
									$('.PersonaNavigation .BusinessAvatar p:last', $personaCard).html(business.name);
									for(var i in business.members) {
										var $personaNavCard = $('.PersonaNavigation .MemberAvatar:first', $personaCard).clone();
										$personaNavCard.removeClass('Template');
										$('.Avatar img', $personaNavCard).attr({
											src: business.members[i].avatar_img_url,
											alt: business.members[i].name
										});
										$('p:last', $personaNavCard).html(business.members[i].name);

										var $personaInfoCard = $('.MemberInfo:first', $personaCard).clone();
										$personaInfoCard.removeClass('Template');
										$('h5 a', $personaInfoCard).append(business.members[i].name).attr('href', business.members[i].profile_url + '#' + business.members[i].GUID);
										$('.MemberTitle', $personaInfoCard).html(business.members[i].title);
										$('p:eq(1)', $personaInfoCard).html(business.members[i].profile_blurb);
										if(loggedIn && !business.members[i].is_me) {
											if(business.members[i].share_msg && business.members[i].share_msg != "") {
												$('.ShareMessage a', $personaInfoCard).html(business.members[i].share_msg).attr('href', business.members[i].profile_url + '#' + business.members[i].GUID);
											} else {
												$('.ShareMessage', $personaInfoCard).remove();
											}
											
											$('.MemberActions li:first a', $personaInfoCard).attr('href', business.members[i].profile_url + '#' + business.members[i].GUID);
											$('a.add_bookmark', $personaInfoCard).attr('href', '/tools/RelationshipAddRemove.aspx?userguid='+business.members[i].GUID+'&performaction=bookmark');
											$('a.remove_bookmark', $personaInfoCard).attr('href', '/tools/RelationshipAddRemove.aspx?userguid='+business.members[i].GUID+'&performaction=removebookmark');
											if(business.members[i].is_my_contact) {
												$('a.remove_bookmark', $personaInfoCard).html('remove connection');
											}
											$('a.add_connection', $personaInfoCard).attr('href', '/tools/RelationshipAddRemove.aspx?userguid='+business.members[i].GUID+'&performaction=add');
											$('a.message', $personaInfoCard).attr('href', '/message-center/newmessage?userid='+business.members[i].GUID);
											if(business.members[i].is_my_bookmark || business.members[i].is_my_contact) {
												$('.MemberActions li a.add_bookmark', $personaInfoCard).remove();
											} else {
												$('.MemberActions li a.remove_bookmark', $personaInfoCard).remove();
											}
											if(business.members[i].is_my_contact) {
												$('.MemberActions li a.add_connection', $personaInfoCard).remove();
											}
										} else if(!loggedIn || business.members[i].is_me) {
											$('.ShareMessage, .MemberActions', $personaInfoCard).remove();
										}
										
										if(business.members[i].ID == business.default_state) {
											$personaNavCard.insertAfter($('.MemberAvatar:first', $personaCard));
											$personaNavCard.addClass('Active').siblings('.Active').removeClass('Active');
											$personaInfoCard.insertAfter($('.MemberInfo:first', $personaCard));
											$personaInfoCard.addClass('Active').siblings('.Active').removeClass('Active');
										} else {
											$personaNavCard.appendTo($('.PersonaNavigation', $personaCard));
											$personaInfoCard.appendTo($('.PersonaInfo', $personaCard));	
										}
									}

									$('.Template', $personaCard).remove();
									if(business.members.length < o.navCarouselThreshold) {
										for(var i = 1; i < o.navCarouselThreshold - business.members.length; i++) {
											$('<li class="Filler"></li>').appendTo($('.PersonaNavigation', $personaCard));
										}
										$('.PersonaNavigation', $personaCard).prependTo($personaCard);
										$('.PersonaNavigationWrapper', $personaCard).remove();
									}
								} else {
									// set up business only popup 
									$personaCard.addClass('BusinessOnly');
									for( var i in business.seeks) {
										$('<li>'+business.seeks[i]+'</li>').appendTo($('.BusinessSeeks ul', $personaCard));
									}
									for( var i in business.provides) {
										$('<li>'+business.provides[i]+'</li>').appendTo($('.BusinessProvides ul', $personaCard));
									}
									$('.BusinessSeeks p a, .BusinessProvides p a', $personaCard).attr('href', business.profile_url);
									$('.PersonaNavigationWrapper, .ShareMessage', $personaCard).remove();
								}

								$('.PersonaInfo, .PersonaNavigation, .PersonaNavigationPrev a, .PersonaNavigationNext a', $personaCard).show();

								$.fn.personaCard.nav.init($personaCard, o);

								var personaInfoMinHeight = 0;
								
								$('.PersonaInfo li', $personaCard).each(function() {
									personaInfoMinHeight = $(this).height() > personaInfoMinHeight ? $(this).height() : personaInfoMinHeight;
									personaInfoMinHeight = $(this).outerHeight() > personaInfoMinHeight ? $(this).outerHeight() : personaInfoMinHeight;
								});
								$('.PersonaInfo li', $personaCard).height(personaInfoMinHeight);
								deltaY = business.members && business.members.length > 0 ? $('.PersonaInfo', $personaCard).height() - 37 : $('.BusinessInfo', $personaCard).height() - 126;
								
								$personaCard.animate({ height: '+='+deltaY+'px' }, 100);
								if(shiftCardUpwards)  {
									$personaCardWrapper.animate({ top: '-='+deltaY+'px' }, 100);
								}
								
								//attach user action events
								$('a.add_bookmark', $personaCardWrapper).oneShotAjax({}, function() {
									$.fn.personaCard.killPopups(infoRequest);
									$('body').sysmessage('This person has been added to Your Radar.  They won\'t be notified, but you can keep up with their activity on the homepage and find them in <a href="https://www.openforum.com/connectodex/contacts">Your Contacts</a>.', {type: 'confirmation'});
									//omniture tracking add to radar trigger
									$('#AddBookmarkLink').trigger('success.add_radar.ax');
								});
								
								$('a.remove_bookmark', $personaCardWrapper).oneShotAjax({}, function() {
									$.fn.personaCard.killPopups(infoRequest);
									if($('#LayoutWrapper').hasClass('YourContacts')) {
										$this.fadeOut('fast', function() {
											$(this).remove();
										});
									}
									$('body').sysmessage('This person has been removed from Your Radar', {type: 'confirmation'});
								});
								
								$('a.add_connection', $personaCardWrapper).oneShotAjax({}, function() {
									$.fn.personaCard.killPopups(infoRequest);
									$('body').sysmessage('Contact request sent', {type: 'confirmation'});
									//omniture tracking request a connection trigger
									$('#AddConnectodexLink').trigger('success.request_connection.ax');
								});
								
								$('a.message', $personaCardWrapper).bindLoadMessageForm();
								
								$('.preload_overlay', $personaCard).fadeOut(100);
							},
							error: function() { return; }
						});
					}
				}, 750);
			}, function() {
				clearTimeout(hoverIntent);
				popupTimeout = setTimeout(function() {
					$.fn.personaCard.killPopups(infoRequest);
				}, 150);
			});
			
		});
	};

	$.fn.personaCard.nav = {
		init: function($personaCard, o) {
			var $personaNavWrapper = $('.PersonaNavigationWrapper', $personaCard).size() > 0 ? $('.PersonaNavigationWrapper', $personaCard) : null;
			var $personaNav = $('.PersonaNavigation', $personaCard);
			$('.overlay', $personaNav).animate({ opacity : 0.45 }, 1);
			
			//activate default card view
			$.fn.personaCard.nav.activate($personaNav, $('li.Active', $personaNav), $personaNavWrapper);
			
			// enable switching between cards on click
			$('li', $personaNav).not('.Filler').click(function() {
				if(!$(this).hasClass('Active')) {
					var $personaNavCard = $(this);
					$.fn.personaCard.nav.activate($personaNav, $personaNavCard, $personaNavWrapper);
				}
			});
			
			// enable pagination if card count is over threshold
			if($personaNavWrapper && $personaNavWrapper.find('li').not('.Filler').size() >= o.navCarouselThreshold) {
				$personaNav.css('width', ($personaNavWrapper.find('li').outerWidth(true) + 7) * $personaNavWrapper.find('li').size());
				$('.PersonaNavigationNext', $personaNavWrapper).click(function() {
					if(!$('a', this).hasClass('Disabled')) {
						$.fn.personaCard.nav.next($personaNav, $personaNavWrapper);
					}
					return false;
				});
				$('.PersonaNavigationPrev', $personaNavWrapper).click(function() {
					if(!$('a', this).hasClass('Disabled')) {
						$.fn.personaCard.nav.prev($personaNav, $personaNavWrapper);
					}
					return false;
				});
			}
		},
		next: function($personaNav, $personaNavWrapper) {
			var $next = $('li.Active', $personaNav).next();
			if($next.size() > 0) {
				$.fn.personaCard.nav.activate($personaNav, $next, $personaNavWrapper);
			}
		},
		prev: function($personaNav, $personaNavWrapper) {
			var $prev = $('li.Active', $personaNav).prev();
			if($prev.size() > 0) {
				$.fn.personaCard.nav.activate($personaNav, $prev, $personaNavWrapper);
			}
		},
		transition: function($personaNav, direction) {
			$personaNav.animate({
				left: direction == 'left' ? '+=89px' : '-=89px'
			}, 100);
		},
		activate: function($personaNav, $personaNavCard, $personaNavWrapper) {
			$personaCard = $personaNavWrapper ? $personaNavWrapper.parent() : $personaNav.parent();
			$personaNavCard.addClass('Active').siblings('.Active').removeClass('Active');
			var activateIndex = $personaNavCard.prevAll().size();
			var $activatedCard;
			$activatedCard = activateIndex - 1 >= 0 ? $('.MemberInfo:eq('+(activateIndex-1)+')',$personaCard) : $('.BusinessInfo', $personaCard);
			$activatedCard.addClass('Active').siblings('.Active').removeClass('Active');
			
			if($personaNavWrapper) {
				if($personaNavCard.position().left  + $personaNav.position().left <= 0) {
					$.fn.personaCard.nav.transition($personaNav, 'left');
				} else if($personaNavCard.position().left + $personaNavCard.outerWidth() + $personaNav.position().left >= 337) {
				 	$.fn.personaCard.nav.transition($personaNav, 'right');
				}
				
				if($personaNavCard.prevAll().size() == 0) {
					$('.PersonaNavigationPrev a', $personaNavWrapper).addClass('Disabled');
				} else {
					$('.PersonaNavigationPrev a', $personaNavWrapper).removeClass('Disabled');
				}
				if($personaNavCard.nextAll().size() <= 0) {
					$('.PersonaNavigationNext a', $personaNavWrapper).addClass('Disabled');
				} else {
					$('.PersonaNavigationNext a', $personaNavWrapper).removeClass('Disabled');
				}
			}
		}
	};

	$.fn.personaCard.killPopups = function(infoRequest) {
		if(infoRequest) {
			infoRequest.abort();
		}
		if(!$.fn.personaCard.debug) {
			if($.browser.msie) {
				$('.PersonaCardWrapper').stop().remove();
			} else {
				$('.PersonaCardWrapper').stop().fadeOut('fast', function() {
					$(this).remove();
				});
			}
			
		}
	};
	
	$.fn.personaCard.debug = false;
	
	$.fn.personaCard.defaults = {
		navCarouselThreshold: 4,
		offsetX : 27,
		offsetY : 24,
		loadingWidth: 364,
		loadingHeight: 178,
		loadingBufferHeight: 122
	};	
	
$.fn.personaCard.template = '<div class="PersonaCard"><div class="preload_overlay"></div><div class="PersonaNavigationWrapper"><p class="PersonaNavigationPrev"><a href="#">Prev</a></p><p class="PersonaNavigationNext"><a href="#">Next</a></p><ul class="PersonaNavigation"><li class="BusinessAvatar Active"><div class="overlay"></div><p class="Avatar"><img src="a" width="67" height="43" alt="" /></p><p></p></li><li class="MemberAvatar Template"><div class="overlay"></div><p class="Avatar"><img src="a" width="67" height="43" alt="Member Name" /></p><p></p></li></ul></div><ul class="PersonaInfo"><li class="BusinessInfo Active"><div class="AtAGlance"><p class="BusinessAvatar"><img src="a" width="111" height="73" alt="" /></p><h5><a href=""></a></h5><p class="BusinessLocation"></p><p></p><p><a href="">launch profile</a></p></div><p class="ShareMessage"><a href=""></a></p><div class="BusinessSeeksAndProvides"><div class="BusinessSeeks"><h6>They Seek</h6><ul></ul><p><a href="/connectodex/business_short_name#seeks">view more</a></p></div><div class="BusinessProvides"><h6>They Provide</h6><ul></ul><p><a href="/connectodex/business_short_name#provides">view more</a></p></div></div></li><li class="MemberInfo Template"><h5><a href=""></a></h5><p class="MemberTitle"></p><p></p><ul class="MemberActions"><li><a>Launch Profile</a></li><li><a href="/tools/RelationshipAddRemove.aspx?userguid=GUID&performaction=add" class="add_connection" id="AddConnectodexLink" title="Ask to add this person as a contact">Request a Connection</a></li><li><a href="/message-center/newmessage?userid=GUID" class="message">Send a Message</a></li><li><a href="/tools/RelationshipAddRemove.aspx?userguid=GUID&performaction=bookmark" class="add_bookmark" id="AddBookmarkLink" title="Follow without adding as a contact">Put On Your Radar</a></li><li><a href="/tools/RelationshipAddRemove.aspx?userguid=GUID&performaction=removebookmark" class="remove_bookmark">Remove from Radar</a></li></ul><p class="ShareMessage"><a href=""></a></p></li></ul></div>';

})(jQuery);

