/*
 * onArcade.com
 * Copyright © 2011 Hans Mäesalu & Eveterm OÜ, All Rights Reserved
 */

// create new DOM object
$.createElement = function(element) {
	return jQuery(document.createElement(element));
};

//template parsing
$.tmpl = function(template, data, returnString) {
	// make replacements
	if (data != undefined) {
		if (data.length === 0) {
			return returnString ? "" : $();
		} else if (data[0]) {
			var fullTemplate = "";
			var newTemplate = "";
			for (var i in data) {
				newTemplate = template;
				for (var j in data[i]) {
					newTemplate = newTemplate.replace(new RegExp("\\$\\("+ j +"\\)","g"), data[i][j]);
				}
				fullTemplate += newTemplate;
			}
			template = fullTemplate;
		} else {
			for (var i in data) {
				template = template.replace(new RegExp("\\$\\("+ i +"\\)","g"), data[i]);
			}
		}
	}


	// return jQuery object
	if (typeof(returnString) == "object") {
		returnString[0].innerHTML += template;
		return;
	} else if (returnString == true) {
		return template;
	}

	return $(template);
};

//sometimes we just need <br />
function nl2br(string) {
	return string.replace(/(\r)?\n/g, "<br />");
}

//we do not want HTML
function nohtml(string) {
    string = string.replace(/"/g,'&quot;');
    string = string.replace(/</g,'&lt;');
    string = string.replace(/>/g,'&gt;');
	return string;
}

//remove letters from field ID/name, to get only ID
function fieldNumber(fieldId) {
	if (typeof(fieldId) == "object") {
		return parseInt(fieldId.attr("id").replace(/[^0-9]/g,""));
	}
	return parseInt(fieldId.replace(/[^0-9]/g,""));
}

//AJAX loader image
var loader = {
	url: "/img/loader.gif",
	replace: function(object) {
		// make sure we have jQuery object
		if (typeof(object) == "string") {
			object = $("#" + object);
		} else if (!object.jQuery) {
			object = $(object);
		}

		// get contents height
		var margin = (object.height() - 16) / 2;
		if (margin < 0) {
			margin = 0;
		}

		// insert loader
		if (object[0].nodeName.toLowerCase() == "table") {
			object.children("tbody").html('<tr><td class="center" colspan="'+ object.children("thead").children("tr:first").children("td").size() +'">'
					+'<img src="'+ loader.url +'" class="loader" style="margin: '+ margin +'px 0px;" /></td></tr>');
		} else {
			object.html('<div class="center"><img src="'+ loader.url +'" class="loader" style="margin: ' + margin + 'px 0px;" /></div>');
		}
	},
	insert: function(object) {
		if (typeof(object) == "string") {
			object = $("#" + object);
		}

		// loader image
		var loader_img = object.next();
		if (loader_img.size() > 0 && loader_img.hasClass("loader")) {
			loader_img.show();
		} else {
			loader_img = $.createElement("img")
						.attr("src", loader.url)
						.addClass("loader")
						.insertAfter(object);
		}

		// disable button
		var nodeName = object.get(0).nodeName.toLowerCase();
		if (nodeName == "input" || nodeName == "button") {
			object.attr("disabled", true);
		}
	},
	remove: function(object) {
		if (typeof(object) == "string") {
			object = $("#" + object);
		}

		// loader image
		var loader_img = object.next();
		if (loader_img.size() > 0 && loader_img.hasClass("loader")) {
			loader_img.hide();
		}

		// enable button
		var nodeName = object.get(0).nodeName.toLowerCase();
		if (nodeName == "input" || nodeName == "button") {
			object.attr("disabled", false);
		}
	}
};

//show AJAX error message
/*
 * object - DOM element before what error is inserted
 * after - insert error after DOM element
 * message - error message
 * error - if it is an error (red) or positive error (green)
 * hide - hide error after x seconds
 */
var error = {
	insert: function(object, message, isError) {
		// if string then get element
		if (typeof(object) == "string") {
			object = $("#" + object);
		}

		// should be compose options object
		if (object instanceof jQuery) {
			options = {object: object, message: message, error: (isError == undefined) ? false : isError};
		} else {
			options = object;
		}

		// try to find an existing element
		var element = (options.after) ? options.object.next() : options.object.prev();
		if (!(element.size() > 0 && (element.hasClass("error") || element.hasClass("errorGreen")))) {
			var element = $.createElement("div");
			if (options.after) {
				element.insertAfter(options.object);
			} else {
				element.insertBefore(options.object);
			}
		}

		// update field info
		element.attr("class", (options.error == false ? "errorGreen":"error"));
		element.text(options.message);

		// slide down animation
		element.hide();
		element.show(250);

		// hide after some time
		if (options.error == false && options.hide) {
			element.delay(1000 * options.hide).hide(250);
		}
	}
};

//bubble
function Bubble(bubbleId, defaultOptions) {
	var here = this;

	this.id = bubbleId;
	this.element = null;
	this.arrowElement = null;
	this.contentsElement;
	this.defaultOptions = defaultOptions;

	/*
	 * Action to run when bubble is closed.
	 * Parameter: TRUE, if bubble hidden, FALSE, if content replaced with open
	 */
	this.closeAction;

	/*
	 * Bubble has been closed
	 */
	this.closed = true;

	this.setWidth = function(width) {
		this.element.width(width);
	};

	this.setLeft = function(left) {
		this.element.css("left", left);
	};

	this.setTop = function(top) {
		this.element.css("top", top);
	};

	this.setContents = function(contents) {
		if (this.element.is(":hidden")) {
			this.element.show();
			$(document).one("click", here.close);
		}

		if (typeof(contents) == "object") {
			this.contentsElement.empty().append(contents);
		} else {
			this.contentsElement.html(contents);
		}
	};

	this.setArrow = function(position) {
		if (this.arrowElement == null) {
			this.arrowElement = $.createElement("div").appendTo(this.element);
		} else {
			this.arrowElement.show().removeClass("arrow_left arrow_right arrow_up arrow_down");
		}
		this.arrowElement.addClass("arrow_" + position);
	};

	this.getContents = function() {
		return this.contentsElement;
	};

	this.addOverlay = function() {
		var overlay = $("#overlay");
		if (overlay.size() == 0) {
			overlay = $.createElement("div").attr("id", "overlay")
				.appendTo(document.body);
		} else {
			overlay.show();
		}

		// cover full page
		var documentHeight = $(document).height();
		var windowHeight = $(window).height();
		overlay.height(documentHeight < windowHeight ? windowHeight : documentHeight);
	};

	this.setCloseAction = function(action) {
		this.closeAction = action;
	};

	// run custom closed action when bubble is being closed
	this.runCloseAction = function(bubbleClosed) {
		if (typeof(this.closeAction) == "function") {
			console.log("Bubble.runCloseAction: "+ bubbleClosed);
			(this.closeAction)(bubbleClosed);
			this.closeAction = null;
		}
	},

	this.loader = function() {
		loader.replace(this.contentsElement);
	};

	// close bubble and call close action, if needed, with true
	this.close = function(e) {
		// event is stopped
		if (e && e.isPropagationStopped()) {
			return;
		}

		here.runCloseAction(true); // run close action

		$("#overlay").hide(); // hide overlay

		// hide bubble (only when really closing bubble)
		if (e != 321) {
			here.element.fadeOut(250);
		}

		$(document).unbind("click", here.close);

		here.closed = true;
	};

	this.open = function(options) {
		// create element
		if (this.element == null) {
			this.element = $.createElement("div").attr("id", this.id).addClass("bubble");
			this.contentsElement = $.createElement("div")
				.appendTo(this.element);
			$(document.body).append(this.element);

			this.element.click(function(e) {
				e.stopPropagation();
			}).hide();
		} else if (!this.closed) {
			// close previous bubble
			this.close(321);
		}
		this.closed = false;

		this.element.fadeIn(250); // show

		// default options
		if (this.defaultOptions) {
			for (i in this.defaultOptions) {
				if (options[i] == undefined) {
					options[i] = this.defaultOptions[i];
				}
			}
		}

		if (options != undefined) {
			if (options.left != undefined) {
				this.setLeft(options.left);
			}
			if (options.top != undefined) {
				this.setTop(options.top);
			}
			if (options.width != undefined) {
				this.setWidth(options.width);
			}
			if (options.center != undefined && options.center) {
				this.setLeft(($(window).width() - this.element.width()) / 2);
			}
			if (options.loader != undefined && options.loader) {
				this.loader();
			} else if (options.contents != undefined) {
				this.setContents(options.contents);
			}
			if (options.arrow != undefined) {
				this.setArrow(options.arrow);
			} else {
				if (this.arrowElement != null) {
					this.arrowElement.hide();
				}
			}
			if (options.overlay == true) {
				this.addOverlay();
			}
			if (options.closeAction != undefined) {
				this.setCloseAction(options.closeAction);
			}
		}

		// delay binding, so could finish propagation to other events
		setTimeout(function() {
			$(document).bind("click", here.close);
		}, 250);
	};
}

// license checking page
var licenseCheck = {
	response: null,
	submit: function(e) {
		e.preventDefault();
		var form = $(this);
		var submit = form.find("input:submit:first");
		loader.insert(submit);
		$.post("/Main/LicenseCheck", form.serialize(), function(response) {
			loader.remove(submit);
			licenseCheck.response.html(response.message);
			if (response.error) {
				licenseCheck.response.addClass("error").removeClass("errorGreen");
			} else {
				licenseCheck.response.removeClass("error").addClass("errorGreen");
			}
		}, "json");
	},
	init: function() {
		licenseCheck.response = $.createElement("p");
		$("#licenseForm").submit(licenseCheck.submit).append(licenseCheck.response);
	}
};
