;function rrc_guide()
{
	var config = {author: "paulo"
					, base: "http://redriverclimbing.com/"
					, guide_base: "http://redriverclimbing.com/RRCGuide/"
					, page_type: $("#page_type").val()
					, userid: $("#_backupuserid").val()
					, username: $("#_backupusername").val()
					, route_id: $("#_backuprouteid").val()
					, route_name: $("#_backuproutename").val()
					, wall_id: $("#_backupwallid").val()
					, wall_name: $("#_backupwallname").val()
					, ajax_page: "ajax_functions.php"
					, currently_viewing: ($("#_currentlyviewing").val() != undefined) ? $("#_currentlyviewing").val() : -1
					, currently_viewing_username: ($("#_currentlyviewingname").val() != undefined) ? $("#_currentlyviewingname").val() : ""
					, partner: ($("#_partner").val() != undefined) ? $("#_partner").val() : ""
					, partner_name: ($("#_partnername").val() != undefined) ? $("#_partnername").val() : ""
					, logged_in: ($("#_backupuserid").val() > 0) 
					, browser: $("#_browsertype").val()
					, browser_version: $("#_browserversion").val()
					, login_alert: "You must login to use this feature."
					, error_message: "Something's gone wrong. Please contact admin and we'll get to it as soon as possible"
					, sid: $("#_guide_sid").val()
					, prevent_keystrokes: false
				};
	
	var messages = {login_alert: "You must login to use this feature."
						, error_message: "Something's gone wrong. Please contact admin and we'll get to it as soon as possible"
						, bad_json: "Something's gone wrong. Let us know.."
					};

	var pref_notify = false;
	
	function rrc_slider(el)
	{
		if($(el).is(":hidden")) { $(el).slideDown("slow");} else { $(el).slideUp("slow"); }
	}
	
	function parse_nice_date(date)
	{
		var jdate = new Date();
		var meta = date.split("/");

		jdate.setFullYear(meta[2]);
		jdate.setMonth((meta[0] - 1));
		jdate.setDate(meta[1]);
		
		return jdate;
	}
	
	function create_cookie(name,value,days) 
	{
		var expires = "";
		if(days) 
		{
			var date = new Date();
			date.setDate(date.getDate()+ days);
			expires = "; expires="+date.toGMTString();
		}
		else 
		{
			expires = "";
		}

		document.cookie = name+"="+value+expires+"; path=/";
	}

	function checkdate(input_date)
	{
		var validformat = /^\d{2}\/\d{2}\/\d{4}$/; 
		var valid = false;
		var monthfield;
		var dayfield;
		var yearfield;
		var dayobj;
		
		if(!validformat.test(input_date))
		{
			valid = false;
		}
		else
		{ 
			monthfield = input_date.split("/")[0];
			dayfield = input_date.split("/")[1];
			yearfield = input_date.split("/")[2];
			dayobj = new Date(yearfield, monthfield - 1, dayfield);
			valid = ((dayobj.getMonth() + 1 != monthfield) || (dayobj.getDate() != dayfield) || (dayobj.getFullYear() != yearfield));
		}

		return valid;
	}

	function keystrokes(key)
	{
		/*
		if(!(config.prevent_keystrokes))
		{
			if(config.page_type == "route")
			{
				if(event.which == 37)
				{
					if($(".routes_left a").length > 0)
					{
						href = $(".routes_left a").attr("href");
					}
				}
				else if(event.which == 39)
				{
					if($(".routes_right a").length > 0)
					{
						href = $(".routes_right a").attr("href");
					}
				}
				
				if(href != "")
				{
					window.location = href;
					return;
				}
				else
				{
					if(event.which == 65)
					{
						$("#route_add_spray").click();
					}
				}
			}

			if(event.which == 191)
			{
				$("#rrc_search").focus();
				event.preventDefault();
			}
		}
		*/
	}

	function read_cookie(name)
	{
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		var c;
		for(var i=0;i < ca.length;i++) 
		{
			c = ca[i];
			while (c.charAt(0)==' ') { c = c.substring(1,c.length); }

			if (c.indexOf(nameEQ) == 0)
			{
				return c.substring(nameEQ.length,c.length);
			}
		}
		return "";
	}
	
	function reset_spray_form()
	{
		var $menu = $("#spray_menu");
		$("li.spray_attempts").removeClass("active");
		$("#_routeattempts").val("-1");
		$("input[name='lead']").attr("checked","");
	}

	function run_down(start,end,$span)
	{
		var interval;
		if(start > end)
		{
			interval = window.setInterval(function(a,b)
				{
					start = start - 1;
					$span.css("background","#B22222").css("color","#FFFFFF").html(start);

					if(start == end)
					{
						clearInterval(interval);
						$span.css("background","#FFFFFF").css("color","#000000");
					}
				},50);
		}
	}
	
	function edit_route_tags($el,method)
	{
		var $new_el = null;
		var tag_id = 0;
		var exists = false;
		var route_id = config.route_id;

		tag_id = ($el.is("span.small_sprite")) ? $el.parent().parent().attr("rel") : $el.attr("rel");
		
		if(route_id > 0 && !($el.hasClass("deactivated")))
		{
			$.post(config.ajax_page, {action: "add_route_tag", token: config.sid, route_id: route_id, type: "route", method: method, tag_id: tag_id},
					function(data)
					{
						var message = "";
						if(data.result === undefined)
						{
							$.jGrowl(messages.bad_json, {sticky:true});
						}
						else
						{
							if(data.result == 1)
							{
								jQuery.each($("td.tag_list a"),function()
									{
										if($(this).attr("rel") == tag_id)
										{
											$(this).find("span.remove_tag").show();
											$(this).find("span.tag_count").html("(" + data.count + ")");
											exists = true;
										}
									});

								if(!exists)
								{
									$new_el = $el.clone().prependTo("td.tag_list");
									$new_el.append(" (" + data.count + ")");
									$new_el.find("span").show();
								}

								$el.addClass("deactivated");
							}
							else if(data.result == 3)
							{
								if(data.count > 0)
								{
									$el.parent().hide();
									$el.parent().parent().find("span.tag_count").html("(" + data.count + ")");
								}
								else
								{
									$el.parent().parent().remove();
								}

								jQuery.each($("div.tag_list a"),function()
									{
										if($(this).attr("rel") == tag_id)
										{
											$(this).removeClass("deactivated");
										}
									});
							}
							else if(data.result === 0)
							{
								$.jGrowl(config.login_alert,{sticky:true});
							}
						}
						return false;
					},"json");
			}
	}
	
	function set_spray_metadata(meta)
	{
		var info = meta.sprayDate.split(",");
		var radio_id = (meta.lead > 0) ? "#route_led" : "#route_not_led";
		var nice_date = info[1] + "/" + info[2] + "/" + info[0];
		$("#attempt_" + meta.attempts).addClass("active");

		$(radio_id).attr("checked",true);
		$("#_datesent").val(nice_date);
		$("#date_sent").datepicker('setDate',new Date(meta.sprayDate));
	}
	
	function update_home_columns()
	{
		$.post(config.ajax_page, { action: "save_preferences", token: config.sid, column1: $(".home_list1").sortable("serialize"), column2: $(".home_list2").sortable("serialize")},
			function(data)
			{
				if(data.result === undefined)
				{
					$.jGrowl(messages.bad_json,{stick:true});
				}
				else
				{
					if(data.result > 0)
					{
						if(!pref_notify)
						{
							$.jGrowl("Your preferences have been saved. Frankly, though, no one else cares..", {life:6000});
							pref_notify = true;
						}
					}
					else if(data.result === 0)
					{
						$.jGrowl("Something's gone wrong.",{sticky:true});
					}
					else if(data.result < 0)
					{
						$.jGrowl(config.login_alert,{sticky:true});
					}
				}
			},"json");
	}
	
	function row_over(el) { if(!$(el).hasClass("head") && !$(el).hasClass("foot")) { $(el).toggleClass("row_over"); } }
	
	function route_recommended(rec)
	{
		var route_id = config.route_id;

		$.post(config.ajax_page, {action: "recommend", token: config.sid, recommended: rec, route: route_id },
			function(data)
			{
				var new_votes;
				var rec;
				var $count = $(".recommended_count");
				
				if(data === undefined)
				{
					$.jGrowl("Heh.. something went wrong. Let us know about it nicely and we might do something about it. Otherwise, just deal..", {life:6000});
				}
				else
				{
					if(data.result < 0)
					{
						$.jGrowl("Sorry, to save a recommendation, you'll need to log in.", {life:6000});
					}
					else if(data.result > 0)
					{
						$.jGrowl("Thanks.. seriously. We mean it. Thanks for the input.", {life:6000});
						new_votes = data.cnt;
						new_votes += data.cnt == 1 ? " vote" : " votes";

						if(data.rec_for > data.against)
						{
							$count.html("+" + data.rec_for).attr("class","recommended_count plus");
						}
						else if(data.rec_for == data.against)
						{
							$count.html("+0").attr("class","recommended_count equal");
						}
						else
						{
							$count.html("-" + data.against).attr("class","recommended_count minus");
						}

						if(data.prev > 0)
						{
							$("#remove_recommended").removeClass("hidden");
						}
						else
						{
							$("#remove_recommended").addClass("hidden");
						}
						$("#total_recommendations").html(new_votes);
						$count.html();
					}
				}
				return false;
			},"json");
	}
	
	function attempts_submit(direction)
	{
		var message = direction == "subtract" ? "Hope you can sleep tonight.. liar.." : "Sally up and clip the anchors next time..";
		var prev_link = '<br/><a id="view_previous_attempts" href="#" class="block_link">Previous Attempts</a>';
		var route_id = config.route_id;

		$.post(config.ajax_page, {action: "change_attempt", token: config.sid, route: route_id, go: direction},
				function(data)
				{
					var $count = $("#try_count");
					if(data.result === undefined)
					{
						$.jGrowl("Heh.. something went wrong. Let us know about it nicely and we might do something about it. Otherwise, just deal..", {life:6000});
					}
					else
					{
						if(data.result > 0)
						{
							if(data.result > 1)
							{
								$count.html(data.result + " goes." + prev_link);
							}
							else
							{
								$count.html(data.result + " go." + prev_link);
							}
							$.jGrowl(message, {life:6000});
						}
						else if(data.result === 0)
						{
							$count.html("No goes yet.");
							$.jGrowl(message, {life:6000});
						}
						else if(data.result == -2)
						{
							$.jGrowl("Heh.. something went wrong. Let us know about it nicely and we might do something about it. Otherwise, just deal..", {life:6000});
						}
						else if(data.result == -1)
						{
							$.jGrowl(config.login_alert,{life:6000});
						}
					}
				},"json");
	}
	
	function quick_spray(route_id,lead,attempts,date)
	{
		$.post(config.ajax_page, { action: "quick_spray", token: config.sid, lead: lead, route: route_id, tries: attempts, date: date },
			function(data)
			{
				var message = "";
				if(data != undefined)
				{
					var $proj = $("#project_" + route_id);
					if(data.result < 0)
					{
						$.jGrowl("You've already sent.. chill!",{life:6000});
					}
					else if(data.result > 0)
					{

						if($proj.hasClass("project_route"))
						{
							$proj.addClass("project_sent").removeClass("project_route").attr("title","Projected and sent");
						}
						
						nice_date = date.split("/");
						
						if(config.page_type == "spray")
						{
							$("tr.spray_" + route_id + " td.column-tries").html(attempts > 0 ? attempts : "Unk");
							$("tr.spray_" + route_id + " td.column-lead").html(lead ? "Lead" : "TR");
							$("tr.spray_" + route_id + " td.column-date_sent").attr("title",date).html(data.sprayDate);
							$("tr.spray_" + route_id + " td.column-points").html(data.this_score);
						}
						else if(config.page_type == "project")
						{
							$("tr.project_" + route_id + " td:eq(4)").html(attempts > 0 ? attempts : "Unk");
							$("tr.project_" + route_id + " td:eq(3)").attr("title",date).html(data.sprayDate);
						}

						if(data.result == 1)
						{
							$("img#spray_route_" + route_id).removeClass("spray").addClass("sent");
							$("img#spray_route_" + route_id + " span.key").html("1");

							if(config.page_type == "route")
							{
								$("#route_add_spray").addClass("hidden").addClass("inactive");
								$("#spray_edit_options").removeClass("hidden");
								$("#attempts").parent().addClass("hidden");
								$(".project_col").addClass("inactive");
								$(".attempts_col").addClass("inactive");
								$("#project_col").addClass("hidden");

								banner = "<tr id='route_sent'><td colspan='5'>You sent this route on " + data.sprayDate;
								banner += lead == 1 ? " on lead" : " on top rope";
								banner += " in ";
								banner += attempts > 0 ? attempts > 1 ? attempts + " goes" : "1 go" : "an unknown number of goes.</td></tr>";

								if($("#route_sent").length > 0)
								{
									$("#route_sent").remove();
								}
								$("#route_nav tbody").prepend(banner);
							}

							lead_text = (lead) ? "lead" : "toproped";
							$("#_routeled").val(lead_text);
							$("#_routeattempts").val(attempts);
						}
						else
						{
							$("#spray_add").removeClass("hidden");
							$("#spray_edit").addClass("hidden");
							$("#attempts").parent().removeClass("hidden");
							$(".project_col").removeClass("hidden");
							$("#attempt_col").removeClass("hidden");
							$("#project_col").removeClass("hidden");
							$("#spray_col").html("Edit :: Delete");
						}

						message = "<br /><b>Score:</b> " + data.score;
						message += "<br /><b>Routes:</b> " + data.total;
						message += "<br /><b>Oldest Send:</b> " + data.oldest;
						message += "<br /><b>Most Recent Send:</b> " + data.recent;
						message += "<br /><b>Hardest Send:</b> " + data.hardest;

						$.jGrowl("That was added to your spraylist.. Don't get too big a head, though. You're still weak sauce, weak like McDonald's coffee weak.<br /><br /><b>Current Stats</b>" + message, {sticky:true});
					}
				}
				else
				{
					$.jGrowl("Heh.. something went wrong. Let us know about it nicely and we might do something about it. Otherwise, just deal..", {life:6000});
				}
				return false;
			},"json");
	}

	function start_loading()
	{
		if(!((config.browser === "msie") && (config.browser_version == 6)))
		{
			$("#_loading").show();
		}
		$("body").css("cursor","progress");
	}

	function end_loading()
	{
		if(!((config.browser === "msie") && (config.browser_version == 6)))
		{
			$("#_loading").fadeOut(2000);
		}
		$("body").css("cursor","default");
	}
	
	function show_message(message,t)
	{
		if(typeof t === "undefined")
		{
			t = "";
		}
		
		if(message === "error")
		{
			message = config.error_message;
			t = "sticky";
		}
		else if(message === "login")
		{
			message = config.login_alert;
			t = "sticky";
		}
		
		if(t === "sticky")
		{
			$.jGrowl(message, {sticky:true});
		}
		else if(t !== "")
		{
			$.jGrowl(message, {life:t});
		}
		else
		{
			$.jGrowl(message, {life:6000});
		}
	}
	
	function simple_post(data,success)
	{
		$.post(config.ajax_page, data, function(d) 
			{
				if(success === "data.message")
				{
					success = d.message;
				}
				standard_post_results(d,success);
			},"json");
	}
	
	function standard_post_results(data,message)
	{
		var r = 0;
		
		if(data.result === undefined)
		{
			show_message("error");
		}
		else
		{
			if(data.result > 0)
			{
				show_message(message);
			}
			else if(data.result === 0)
			{
				show_message("error");
			}
			else if(data.result < 0)
			{
				show_message("login");
			}
			r = data.result;
		}
		return r;
	}
	
	return {slide:rrc_slider
			, row_over: row_over
			, checkdate: checkdate
			, run_down: run_down
			, sp: start_loading
			, ep: end_loading
			, parse_nice_date: parse_nice_date
			, set_spray_metadata: set_spray_metadata
			, ajax_page:config.ajax_page
			, speak:show_message
			, read_cookie: read_cookie
			, create_cookie: create_cookie
			, post_results:standard_post_results
			, update_home_columns:update_home_columns
			, simple_post:simple_post
			, attempt:attempts_submit
			, rec:route_recommended
			, edit_tags: edit_route_tags
			, spray: quick_spray
			, reset_spray_form: reset_spray_form
			, author: config.author
			, page_type: config.page_type
			, userid: config.userid
			, username: config.username
			, route_id: config.route_id
			, route_name: config.route_name
			, wall_id: config.wall_id
			, wall_name: config.wall_name
			, currently_viewing: config.currently_viewing
			, currently_viewing_username: config.currently_viewing_username
			, partner: config.partner
			, partner_name: config.partner_name
			, logged_in: config.logged_in
			, browser: config.browser
			, browser_version: config.browser_version
			, sid: config.sid
			, keystrokes: keystrokes
			, prevent_keystrokes: config.prevent_keystrokes
			, base: config.base
			, guide_base: config.guide_base
			};
}
