String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}
$.fn.unwrap = function() {
  this.parent(':not(body)')
    .each(function(){
      $(this).replaceWith( this.childNodes );
    });

  return this;
};

var closePad = function() {
	$("#highlight_menu").fadeOut(400);
	$("#highlight_form").data("selection",null);
	$("#highlight_form").data("parent",null);
	$("#highlight_form").data("master_info",null);
	$("#highlight_form").data("extra",null);
}
var closeUHPad = function() {
	$("#unhighlight_menu").fadeOut(400);
	$("#unhighlight_form").data("HLID",null);
}
function messageStack(message, type)
{
	if (typeof(type)=="undefined") type = "error";
	
	var addText = "<a href=\"#\">[X]</a>" + message;
	
	if (type=="normal") 
		addText = "<div class=\"message_normal\">" + addText + "</div>";
	else if (type=="neutral") 
		addText = "<div class=\"message_neutral\">" + addText + "</div>";
	else
		addText = "<div class=\"message_error\">" + addText + "</div>";
		
	$("#message_stack_box").append(addText);
	$("#message_stack_box div:hidden").slideDown(400);
	
	rebind_events();
}
function getLoginStatus(fn,fn2)
{
	var login_status = false;
	$.post("get_login_status.php", {send : 1}, function(data){
		if (data=="false") {
			if (typeof(fn2)!="undefined") fn2();
			return false;
		}
		else {
			if (typeof(fn)!="undefined") fn(data);
			return true;
		}
	},"text");
}
function performLoginOps()
{
	$.post("user_menu_options.php",{"load" : 1},function(data){
		$("#user_menu").html(data);
		rebindUserBox();
	},"html");
}
function performLogoutOps()
{
	$("#user_menu").slideUp(400);
	$("#user_menu").html("");
}

var defaultNeedLogin = function() {
	messageStack("Please briefly make an account to submit. Thanks!","neutral");
	$(".LOGIN").click();
	return false;
}

var rebind_events = function()
{
	$(".NEED_LOGIN").unbind("click").bind("click",function(event){
		var href = $(this).attr("href");
		getLoginStatus(function(){
			//window.location.replace(href);
			window.location = href;
			return true;
		},function(){
			defaultNeedLogin();
			return false;
		});
		event.preventDefault();
	});
	
	$("#message_stack_box div a").unbind("click").bind("click",function(event){
		$(this).parent("div").fadeOut(250,function(){
			$(this).remove();
		});
		event.preventDefault();
	});
	
	$(".NOTE_OPEN").unbind("click").bind("click",function(event){
		var $_abs = $(this);
		getLoginStatus(function(){		
		if ($("#note_change_box:visible").length == 0) {
			var _guide_id = $_abs.siblings("input[name=guide_id]").val();
			var _guide_heading = $_abs.siblings("input[name=guide_heading]").val();
			var _revise_code = $_abs.siblings("input[name=revise_code]").val();
			var _note_extra = $_abs.siblings("input[name=note_extra]").val();
			$.post("notepad_form.php", {guide_id : _guide_id,guide_heading : _guide_heading,revise_code : _revise_code, note_extra : _note_extra, send : 1}, function(data){
				//alert(data);
				//$("#note_change_box").html(data);
				document.getElementById("note_change_box").innerHTML = data;
				$("#note_change_box").fadeIn(500);
				rebind_events();
			},"html");
		}
		},defaultNeedLogin);
		event.preventDefault();
	});
	
	$(".edit_note_button").unbind('click').bind('click',function(event){
		var $_abs = $(this);		
		getLoginStatus(function(){
		if ($("#note_change_box:visible").length == 0) {
			var _guide_id = $_abs.siblings("input[name=guide_id]").val();
			var _revise_id = $_abs.siblings("input[name=revise_id]").val();
			var _guide_heading = $_abs.siblings("input[name=guide_heading]").val();
			var _revise_code = $_abs.siblings("input[name=revise_code]").val();
			
			$.post("notepad_form.php", {revise_id : _revise_id, guide_id : _guide_id, guide_heading : _guide_heading, revise_code : _revise_code, editing : 1, send : 1}, function(data){
				$("#note_change_box").html(data);
				$("#note_change_box").fadeIn(500);
				rebind_events();
			},"html");
		}
		},defaultNeedLogin);
		event.preventDefault();
	});
	$(".delete_note_button").unbind('click').bind('click',function(event){
		var $_abs = $(this);
		getLoginStatus(function(){		
		if ($("#note_change_box:visible").length == 0) {
			var _guide_id = $_abs.siblings("input[name=guide_id]").val();
			var _revise_id = $_abs.siblings("input[name=revise_id]").val();
			var _guide_heading = $_abs.siblings("input[name=guide_heading]").val();
			var _revise_code = $_abs.siblings("input[name=revise_code]").val();
			
			$.post("notepad_form.php", {delete_id : _revise_id, guide_id : _guide_id, guide_heading : _guide_heading, revise_code : _revise_code, send : 1}, function(data){
				$("#note_change_box").html(data);
				$("#note_change_box").fadeIn(500);
				rebind_events();
			},"html");
		}
		},defaultNeedLogin);
		event.preventDefault();
	});
		
	$("#notepad_change_box_close").unbind("click").bind("click",function(event){
		$("#note_change_box").fadeOut(400,function(){
			$("#note_change_box").html("");
		});
		event.preventDefault();
	});
	
	$("#notepad_form").unbind("submit").bind("submit",function(event){
		event.preventDefault();
		
		var _form = $(this);		
		var _note_content = _form.children("div").children("textarea[name=note_content]").val();
		var _guide_id = _form.children("div").children("input[name=guide_id]").val();
		var _guide_heading = _form.children("div").children("input[name=guide_heading]").val();
		var _revise_code = _form.children("div").children("input[name=revise_code]").val();
		var _note_extra = _form.children("div").children("input[name=note_extra]").val();
		var _revise_id = _form.children("div").children("input[name=revise_id]").val();
		var _delete_id = _form.children("div").children("input[name=delete_id]").val();
		
		if (_delete_id==undefined) {
			if (_note_content.length < 30) {
				messageStack("Please enter a message at least 30 characters in length.");
				return false;
			}
		}
		var GH = ('#' + _guide_heading + "_NOTEBOX");
		var GC = ('#' + _guide_heading + "-counter");
		getLoginStatus(function(){
			if (_note_extra == "undefined") _note_extra = "";
			
			$.post("input_notes.php", {content : _note_content, guide_id : _guide_id, guide_heading : _guide_heading, revise_code : _revise_code, revise_id : _revise_id, delete_id : _delete_id, note_extra : _note_extra, editing : 1}, function(data){ 
				var RESULT = data._result;
				
				if (RESULT != 4) {
					$.post("notes_generic.php", {guide_id : _guide_id, guide_heading : _guide_heading, revise_code : _revise_code, send : 1},function(new_data){
						$(GH).parent("div").html(new_data.note_html); //.notepad_content_container
						if ($(GC).length>0) $(GC).text(new_data.count);
						
						if (RESULT == 2) messageStack("Your note has been modified.",'normal');
						else if (RESULT == 3) messageStack("Your note has been removed.",'normal');
						else messageStack("Your note has been added!",'normal');
						$("#notepad_change_box_close").click();
						reloadUserBox("my_note_box");
						rebind_events();
					},"json");
				}
				else {
					var e;
					for (e in data._error) {
						messageStack(data._error[e]);
					}
				}
			},"json");
		},defaultNeedLogin);
		
		event.preventDefault();
		return false;
	});
	
	$(".LOGIN").unbind("click").bind("click",function(event){		
		if ($("#account_box:visible").length == 0) {
			$.post("login_form.php", {send : 1}, function(data){
				$("#account_box").html(data);
				$("#account_box").fadeIn(500);
				rebind_events();
			},"html");
		}
		event.preventDefault();
	});
	$(".LOGOUT").unbind("click").bind("click",function(event){
		$.post("account_handle.php", {logout : 1}, function(data){
			$.post("user_menu.php",{include : 1},function(new_data){
				$("#user_box").html(new_data);
				messageStack("You have been successfully logged out!",'normal');
				performLogoutOps();
			},"html");
		},"html");
		event.preventDefault();
	});
	
	$("#forgot_password_link").unbind("click").bind("click",function(event){
		$("#forgot_password_div").slideToggle(400);
	});
	
	$("#forgot_password_button").unbind("click").bind("click",function(event){
		var _email = $("#login_form input[name=login_email]");
		$.post("account_handle.php", {login_email : _email.val(), reset_password : 1}, function(data){
			var RESULT = data._result;
			if (RESULT != 4) {
				messageStack("An e-mail to reset your password has been sent!",'normal');
				$("#forgot_password_div").slideUp(400);
			}
			else {
				var e;
				for (e in data._error) {
					messageStack(data._error[e]);
				}
			}
		},"json");
	});
	
	$("#account_box_close").unbind("click").bind("click",function(event){
		$("#account_box").fadeOut(400,function(){
			$("#account_box").html("");
		});
		event.preventDefault();
	});
	
	$("#login_form").unbind("submit").bind("submit",function(event){
		var _email = $("#login_form input[name=login_email]");
		var str_email = _email.val();
		var _password = $("#login_form input[name=login_password]");
		var str_password = _password.val();
		
		$.post("account_handle.php", {login_email : str_email, login_password : str_password, login : 1}, function(data){
			var RESULT = data._result;
			if (RESULT != 4) {
				$.post("user_menu.php",{include : 1},function(new_data){
					$("#user_box").html(new_data);
					messageStack("You have been successfully been logged in!",'normal');
					performLoginOps();
					$("#account_box_close").click();
				},"html");
			}
			else {
				var e;
				for (e in data._error) {
					messageStack(data._error[e]);
				}
			}
		},"json");
		
		event.preventDefault();
		return false;
	});
	
	$("#register_form").unbind("submit").bind("submit",function(event){
		//alert("HAY");
		var HANDLE = true;
		
		var _name = $("#register_form input[name=register_name]");
		var str_name = _name.val();
		var _email = $("#register_form input[name=register_email]");
		var str_email = _email.val();
		var _password = $("#register_form input[name=register_password]");
		var str_password = _password.val();
		var _password_confirm = $("#register_form input[name=register_password_confirm]");
		var str_password_confirm = _password_confirm.val();

		$("#register_form input").removeClass("input_error");
		
		if (str_password != str_password_confirm) {
			messageStack("Passwords Don't Match!");
			_password.addClass("input_error");
			_password_confirm.addClass("input_error");
			HANDLE = false;
		}
		if (str_password.length < 5) {
			messageStack("Please enter a password with at least 5 characters!");
			_password.addClass("input_error");
			_password_confirm.addClass("input_error");
			HANDLE = false;
		}
		if (str_email == "" || str_email.indexOf("@")==-1 || str_email.indexOf(".")==-1) {
			messageStack("Invalid E-Mail Entered!");
			_email.addClass("input_error");
			HANDLE = false;
		}
		if (str_name.length < 4 ) {
			messageStack("Please Enter a Username with more than 4 Characters!");
			_name.addClass("input_error");
			HANDLE = false;
		}
		
		if (HANDLE==false) return false;
		$.post("account_handle.php", {register_name : str_name, register_email : str_email, register_password : str_password, register : 1}, function(data){
			var RESULT = data._result;
			if (RESULT != 4) {
				$.post("user_menu.php",{include : 1},function(new_data){
					$("#user_box").html(new_data);
					messageStack("Your account has been created and you have been logged in!",'normal');
					performLoginOps();
					$("#account_box_close").click();
				},"html");
			}
			else {
				var e;
				for (e in data._error) {
					messageStack(data._error[e]);
				}
			}
		},"json");
		
		event.preventDefault();
	});
		
	$(".highlightable").parent().unbind("mouseup").bind("mouseup",function(event){
		var parentDiv,focusParent,_selection,final_selection;
		var validSelection = false;
		
		if (window.getSelection)
		{
			_selection = window.getSelection();
			if (_selection=='') {closePad(); return;}
			
			parentDiv = $(_selection.anchorNode).parents(".highlightable");
			
			var range = _selection.getRangeAt(0);
			var clonedSelection = range.cloneContents();
			var div = document.createElement('div');
			div.appendChild(clonedSelection);
			_selection = div.innerHTML;

			if (parentDiv.length==1) validSelection = true;
		}
		else if (document.getSelection)
		{
			_selection = document.getSelection();
			if (_selection=='') {closePad(); return;}
			tempParent = $(_selection.anchorNode).parents(".highlightable");
			
			parentDiv = tempParent;
			if (parentDiv.length==1) validSelection = true;
		}
		else if (document.selection)
		{
			var selRange = document.selection.createRange();
			_selection = selRange.text;
			if (_selection=='') {closePad(); return;}
			
			var tempParent = $(selRange.parentElement());
			if (tempParent.is(".highlightable"))
				parentDiv = tempParent;
			else
				parentDiv = $(selRange.parentElement()).parents(".highlightable");
			if (parentDiv.length==1) validSelection = true;
			var IE = true;
        }

		final_selection = _selection.toString().trim();
		
		if (final_selection.length < 16) validSelection = false;
		if (final_selection.length > 500) validSelection = false;
		if (final_selection.indexOf("\n")!=-1) validSelection = false;
		if (final_selection.indexOf("\r")!=-1) validSelection = false;
		if (final_selection.indexOf('class="text_highlight"')!=-1) validSelection = false;
		if (parentDiv.children(".highlight_master").length == 0) validSelection = false;
		
		if (validSelection==true) {
			var newhtml,_START,_LEN,rpl = parentDiv.html().trim();			
			_START = rpl.indexOf(final_selection);
			if (rpl.lastIndexOf(final_selection) != _START) _START = -1;
			
			if (_START!=-1) {
				_LEN = final_selection.length;
				$("#highlight_form").data("selection",final_selection);
				$("#highlight_form").data("parent",parentDiv);
				$("#highlight_form").data("master_info",parentDiv.children(".highlight_master").attr("rel"));
				$("#highlight_form").data("extra",parentDiv.children(".highlight_master").attr("name"));
				if (IE==undefined)
					$("#highlight_menu").css({"left" : event.pageX, "top" : (event.pageY)});
				else
					$("#highlight_menu").css({"position" : "fixed" , "top" : 0, "left" : "50%"});
					
				$("#highlight_menu").fadeIn(400);
			} else {
				closePad();
			}
		} else {
			closePad();
		}
	});
	
	$(".unhighlight_invalid").unbind("click").bind("click",function(event){
		event.preventDefault();
		var HLID = $(this).attr("href");
		var _parent = $(this).parent("div");
		
		$("#unhighlight_form").data("hlid",HLID);
		
		getLoginStatus(function(){
			$("#unhighlight_form input[type=button]").click();
			_parent.remove();
			
			if ($("#invalid_highlight_box div").length == 0) {
				$("#invalid_highlight_box").fadeOut(400,function(){
					$(this).remove();
				});
			}
		},defaultNeedLogin);
	});
	
	$("#unhighlight_form input[type=button]").unbind("click").bind("click",function(event){
		getLoginStatus(function(){
			var HLID = $("#unhighlight_form").data("hlid");

			$.post("highlight_functions.php",{unhl : HLID, ajax : 1, action: "remove"},function(data){
				if (data.result == 3) {
					messageStack(data.message,'bad');
				}
				else {
					closeUHPad();
					messageStack(data.message,'neutral');
					$("#"+HLID).before($("#"+HLID).html());
					$("#"+HLID).remove();
					reloadUserBox("my_highlight_box");
					rebind_events();
				}
			},"json");
			
		},defaultNeedLogin);
	});
	
	$("#highlight_form input[type=button]").unbind("click").bind("click",function(event){
		getLoginStatus(function(){
			var _text = $("#highlight_form").data("selection");
			var _parent = $("#highlight_form").data("parent");
			var _master_info = $("#highlight_form").data("master_info");
			var handle_EX = $("#highlight_form").data("extra");
			
			if (_text==null) return;
			if (handle_EX == "" || handle_EX == "undefined") handle_EX = "";
			
			$.post("highlight_functions.php",{text : _text, highlight_info : _master_info, ajax : 1, extra : handle_EX, action: "add"},function(data){
				if (data.result == 3) {
					messageStack(data.message,'bad');
				}
				else {
					var rpl;
					closePad();
					rpl = _parent.html().replace(_text,"<span class=\"text_highlight\" id=\"HLIGHT_"+data.hlid+"\">"+_text+"</span>");
					messageStack(data.message,'normal');
					_parent.html(rpl);
					reloadUserBox("my_highlight_box");
					rebind_events();
					//_parent.html(rpl.substr(0,_start) + "<span class=\"text_highlight\" id=\"HLIGHT_"+data.hlid+"\">" + rpl.substr(_start, _len) + "</span>" +rpl.substr(_start + _len));
				}
			},"json");
		},defaultNeedLogin);
	});
	
	$(".text_highlight").unbind("click").bind("click",function(event){
		$("#unhighlight_form").data("hlid",$(this).attr("id"));
		$("#unhighlight_menu").css({"left" : event.pageX, "top" : (event.pageY)});
		$("#unhighlight_menu").slideDown(300);
	});
	
	rebindUserBox();
	
	$(".taggable").unbind("click").bind("click",function(event){
		event.preventDefault();
		var handle_OBJ = $(this);
		var handle_ID = handle_OBJ.attr("id");
		var handle_EX = handle_OBJ.attr("name");
		
		getLoginStatus(function(){
			if (handle_OBJ.hasClass("tagged") || handle_OBJ.hasClass("taggedsmall")) {
				$.post("highlight_functions.php",{ajax : 1, action : "remove_tag", tag : handle_ID},function(data){
					if (data.result == 3) {
						messageStack(data.message,'bad');
					} else {
						if (handle_OBJ.hasClass("tagsmall"))
							handle_OBJ.removeClass("taggedsmall");
						else
							handle_OBJ.removeClass("tagged");
						messageStack(data.message,'normal');
						reloadUserBox("my_tag_box");
					}
				},"json");
			} else {
				if (handle_EX == "" || handle_EX == "undefined") handle_EX = "";
				$.post("highlight_functions.php",{ajax : 1, action : "add_tag", tag : handle_ID, extra : handle_EX},function(data){
					if (data.result == 3) {
						messageStack(data.message,'bad');
					} else {
						if (handle_OBJ.hasClass("tagsmall"))
							handle_OBJ.addClass("taggedsmall");
						else
							handle_OBJ.addClass("tagged");
						messageStack(data.message,'normal');
						reloadUserBox("my_tag_box");
					}
				},"json");
			}
		},defaultNeedLogin);
	});
}
var reloadUserBox = function(box_id) {
	var BOX_HANDLE;
	if (box_id.indexOf("#")==-1)
		BOX_HANDLE = $("#"+box_id);
	else
		BOX_HANDLE = $(box_id);
	
	var _action = $(BOX_HANDLE).children(".current_offset").attr("rel");
	var _offset = $(BOX_HANDLE).children(".current_offset").attr("href");
	
	$.post("user_menu_options.php", {ajax : 1, action : _action, offset : _offset},function(data){
			BOX_HANDLE.html(data);
			//rebindUserBox();
	},"html");
}
var rebindUserBox = function() {
	$("#user_menu_arrow").unbind("click").bind("click",function(event){
		event.preventDefault();
		if ($("#user_menu").is(":visible")) {
			$("#user_menu").slideUp(500);
		} else {
			$("#user_menu").slideDown(500);
		}
	});
	
	$(".my_notes_next").unbind("click").bind("click",function(event){
		var box_reload = $(this).parents(".user_menu_box");
		var _action = $(this).attr("rel");

		event.preventDefault();
		var _offset = parseInt($(this).attr("href"));
		$.post("user_menu_options.php", {ajax : 1, action : _action, offset : _offset},function(data){
			box_reload.html(data);
			rebindUserBox();
		},"html");
	});
	
	$(".user_menu_down").unbind("click").bind("click",function(event){
		event.preventDefault();
		$(this).next(".user_menu_box").slideToggle(500);
	});
	
	$("#password_change_form").unbind("submit").bind("submit",function(event){
		var HANDLE = true;
		
		var _current_password = $("#password_change_form input[name=current_password]").val();
		var _new_password = $("#password_change_form input[name=new_password]").val();
		var _confirm_new_password = $("#password_change_form input[name=confirm_new_password]").val();
		
		if (_new_password != _confirm_new_password) {
			messageStack("Passwords Don't Match!");
			HANDLE = false;
		}
		if (_new_password.length < 5) {
			messageStack("Please enter a password with at least 5 characters!");
			HANDLE = false;
		}
		
		if (HANDLE==false) return false;
		
		$.post("account_handle.php", {current_password : _current_password, new_password : _confirm_new_password, change_password : 1}, function(data){
			var RESULT = data._result;
			if (RESULT != 4) {
				$("#password_change_form input[name=current_password]").val("");
				$("#password_change_form input[name=new_password]").val("");
				$("#password_change_form input[name=confirm_new_password]").val("");
				messageStack("Your password has been changed!",'normal');
			}
			else {
				var e;
				for (e in data._error) {
					messageStack(data._error[e]);
				}
			}
		},"json");
		
		event.preventDefault();
	});
}

$(document).ready(function(){	
	rebind_events();

	$("body").click(function(event){
		if (!$(event.target).is(".highlightable") && $(event.target).parents(".highlightable").length == 0 && !$(event.target).is(":input")) {
			closePad();
		}
		if (!$(event.target).is(".text_highlight")) {
			closeUHPad();
		}
	});	
});