/* $Id: common.js 1978 2011-10-27 22:52:32Z rfludwick $ */

/**
 * OMGN template switch
 */
var OMGNTemplateSwitch =
{
	/**
	 * Initializes the switcher
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @return void
	 */
	init : function()
	{
		var elements = $$("a.template_switch");

		elements.each(function(item)
		{
			item.observe("click", this.doSwitch.bind(this));
		}.bind(this));
	},

	/**
	 * Switches the template
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @param event The event
	 * @return void
	 */
	doSwitch : function(event)
	{
		var template = event.element().identify().replace("template_switch_", "");

		OMGNCookie.set("TEMPLATE", template);

		Event.stop(event);

		window.location.reload();
	}
};

/**
 * OMGN ask registration
 */
var OMGNAskRegistration =
{
	/**
	 * Initializes the ask for registration
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @return void
	 */
	init : function()
	{
		setTimeout(this.ask.bind(this), 10000);
	},

	/**
	 * Asks for registration
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @return void
	 */
	ask : function()
	{
		var content = '<div class="title">Please Register!</div>' +
			'<p>You\'re not currently logged in to a user account. If you have one, please <a href="/user/login" title="Login">login</a>. Otherwise, please consider <a href="/user/register" title="Register">registering</a> with us. There are many features registered users have, including:</p>' +
			"<ul>" +
			"<li>Ability to comment on articles and blog posts</li>" +
			"<li>A blog you can post on (and get revenue share from!)</li>" +
			'<li>Ability to talk in our <a href="/forum" title="Forum">Forum</a></li>' +
			"<li>User preferences</li>" +
			"<li>And more!</li>" +
			"</ul>";

		OMGNOverlay.write(content, "ask_registration");
	}
};

/**
 * OMGN unread message alert
 */
var OMGNUnreadMessageAlert =
{
	/**
	 * Displays the alert
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @param number The number of unread messages
	 * @return void
	 */
	display : function(number)
	{
		var content = '<div class="title">Unread Messages</div>' +
			"<p>You have " + number + " unread message" + ((number > 1) ? "s" : "") + ".</p>" +
			'<p>Please visit your <a href="/user/message/list-messages" title="User: Message: List Messages">messages</a> to read ' + ((number > 1) ? "them" : "it") + '.</p>';

		OMGNOverlay.write(content, "ask_registration");
	}
};

/**
 * OMGN Ajax login
 */
var OMGNAjaxLogin =
{
	/**
	 * Initializes the Ajax login
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @return void
	 */
	init : function()
	{
		$$("a.ajax_login").each(function(item)
		{
			item.observe("click", this.showLogin.bind(this));
		}.bind(this));
	},

	/**
	 * Shows the login overlay
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @param event The triggering event
	 * @return void
	 */
	showLogin : function(event)
	{
		var content = '<form id="ajax_login">' +
			'<div class="form_explain login">' +
			"<p>" +
			'<a href="/user/register" title="Register">Register?</a>' +
			"</p>" +
			"<p>Login with...</p>" +
			"<p>" +
			'<a href="#" title="Login With Facebook" id="ajax_facebook_login"><img src="/images/social/facebook_logo.png" width="75" height="75" alt="Login With Facebook" title="Login With Facebook" /></a>' +
			"</p>" +
			"<p>" +
			'<a href="/user/login/social/twitter" title="Login With Twitter"><img src="/images/social/twitter_logo.png" width="75" height="75" alt="Login With Twitter" title="Login With Twitter" /></a>' +
			"</p>" +
			"</div>" +
			'<div class="form login" id="login_form_div">' +
			'<div class="title">Login</div>' +
			"<ul>" +
			"<li>" +
			'<label for="username_overlay" class="required">Username:</label> <input type="text" name="username_overlay" id="username_overlay" maxlength="25" class="username" />' +
			"</li>" +
			"<li>" +
			'<label for="password_overlay" class="required">Password:</label> <input type="password" name="password_overlay" id="password_overlay" maxlength="25" class="password" />' +
			"</li>" +
			"<li>" +
			'<label for="remember_overlay">Remember Login:</label> <input type="checkbox" name="remember_overlay" id="remember_overlay" value="1" /> Yes (30 days)' +
			"</li>" +
			"<li>" +
			required_fields +
			'<input type="submit" name="login" id="login" value="Login" /> <input type="button" name="login_close" id="login_close" value="Close" />' +
			"</li>" +
			"</ul>" +
			'<div class="extras">' +
			'<a href="/user/recover-password" title="Forgotten Password?">Forgotten Password?</a> &nbsp;<a href="/user/resend-confirmation" title="Resend Confirmation">Resend Confirmation</a>' +
			"</div>" +
			"</div>" +
			"</form>";

		OMGNOverlay.write(content, "login");

		// Attach event listeners
		OMGNOverlay.attachClickClose($A([
			"login_close"
		]));

		$("ajax_login").observe("submit", this.login.bind(this));
		$("login").observe("click", this.login.bind(this));
		$("ajax_facebook_login").observe("click", this.loginFacebook.bind(this));

		if (event)
		{
			Event.stop(event);
		}
	},

	/**
	 * Logs the user in
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @param event The triggering event, if there is one
	 * @return void
	 */
	login : function(event)
	{
		var username = $F("username_overlay"),
			password = $F("password_overlay"),
			remember = $F("remember_overlay"),
			login = $("login"),
			login_close = $("login_close");

		// Data validation
		if (!username.length || !password.length)
		{
			alert("You must enter both the Username and Password.");
		}
		else if (login && login_close)
		{
			var parameters = new Hash(),
				login_form_div = $("login_form_div"),
				overlay_close = $("overlay_close");

			parameters.set("username", username);
			parameters.set("password", password);
			parameters.set("remember", (remember ? 1 : 0));

			login.disable();
			login_close.disable();

			OMGNOverlay.removeClickClose($A([
				"overlay_close"
			]));

			if (login_form_div)
			{
				OMGNAjaxBase.fadeElement(login_form_div);
			}
			if (overlay_close)
			{
				OMGNAjaxBase.fadeElement(overlay_close);
			}

			// Make the Ajax request
			OMGNAjaxBase.showProcessing();

			new Ajax.Request("/ajax/login",
			{
				method : "post",
				parameters : parameters,
				onFailure : function()
				{
					login.enable();
					login_close.enable();

					OMGNOverlay.attachClickClose($A([
						"overlay_close"
					]));

					this.insertError(OMGNAjaxBase.default_error + " " + OMGNAjaxBase.contact_link);

					if (login_form_div)
					{
						OMGNAjaxBase.unfadeElement(login_form_div);
					}
					if (overlay_close)
					{
						OMGNAjaxBase.unfadeElement(overlay_close);
					}

					OMGNAjaxBase.hideProcessing();
				}.bind(this),
				onSuccess : function(request)
				{
					login.enable();
					login_close.enable();

					OMGNOverlay.attachClickClose($A([
						"overlay_close"
					]));

					OMGNAjaxBase.hideProcessing();

					if (login_form_div)
					{
						OMGNAjaxBase.unfadeElement(login_form_div);
					}
					if (overlay_close)
					{
						OMGNAjaxBase.unfadeElement(overlay_close);
					}

					// Check for some sort of error
					if (!request.responseText.isJSON())
					{
						this.insertError(OMGNAjaxBase.default_error + " " + OMGNAjaxBase.contact_link);
					}
					else
					{
						var results = request.responseText.evalJSON(true);

						if (results["error"])
						{
							this.insertError(results["error"]);
						}
						else
						{
							this.insertSuccess("Login successful! Hold on just a moment...");

							login.disable();
							login_close.disable();

							window.location.reload();
						}
					}
				}.bind(this)
			});
		}

		if (event)
		{
			Event.stop(event);
		}
	},

	/**
	 * Logs the user in via Facebook
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @param event The triggering event, if there is one
	 * @return void
	 */
	loginFacebook : function(event)
	{
		// Make the Facebook login
		FB.login(function(response)
		{
			if (response.authResponse)
			{
				var login = $("login"),
					login_close = $("login_close");

				// Validate internally
				if (login && login_close)
				{
					var parameters = new Hash(),
						login_form_div = $("login_form_div"),
						overlay_close = $("overlay_close");

					parameters.set("facebook_access_token", response.authResponse["accessToken"]);
					parameters.set("facebook_access_token_expiration", response.authResponse["expiresIn"]);

					login.disable();
					login_close.disable();

					OMGNOverlay.removeClickClose($A([
						"overlay_close"
					]));

					if (login_form_div)
					{
						OMGNAjaxBase.fadeElement(login_form_div);
					}
					if (overlay_close)
					{
						OMGNAjaxBase.fadeElement(overlay_close);
					}

					// Make the Ajax request
					OMGNAjaxBase.showProcessing();

					new Ajax.Request("/ajax/login",
					{
						method : "post",
						parameters : parameters,
						onFailure : function()
						{
							login.enable();
							login_close.enable();

							OMGNOverlay.attachClickClose($A([
								"overlay_close"
							]));

							this.insertError(OMGNAjaxBase.default_error + " " + OMGNAjaxBase.contact_link);

							if (login_form_div)
							{
								OMGNAjaxBase.unfadeElement(login_form_div);
							}
							if (overlay_close)
							{
								OMGNAjaxBase.unfadeElement(overlay_close);
							}

							OMGNAjaxBase.hideProcessing();
						}.bind(this),
						onSuccess : function(request)
						{
							login.enable();
							login_close.enable();

							OMGNOverlay.attachClickClose($A([
								"overlay_close"
							]));

							OMGNAjaxBase.hideProcessing();

							if (login_form_div)
							{
								OMGNAjaxBase.unfadeElement(login_form_div);
							}
							if (overlay_close)
							{
								OMGNAjaxBase.unfadeElement(overlay_close);
							}

							// Check for some sort of error
							if (!request.responseText.isJSON())
							{
								this.insertError(OMGNAjaxBase.default_error + " " + OMGNAjaxBase.contact_link);
							}
							else
							{
								var results = request.responseText.evalJSON(true);

								if (results["error"])
								{
									this.insertError(results["error"]);
								}
								else
								{
									this.insertSuccess("Login successful! Hold on just a moment...");

									login.disable();
									login_close.disable();

									window.location.reload();
								}
							}
						}.bind(this)
					});
				}
			}
			else
			{
				this.insertError("We are having an error logging you in with Facebook. You might want to consider trying registering and logging in with OMGN directly.");
			}
		}.bind(this), {
			scope : "email,publish_stream,publish_actions"
		});


		if (event)
		{
			Event.stop(event);
		}
	},

	/**
	 * Inserts an error
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @param error The error message
	 * @return void
	 */
	insertError : function(error)
	{
		var titles = $$("div#overlay_vertical div.overlay div.title");

		if (titles.length)
		{
			var overlay_error = $("overlay_error");

			if (overlay_error)
			{
				overlay_error.update(error);
			}
			else
			{
				var title = titles[0];

				title.insert({
					after : '<div class="error after" id="overlay_error">' + error + "</div>"
				});
			}
		}
	},

	/**
	 * Inserts a success
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @param success The success message
	 * @return void
	 */
	insertSuccess : function(success)
	{
		var titles = $$("div#overlay_vertical div.overlay div.title");

		if (titles.length)
		{
			var overlay_success = $("overlay_success"),
				overlay_error = $("overlay_error");

			if (overlay_error)
			{
				overlay_error.remove();
			}

			if (overlay_success)
			{
				overlay_success.update(success);
			}
			else
			{
				var title = titles[0];

				title.insert({
					after : '<div class="success after" id="overlay_success">' + success + "</div>"
				});
			}
		}
	}
};

/**
 * OMGN Facebook IFrame
 */
var OMGNFacebookIFrame =
{
	/**
	 * @var iframe_location The IFrame location
	 */
	iframe_location : null,

	/**
	 * Builds the IFrame
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @return void
	 */
	buildFrame : function(iframe_location)
	{
		if (!OMGNCookie.get("no_facebook_iframe_login"))
		{
			this.iframe_location = iframe_location;

			// Attach the IFrame
			var bodies = $$("body"),
				body = bodies[0];

			body.insert({
				bottom : '<iframe class="social facebook_iframe" id="facebook_oauth_iframe"> </iframe>'
			});

			this.checkFacebookLogin(true);
		}
	},

	/**
	 * Checks if the user is logged in to Facebook
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @param first Flag for if this is the first call of the page load
	 * @return void
	 */
	checkFacebookLogin : function(first)
	{
		FB.getLoginStatus(function(response)
		{
			if (response.authResponse)
			{
				if (response.authResponse["expiresIn"] < 60)
				{
					var facebook_oauth_iframe = $("facebook_oauth_iframe");

					if (facebook_oauth_iframe)
					{
						facebook_oauth_iframe.contentWindow.location = this.iframe_location;
					}
				}

				if (first)
				{
					var parameters = new Hash();

					parameters.set("access_token", response.authResponse["accessToken"]);
					parameters.set("access_token_expiration", response.authResponse["expiresIn"]);

					new Ajax.Request("/ajax/social/facebook/set-access-token",
					{
						method : "post",
						parameters : parameters
					});
				}

				setTimeout(this.checkFacebookLogin.bind(this), 60000); // 1 minute checks on login
			}
			else
			{
				// Get the parent body
				var content = '<div class="title">Facebook Login</div>' +
					"<p>Your OMGN account is linked to your Facebook account, and you've enabled sharing. Currently, you are not logged in to Facebook, therefore you cannot share. Would you to log in to Facebook to resume sharing?</p>" +
					'<p><a href="#" id="facebook_iframe_confirm_yes">Yes</a> &nbsp; | &nbsp; <a href="#" id="facebook_iframe_confirm_no">No</a></p>' +
					'<p>Clicking "Yes" will log you in to Facebook. If you click "No", we won\'t ask again this session.</p>';

				OMGNOverlay.write(content, "facebook_iframe_login");

				// Attach event listeners
				OMGNOverlay.attachClickClose($A([]));

				$("facebook_iframe_confirm_yes").observe("click", this.doLogin.bind(this));
				$("facebook_iframe_confirm_no").observe("click", this.optOut.bind(this));
			}
		}.bind(this));
	},

	/**
	 * Performs the Facebook login
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @param event The triggering event
	 * @return void
	 */
	doLogin : function(event)
	{
		FB.login(function(response)
		{
			this.seconds_left = response.authResponse["expiresIn"];

			var parameters = new Hash();

			parameters.set("access_token", response.authResponse["accessToken"]);
			parameters.set("access_token_expiration", response.authResponse["expiresIn"]);

			new Ajax.Request("/ajax/social/facebook/set-access-token",
			{
				method : "post",
				parameters : parameters
			});
		}.bind(this), {
			scope : "email,publish_actions,publish_stream"
		});

		setTimeout(this.checkFacebookLogin.bind(this), 60000); // 1 minute checks on login

		OMGNOverlay.remove();

		Event.stop(event);
	},

	/**
	 * The user doesn't want to be bothered with logging in
	 *
	 * @author Robert F. Ludwick <rfludwick@darqflare.com>
	 * @param event The triggering event
	 * @return void
	 */
	optOut : function(event)
	{
		OMGNCookie.set("no_facebook_iframe_login", 1);

		OMGNOverlay.remove();

		Event.stop(event);
	}
};

// Setup search bar
document.observe("dom:loaded", function()
{
	var omgn_search = $("omgn_search"),
		omgn_search_form = $("omgn_search_form");

	if (omgn_search && omgn_search_form)
	{
		omgn_search.observe("focus", function(event)
		{
			var omgn_search = event.element();

			if ($F(omgn_search) == "Search OMGN")
			{
				omgn_search.value = "";
			}

			Event.stop(event);
		});

		omgn_search.observe("blur", function(event)
		{
			var omgn_search = event.element();

			if ($F(omgn_search) == "")
			{
				omgn_search.value = "Search OMGN";
			}

			Event.stop(event);
		});

		omgn_search_form.observe("submit", function(event)
		{
			if ($F("omgn_search") == "Search OMGN")
			{
				Event.stop(event);
			}
		});
	}
});
