<commit_before>
function confirmDelete() { return confirm(aStr.delitem); }

function commentOpenUI(obj, id) {
	$(document).unbind( "click.commentOpen", handler );

	var handler = function() {
		if(obj.value == aStr.comment) {
			obj.value = '';
			$("#comment-edit-text-" + id).addClass("comment-edit-text-full").removeClass("comment-edit-text-empty");
			// Choose an arbitrary tab index that's greater than what we're using in jot (3 of them)
			// The submit button gets tabindex + 1
			$("#comment-edit-text-" + id).attr('tabindex','9');
			$("#comment-edit-submit-" + id).attr('tabindex','10');
			$("#comment-tools-" + id).show();
		}
	};

	$(document).bind( "click.commentOpen", handler );
}

function commentCloseUI(obj, id) {
	$(document).unbind( "click.commentClose", handler );

	var handler = function() {
		if(obj.value === '') {
		obj.value = aStr.comment;
			$("#comment-edit-text-" + id).removeClass("comment-edit-text-full").addClass("comment-edit-text-empty");
			$("#comment-edit-text-" + id).removeAttr('tabindex');
			$("#comment-edit-submit-" + id).removeAttr('tabindex');
			$("#comment-tools-" + id).hide();
		}
	};

	$(document).bind( "click.commentClose", handler );
}

function commentOpen(obj, id) {
	if(obj.value == aStr.comment) {
		obj.value = '';
		$("#comment-edit-text-" + id).addClass("comment-edit-text-full");
		$("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
		$("#mod-cmnt-wrap-" + id).show();
		openMenu("comment-tools-" + id);
		return true;
	}
	return false;
}

function commentClose(obj, id) {
	if(obj.value === '') {
		obj.value = aStr.comment;
		$("#comment-edit-text-" + id).removeClass("comment-edit-text-full");
		$("#comment-edit-text-" + id).addClass("comment-edit-text-empty");
		$("#mod-cmnt-wrap-" + id).hide();
		closeMenu("comment-tools-" + id);
		return true;
	}
	return false;
}

function showHideCommentBox(id) {
	if( $('#comment-edit-form-' + id).is(':visible')) {
		$('#comment-edit-form-' + id).hide();
	} else {
		$('#comment-edit-form-' + id).show();
	}
}

function commentInsert(obj, id) {
	var tmpStr = $("#comment-edit-text-" + id).val();
	if(tmpStr == '$comment') {
		tmpStr = '';
		$("#comment-edit-text-" + id).addClass("comment-edit-text-full");
		$("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
		openMenu("comment-tools-" + id);
	}
	var ins = $(obj).html();
	ins = ins.replace('&lt;','<');
	ins = ins.replace('&gt;','>');
	ins = ins.replace('&amp;','&');
	ins = ins.replace('&quot;','"');
	$("#comment-edit-text-" + id).val(tmpStr + ins);
}

function insertbbcomment(comment, BBcode, id) {
	// allow themes to override this
	if(typeof(insertFormatting) != 'undefined')
		return(insertFormatting(comment, BBcode, id));

	var urlprefix = ((BBcode == 'url') ? '#^' : '');

	var tmpStr = $("#comment-edit-text-" + id).val();
	if(tmpStr == comment) {
		tmpStr = "";
		$("#comment-edit-text-" + id).addClass("comment-edit-text-full");
		$("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
		openMenu("comment-tools-" + id);
		$("#comment-edit-text-" + id).val(tmpStr);
	}

	textarea = document.getElementById("comment-edit-text-" +id);
	if (document.selection) {
		textarea.focus();
		selected = document.selection.createRange();
		selected.text = urlprefix+"["+BBcode+"]" + selected.text + "[/"+BBcode+"]";
	} else if (textarea.selectionStart || textarea.selectionStart == "0") {
		var start = textarea.selectionStart;
		var end = textarea.selectionEnd;
		textarea.value = textarea.value.substring(0, start) + urlprefix+"["+BBcode+"]" + textarea.value.substring(start, end) + "[/"+BBcode+"]" + textarea.value.substring(end, textarea.value.length);
	}
	return true;
}

function inserteditortag(BBcode) {
	// allow themes to override this
	if(typeof(insertEditorFormatting) != 'undefined')
		return(insertEditorFormatting(BBcode));

	textarea = document.getElementById('profile-jot-text');
	if (document.selection) {
		textarea.focus();
		selected = document.selection.createRange();
		selected.text = urlprefix+"["+BBcode+"]" + selected.text + "[/"+BBcode+"]";
	} else if (textarea.selectionStart || textarea.selectionStart == "0") {
		var start = textarea.selectionStart;
		var end = textarea.selectionEnd;
		textarea.value = textarea.value.substring(0, start) + "["+BBcode+"]" + textarea.value.substring(start, end) + "[/"+BBcode+"]" + textarea.value.substring(end, textarea.value.length);
	}
	return true;
}

function insertCommentURL(comment, id) {
	reply = prompt(aStr.linkurl);
	if(reply && reply.length) {
		reply = bin2hex(reply);
		$('body').css('cursor', 'wait');
		$.get('parse_url?binurl=' + reply, function(data) {
			var tmpStr = $("#comment-edit-text-" + id).val();
			if(tmpStr == comment) {
				tmpStr = "";
				$("#comment-edit-text-" + id).addClass("comment-edit-text-full");
				$("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
				openMenu("comment-tools-" + id);
				$("#comment-edit-text-" + id).val(tmpStr);
			}

			textarea = document.getElementById("comment-edit-text-" +id);
			textarea.value = textarea.value + data;
			$('body').css('cursor', 'auto');
		});
	}
	return true;
}

function viewsrc(id) {
	$.colorbox({href: 'viewsrc/' + id, maxWidth: '80%', maxHeight: '80%' });
}

function qCommentInsert(obj, id) {
	var tmpStr = $("#comment-edit-text-" + id).val();
	if(tmpStr == aStr.comment) {
		tmpStr = '';
		$("#comment-edit-text-" + id).addClass("comment-edit-text-full");
		$("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
		openMenu("comment-edit-submit-wrapper-" + id);
	}
	var ins = $(obj).val();
	ins = ins.replace('&lt;','<');
	ins = ins.replace('&gt;','>');
	ins = ins.replace('&amp;','&');
	ins = ins.replace('&quot;','"');
	$("#comment-edit-text-" + id).val(tmpStr + ins);
	$(obj).val('');
}

function showHideComments(id) {
	if( $('#collapsed-comments-' + id).is(':visible')) {
		$('#collapsed-comments-' + id + ' .autotime').timeago('dispose');
		$('#collapsed-comments-' + id).slideUp();
		$('#hide-comments-' + id).html(aStr.showmore);
		$('#hide-comments-total-' + id).show();
	} else {
		$('#collapsed-comments-' + id + ' .autotime').timeago();
		$('#collapsed-comments-' + id).slideDown();
		$('#hide-comments-' + id).html(aStr.showfewer);
		$('#hide-comments-total-' + id).hide();
	}
}

function openClose(theID) {
	if(document.getElementById(theID).style.display == "block") {
		document.getElementById(theID).style.display = "none";
	} else {
		document.getElementById(theID).style.display = "block";
	}
}

function closeOpen(theID) {
	if(document.getElementById(theID).style.display == "none") {
		document.getElementById(theID).style.display = "block";
	} else {
		document.getElementById(theID).style.display = "none";
	}
}

function openMenu(theID) {
	document.getElementById(theID).style.display = "block";
}

function closeMenu(theID) {
	document.getElementById(theID).style.display = "none";
}

function markRead(notifType) {
	$.get('ping?f=&markRead='+notifType);
	if(timer) clearTimeout(timer);
	$('#' + notifType + '-update').html('');
	timer = setTimeout(NavUpdate,2000);
}

function markItemRead(itemId) {
	$.get('ping?f=&markItemRead='+itemId);
	$('.unseen-wall-indicator-'+itemId).hide();
}


var src = null;
var prev = null;
var livetime = null;
var msie = false;
var stopped = false;
var totStopped = false;
var timer = null;
var pr = 0;
var liking = 0;
var in_progress = false;
var langSelect = false;
var commentBusy = false;
var last_popup_menu = null;
var last_popup_button = null;
var scroll_next = false;
var next_page = 1;
var page_load = true;
var loadingPage = true;
var pageHasMoreContent = true;
var updateCountsOnly = false;
var divmore_height = 400;
var last_filestorage_id = null;

$(function() {
	$.ajaxSetup({cache: false});

	msie = false; // $.browser.msie ;

	var e = document.getElementById('content-complete');
	if(e)
		pageHasMoreContent = false;		

	/* setup onoff widgets */
	$(".onoff input").each(function(){
		val = $(this).val();
		id = $(this).attr("id");
		$("#"+id+"_onoff ."+ (val==0?"on":"off")).addClass("hidden");
	});
	$(".onoff > a").click(function(event){
		event.preventDefault();	
		var input = $(this).siblings("input");
		var val = 1-input.val();
		var id = input.attr("id");
		$("#"+id+"_onoff ."+ (val==0?"on":"off")).addClass("hidden");
		$("#"+id+"_onoff ."+ (val==1?"on":"off")).removeClass("hidden");
		input.val(val);
		//console.log(id);
	});

	/* setup field_richtext */
	setupFieldRichtext();


	/* Turn elements with one of our special rel tags into popup menus */
	/* CHANGES: let bootstrap handle popups and only do the loading here */

	$('a[rel^=#]').click(function(e){
		manage_popup_menu(this, e);
		return;
	});

	$('span[rel^=#]').click(function(e){
		manage_popup_menu(this, e);
		return;
	});

	function manage_popup_menu(w,e) {
		menu = $( $(w).attr('rel') );

		/* notification menus are loaded dynamically 
		 * - here we find a rel tag to figure out what type of notification to load */

		var loader_source = $(menu).attr('rel');

		if(typeof(loader_source) != 'undefined' && loader_source.length) {	
			notify_popup_loader(loader_source);
		}
	}

	// fancyboxes
	// Is this actually used anywhere?
	$("a.popupbox").colorbox({
		'transition' : 'elastic'
	});

	NavUpdate(); 
	// Allow folks to stop the ajax page updates with the pause/break key
	$(document).keydown(function(event) {
		if(event.keyCode == '8') {
			var target = event.target || event.srcElement;
			if (!/input|textarea/i.test(target.nodeName)) {
				return false;
			}
		}
		if(event.keyCode == '34') {
			if((pageHasMoreContent) && (! loadingPage)) {
				$('#more').hide();
				$('#no-more').hide();

				next_page++;
				scroll_next = true;
				loadingPage = true;

				if(($('.directory-end').length == 0) && ($('.photos-end').length == 0))
					liveUpdate();
				else
					pageUpdate();
				return true;
			}
		}

		if(event.keyCode == '19' || (event.ctrlKey && event.which == '32')) {
			event.preventDefault();
			if(stopped === false) {
				stopped = true;
				if (event.ctrlKey) {
					totStopped = true;
				}
				$('#pause').html('<img src="images/pause.gif" alt="pause" style="border: 1px solid black;" />');
			} else {
				unpause();
			}
		} else {
			if (!totStopped) {
				unpause();
			}
		}
	});
});

function NavUpdate() {
	if(liking)
		$('.like-rotator').spin(false);

	if(! stopped) {
		var pingCmd = 'ping' + ((localUser != 0) ? '?f=&uid=' + localUser : '');

		$.get(pingCmd,function(data) {
			if(data.invalid == 1) { 
				window.location.href=window.location.href;
			}

			if(! updateCountsOnly) {
				// start live update

				if($('#live-network').length) { src = 'network'; liveUpdate(); }
				if($('#live-channel').length) { src = 'channel'; liveUpdate(); }
				if($('#live-home').length)    { src = 'home'; liveUpdate(); }
				if($('#live-display').length) { src = 'display'; liveUpdate(); }
				if($('#live-search').length)  { src = 'search'; liveUpdate(); }

				if($('#live-photos').length) {
					if(liking) {
						liking = 0;
						window.location.href=window.location.href;
					}
				}
			}

			updateCountsOnly = false;

			if(data.network == 0) {
				data.network = '';
				$('.net-update').removeClass('show');
			} else {
				$('.net-update').addClass('show');
			}
			$('.net-update').html(data.network);

			if(data.home == 0) { data.home = ''; $('.home-update').removeClass('show'); } else { $('.home-update').addClass('show'); }
			$('.home-update').html(data.home);

			if(data.intros == 0) { data.intros = ''; $('.intro-update').removeClass('show'); } else { $('.intro-update').addClass('show'); }
			$('.intro-update').html(data.intros);

			if(data.mail == 0) { data.mail = ''; $('.mail-update').removeClass('show'); } else { $('.mail-update').addClass('show'); }
			$('.mail-update').html(data.mail);

			if(data.notify == 0) { data.notify = ''; $('.notify-update').removeClass('show'); } else { $('.notify-update').addClass('show'); }
			$('.notify-update').html(data.notify);

			if(data.register == 0) { data.register = ''; $('.register-update').removeClass('show'); } else { $('.register-update').addClass('show'); }
			$('.register-update').html(data.register);

			if(data.events == 0) { data.events = ''; $('.events-update').removeClass('show'); } else { $('.events-update').addClass('show'); }
			$('.events-update').html(data.events);

			if(data.events_today == 0) { data.events_today = ''; $('.events-today-update').removeClass('show'); } else { $('.events-today-update').addClass('show'); $('.events-update').html(data.events + '*'); }
			$('.events-today-update').html(data.events_today);

			if(data.birthdays == 0) { data.birthdays = ''; $('.birthdays-update').removeClass('show'); } else { $('.birthdays-update').addClass('show'); }
			$('.birthdays-update').html(data.birthdays);

			if(data.birthdays_today == 0) { data.birthdays_today = ''; $('.birthdays-today-update').removeClass('show'); } else { $('.birthdays-today-update').addClass('show'); $('.birthdays-update').html(data.birthdays + '*'); }
			$('.birthdays-today-update').html(data.birthdays_today);

			if(data.all_events == 0) { data.all_events = ''; $('.all_events-update').removeClass('show'); } else { $('.all_events-update').addClass('show'); }
			$('.all_events-update').html(data.all_events);

			if(data.all_events_today == 0) { data.all_events_today = ''; $('.all_events-today-update').removeClass('show'); } else { $('.all_events-today-update').addClass('show'); $('.all_events-update').html(data.all_events + '*'); }
			$('.all_events-today-update').html(data.all_events_today);

			$.jGrowl.defaults.closerTemplate = '<div>[ ' + aStr.closeAll + ']</div>';

			$(data.notice).each(function() {
				$.jGrowl(this.message, { sticky: true, theme: 'notice' });
			});

			$(data.info).each(function(){
				$.jGrowl(this.message, { sticky: false, theme: 'info', life: 10000 });
			});
		}) ;
	}
	timer = setTimeout(NavUpdate, updateInterval);
}


function updatePageItems(mode, data) {

	if(mode === 'append') {
		$(data).each(function() {
			$('#page-end').before($(this));
		});

		if(loadingPage) {
			loadingPage = false;
		}
	}

	var e = document.getElementById('content-complete');
	if(e) {
		pageHasMoreContent = false;
	}

	collapseHeight();
}


function updateConvItems(mode,data) {

	if(mode === 'update') {
		prev = 'threads-begin';

		$('.thread-wrapper.toplevel_item',data).each(function() {

			var ident = $(this).attr('id');
			// This should probably use the context argument instead
			var commentWrap = $('#'+ident+' .collapsed-comments').attr('id');
			var itmId = 0;
			var isVisible = false;

			if(typeof commentWrap !== 'undefined')
				itmId = commentWrap.replace('collapsed-comments-','');
				
			if($('#' + ident).length == 0 && profile_page == 1) {
				$('img',this).each(function() {
					$(this).attr('src',$(this).attr('dst'));
				});
				if($('#collapsed-comments-'+itmId).is(':visible'))
					isVisible = true;
				$('#' + prev).after($(this));
				if(isVisible)
					showHideComments(itmId);
				$("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago();
			}
			else {
				$('img',this).each(function() {
					$(this).attr('src',$(this).attr('dst'));
				});
				if($('#collapsed-comments-'+itmId).is(':visible'))
					isVisible = true;
				$('#' + ident).replaceWith($(this));
				if(isVisible)
					showHideComments(itmId);
				$("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago();
			}
			prev = ident;
		});
	}
	if(mode === 'append') {

		next = 'threads-end';

		$('.thread-wrapper.toplevel_item',data).each(function() {
			var ident = $(this).attr('id');
			var commentWrap = $('#'+ident+' .collapsed-comments').attr('id');
			var itmId = 0;
			var isVisible = false;

			if(typeof commentWrap !== 'undefined')
				itmId = commentWrap.replace('collapsed-comments-', '');

			if($('#' + ident).length == 0) {
				$('img',this).each(function() {
					$(this).attr('src',$(this).attr('dst'));
				});
				if($('#collapsed-comments-'+itmId).is(':visible'))
					isVisible = true;
				$('#threads-end').before($(this));
				if(isVisible)
					showHideComments(itmId);
				$("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago();
			}
			else {
				$('img',this).each(function() {
					$(this).attr('src', $(this).attr('dst'));
				});
				if($('#collapsed-comments-'+itmId).is(':visible'))
					isVisible = true;
				$('#' + ident).replaceWith($(this));
				if(isVisible)
					showHideComments(itmId);
				$("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago();
			}
		});

		if(loadingPage) {
			loadingPage = false;
		}
	}
	if(mode === 'replace') {
		// clear existing content
		$('.thread-wrapper').remove();

		prev = 'threads-begin';

		$('.thread-wrapper.toplevel_item',data).each(function() {

			var ident = $(this).attr('id');
			var commentWrap = $('#'+ident+' .collapsed-comments').attr('id');
			var itmId = 0;
			var isVisible = false;

			if(typeof commentWrap !== 'undefined')
				itmId = commentWrap.replace('collapsed-comments-','');

			if($('#' + ident).length == 0 && profile_page == 1) {
				$('img',this).each(function() {
					$(this).attr('src',$(this).attr('dst'));
				});
				if($('#collapsed-comments-'+itmId).is(':visible'))
					isVisible = true;
				$('#' + prev).after($(this));
				if(isVisible)
					showHideComments(itmId);
				$("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago();
			}
			prev = ident;
		});

		if(loadingPage) {
			loadingPage = false;
		}

		if (window.location.search.indexOf("mid=") != -1 || window.location.pathname.indexOf("display") != -1) {
			var title = $(".wall-item-title").text();
			title.replace(/^\s+/, '');
			title.replace(/\s+$/, '');
			if (title)
				document.title = title + " - " + document.title;
		}
	}

	$('.like-rotator').spin(false);

	if(commentBusy) {
		commentBusy = false;
		$('body').css('cursor', 'auto');
	}

	/* autocomplete @nicknames */
	$(".comment-edit-form  textarea").editor_autocomplete(baseurl+"/acl?f=&n=1");

	var bimgs = $(".wall-item-body img").not(function() { return this.complete; });
	var bimgcount = bimgs.length;

	if (bimgcount) {
		bimgs.load(function() {
			bimgcount--;
			if (! bimgcount) {
				collapseHeight();
			}
		});
	} else {
		collapseHeight();
	}
}


function collapseHeight() {
	$(".wall-item-body, .contact-info").each(function() {
		if($(this).height() > divmore_height + 10) {
			if(! $(this).hasClass('divmore')) {
				$(this).readmore({
					collapsedHeight: divmore_height, 
					moreLink: '<a href="#" class="divgrow-showmore">' + aStr.divgrowmore + '</a>',
					lessLink: '<a href="#" class="divgrow-showmore">' + aStr.divgrowless + '</a>'
				});
				$(this).addClass('divmore');
			}
		}
	});
}

function liveUpdate() {
	if(typeof profile_uid === 'undefined') profile_uid = false; /* Should probably be unified with channelId defined in head.tpl */
	if((src === null) || (stopped) || (! profile_uid)) { $('.like-rotator').spin(false); return; }
	if(($('.comment-edit-text-full').length) || (in_progress)) {
		if(livetime) {
			clearTimeout(livetime);
		}
		livetime = setTimeout(liveUpdate, 10000);
		return;
	}
	if(livetime !== null)
		livetime = null;
<commit_msg>do not move viewed content off the screen after collapsing a long post<commit_after>
function confirmDelete() { return confirm(aStr.delitem); }

function commentOpenUI(obj, id) {
	$(document).unbind( "click.commentOpen", handler );

	var handler = function() {
		if(obj.value == aStr.comment) {
			obj.value = '';
			$("#comment-edit-text-" + id).addClass("comment-edit-text-full").removeClass("comment-edit-text-empty");
			// Choose an arbitrary tab index that's greater than what we're using in jot (3 of them)
			// The submit button gets tabindex + 1
			$("#comment-edit-text-" + id).attr('tabindex','9');
			$("#comment-edit-submit-" + id).attr('tabindex','10');
			$("#comment-tools-" + id).show();
		}
	};

	$(document).bind( "click.commentOpen", handler );
}

function commentCloseUI(obj, id) {
	$(document).unbind( "click.commentClose", handler );

	var handler = function() {
		if(obj.value === '') {
		obj.value = aStr.comment;
			$("#comment-edit-text-" + id).removeClass("comment-edit-text-full").addClass("comment-edit-text-empty");
			$("#comment-edit-text-" + id).removeAttr('tabindex');
			$("#comment-edit-submit-" + id).removeAttr('tabindex');
			$("#comment-tools-" + id).hide();
		}
	};

	$(document).bind( "click.commentClose", handler );
}

function commentOpen(obj, id) {
	if(obj.value == aStr.comment) {
		obj.value = '';
		$("#comment-edit-text-" + id).addClass("comment-edit-text-full");
		$("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
		$("#mod-cmnt-wrap-" + id).show();
		openMenu("comment-tools-" + id);
		return true;
	}
	return false;
}

function commentClose(obj, id) {
	if(obj.value === '') {
		obj.value = aStr.comment;
		$("#comment-edit-text-" + id).removeClass("comment-edit-text-full");
		$("#comment-edit-text-" + id).addClass("comment-edit-text-empty");
		$("#mod-cmnt-wrap-" + id).hide();
		closeMenu("comment-tools-" + id);
		return true;
	}
	return false;
}

function showHideCommentBox(id) {
	if( $('#comment-edit-form-' + id).is(':visible')) {
		$('#comment-edit-form-' + id).hide();
	} else {
		$('#comment-edit-form-' + id).show();
	}
}

function commentInsert(obj, id) {
	var tmpStr = $("#comment-edit-text-" + id).val();
	if(tmpStr == '$comment') {
		tmpStr = '';
		$("#comment-edit-text-" + id).addClass("comment-edit-text-full");
		$("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
		openMenu("comment-tools-" + id);
	}
	var ins = $(obj).html();
	ins = ins.replace('&lt;','<');
	ins = ins.replace('&gt;','>');
	ins = ins.replace('&amp;','&');
	ins = ins.replace('&quot;','"');
	$("#comment-edit-text-" + id).val(tmpStr + ins);
}

function insertbbcomment(comment, BBcode, id) {
	// allow themes to override this
	if(typeof(insertFormatting) != 'undefined')
		return(insertFormatting(comment, BBcode, id));

	var urlprefix = ((BBcode == 'url') ? '#^' : '');

	var tmpStr = $("#comment-edit-text-" + id).val();
	if(tmpStr == comment) {
		tmpStr = "";
		$("#comment-edit-text-" + id).addClass("comment-edit-text-full");
		$("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
		openMenu("comment-tools-" + id);
		$("#comment-edit-text-" + id).val(tmpStr);
	}

	textarea = document.getElementById("comment-edit-text-" +id);
	if (document.selection) {
		textarea.focus();
		selected = document.selection.createRange();
		selected.text = urlprefix+"["+BBcode+"]" + selected.text + "[/"+BBcode+"]";
	} else if (textarea.selectionStart || textarea.selectionStart == "0") {
		var start = textarea.selectionStart;
		var end = textarea.selectionEnd;
		textarea.value = textarea.value.substring(0, start) + urlprefix+"["+BBcode+"]" + textarea.value.substring(start, end) + "[/"+BBcode+"]" + textarea.value.substring(end, textarea.value.length);
	}
	return true;
}

function inserteditortag(BBcode) {
	// allow themes to override this
	if(typeof(insertEditorFormatting) != 'undefined')
		return(insertEditorFormatting(BBcode));

	textarea = document.getElementById('profile-jot-text');
	if (document.selection) {
		textarea.focus();
		selected = document.selection.createRange();
		selected.text = urlprefix+"["+BBcode+"]" + selected.text + "[/"+BBcode+"]";
	} else if (textarea.selectionStart || textarea.selectionStart == "0") {
		var start = textarea.selectionStart;
		var end = textarea.selectionEnd;
		textarea.value = textarea.value.substring(0, start) + "["+BBcode+"]" + textarea.value.substring(start, end) + "[/"+BBcode+"]" + textarea.value.substring(end, textarea.value.length);
	}
	return true;
}

function insertCommentURL(comment, id) {
	reply = prompt(aStr.linkurl);
	if(reply && reply.length) {
		reply = bin2hex(reply);
		$('body').css('cursor', 'wait');
		$.get('parse_url?binurl=' + reply, function(data) {
			var tmpStr = $("#comment-edit-text-" + id).val();
			if(tmpStr == comment) {
				tmpStr = "";
				$("#comment-edit-text-" + id).addClass("comment-edit-text-full");
				$("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
				openMenu("comment-tools-" + id);
				$("#comment-edit-text-" + id).val(tmpStr);
			}

			textarea = document.getElementById("comment-edit-text-" +id);
			textarea.value = textarea.value + data;
			$('body').css('cursor', 'auto');
		});
	}
	return true;
}

function viewsrc(id) {
	$.colorbox({href: 'viewsrc/' + id, maxWidth: '80%', maxHeight: '80%' });
}

function qCommentInsert(obj, id) {
	var tmpStr = $("#comment-edit-text-" + id).val();
	if(tmpStr == aStr.comment) {
		tmpStr = '';
		$("#comment-edit-text-" + id).addClass("comment-edit-text-full");
		$("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
		openMenu("comment-edit-submit-wrapper-" + id);
	}
	var ins = $(obj).val();
	ins = ins.replace('&lt;','<');
	ins = ins.replace('&gt;','>');
	ins = ins.replace('&amp;','&');
	ins = ins.replace('&quot;','"');
	$("#comment-edit-text-" + id).val(tmpStr + ins);
	$(obj).val('');
}

function showHideComments(id) {
	if( $('#collapsed-comments-' + id).is(':visible')) {
		$('#collapsed-comments-' + id + ' .autotime').timeago('dispose');
		$('#collapsed-comments-' + id).slideUp();
		$('#hide-comments-' + id).html(aStr.showmore);
		$('#hide-comments-total-' + id).show();
	} else {
		$('#collapsed-comments-' + id + ' .autotime').timeago();
		$('#collapsed-comments-' + id).slideDown();
		$('#hide-comments-' + id).html(aStr.showfewer);
		$('#hide-comments-total-' + id).hide();
	}
}

function openClose(theID) {
	if(document.getElementById(theID).style.display == "block") {
		document.getElementById(theID).style.display = "none";
	} else {
		document.getElementById(theID).style.display = "block";
	}
}

function closeOpen(theID) {
	if(document.getElementById(theID).style.display == "none") {
		document.getElementById(theID).style.display = "block";
	} else {
		document.getElementById(theID).style.display = "none";
	}
}

function openMenu(theID) {
	document.getElementById(theID).style.display = "block";
}

function closeMenu(theID) {
	document.getElementById(theID).style.display = "none";
}

function markRead(notifType) {
	$.get('ping?f=&markRead='+notifType);
	if(timer) clearTimeout(timer);
	$('#' + notifType + '-update').html('');
	timer = setTimeout(NavUpdate,2000);
}

function markItemRead(itemId) {
	$.get('ping?f=&markItemRead='+itemId);
	$('.unseen-wall-indicator-'+itemId).hide();
}


var src = null;
var prev = null;
var livetime = null;
var msie = false;
var stopped = false;
var totStopped = false;
var timer = null;
var pr = 0;
var liking = 0;
var in_progress = false;
var langSelect = false;
var commentBusy = false;
var last_popup_menu = null;
var last_popup_button = null;
var scroll_next = false;
var next_page = 1;
var page_load = true;
var loadingPage = true;
var pageHasMoreContent = true;
var updateCountsOnly = false;
var divmore_height = 400;
var last_filestorage_id = null;

$(function() {
	$.ajaxSetup({cache: false});

	msie = false; // $.browser.msie ;

	var e = document.getElementById('content-complete');
	if(e)
		pageHasMoreContent = false;		

	/* setup onoff widgets */
	$(".onoff input").each(function(){
		val = $(this).val();
		id = $(this).attr("id");
		$("#"+id+"_onoff ."+ (val==0?"on":"off")).addClass("hidden");
	});
	$(".onoff > a").click(function(event){
		event.preventDefault();	
		var input = $(this).siblings("input");
		var val = 1-input.val();
		var id = input.attr("id");
		$("#"+id+"_onoff ."+ (val==0?"on":"off")).addClass("hidden");
		$("#"+id+"_onoff ."+ (val==1?"on":"off")).removeClass("hidden");
		input.val(val);
		//console.log(id);
	});

	/* setup field_richtext */
	setupFieldRichtext();


	/* Turn elements with one of our special rel tags into popup menus */
	/* CHANGES: let bootstrap handle popups and only do the loading here */

	$('a[rel^=#]').click(function(e){
		manage_popup_menu(this, e);
		return;
	});

	$('span[rel^=#]').click(function(e){
		manage_popup_menu(this, e);
		return;
	});

	function manage_popup_menu(w,e) {
		menu = $( $(w).attr('rel') );

		/* notification menus are loaded dynamically 
		 * - here we find a rel tag to figure out what type of notification to load */

		var loader_source = $(menu).attr('rel');

		if(typeof(loader_source) != 'undefined' && loader_source.length) {	
			notify_popup_loader(loader_source);
		}
	}

	// fancyboxes
	// Is this actually used anywhere?
	$("a.popupbox").colorbox({
		'transition' : 'elastic'
	});

	NavUpdate(); 
	// Allow folks to stop the ajax page updates with the pause/break key
	$(document).keydown(function(event) {
		if(event.keyCode == '8') {
			var target = event.target || event.srcElement;
			if (!/input|textarea/i.test(target.nodeName)) {
				return false;
			}
		}
		if(event.keyCode == '34') {
			if((pageHasMoreContent) && (! loadingPage)) {
				$('#more').hide();
				$('#no-more').hide();

				next_page++;
				scroll_next = true;
				loadingPage = true;

				if(($('.directory-end').length == 0) && ($('.photos-end').length == 0))
					liveUpdate();
				else
					pageUpdate();
				return true;
			}
		}

		if(event.keyCode == '19' || (event.ctrlKey && event.which == '32')) {
			event.preventDefault();
			if(stopped === false) {
				stopped = true;
				if (event.ctrlKey) {
					totStopped = true;
				}
				$('#pause').html('<img src="images/pause.gif" alt="pause" style="border: 1px solid black;" />');
			} else {
				unpause();
			}
		} else {
			if (!totStopped) {
				unpause();
			}
		}
	});
});

function NavUpdate() {
	if(liking)
		$('.like-rotator').spin(false);

	if(! stopped) {
		var pingCmd = 'ping' + ((localUser != 0) ? '?f=&uid=' + localUser : '');

		$.get(pingCmd,function(data) {
			if(data.invalid == 1) { 
				window.location.href=window.location.href;
			}

			if(! updateCountsOnly) {
				// start live update

				if($('#live-network').length) { src = 'network'; liveUpdate(); }
				if($('#live-channel').length) { src = 'channel'; liveUpdate(); }
				if($('#live-home').length)    { src = 'home'; liveUpdate(); }
				if($('#live-display').length) { src = 'display'; liveUpdate(); }
				if($('#live-search').length)  { src = 'search'; liveUpdate(); }

				if($('#live-photos').length) {
					if(liking) {
						liking = 0;
						window.location.href=window.location.href;
					}
				}
			}

			updateCountsOnly = false;

			if(data.network == 0) {
				data.network = '';
				$('.net-update').removeClass('show');
			} else {
				$('.net-update').addClass('show');
			}
			$('.net-update').html(data.network);

			if(data.home == 0) { data.home = ''; $('.home-update').removeClass('show'); } else { $('.home-update').addClass('show'); }
			$('.home-update').html(data.home);

			if(data.intros == 0) { data.intros = ''; $('.intro-update').removeClass('show'); } else { $('.intro-update').addClass('show'); }
			$('.intro-update').html(data.intros);

			if(data.mail == 0) { data.mail = ''; $('.mail-update').removeClass('show'); } else { $('.mail-update').addClass('show'); }
			$('.mail-update').html(data.mail);

			if(data.notify == 0) { data.notify = ''; $('.notify-update').removeClass('show'); } else { $('.notify-update').addClass('show'); }
			$('.notify-update').html(data.notify);

			if(data.register == 0) { data.register = ''; $('.register-update').removeClass('show'); } else { $('.register-update').addClass('show'); }
			$('.register-update').html(data.register);

			if(data.events == 0) { data.events = ''; $('.events-update').removeClass('show'); } else { $('.events-update').addClass('show'); }
			$('.events-update').html(data.events);

			if(data.events_today == 0) { data.events_today = ''; $('.events-today-update').removeClass('show'); } else { $('.events-today-update').addClass('show'); $('.events-update').html(data.events + '*'); }
			$('.events-today-update').html(data.events_today);

			if(data.birthdays == 0) { data.birthdays = ''; $('.birthdays-update').removeClass('show'); } else { $('.birthdays-update').addClass('show'); }
			$('.birthdays-update').html(data.birthdays);

			if(data.birthdays_today == 0) { data.birthdays_today = ''; $('.birthdays-today-update').removeClass('show'); } else { $('.birthdays-today-update').addClass('show'); $('.birthdays-update').html(data.birthdays + '*'); }
			$('.birthdays-today-update').html(data.birthdays_today);

			if(data.all_events == 0) { data.all_events = ''; $('.all_events-update').removeClass('show'); } else { $('.all_events-update').addClass('show'); }
			$('.all_events-update').html(data.all_events);

			if(data.all_events_today == 0) { data.all_events_today = ''; $('.all_events-today-update').removeClass('show'); } else { $('.all_events-today-update').addClass('show'); $('.all_events-update').html(data.all_events + '*'); }
			$('.all_events-today-update').html(data.all_events_today);

			$.jGrowl.defaults.closerTemplate = '<div>[ ' + aStr.closeAll + ']</div>';

			$(data.notice).each(function() {
				$.jGrowl(this.message, { sticky: true, theme: 'notice' });
			});

			$(data.info).each(function(){
				$.jGrowl(this.message, { sticky: false, theme: 'info', life: 10000 });
			});
		}) ;
	}
	timer = setTimeout(NavUpdate, updateInterval);
}


function updatePageItems(mode, data) {

	if(mode === 'append') {
		$(data).each(function() {
			$('#page-end').before($(this));
		});

		if(loadingPage) {
			loadingPage = false;
		}
	}

	var e = document.getElementById('content-complete');
	if(e) {
		pageHasMoreContent = false;
	}

	collapseHeight();
}


function updateConvItems(mode,data) {

	if(mode === 'update') {
		prev = 'threads-begin';

		$('.thread-wrapper.toplevel_item',data).each(function() {

			var ident = $(this).attr('id');
			// This should probably use the context argument instead
			var commentWrap = $('#'+ident+' .collapsed-comments').attr('id');
			var itmId = 0;
			var isVisible = false;

			if(typeof commentWrap !== 'undefined')
				itmId = commentWrap.replace('collapsed-comments-','');
				
			if($('#' + ident).length == 0 && profile_page == 1) {
				$('img',this).each(function() {
					$(this).attr('src',$(this).attr('dst'));
				});
				if($('#collapsed-comments-'+itmId).is(':visible'))
					isVisible = true;
				$('#' + prev).after($(this));
				if(isVisible)
					showHideComments(itmId);
				$("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago();
			}
			else {
				$('img',this).each(function() {
					$(this).attr('src',$(this).attr('dst'));
				});
				if($('#collapsed-comments-'+itmId).is(':visible'))
					isVisible = true;
				$('#' + ident).replaceWith($(this));
				if(isVisible)
					showHideComments(itmId);
				$("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago();
			}
			prev = ident;
		});
	}
	if(mode === 'append') {

		next = 'threads-end';

		$('.thread-wrapper.toplevel_item',data).each(function() {
			var ident = $(this).attr('id');
			var commentWrap = $('#'+ident+' .collapsed-comments').attr('id');
			var itmId = 0;
			var isVisible = false;

			if(typeof commentWrap !== 'undefined')
				itmId = commentWrap.replace('collapsed-comments-', '');

			if($('#' + ident).length == 0) {
				$('img',this).each(function() {
					$(this).attr('src',$(this).attr('dst'));
				});
				if($('#collapsed-comments-'+itmId).is(':visible'))
					isVisible = true;
				$('#threads-end').before($(this));
				if(isVisible)
					showHideComments(itmId);
				$("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago();
			}
			else {
				$('img',this).each(function() {
					$(this).attr('src', $(this).attr('dst'));
				});
				if($('#collapsed-comments-'+itmId).is(':visible'))
					isVisible = true;
				$('#' + ident).replaceWith($(this));
				if(isVisible)
					showHideComments(itmId);
				$("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago();
			}
		});

		if(loadingPage) {
			loadingPage = false;
		}
	}
	if(mode === 'replace') {
		// clear existing content
		$('.thread-wrapper').remove();

		prev = 'threads-begin';

		$('.thread-wrapper.toplevel_item',data).each(function() {

			var ident = $(this).attr('id');
			var commentWrap = $('#'+ident+' .collapsed-comments').attr('id');
			var itmId = 0;
			var isVisible = false;

			if(typeof commentWrap !== 'undefined')
				itmId = commentWrap.replace('collapsed-comments-','');

			if($('#' + ident).length == 0 && profile_page == 1) {
				$('img',this).each(function() {
					$(this).attr('src',$(this).attr('dst'));
				});
				if($('#collapsed-comments-'+itmId).is(':visible'))
					isVisible = true;
				$('#' + prev).after($(this));
				if(isVisible)
					showHideComments(itmId);
				$("> .wall-item-outside-wrapper .autotime, > .thread-wrapper .autotime",this).timeago();
			}
			prev = ident;
		});

		if(loadingPage) {
			loadingPage = false;
		}

		if (window.location.search.indexOf("mid=") != -1 || window.location.pathname.indexOf("display") != -1) {
			var title = $(".wall-item-title").text();
			title.replace(/^\s+/, '');
			title.replace(/\s+$/, '');
			if (title)
				document.title = title + " - " + document.title;
		}
	}

	$('.like-rotator').spin(false);

	if(commentBusy) {
		commentBusy = false;
		$('body').css('cursor', 'auto');
	}

	/* autocomplete @nicknames */
	$(".comment-edit-form  textarea").editor_autocomplete(baseurl+"/acl?f=&n=1");

	var bimgs = $(".wall-item-body img").not(function() { return this.complete; });
	var bimgcount = bimgs.length;

	if (bimgcount) {
		bimgs.load(function() {
			bimgcount--;
			if (! bimgcount) {
				collapseHeight();
			}
		});
	} else {
		collapseHeight();
	}
}


function collapseHeight() {
	$(".wall-item-body, .contact-info").each(function() {
		var orgHeight = $(this).height();
		if(orgHeight > divmore_height + 10) {
			if(! $(this).hasClass('divmore')) {
				$(this).readmore({
					collapsedHeight: divmore_height, 
					moreLink: '<a href="#" class="divgrow-showmore">' + aStr.divgrowmore + '</a>',
					lessLink: '<a href="#" class="divgrow-showmore">' + aStr.divgrowless + '</a>',
					beforeToggle: function(trigger, element, expanded) {
						if(expanded) {
							if((($(element).offset().top + divmore_height) - $(window).scrollTop()) < 65 ) {
									$('html, body').animate( { scrollTop: $(window).scrollTop() - (orgHeight - divmore_height) }, {duration: 100 } );
							}
						}
					}
				});
				$(this).addClass('divmore');
			}
		}
	});
}

function liveUpdate() {
	if(typeof profile_uid === 'undefined') profile_uid = false; /* Should probably be unified with channelId defined in head.tpl */
	if((src === null) || (stopped) || (! profile_uid)) { $('.like-rotator').spin(false); return; }
	if(($('.comment-edit-text-full').length) || (in_progress)) {
		if(livetime) {
			clearTimeout(livetime);
		}
		livetime = setTimeout(liveUpdate, 10000);
		return;
	}
	if(livetime !== null)
		livetime = null;

{'fraction_non_alphanumeric': 0.22993364588937565, 'fraction_numerical': 0.004022237593830861, 'mean_word_length': 3.961738909368247, 'pattern_counts': {'":': 6, '<': 22, '<?xml version=': 0, '>': 45, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6368507', 'n_tokens_mistral': 15170, 'n_tokens_neox': 13323, 'n_words': 2228}