function moreHandler(event) {
	var anchor = $(this);
	var action = anchor.attr("href");
	
	taskPointer();
	anchor.addClass("task");
	
	// Save our original so we can restore it on refresh
	if ( ! anchor.attr('origHref') ) {
		anchor.attr('origHref', anchor.attr('href') );
	}
	
	$.get(action, {}, function(response) {
		var object = JSON.parse(response);
		
		// Omniture handling
		trackOmni(object);
		
		if (object.rendered) {
			$("ul#stream").append(object.rendered);
			initializeControls();
		}
		
		if (object.morePages) {
			var href = anchor.attr("href").replace(/page=\d+/gi, "page=" + object.morePages);
	
			if (object.beforeActivityTime) {
				href = href.replace(/beforeActivityTime=\d+/gi, "beforeActivityTime=" + object.beforeActivityTime);
			}
			
			if (object.filterType) {
	   		   if (href.indexOf("filterType=") != -1) {
	   		      href = href.replace(/filterType=\w+/gi, "filterType=" + object.filterType);
	   		   } else {
	   		      href = href + "&amp;filterType=" + object.filterType;
	   		   }
			}
			anchor.attr('href', href);
		} else {
			$("a#moreActivities").addClass("hide-view-more");
		}
		
		// Update our timestamps
		$("#stream, #results").each(function() {
			var elem = $(this);
			updateTimestamps(elem);
		});
		
		if (object.error) {
			errorDialog.showErrors({
				title: "Stream error",
				message: "We were unable to get more activities.</p><p>Please try again later.",
				errors: object.errors
			});
		}
		
		defaultPointer();
		anchor.removeClass("task");
	});
	
	event.preventDefault();
	event.stopPropagation();
}

function filterTypeHandler(event) {
	addClickOverlay({popObj:$('#filterList'),
	                 refElem:$('#filterButton').get(0),
	                 top:2,
	                 left:2,
	                 click:closeFilter});
}

function trackOmni(json_res) {
   if (json_res.pageName != null && json_res.oProp1 != null && json_res.oProp2 != null) {
      s_265.pageName = "als: " + json_res.pageName;
      s_265.prop1 = "als: " + json_res.oProp1;
      var s_code = s_265.t();
   }
}

function openBuddyMe(openerPattern, offsetDirection, offsetAmount){
	if(offsetDirection == 'left') {
		addClickOverlay({popObj:$('#buddy_me_popup'),
		                 refElem:$(openerPattern).get(0),
		                 top:5,
		                 left:offsetAmount,
		                 click:closeBuddyMe});
	} else {
		addClickOverlay({popObj:$('#buddy_me_popup'),
		                 refElem:$(openerPattern).get(0),
		                 top:5,
		                 right:offsetAmount,
		                 click:closeBuddyMe});
	}
	$("#nickname").focus();
	return false;
}
function closeBuddyMe(){
	$("#buddy_me_popup").hide();
	$("#clickOverlay").hide();
	return false;
}
function showBlob(data) {
   var blob = $('#chuckleBlob');
   var bubble = $('#speechBubble');
   var scoreText = $('#scoreText');
   if (blob.size() == 0 || bubble.size() == 0 || scoreText.size() == 0) {
      blob = $('<img id="chuckleBlob" src="/img/chuckle_blob.png" style="position: fixed; left: 20px; bottom: -85px;" />').appendTo('body');
      bubble = $('<img id="speechBubble" src="/img/speech_bubble.png" style="position: fixed; left: -165px; bottom: 65px;" />').appendTo('body');
      scoreText = $('<div id="scoreText" style="position: fixed; bottom: 95px; left: -160px; font-size: 20px; font-weight: bold; text-align: center; width: 150px;" />').appendTo('body');
   }
   scoreText.text(data.score == "cheater" ? "cheater!" : data.score + " points!");
   blob.animate({bottom:"-20px"},900).animate({bottom:"-25px"},100).animate({bottom:"-20px"},100).animate({bottom:"-25px"},100).animate({bottom:"-20px"},100).animate({bottom:"-25px"},100).animate({bottom:"-20px"},100);
   setTimeout(function() {
      bubble.animate({left:"65px"},250).animate({left:"55px"},150).animate({left:"62px"},100).animate({left:"60px"},50);
      scoreText.animate({left:"70px"},250).animate({left:"60px"},150).animate({left:"67px"},100).animate({left:"65px"},50);
   },900);
   setTimeout(function() {blob.animate({bottom:"-85px"},300);bubble.animate({left:"-165px"},300);scoreText.animate({left:"-160px"},300);},4500);
}

$(document).ready(function() {
	$("div.more a, p.more a").append(" &raquo;");
	$("a#moreActivities").click(moreHandler);
	$("#filterButton").click(filterTypeHandler);
	$("#filterType").click(filterTypeHandler);
	$("#crossPostControl").click(showCrossPostEdit);
	$("#crossPostServices").find("input[type=checkbox]").click(changeCrossPostSetting);
	$('#filterList').find('a').click(function(){
		if($(this).hasClass('active')) {
			return;
		}
		var f = $(this).attr('className');
		$('#filterList').hide();
		$('#filterIcon').attr('className','filter-'+f);
		$('#filterType').attr('filter', f).text('Loading...');
		$('#clickOverlay').live('click', function(){});
		var href = window.location.href.split("?", 1)[0];
		window.location.assign(href + "?filterType=" + f);
	});
});

function showCrossPostEdit() {
	addClickOverlay({popObj:$('#crossPostEdit'),
	         refElem:$('#crossPostControl p').get(0), 
	         top:5, 
	         left:0, 
	         click:hideCrossPostEdit});
}

function hideCrossPostEdit() {
	$("#crossPostEdit").hide();
	$("#clickOverlay").hide();
	return false;
}

function changeCrossPostSetting(event) {
	var action = "/settings/save_service_settings";
	var userId = $(this).siblings('.userId').val();
	var serviceName = $(this).val();
	var push_status = $(this).is(':checked') ? 'on' : 'off';
	$.post(action, {
		"_a" : window.authenticityToken,
		"serviceName" : serviceName,
		"userId" : userId,
		"status" : push_status
	}, function(response) {
		var object = JSON.parse(response);
		if (object.ok) {
			renderCrossPostControl();
			setTimeout(statusCounter.init, 1000);
		}
		if (object.error) {
			alert("We were unable to change your post settings. Please try again later.");
			hideCrossPostEdit();
		}
	});
}


function renderCrossPostControl() { 
	$.getJSON("/stream/render_cross_post_control", {},
		function ( result ) {
			var html = typeof(result.html) == 'undefined' ? '' : result.html;
			$('#currentCrossPost').html(html)
				.find('label.service-icon').not('hc_updated')
				.each( function() {
					var icon = document.createElement('img');
					icon.src = computeServiceIconUrl($(this));
					icon.style.cursor = 'pointer';
					$(this).addClass('hc_updated');
					$(this).children().replaceWith(icon);
				});
		});
}


function getBuddyGroups(){
var URLAuth = getURLAuth();
var baseURL = 	getURLBase();

if(baseURL==null || URLAuth==null ){
	var selectGroup = document.getElementById("buddy_me_group");
	selectGroup.innerHTML="";
		var opt = document.createElement("option");	
		opt.value="Buddies";
		opt.innerHTML="Buddies";
		selectGroup.appendChild(opt);
	return;
}

var url = baseURL+"/buddylist/get?f=json"+URLAuth+"&c=?";	
 
 
 $.getJSON(url,
	function ( result ) {
		 var grp = result.response.data.groups;	
		var selectGroup = document.getElementById("buddy_me_group");
		selectGroup.innerHTML="";
		if(typeof(grp)=="undefined"){
			var opt = document.createElement("option");	
			opt.value="Buddies";
			opt.innerHTML="Buddies";
			selectGroup.appendChild(opt);
		}
		for(var i in grp){
				if(!grp[i].bot && !grp[i].shared && !grp[i].smartGroup && grp[i].name!="Recent Buddies"){
					var opt = document.createElement("option");	
					opt.value=grp[i].name;
					opt.innerHTML=grp[i].name;
					selectGroup.appendChild(opt);
				}else if( grp[i].name!="Recent Buddies" && grp.length==1){
					var opt = document.createElement("option");	
					opt.value="Buddies";
					opt.innerHTML="Buddies";
					selectGroup.appendChild(opt);
				}
			}
		}
	);	
}
function addToBuddyList(){
	var url = getURLBase()+"/buddylist/addBuddy?f=json"+getURLAuth()+"&c=?";
	
	
	var buddyToAdd = document.addBuddy.buddy.value;
	var buddyGrp = "Lifestream";
	
	$.getJSON(url, {buddy:buddyToAdd, group:buddyGrp},
			function ( result ) {
		var mess = document.getElementById("buddy_me_alert");
		if(result.response.statusCode == 200){
			openBuddyMe();
		}else{
			mess.innerHTML = buddyToAddDisplay+" was not added due to errors please try again";
			mess.className="message_on";
		}
		closeBuddyMe();
	});
}
function setBuddyAttribute(nickName){
	var url = getURLBase()+"/buddylist/setBuddyAttribute?f=json"+getURLAuth()+"&c=?";
	var buddyToAdd = document.addBuddy.buddy.value;
	$.getJSON(url, {friendly:nickName,buddy:buddyToAdd}, function ( result ) {});
}


function reportLocation() {
	// Show report location popup
	var ta = $('#reportLocationComment');
	if ( ! ta.hasClass('dont-clear') ) {
		ta.val(defaultReportLocText);
	}
	if ( ta.val() == defaultReportLocText ) {
		ta.addClass('empty');
	}
	reportLocationDialog.open();
	//alert('here');
	return false;
}

function reportLocationHandler() {
	var reportLocationId = $('#reportLocationId').val();
	var reportLocationComment = $('#reportLocationComment').val();
	//alert( "Reporting " + reportLocationId + ", comment = " + reportLocationComment );
	if ( reportLocationComment == '' ) {
		alert("You must include a comment.");
		return false;
	}
	$.post("/stream/report_location", { "_a": window.authenticityToken, locationId : reportLocationId, comment : reportLocationComment },
		function(data) {
			resp = JSON.parse(data);
			if ( resp.alert ) {
				alert(resp.alert);
			}
			if ( resp.reported == true ) {
				// clear the box for next time
				$('#reportLocationComment').val('');
			} else {
				$('#reportLocationComment').addClass('dont-clear');
			}
	});
	return true;
}

function closeFtux() {
	$.post("/stream/close_ftux", { "_a" : window.authenticityToken },
		function(data) {
			var resp = JSON.parse(data);
			if ( resp.closed ) {
				// TODO: Hope this works!
			}
		}
	);
	$("#ftux").slideUp(function() {
		$(this).remove();
	});
	return true;
}

function updateParams( params, id, key ) {
	var el = $(id);
	var dflt = $(id + "-default");
	var val = el.val();
	var defVal = dflt.val();
	if ( el.size() > 0 && el[0].nodeName.toLowerCase() == "input" && el[0].type == 'checkbox' ) {
		val = ( el.is(':checked') ) ? "1" : "0";
	}
	if ( val != defVal ) {
		params[key] = val;
	}
}

function textBoxLabel(id) {
	var el = $(id);
	var val = el.attr('title');
	
	if( el.val() == '' ) {
		el.addClass('empty');
		el.val(val);
	}
	el.focus( function() {
		el.addClass('hasfocus');
		if ( el.hasClass('empty') ) {
			el.val('');
		}
	})
	.blur( function() {
		el.removeClass('hasfocus').change();
	})
	.change ( function() {
		if ( el.val() == '' || el.val() == val ) {
			el.addClass('empty');
			el.val(val);
		} else {
			el.removeClass('empty');
		}
	});
}

function resetLabel(id) {
	var el = $(id);
	var val = el.attr('title');
	if ( el.val() == val ) {
		el.val('');
	}
}


function doProfileReminderClose() {
	$.post("/stream/profile_reminder_close", {"_a" : window.authenticityToken},
			function(data) {
				$('div.saveReminder').remove();
			}
	);
	return false;
}

function doProfileSave() {
	resetLabel('#user-first-name');
	resetLabel('#user-last-name');
	resetLabel('#user-email');
	resetLabel('#user-city');
	resetLabel('#user-zipcode');
	if ( $('#user-zipcode').val() != '' ) {
		if ( ! $('#user-zipcode').val().match(/^[0-9-]+$/) ) {
			alert('Zip Code must contain numerics or hyphens only.');
			$('#user-zipcode').focus();
			return false;
		}
	}
	if ( $('#user-email').val() != '' ) {
		if ( ! $('#user-email').val().match(/^[\w\-]([\.\w+])*[\w]+@([\w\-]+\.)+[A-Z]{2,}$/i) ) {
			alert('Email addresses should be formatted: myname@domain.com');
			$('#user-email').focus();
			return false;
		}
	}
	var params = { "_a" : window.authenticityToken };
	// See what's changed, and add them to our save list.
	updateParams( params, '#user-first-name','first_name');
	updateParams( params, '#user-last-name','last_name');
	updateParams( params, '#user-gender','gender');
	updateParams( params, '#user-email','email');
	updateParams( params, '#user-city','city');
	updateParams( params, '#user-state','state');
	updateParams( params, '#user-zipcode','zipcode');
	if ( params.city !== undefined || params.state !== undefined || params.zipcode !== undefined ) {
		params.city = $("#user-city").val();
		params.state = $("#user-state").val();
		params.zipcode = $("#user-zipcode").val();
	}
	updateParams( params, '#profile-hide-flag','hideFlag');
	updateParams( params, '#profile-search-email','discPref');
	updateParams( params, '#profile-hide-level','hideLevel');
	updateParams( params, '#profile-about','about');
	// MDir nukes our hideLevel if we change anything else in mdir, so lets check, and add it if needed.
	if ( params.first_name !== undefined ||
		 params.last-name !== undefined ||
		 params.city !== undefined ||
		 params.state != undefined ||
		 params.zipcode != undefined ||
		 params.hideFlag != undefined
    ) {
		params.hideLevel = ( $('#profile-hide-level').is(':checked') ? "1" : "0" );
	}
	taskPointer();
	// Disable our buttons and show our spinners.
	$('div.profile ul.form-buttons input').attr('disabled','disabled');
	$('div.profile div.save').html('<span class="spinner">Loading..</span>');
	$('div.profile ul.form-buttons li.spinner').show();
	$.post("/stream/profile_save", params,
			function(data) {
				defaultPointer();
				var resp = JSON.parse(data);
				$('div.profile').replaceWith( resp.rendered );
				addProfileActions();
			}
	);
	return true;
}

function doProfileCancel() {
	$.post("/stream/profile_load", { "_a" : window.authenticityToken },
			function(data) {
				var resp = JSON.parse(data);
				$('div.profile').replaceWith( resp.rendered );
				addProfileActions();
			}
	);
	return false;
}

function doProfileEdit() {
	// Open our edit dialog
	$.post("/stream/profile_edit", { "_a" : window.authenticityToken },
			function(data) {
				var resp = JSON.parse(data);
				$('div#buddyInfoEditDialog div.dialog-content').html( resp.rendered );
				buddyInfoEditDialog.open();
				textBoxLabel('#user-first-name');
				textBoxLabel('#user-last-name');
				textBoxLabel('#user-email');
				textBoxLabel('#user-city');
				textBoxLabel('#user-zipcode');
			}
	);
	
	return false;
}


function followLocation() {
	var el = $('#follow-location-link');
	var form = $("#follow_form");
	var location = form.find('input[name=location]').val();
	var locationFriendly = form.find('input[name=locationFriendly]').val();
	if ( el.hasClass('follow') ) {
		$.post("/stream/follow_location", {"_a": window.authenticityToken, location: location, locationFriendly : locationFriendly },
				function(data) { 
								resp = JSON.parse(data); 
								if ( resp.followed == true ) {
									//openBuddyMe('#follow-location-link', 'left', 0);
									el.removeClass('follow').addClass('unfollow');
									el.removeClass('ls_green_bt').addClass('ls_grey_bt');
									el.find(".bt_content").text("Remove");
									
								}
				});
	} else {
		 //removeLocationDialogbox.open();
		removeLocationHandler();
	}
	//alert('following ' + el.hasClass('follow') + ' ' + el.attr('id') );
	return false;
}
function removeLocationHandler(){
	var el = $('#follow-location-link');
	var form = $("#follow_form");
	var location = form.find('input[name=location]').val();
	var locationFriendly = form.find('input[name=locationFriendly]').val();
	
	$.post("/stream/unfollow_location", {"_a": window.authenticityToken, location: location },
			function(data) { 
				resp = JSON.parse(data); 
				if ( resp.unfollowed == true ) {
					el.removeClass('unfollow').addClass('follow'); 
					el.removeClass('ls_grey_bt').addClass('ls_green_bt'); 
					el.find(".bt_content").text("Follow");
					} 
				});
}
function clearStatusHandler(){
	$.post("/stream/set_status", {"_a": window.authenticityToken, status: " " },
			function(data) { 
				resp = JSON.parse(data); 
				if ( resp.status) {
					$("p#status").html("");
					$("div#statusWrap").addClass("emptyStatus");
					$("div#statusSrc").addClass("emptyStatus");
				} 
				});
	
}
function addProfileActions() {
	$('#profile-edit-link').click( doProfileEdit );
	$('#write-something-link').click( doProfileEdit );
	$('#profile-save-link').click( doProfileSave );
	$('#profile-save-button').click( doProfileSave );
	$('#profile-cancel-button').click( doProfileCancel );
	$('#profile-reminder-close').click( doProfileReminderClose );
	initializeControls($('div.profile'));
	
	/*
	(function() { 
		var pat = new RegExp("(https?://[^ \n<]+)");
		var el = $('div.about p');
		var profileMsg = el.html();
		if ( ! profileMsg ) {
			return;
		}
		var subst = profileMsg.replace(pat,'<a target="_blank" href="$1">$1</a>');
		el.html(subst);
		if ( el.height() > 183 ) {
			el.height(183);
			el.css('overflow','hidden');
			var a = $('<a href="#">More</a>');
			a.click( function() { 
				el.height('auto');
				el.css('overflow','visible');
				a.remove();
				return false;
			});
			$('div.about').append(a);
		}
	})();
	*/

	var PROFILE_MAX_CHARS = 255;
	var PROFILE_MAX_LINES = 10;
	if ( window.aboutProfileMsg != undefined ) {
		$('div#profileMsg').html( renderProfileMsg(aboutProfileMsg,PROFILE_MAX_CHARS,PROFILE_MAX_LINES) );
	}
	
	$('#about-more-link').click( function() {
		var p = $('#profileMsg').find('p');
		p.find('span.elip').hide();
		$('#about-more-link').hide();
		p.find('span.rest').show();
		return false;
	});

	
	$('div.nasl-info div.user-icon-wrapper')
	.mouseenter(
			function() {
				$(this).find('p.user-icon-edit').css('display','block');
			})
	.mouseleave(
			function() {
				$(this).find('p.user-icon-edit').css('display','none');
			});
	$('div.nasl-info p.user-icon-edit a').click( function() {
		var displayName = $('div.nasl-info h4').text();
		var win = window.open( "http://o.aolcdn.com/aim/gromit/iconuploader/current.en-us/Main.html?env=prod&lang=en-us&aimsid=" + WIM.aimsid + "&displayId=" + displayName,"editIcon","resizeable=yes,width=487,height=308,directories=no,titlebar=no,scrollbars=no,menubar=no,toolbar=no,location=no");
		var id = setInterval( function() { if ( win.closed ) { refreshMyIcons(); clearInterval(id); } }, 50 );
		return false;
	});
	
	/*
	var userCityEl = $('#user-city');
	if( userCityEl.val() == '' ) {
		userCityEl.addClass('empty');
		userCityEl.val('City');
	}
	userCityEl.focus( function() {
		userCityEl.addClass('hasfocus');
		if ( userCityEl.hasClass('empty') ) {
			userCityEl.val('');
		}
	})
	.blur( function() {
		$(this).removeClass('hasfocus').change();
	})
	.change ( function() {
		if ( $(this).val() == '' || $(this).val() == 'City' ) {
			userCityEl.addClass('empty');
			userCityEl.val('City');
		} else {
			userCityEl.removeClass('empty');
		}
	});
	
	var userZipEl = $('#user-zipcode');
	if( userZipEl.val() == '' ) {
		userZipEl.addClass('empty');
		userZipEl.val('Zip Code');
	}
	userZipEl.focus( function() {
		userZipEl.addClass('hasfocus');
		if ( userZipEl.hasClass('empty') ) {
			userZipEl.val('');
		}
	})
	.blur( function() {
		$(this).removeClass('hasfocus').change();
	})
	.change ( function() {
		if ( $(this).val() == '' || $(this).val() == 'Zip Code' ) {
			userZipEl.addClass('empty');
			userZipEl.val('Zip Code');
		} else {
			userZipEl.removeClass('empty');
		}
	});
	*/
	
}

function reportProfile() {
	// Show report profile popup
	var ta = $('#reportProfileComment');
	if ( ! ta.hasClass('dont-clear') ) {
		ta.val(defaultReportProfileText);
	}
	if ( ta.val() == defaultReportProfileText ) {
		ta.addClass('empty');
	}
	reportProfileDialog.open();
	return false;
}

function reportProfileHandler() {
	var reportProfileUser = $('#reportProfileUser').val();
	var reportProfileComment = $('#reportProfileComment').val();
	if ( reportProfileComment == '' || reportProfileComment == defaultReportProfileText ) {
		alert("You must include a comment.");
		return false;
	}
	$.post("/stream/report_profile", { "_a": window.authenticityToken, user : reportProfileUser, comment : reportProfileComment },
		function(data) {
			resp = JSON.parse(data);
			if ( resp.alert ) {
				alert(resp.alert);
			}
			if ( resp.reported == true ) {
				// clear the box for next time
				$('#reportProfileComment').val('');
			} else {
				$('#reportProfileComment').addClass('dont-clear');
			}
	});
	return true;
}


var reportLocationDialog;
var defaultReportLocText;
var buddyInfoEditDialog;
var reportProfileDialog;
var defaultReportProfileText;

$(document).ready( function() {
	addProfileActions();
	
	// Reparent the buddyInfoEditDialog (IE z-index fix)
	$('#buddyInfoEditDialog').appendTo('body');
	
	$("#report-location-link").click( function() { return reportLocation(); } );
	$("#follow-location-link").click( function() { return followLocation(); } );
	reportLocationDialog = new Dialog("reportLocationDialog", reportLocationHandler);
	buddyInfoEditDialog = new Dialog("buddyInfoEditDialog", doProfileSave);
	//removeFriendDialogbox = new Dialog("removeFriendDialog", removeFriendHandler);
	//removeLocationDialogbox = new Dialog("removeLocationDialog", removeLocationHandler);
	$("a.addFriend").live("click",addFriendHandler);
	$("a.removeFriend").live("click", removeFriendHandler);
	// TODO: Not sure what this is supposed to do. It calls a typo'd function, but in doing so
	// breaks IE. Also, seems we are using the 'addC' id value more then once, which is a no-no.
	// There is another live handler that does the right thing for this. We should probably do
	// some cleanup around the code that is generating the same id more then once, along
	// with revisting how this is handled. Commenting it out for now as a reminder.
	//$("#addC").find('button.submit').click(function(){ $("#addC").sumbit()});
	defaultReportLocText = $('#reportLocationComment').val();
	
	$('#reportLocationComment').focus( function() {
		var ta = $('#reportLocationComment');
		if ( ta.val() == defaultReportLocText ) {
			ta.val('').removeClass('empty');
		}
	});
	
	$('#report-profile-link').click( function() { return reportProfile(); } );
	reportProfileDialog = new Dialog("reportProfileDialog", reportProfileHandler );
	defaultReportProfileText = $("#reportProfileComment").val();
	$('#reportProfileComment').focus( function() {
		var ta = $("#reportProfileComment");
		if ( ta.val() == defaultReportProfileText ) {
			ta.val('').removeClass('empty');
		}
	});
	
	$('#ftux a.close').click( function() { closeFtux(); return true; } );
	
	$("#profile-about").live("keyup", function(event) {
		var value = $(event.target).val();
		if (value.length > 4096) {
			$(this).val(value.substring(0, 4096));
			event.preventDefault();
			event.stopPropagation();
		}
	});
	
	$(".dmTryAgain").live("click",resetDMForm);
	
	$('.dmReply').click( function(event) {
		var frm = $("form." + this.getAttribute("activityId"));
		if(!$(this).hasClass("active")) {
			frm[0].style.display = "block";
			frm[0].elements["message"].focus();
			$(frm).animate({opacity:1},{duration:200});
			$(this).addClass("active");
		} else {
			$(this).removeClass("active");
			$(frm).animate({opacity:0},{duration:200,complete: function() { frm[0].style.display = "none"; }});
		}
	});
	
	$('.dmReplyForm').submit( function(event) {
		var el = this;
		var message = this.elements["message"].value;
		var serviceName = this.elements["serviceName"].value;
		var serviceUid = this.elements["serviceUid"].value;
		if(message == "") return false;
		var a = $("a." + this.getAttribute("activityId"));
		var frm = $(".form." + this.getAttribute("activityId"));
		var msg = $(".msg." + this.getAttribute("activityId"));
		$(frm).hide(); $(msg).show();
		$.post("/stream/send_direct_message", {"_a": window.authenticityToken,"serviceName": serviceName, "serviceUid": serviceUid, "message":message},
				function(data) { 
					resp = JSON.parse(data); 
					if (resp.sent == true) {
						el.elements["message"].value = "";
						$(msg).html("Reply sent.");
						// first animate is just a delay. jQuery 1.4 supports delay(), so update this when we switch over
						$(el).animate({opacity:1},{duration:1200}).animate({opacity:0},{duration:200,complete: function() { 
							el.style.display = "none";
							$(frm).show();
							$(msg).hide().html("Sending Reply ...");
						}});
						$(a).removeClass("active");
					} else {
						$(msg).html("Your reply has failed. Please <a activityId=\"" + el.getAttribute("activityId") + "\" class=\"dmTryAgain\" href=\"javascript:;\">try again.</a>");
					}
			});
		return false;
	});
		
	noPhotoRightRail_ie();
	$("#crossPostEdit").find('.closer').html('X');
	$("#crossPostEdit").find('.closer').click(hideCrossPostEdit);
	$("#clickOverlay").hide();
});

function resetDMForm() {
	var aId = this.getAttribute("activityId");
	var frm = $(".form." + aId);
	var msg = $(".msg." + aId);
	msg.hide().html("Sending Reply ...")
	frm.show();
}

function noPhotoRightRail_ie (){
	var browserName=navigator.appName; 
	if(browserName=="Microsoft Internet Explorer"){
		//var carouselC = $('#carouselContainer');
		var carouselC = document.getElementById('carouselContainer');
		//alert(carouselC.innerHTML);
	}
	
}

function addFriendHandler(event) {
	var group = "Lifestream";
	var friendId = $("#buddyId").val();
	var el = $('.addFriend');
	var action = "/settings/add_friend";
	
	taskPointer();
	$.post(action, {
		"_a": window.authenticityToken,
		friendId : friendId
	}, function(response) {
		var object = JSON.parse(response);

		if (object.added) {
			if ( object.smsDevices == undefined || object.smsDevices.length == 0 ) {
				$('#buddy_me_popup div.mobileU').css('visibility','hidden');
			}
			//openBuddyMe('#buddy_me_button', 'right', 0);
			el.removeClass('addFriend').addClass('removeFriend'); 
			el.removeClass('ls_green_bt').addClass('ls_grey_bt'); 
			el.find(".bt_content").text("Remove");
		}
	if (object.error) {
		errorDialog.showErrors({
			title: "Add Friend error",
			message: "We were unable to add this person to your Buddy List.\nPlease try again later.",
			errors: object.errors,
			target: div
		});
	}
		defaultPointer();
	});

	event.preventDefault();
	event.stopPropagation();
}

function removeFriendHandler(event) {
	var el = $('.removeFriend');
	
	
	var href = $("#removeFriendDialog input.dialog-data").val();
	var friendId = $("#buddyId").val();

	var action = "/settings/remove_friend";
	
	taskPointer();
	$.post(action, {
		"_a": window.authenticityToken,
		friendId : friendId
	}, function(response) {
		var object = JSON.parse(response);
		if (object.removed) {
			el.removeClass('removeFriend').addClass('addFriend'); 
			el.removeClass('ls_grey_bt').addClass('ls_green_bt'); 
			el.find(".bt_content").text("Follow");
		}

		if (object.error) {
			errorDialog.showErrors({
				title: "Activity error",
				message: "We were unable to remove this person.\nIt may have already been removed.",
				errors: object.errors,
				target: div
			});
		}
		
		defaultPointer();
	});

	event.preventDefault();
	event.stopPropagation();
}

function checkMobileUpdates(event){
	if($("#mobileUpdates:checked").val() == null){
		closeBuddyMe();
		return;
	}
	var act ="on";
	$.post("/settings/set_mobile_updates", {
         "_a": window.authenticityToken,
         "subscrib_id": $("#buddyId").val(),
         "action": act
     }, function(response) {
         var object = JSON.parse(response);
         if (object.success) {
      	  
         }
         if (object.error) {
             errorDialog.showErrors({
                 title: "Subscription error",
                 message: "We were unable to change your SMS update subscriptions.\nPlease try again later.",
                 errors: object.errors
             });
         }
         
         defaultPointer();
     });
	closeBuddyMe();
	
	event.preventDefault();
	event.stopPropagation();
}
function checkMobileUpdates_nosms(event){
	if($("#mobileUpdates:checked").val() == null){
		closeBuddyMe();
		return;
	}
	$.getJSON(
		      '/settings/render_add_sms_device',
		      {},
		      function(data) {
		         if (data.error) {
		        	 return;
		         } 
		         
		         popup.openPopup();
		         popup.setTitle(data.title);
		         popup.setBody(data.html);

		         var form = popup.getPopupBody().find('form');

		         form.find(".auto_advance").keypress(autoAdvanceInputField);

		         form.find("button.submit").click(form.submit(addSMSDeviceSubmitHandler_withMobileUpdates));
		         form.find("#phone1,#phone2,#phone3").keypress(function (e) {
		            if (e.keycode == 13) {
		               form.submit();
		            }
		         });
		         form.find("#phone1")[0].focus();

		         $("li.cancel input.reset, span.cancel input.reset, .form-buttons button.reset").click(function (e) {
		            popup.closePopup();
		         });
		         
		         closeBuddyMe(); 
		      }
		   );
}

/* SMS */

function autoAdvanceInputField(event) {
   el = $(this);
   var numChars = $(this).attr("size");
   var caretPos = null;
   
   if (document.selection) {
        var range = document.selection.createRange();
       var len = document.selection.createRange().text.length;
      range.moveStart ('character', -this.value.length);
      caretPos = range.text.length - len;
      numChars++; //IE hack... blech
   } else if (this.selectionStart) {
      if (this.selectionEnd === null) {
         caretPos = this.selectionStart;
      } else if (this.selectionStart != this.selectionEnd) {
         return true;
      } else {
         caretPos = this.selectionStart;
      }
   }
   
   if ((el.val().length == numChars - 1) && (caretPos == numChars - 1)) {
      var next_el = el.next("input.auto_advance");
      if (next_el.size() > 0) {
         next_el[0].focus();
      }
   }
}

function confirmSMSDeviceSubmitHandler(event) {
   var form;
   if (event.target.nodeName === "FORM" || event.target.nodeName === "form") {
      form = $(event.target);
   } else {
      form = $(event.target).parents('form');
   }

   var phoneNumber = form.find('#phoneNumber').val();
   var confCode = form.find("#confirmation_code").val();
   
   var action = "/settings/confirm_sms_device";
   taskPointer();
   
   $.post(action, {"_a": window.authenticityToken, phoneNumber: phoneNumber, confCode: confCode}, function (data) {
      var response = JSON.parse(data);

      if (response.error) {
         var messages = "<ul>";
         for (var x in response.errors) {
            if (response.errors.hasOwnProperty(x)) {
               messages += "<li>" + response.errors[x] + "</li>";
            }
         }
         messages += "</ul>";

         form.find("#confirmSMSDeviceError").html(messages).show();
         form.find('#confirmationCode').select();
      } else if (response.success && response.success === true) {
         var link = $("#confirmSMSDevice_" + phoneNumber);
         link.after('<a href="#" id="disableSMSDevice_' + phoneNumber + '" class="disableSMSDevice">disable</a>');
         link.remove();
         popup.closePopup();
      }
      
      defaultPointer();
   });

   event.preventDefault();
   event.stopPropagation();
}

function confirmSMSDevice(phoneNumber) {
   $.getJSON(
      '/settings/render_confirm_sms_device',
      {phoneNumber : phoneNumber},
      function(data) {
         if (data.error) {
            return;
         } 
         popup.openPopup();
         popup.setTitle(data.title);
         popup.setBody(data.html);

         var form = popup.getPopupBody().find('form');

         form.submit(confirmSMSDeviceSubmitHandler);
         form.find("#confirmation_code").keypress(function (e) {
            if (e.keycode == 13) {
               form.submit();
            }
         });
         form.find("#confirmation_code")[0].focus();
         $("#restartConfirmationLink").click(function (e) {
            form.find('#confirmSMSDeviceSuccess').text('');
            $.getJSON('/settings/send_sms_confirmation_code',
                      {phoneNumber : phoneNumber},
                      function(data) {
                         if (data.success) {
                            form.find('#confirmSMSDeviceSuccess').text("Confirmation code sent.");
                         }
                      });
            e.preventDefault();
            e.stopPropagation();
         });
         
         $("li.cancel input.reset, span.cancel input.reset").click(function (e) {
            popup.closePopup();
         });
      }
   );
}
function addSMSDeviceSubmitHandler_withMobileUpdates(event) {

	   var form;
	   if (event.target.nodeName === "FORM" || event.target.nodeName === "form") {
	      form = $(event.target);
	   } else {
	      form = $(event.target).parents('form');
	   }

	   var phoneNumber = form.find("#phone1, #phone2, #phone3");
	   phoneNumber = phoneNumber[0].value + phoneNumber[1].value + phoneNumber[2].value;
	   if (phoneNumber.length != 10 && !phoneNumber.match(/[^\d]/)) {
	      // TODO: show error
	      return;
	   }
	   
	   var action = "/settings/add_sms_device";
	   taskPointer();
	   
	   $.post(action, {"_a": window.authenticityToken, phoneNumber: phoneNumber}, function (data) {
	      var response = JSON.parse(data);

	      if (response.error) {
	         var messages = "<ul>";
	         for (var x in response.errors) {
	            if (response.errors.hasOwnProperty(x)) {
	               messages += "<li>" + response.errors[x] + "</li>";
	            }
	         }
	         messages += "</ul>";

	         form.find("#addSMSDeviceError").html(messages);
	         form.find("#addSMSDeviceError").show();
	         form.find('#phone1').select();
	      } else if (response.success && response.success === true) {
	         smsDevices = response.devices;
	         if (response.smsSectionHTML !== null) {
	            $('#smsSection').empty().append(response.smsSectionHTML);
	         }
	         popup.closePopup();
	         confirmSMSDevice(phoneNumber);
	         
	         var act ="on";
	     	$.post("settings/set_mobile_updates", {
	              "_a": window.authenticityToken,
	              "subscrib_id": $("#buddyId").val(),
	              "action": act
	          }, function(response) {
	              var object = JSON.parse(response);
	              if (object.success) {
	           	  
	              }
	              if (object.error) {
	                  errorDialog.showErrors({
	                      title: "Subscription error",
	                      message: "We were unable to change your SMS update subscriptions.\nPlease try again later.",
	                      errors: object.errors
	                  });
	              }
	              
	              defaultPointer();
	          });
	         
	      }
	      
	      defaultPointer();
	   });

	   event.preventDefault();
	   event.stopPropagation();

}
function addSMSDeviceSubmitHandler(event) {
   var form;
   if (event.target.nodeName === "FORM" || event.target.nodeName === "form") {
      form = $(event.target);
   } else {
      form = $(event.target).parents('form');
   }

   var phoneNumber = form.find("#phone1, #phone2, #phone3");
   phoneNumber = phoneNumber[0].value + phoneNumber[1].value + phoneNumber[2].value;
   if (phoneNumber.length != 10 && !phoneNumber.match(/[^\d]/)) {
      // TODO: show error
      return;
   }
   
   var action = "/settings/add_sms_device";
   taskPointer();
   
   $.post(action, {"_a": window.authenticityToken, phoneNumber: phoneNumber}, function (data) {
      var response = JSON.parse(data);

      if (response.error) {
         var messages = "<ul>";
         for (var x in response.errors) {
            if (response.errors.hasOwnProperty(x)) {
               messages += "<li>" + response.errors[x] + "</li>";
            }
         }
         messages += "</ul>";

         form.find("#addSMSDeviceError").html(messages);
         form.find("#addSMSDeviceError").show();
         form.find('#phone1').select();
      } else if (response.success && response.success === true) {
         smsDevices = response.devices;
         if (response.smsSectionHTML !== null) {
            $('#smsSection').empty().append(response.smsSectionHTML);
         }
         popup.closePopup();
         confirmSMSDevice(phoneNumber);
      }
      
      defaultPointer();
   });

   event.preventDefault();
   event.stopPropagation();
}

function closeFilter() {
$('#clickOverlay').hide();
$('#filterList').hide();
}

/*
	fields in the args object:
	- popObj: the jquery set of the elem to be popped.
	           it will be removed from its current place in the dom
	           and attached to the body element to avoid any ie index issues.

	- refElem: the dom element to position popup relative to.
	              can exclude and position popup yourself.

	- top: the number of px to set the popup top from refElem bottom.
	       required if using refElem.

	- left: the number of px to set the popup left from refElem left.
	       this or right required if using refElem.

	- right: the number of px to set the popup right from refElem left + width.
	       this or left required if using refElem.

	- click: function to be called on overlay click
*/
function addClickOverlay(args) {
	var overlay = $('#clickOverlay');
	if(overlay.size() == 0) {
		var elem = document.createElement('div');
		elem.id='clickOverlay';
		$('body').append(elem);
	}

	overlay.empty();
	overlay.show();

	args['popObj'].addClass('popObj');
	var popElem = args['popObj'].get(0);
	if(args['popObj'].parent('body').size() == 0 && typeof(popElem)!="undefined") {
		document.body.appendChild(popElem.parentNode.removeChild(popElem));
	}
	args['popObj'].show();

	if(args['refElem']) {
		positionAt(args);
		$(window).resize(function(){positionAt(args)});
	}
	overlay.live('click', args['click']);
}
function positionAt(args) {
	var pos = getPos(args['refElem']);
	var t = pos.top + pos.height + args['top'];
	args['popObj'].css('position', 'absolute');
	args['popObj'].css('top', t+'px');
	if(args['left'] === undefined) {
		var r = document.body.clientWidth - pos.left - pos.width + args['right'];
		args['popObj'].css('right', r+'px');
	} else {
		var l = pos.left + args['left'];
		args['popObj'].css('left', l+'px');
	}
}

function renderProfileMsg(msg,maxChars,maxLines) {
    var nlCount = 0, chCount = 0, idx = 0, html = [], more = false;
    var pat = new RegExp("^(https?://[^ \"\n]+)");
    html.push('<p><span class="begin">');
    msg = msg.replace(/&gt;/g,'>')
             .replace(/&lt;/g,'<')
             .replace(/&#160;/g,'\u00a0');
    var profileLen = msg.length;
    for ( idx = 0; idx < profileLen; idx++ ) {
        var ch = msg.charAt(idx);
        if ( ch == "\n" ) {
            nlCount += 1;
            if ( ! more && nlCount > maxLines ) {
                html.push('</span><span class="rest">');
                more = true;
            }
            html.push("<br />");
        } else {
            var left = msg.substr(idx);
            var match = undefined;
            if ( ch == 'h' ) {
                match = left.match(pat);
            }
            if ( match ) {
                html.push('<a target="_blank" href="');
                html.push(match[0]);
                html.push('">');
                html.push(match[0]);
                html.push('</a>')
                idx += match[0].length - 1;
                if ( ! more && idx > maxChars && idx < profileLen - 1 ) {
                    console.log( 'more: idx = ' + idx + ', maxChars = ' + maxChars + ', profileLen = ' + profileLen );
                	html.push('</span><span class="elip">...</span><span class="rest">');
                    more = true;
                }
            } else {
                if ( ! more && idx > maxChars && idx < profileLen - 1 ) {
                    html.push('</span><span class="elip">...</span><span class="rest">');
                    more = true;
                }
                switch ( ch ) {
                case '<' : html.push('&lt;'); break;
                case '>' : html.push('&gt;'); break;
                case '&' : html.push('&amp;'); break;
                case '\u00a0' : html.push('&#160;'); break;
                default: html.push(ch);
                }
            }
        }
    }
    html.push('</span></p>');
    if ( more ) {
        html.push('<a href="#" id="about-more-link">More</a>\n');
    }
    return html.join('');
}

function handleGtalkInvite(el,action,user) {
	if ( typeof(WIM) != 'undefined' && typeof(WIM.authorizeUser) != 'undefined' ) {
		WIM.authorizeUser(user,'google',action,function() { 
			// It worked, invoke our delete
			$(el).closest('li.activity').find('div.actions a.delete').click();
		})
	}
}

/* Initialize our gtalk invite notifications */
$(document).ready( function() { 
	if ( typeof(WIM) != 'undefined' ) {
		$('ul.notifications div.gtalk-invite-actions').show();
		$('ul.notifications span.gtalk-invite-question').show();
	}
});
/* End gtalk notification init */
