// utility functions
$.fn.uniqueArray = function(sourceArray) {
	var alreadySeen = {};
	var uniqueArray = new Array();
	$.each(sourceArray, function(i, v) {
		if(alreadySeen[v]) {return;}
		alreadySeen[v] = true;
		uniqueArray.push(v);
	});
	return uniqueArray;
}

// tag control
$(document).ready(function() {
	$('#tagControl').each(function() {
		this.addTag = function(tagNameToAdd) {
			var tagList = this.value.split(' ');
			tagList.push(tagNameToAdd);
			tagList = jQuery.fn.uniqueArray(tagList);
			this.value = tagList.join(' ').trim();
		}
	});

	$('.tagInserter').click(function() {
		var tagName = $(this).text();
		$('#tagControl').each(function() {this.addTag(tagName);});
		return false;
	});
});

// login slide
$(document).ready(function() {
	// Expand Panel
	$("#open").click(function(){
		$("div#panel").slideDown("slow");
	});

	// Collapse Panel
	$("#close").click(function(){
		$("div#panel").slideUp("slow");
	});

	// Switch buttons from "Log In | Register" to "Close Panel" on click
	$("#toggle a").click(function () {
		$("#toggle a").toggle();
	});
});

// comment upvote
$(document).ready(function() {
	var UpvoteInterval = 5;
	var nextAllowableUpvoteMilliseconds = 0;

	function ajaxifyUpvoteForms(unprocessed$) {
		unprocessed$.find("form.commentUpvoteForm").each(function() {
			var form = this;
			function postUpvote() {
				var currentMilliseconds = (new Date()).getTime();
				if(currentMilliseconds < nextAllowableUpvoteMilliseconds) {
					alert("Can only upvote once every " + UpvoteInterval + " seconds");
					return false;
				}
				else{
					nextAllowableUpvoteMilliseconds = currentMilliseconds + UpvoteInterval * 1000;
					$.post($(form).attr('action'), {submit:'',ajax:1}, upvotePostSuccess);
					return true;
				}
			}
			function upvotePostSuccess(data) {
				if(typeof data != "object") { return; }
				form.displayUpvoteForm(data.upvoteCount, false);
			}

			function constructIcon(isEnabled) {
				var upvoteIcon$ = $('<span>&#9650;</span>');
				if(isEnabled) { // generated linked icon
					var upvoteLink$ = $('<a href="#"></a>');
					upvoteLink$.click(function() {
						if(postUpvote()) { upvoteLink$.replaceWith(upvoteIcon$); }
						return false;
					});
					upvoteIcon$.appendTo(upvoteLink$);
					return upvoteLink$;
				}
				else{ return upvoteIcon$; }
			}
			this.displayUpvoteForm = function(upvoteCount, isEnabled) {
				$(this).children().remove();
				var upvoteSpan$ = $('<span class="upvote" title="Upvotes">' + (upvoteCount > 0 ? upvoteCount : '') + '</span>');
				upvoteSpan$.prepend(constructIcon(isEnabled));
				upvoteSpan$.appendTo(this);
			}

			// extract non-AJAX data
			var isEnabled = false;
			var upvoteCount = 0;
			$(this).find("input").each(function() {
				var upvoteLabel = $(this).val();
				var upvoteCountString = upvoteLabel.substr(1);
				upvoteCount = (upvoteCountString == "" ? 0 : parseInt(upvoteCountString));
				isEnabled = !$(this).attr('disabled');
			});
			this.displayUpvoteForm(upvoteCount, isEnabled);
		});
	}
	document.onMoreResults(ajaxifyUpvoteForms, true);
});

// ajax paging
(function() {
	var onMoreResultsCallbacks = new Array();
	document.onMoreResults = function(callbackOrResultElement, callInitially) {
		if(typeof callbackOrResultElement == "function") {
			var callback = callbackOrResultElement;
			onMoreResultsCallbacks.push(callback);
			if(callInitially) { callback($(document)); }
		}
		else{
			var resultsElement$ = callbackOrResultElement;
			$.each(onMoreResultsCallbacks, function() { this(resultsElement$); });
		}
	}
})();
$(document).ready(function() {
	function bindMoreResults(unprocessedContainer$) {
		unprocessedContainer$.find("a.moreResults").each(function() {
			this.replaceWithMoreResults = function() {
				if(this.isLoading) {return;}
				else{this.isLoading = true;}

				// replace "more results" with actual results
				var pagingElement$ = $(this).parent();
				pagingElement$.before('<div><div class="resultInfo">Loading more results...</div></div>');
				var resultsElement$ = pagingElement$.prev();
				pagingElement$.remove();

				// make request to load data
				resultsElement$.load(this.href, {ajax:1}, function() { document.onMoreResults(resultsElement$); });
			}
			$(this).click(function() {
				this.replaceWithMoreResults();
				return false;
			});
		});
	}

	$(window).scroll(function(){
		if($(window).scrollTop() >= $(document).height() - $(window).height() * 2) {
			$("a.moreResults").each(function() {
				this.replaceWithMoreResults();
			});
		}
	});

	document.onMoreResults(bindMoreResults, true);
})

// bbeditor
$(document).ready(function() {
	function doMedia(openTag, closeTag, textArea) {
		var url = prompt('Enter the URL:','http://');
		var scrollTop = textArea.scrollTop;
		var scrollLeft = textArea.scrollLeft;

		if (url != '' && url != null) {
			if(document.selection)
			{
				textArea.focus();
				var sel = document.selection.createRange();
				sel.text = openTag + url + closeTag;
			}
			else
			{
				var len = textArea.value.length;
				var start = textArea.selectionStart;
				var end = textArea.selectionEnd;

				var sel = textArea.value.substring(start, end);
					//alert(sel);
				var rep = openTag + url + closeTag;
				textArea.value =  textArea.value.substring(0,start) + rep + textArea.value.substring(end,len);

				textArea.scrollTop = scrollTop;
				textArea.scrollLeft = scrollLeft;
			}
		}
	}

	function doURL(textArea) {
		var url = prompt('Enter the URL:','http://');
		var scrollTop = textArea.scrollTop;
		var scrollLeft = textArea.scrollLeft;

		if (url != '' && url != null) {
			if (document.selection) {
				textArea.focus();
				var sel = document.selection.createRange();

				if(sel.text==""){
					sel.text = '[url]'  + url + '[/url]';
				} else {
					sel.text = '[url=' + url + ']' + sel.text + '[/url]';
				}
			}
			else
			{
				var len = textArea.value.length;
				var start = textArea.selectionStart;
				var end = textArea.selectionEnd;

				var sel = textArea.value.substring(start, end);

				if(sel==""){
					var rep = '[url]' + url + '[/url]';
				} else {
					var rep = '[url=' + url + ']' + sel + '[/url]';
				}

				textArea.value =  textArea.value.substring(0,start) + rep + textArea.value.substring(end,len);

				textArea.scrollTop = scrollTop;
				textArea.scrollLeft = scrollLeft;
			}
		}
	}

	function doAddTags(tag1,tag2,textArea) {
		// Code for IE
		if (document.selection) {
			textArea.focus();
			var sel = document.selection.createRange();
			sel.text = tag1 + sel.text + tag2;
		}
		else
		{  // Code for Mozilla Firefox
			var len = textArea.value.length;
			var start = textArea.selectionStart;
			var end = textArea.selectionEnd;

			var scrollTop = textArea.scrollTop;
			var scrollLeft = textArea.scrollLeft;

			var sel = textArea.value.substring(start, end);
			var rep = tag1 + sel + tag2;
			textArea.value =  textArea.value.substring(0,start) + rep + textArea.value.substring(end,len);

			textArea.scrollTop = scrollTop;
			textArea.scrollLeft = scrollLeft;
		}
	}

	function doList(tag1,tag2,textArea){
		// Code for IE
		if (document.selection) {
			textArea.focus();
			var sel = document.selection.createRange();
			var list = sel.text.split('\n');

			for(i=0;i<list.length;i++) {
				list[i] = '[*]' + list[i];
			}

			sel.text = tag1 + '\n' + list.join("\n") + '\n' + tag2;
		} else { // Firefox
			var len = textArea.value.length;
			var start = textArea.selectionStart;
			var end = textArea.selectionEnd;
			var i;

			var scrollTop = textArea.scrollTop;
			var scrollLeft = textArea.scrollLeft;

			var sel = textArea.value.substring(start, end);

			var list = sel.split('\n');

			for(i=0;i<list.length;i++) {
				list[i] = '[*]' + list[i];
			}

			var rep = tag1 + '\n' + list.join("\n") + '\n' +tag2;
			textArea.value =  textArea.value.substring(0,start) + rep + textArea.value.substring(end,len);

			textArea.scrollTop = scrollTop;
			textArea.scrollLeft = scrollLeft;
		}
	}

	function MakeButton(name, caption, clickHandler) {
		var button = $('<img src="/grafx/bbeditor/' + name + '.gif" />');
		button.addClass("bbeditorButton");
		button.attr('title', caption);
		button.click(clickHandler);
		return button;
	}

	$("textArea.bbeditor").each(function() {
		var textArea = this;
		var toolbar = $('<div class="bbeditorToolbar"></div>');
		toolbar.append(MakeButton("bold", "Bold", function() {doAddTags("[b]", "[/b]", textArea);}));
		toolbar.append(MakeButton("italic", "Italic", function() {doAddTags("[i]", "[/i]", textArea);}));
		toolbar.append(MakeButton("underline", "Underline", function() {doAddTags("[u]", "[/u]", textArea);}));
		toolbar.append(MakeButton("link", "Insert link", function() {doURL(textArea);}));
		toolbar.append(MakeButton("picture", "Insert image", function() {doMedia("[img]", "[/img]", textArea);}));
		toolbar.append(MakeButton("ordered", "Ordered list", function() {doList("[list=1]", "[/list]", textArea);}));
		toolbar.append(MakeButton("unordered", "Unordered list", function() {doList("[list]", "[/list]", textArea);}));
		toolbar.append(MakeButton("quote", "Quote", function() {doAddTags("[quote]", "[/quote]", textArea);}));
		toolbar.insertBefore(this);
	});
});
