(function() {
	var App = {
		base_url: '/',

		load_flash: function(where, what_flash, flashvars) {
			swfobject.embedSWF(
				App.base_url + what_flash,
				where, "100%", "100%", "10.0.0",
				App.base_url +"media/expressInstall.swf",
				{},
				{ menu: "false", scale: "noScale", allowFullscreen: "true", allowScriptAccess: "always", bgcolor: "#000000", wmode: "transparent", flashvars: flashvars ? http_build_query(flashvars) : '' },
				{}
			);
		},

		GATrackPageView: function(path) {
			if (pageTracker && path) {
				pageTracker._trackPageview(path);
			}
		},

		// fb widget
		FBWidget: {
			init: function() {
				App.FBWidget.hide();
				$("#fb-close").click(function() {
					App.FBWidget.hide();
					document.getElementById("media-main").hideBlocker();
					return false;
				});
			},

			show: function() {
				$("#fb-popup").show();
			},

			hide: function() {
				$("#fb-popup").hide();
			}
		},

		init_forms: function() {
			$('div.ajax-form').each(function() {
				var $form_wrapper = $(this),
					$form_messages = $form_wrapper.find('> .messages'),
					$form = $form_wrapper.find('> form');
				$form.submit(function() {
					$.ajax({
						type: $form.attr('method'),
						url: $form.attr('action'),
						data: $form.serialize(),
						success: function(server_response, status) {
							var response = JSON.parse(server_response);
							$form_messages.html('<div class="'+ (response.status == 0 ? 'state-highlight' : 'state-error') +'"><pre>'+ App.formatJSON(response) +'</pre></div>');
							//$form.find('.text input, textarea').val('');
						},
						beforeSend: function(xhr) {
						},
						complete: function(xhr, status) {
						},
						global: false,
						dataType: 'text'
					});

					return false;
				});
			});
		},

		/**
		 * http://joncom.be/code/javascript-json-formatter/
		 */
		formatJSON: function(oData, sIndent) {
			if (arguments.length < 2) {
				sIndent = "";
			}
			var sIndentStyle = "    ";
			var sDataType = App.RealTypeOf(oData);

			// open object
			if (sDataType == "array") {
				if (oData.length == 0) {
					return "[]";
				}
				var sHTML = "[";
			}
			else {
				var iCount = 0;
				$.each(oData, function() {
					iCount++;
					return;
				});
				if (iCount == 0) { // object is empty
					return "{}";
				}
				var sHTML = "{";
			}

			// loop through items
			var iCount = 0;
			$.each(oData, function(sKey, vValue) {
				if (iCount > 0) {
					sHTML += ",";
				}
				if (sDataType == "array") {
					sHTML += ("\n" + sIndent + sIndentStyle);
				}
				else {
					sHTML += ("\n" + sIndent + sIndentStyle + "\"" + sKey + "\"" + ": ");
				}

				// display relevant data type
				switch (App.RealTypeOf(vValue)) {
					case "array":
					case "object":
						sHTML += App.formatJSON(vValue, (sIndent + sIndentStyle));
						break;
					case "boolean":
					case "number":
						sHTML += vValue.toString();
						break;
					case "null":
						sHTML += "null";
						break;
					case "string":
						sHTML += ("\"" + vValue + "\"");
						break;
					default:
						sHTML += ("TYPEOF: " + typeof(vValue));
				}

				// loop
				iCount++;
			});

			// close object
			if (sDataType == "array") {
				sHTML += ("\n" + sIndent + "]");
			}
			else {
				sHTML += ("\n" + sIndent + "}");
			}

			// return
			return sHTML;
		},

		RealTypeOf: function(v) {
			if (typeof(v) == "object") {
				if (v === null) {
					return "null";
				}
				if (v.constructor == (new Array).constructor) {
					return "array";
				}
				if (v.constructor == (new Date).constructor) {
					return "date";
				}
				if (v.constructor == (new RegExp).constructor) {
					return "regex";
				}
				return "object";
			}

			return typeof(v);
		}
	};

	window.App = App;
})();

