﻿var appSettings = null;
var globals = { ui: null, appSettings: null };
var globalEvalContext = new JsEvalContext(globals);

(function($) {
	$.fn.enter = function(handler) {
		return this.keydown(function(e) { if (e.keyCode == $.ui.keyCode.ENTER) { return handler(e); } });
	};

	$.fn.forceInteger = function() {
		this.keydown(function(e) {
			var key = e.keyCode;
			if (isVirtualKey(key) || e.ctrlKey || (!e.shiftKey && isDigitKey(key)))
				return true;
			$.jGrowl(_("MSG_NUMBER_POSITIVE"));
			e.target.focus();
			return false;
		});
	}

	function isFixedButton(obj) {
		return (obj.attr("tagName") == "BUTTON" && !obj.attr("nofix"));
	}

	function getSiblingButtons(obj) {
		return (isFixedButton(obj)) ? [obj.prev(), obj, obj.next()] : [obj];
	}

	$.fn.enable = function(bool) {
		if (bool)
			this.removeAttr("disabled");
		else
			this.attr("disabled", "disabled");

		this.each(function() {
			var self = $(this);
			if (this.tagName == "BUTTON") {
				$.each(getSiblingButtons(self), function() {
					(bool) ?
						this.removeClass("disabled").removeAttr("disabled") :
						this.addClass("disabled").attr("disabled", "disabled").blur();
				});
			}
			else if (self.is(":text") || self.is("select")) {
				(bool) ? self.removeClass("disabled") : self.addClass("disabled");
			}
		});
		return this;
	}

	$.fn.showIf = function(arg) {
		if ($.isFunction(arg))
			return $(this).each(function(i) { arg.call(this, i) ? $(this).show() : $(this).hide(); });
		else
			return (arg) ? $(this).show() : $(this).hide();
	}

	$.fn.check = function(bool) {
		if (bool == null || bool)
			this.attr("checked", "checked");
		else
			this.removeAttr("checked");
		return this;
	}

	$.fn.getAllCheckBoxes = function() {
		return $(this).find("input[type=checkbox]");
	}

	$.fn.getCheckBoxes = function() {
		return $(this).getAllCheckBoxes().filter("[master!=true]");
	}

	$.fn.getRows = function() {
		return $(this).find("tr[rowId]");
	}

	$.fn.checkBoxGroup = function() {
		var selected = 0;
		var all = this;
		var masters = this.filter("[master=true]");
		var slaves = this.filter("[master!=true]");
		masters.click(function() {
			if ($(this).attr("checked")) {
				$(all).check();
				selected = slaves.length;
			} else {
				$(all).check(false);
				selected = 0;
			}
		});
		slaves.click(function() {
			if ($(this).attr("checked"))
				++selected;
			else if (--selected == 0)
				masters.check(false);
		});
		return this;
	}

	$.fn.fixButtons = function() {
		return $(this).each(function() {
			var self = $(this);
			if (self.attr("nofix"))
				return;
			if (/iPhone|iPad/.test(navigator.userAgent)) 
			{
				self.addClass("iphone");
				return;	
			}
			var c = self.attr("className");
			// filter out jQuery built-in class names (ui-...)
			var ar = $.map(c.split(" "), function(val) { return (val.match(/^ui-/)) ? null : val; });
			self
				.before('<button class="' + ar.concat(["left"]).join(" ") + '" type="button" tabindex="-1">&nbsp;</button>')
				.after('<button class="' + ar.concat(["right"]).join(" ") + '"  type="button" tabindex="-1">&nbsp;</button>');
			function selfClick() { self.click(); }
			self.prev().click(selfClick);
			self.next().click(selfClick);
		});
	}

	var hideOrig = $.fn.hide;
	var showOrig = $.fn.show;
	$.fn.hide = function() {
		var args = arguments;
		return $(this).each(function() {
			$.each(getSiblingButtons($(this)), function() {
				hideOrig.apply(this, args);
			});
		});
	}
	$.fn.show = function() {
		var args = arguments;
		return $(this).each(function() {
			var self = $(this);
			$.each(getSiblingButtons($(this)), function() {
				showOrig.apply(this, args);
			});
		});
	}

	$.fn.fixDialog = function(params) {
		var self = $(this);
		var title = self.prev("div.ui-dialog-titlebar");
		$('<table width="100%" cellpadding="0" cellspacing="0"><tr>' +
			'<tr><td class="dialogTop left"></td><td class="dialogTop"></td><td class="dialogTop right"></td>' +
			'</tr></table>')
			.insertBefore(title)
			.find("td:eq(1)").append(title);
		var footer = self.next("div.ui-dialog-buttonpane");
		$('<table width="100%" cellpadding="0" cellspacing="0"><tr>' +
			'<td class="dialogBottom left"></td><td class="dialogBottom"></td><td class="dialogBottom right"></td>' +
			'</tr></table>')
			.insertBefore(footer)
			.find("td:eq(1)").append(footer);
		footer.find("button[type=button]")
			.each(function() {
				var label = $(this).text();
				var button = params.buttons[label] || {};
				var l = _(button.labelId);
				if (l)
					$(this).text(l);
				var id = button.id;
				if (id)
					$(this).attr("id", id);
			})
			.fixButtons();
	}

	$.fn.initDialog = function(params) {
		var self = $(this);
		var dialogButtons = {};
		$.each(params.buttons, function(key) {
			dialogButtons[key] = this.click;
		});
		var dialogParams = {
			autoOpen: false,
			bgiframe: true,
			modal: true,
			draggable: ((params.draggable && params.draggable == false) ? false : true),
			resizable: false,
			width: params.width,
			height: params.height,
			title: params.title,
			buttons: dialogButtons,
			open: function() {
				var t = _(params.titleId);
				if (t)
					self.data("title.dialog", t);
				if ($.isFunction(params.open))
					params.open.apply(this, arguments);
			}
		}
		if ($.isFunction(params.close))
			dialogParams.close = function() { params.close.apply(this, arguments); }
		if (getGlobal("ui"))
			self.dialog(dialogParams).fixDialog(params);
		else
			onRenderUI(function() { self.dialog(dialogParams).fixDialog(params); });
		return self;
	}
})(jQuery);

function closeDialog()
{
	$(this).dialog("close");
}

function setGlobalVariable(name, value)
{
	globalEvalContext.setVariable(name, value);
}

function getEvalContext()
{
	return globalEvalContext;
}

function setGlobal(name, value)
{
	globals[name] = value;
	globalEvalContext.setVariable(name, value);
}

function getGlobal(name)
{
	return globals[name];
}

function render(output, template) 
{
	if (typeof(output) == "string")
		output = document.getElementById(output);
	else if ($.isFunction(output.each))
		return output.each(function() { render(this, template); });
	if (template != null)
	{
		if (typeof(template) == "string")
		{
			var test = document.getElementById(template);
			if (test == null)
				alert("Error in render(): element \"" + template + "\" not found");
			template = jstGetTemplate(template);	// template is element id
		}
		else
			template = template.cloneNode(true);
		output.innerHTML = "";
		output.appendChild(template);
		output = template;
		$(template).show();
	}
	jstProcess(globalEvalContext, output);
}

function _(id, params)
{
	if (id == null)
		return null;
	var ret = globals.ui[id];
	if (ret == null)
	{
		alert("Missing localized string: " + id);
		ret = id;
	}
	if (params != null)
	{
		ret = ret.replace(/\$(\w+)/g, function (param, paramName)
		{
			return params[paramName] || param;
		});
	}
	return ret;
}

function getAppRoot()
{
	return document.location.pathname.replace(/[^\/]+$/, "");
}

function getUrl(protocol, pathname) {
	return protocol + "://" + document.location.host + getAppRoot() + pathname;
}

function isEcommerceOn() { return (getGlobal("appSettings").regMode == 2); }

function updateCurrentCulture()
{
	$("span[lang]").each(function() 
	{
		if ($(this).attr("lang") == _("locale"))
			$(this).addClass("selected");
		else
			$(this).removeClass("selected");
	});
}

function find1st(ar, fn)
{
	var n = ar.length;
	for (var i = 0; i < n; i++)
	{
		var obj = ar[i];
		if (fn.call(obj, i, obj))
			return obj;
	}
}

function findLanguage(ar, lang)
{
	if (find1st(function() { return (this.code == lang); }))
		return lang;
}

function setDefaultLanguage()
{
	var ar = appSettings.languages;
	if (ar == null || ar.length == 0)
		return;

	var lang = findLanguage(ar, getCookie("lang")) || ar[0].code;
	loadLang(lang);
}

function isVirtualKey(key) 
{
	return (key < 48 /*arrows, pgup/pgdown, backspace, delete etc*/ || key == 91 /* windows key*/);
}
function isDigitKey(key) 
{
	return ((key >= 48 && key <= 57) || (key >= 96 && key <= 105) /* num. pad */);
}

function getCookie(name)
{
	return $.cookie(name);
}

function setCookie(name, value, options) {
	var defaults = { path: getAppRoot(), expires: 1000 };
	var opts = $.extend({}, defaults, options);
	if (value != null && typeof (value) == "object")
		value = $.toJSON(value);	
	$.cookie(name, value, opts);
}

function deleteCookie(name)
{
	$.cookie(name, null, { path: getAppRoot() });
}

function delay(fn) 
{
	//setTimeout(fn, 500);
	fn();
}

function showContainer(target)
{
	if (currContainer == target)
	{
		recalcHeight();
		return;
	}
	$("#" + currContainer).hide();
	$("#" + target).show();
	currContainer = target;
	switch(currContainer)
	{
		case "searchForm":
			myLayout.show("south");
			break;
		default:
			myLayout.hide("south");
			break;
	}
}

function findSideMenu()
{
	var id = currSearchContainer.attr("id");
	return $("#sideMenu td[searchFormId=" + id + "]");
}
/*
function showSearchForm(targetId)
{
	if (currSearchContainer) {
		if (currSearchContainer.id == targetId)
			return;
		currSearchContainer.hide();
		findSideMenu()
			.removeClass("activeItem")
			.find("img").attr("src", "css/images/side_tab.png");
	}
	$("#searchForm button[targetId]").showIf(function() {return ($(this).attr("targetId") == targetId); });
	currSearchContainer = $("#" + targetId);
	currSearchContainer
		.trigger("beforeShow")
		.show();
	findSideMenu()
		.addClass("activeItem")
		.find("img").attr("src", "css/images/side_tab_selected.png");
}
*/
function showLogin(onSuccess) 
{
	$("#loginForm")
		.unbind("loginSuccess")
		.bind("loginSuccess", onSuccess)
		.dialog("open");
}

function getData(url, params, onOK, options) {
	options = $.extend({ block: true }, options || {});
	if (options.block)
		beginLoading();
	$.ajax({
		type: (params == null) ? "GET" : "POST",
		url: url,
		data: params,
		dataType: "json",
		cache: false,
		success: function(json) { 
			if (options.block)
				endLoading();
			onOK(json); 
		}
	});

}

function handleError(json)
{
	var e = json.error;
	var msg = (e) ? _(e.messageId, e.data) || e.description || _("MSG_ERROR", e) : null;
	if (!msg)
		return false;
	alert(msg);
	return true;
}

function handleMessage(json, options)
{
	var msg = _(json.messageId, json.data) || json.message;
	if (!msg)
		return false;
	$.jGrowl(msg, options);
	return true;
}

function getDataEx(url, params, onOK, options) {
	getData(url, params, function(json) {
		var msg;
		if (json.needLogin)
		{
			showLogin(function() { getDataEx(url, params, onOK); });
		}
		else if (handleError(json) || handleMessage(json))
		{
			return;
		}
		else if ($.isFunction(onOK))
		{
			onOK(json);
		}
	}, options);
	$(document).unbind("retry");
}

function formatDate(d)
{
	return d.format(getGlobal("appSettings").dateFormat);
}

function beginLoading()
{
	$.blockUI({
		message: $("#loading").html(),
		css : {
			zIndex : 999999
		},
		// styles for the overlay 
		overlayCSS:  {
			backgroundColor: "#A0A0A0", 
			opacity: 0.8,
			zIndex : 999998
		}
	});
}

function endLoading()
{
	$.unblockUI();
}

function ensureLoaded(placeHolderId, onload)
{
	var o = $("#" + placeHolderId);
	if (o.attr("loaded"))
	{
		if ($.isFunction(onload))
			onload();
		return;
	}
	beginLoading();
	$.ajax({
			url : o.attr("url"),
			dataType : "html",
			success: function(result) {
				endLoading();
				o.html(result).attr("loaded", "true");
				render(placeHolderId)
				if ($.isFunction(onload))
					onload();
			}
		});
}

function dialogData(obj, param) 
{
	if (arguments.length == 1)
		return obj.dialog("option", "data");
	else
		obj.dialog("option", "data", param);
}

var Compat =
{
	xmlEntities: { '&': '&amp;', '"': '&quot;', '<': '&lt;', '>': '&gt;', "'": '&apos;' },
	xmlEncode: function(s) { return s.replace(/[&"<>']/g, function(x) { return Compat.xmlEntities[x]; }); },
	quoteValue: function(v) { return "\"" + Compat.xmlEncode(new String(v)) + "\""; },
	makeTag: function(tagName, attrs, content) {
		var ar = ["<" + tagName];
		$.each(attrs, function(key, value) { ar.push(" " + key + "=" + Compat.quoteValue(value)); });
		ar.push((content == null || content == "") ? "/>" : ">" + content + "</" + tagName + ">");
		return ar.join("");
	}
}

// This makes it easy to override default parsing on a field-by-field basis
function createParser(fieldName, fieldFlags) 
{
	return new QueryParser(fieldName, fieldFlags);
}

function parseTerm(fieldName, term, sFlags, termType) 
{
	if (term == "") return "";
	if (sFlags == null)
		sFlags = "twpe"; 	// default is a text field with all extras
	// Translate field flags to a bit mask
	var fieldFlags = 0;
	for (var i = 0; i < sFlags.length; ++i)
		switch (sFlags.charAt(i)) {
		case "w": fieldFlags += FieldFlags.WILDCARD; break;
		case "p": fieldFlags += FieldFlags.PROXIMITY; break;
		case "e": fieldFlags += FieldFlags.EXPRESSION; break;
		case "n": fieldFlags += FieldFlags.NUMERIC; break;
		case "d": fieldFlags += FieldFlags.DATE; break;
		case "f": fieldFlags += FieldFlags.NUMERIC + FieldFlags.FLOAT; break;
	}
	if (termType != null)
		fieldFlags &= ~(FieldFlags.WILDCARD | FieldFlags.PROXIMITY);
	var oParser = createParser(fieldName, fieldFlags);
	return oParser.parseTerm(term, termType);
}

function sendQuery(oQuery)
{	
	getDataEx("NetisUtils/srvrutil_xmlquery.aspx", oQuery.params, analyseResultListDetails);
}

function setSortImage(img, order) 
{
	if (order == null)
		order = $(img).attr("order");
	var bAsc = (order > 0);

	$(img)
		.attr("src", bAsc ? $(img).attr("imgUp") : $(img).attr("imgDown"))
		.attr("title", bAsc ? _("MSG_SORTED_ASC") : _("MSG_SORTED_DESC"))
		.attr("order", bAsc ? 1 : -1);
}

function toggleSortImage() 
{
	setSortImage(this, -$(this).attr("order")); 
}

function checkValue(val, valType)
{
	switch (valType) {
		case "" : return true;
		case "text": return (val.length != 0);
		case "email" : return (val.match(/^[a-zA-Z0-9\._-]+@\w+(\.\w+)+$/));
		case "number": return (val.length == 0 || val.match(/^\d+$/));
		case "phone": return (val.length == 0 || val.match(/^\d+(-\d+)*$/));
		case "3digits": return (val.match(/^\d\d\d$/));
		case "card": return isValidCardNumber(val);
	}
}

function validate(obj)
{
	function getNth(s, n, sep)
	{
		if (!s)
			return null;
		var ar = s.split(sep || ",");
		return ar[(n < ar.length) ? n : ar.length - 1];			
	}

	var val = obj.val();
	var i = null;
	$.each((obj.attr("validate")||"").split(","), function(index, valType) {
		if (!checkValue(val, valType))
			return (i = index, false);
	});
	if (i == null)
		return true;
	var message =
		_(getNth(obj.attr("messageId"), i)) ||
		getNth(obj.attr("message"), i) ||
		"Please provide a valid input";
	$.jGrowl(message);
	obj.focus();
	return false;
}

function validateAll(obj)
{
	var ret = true;
	obj.find(":input[validate]").each(function() {
		var self = $(this);
		if (!validate(self))
			return (ret = false);
	});
	return ret;
}

function findFormFields(obj)
{
	return obj.find(":input[fieldName]");
}

function setFormData(obj, data)
{
	findFormFields(obj).each(function() {
		var value = data[$(this).attr("fieldName")];
		if (value)
			$(this).val(value);
	});
}

function getFormData(obj, data)
{
	var ret = true;
	findFormFields(obj).each(function() {
		var self = $(this);
		if (!validate(self))
			return (ret = false);
		var field = self.attr("fieldName");
		if (field)
			data[field] = self.val();
	});
	return ret;
}

function openNoteFromRLItem(item) 
{
	openNote(item.fields["DocId"], item.fields[appSettings.noteField], item);
}

function openNote(docId, header, item) 
{
	var serverData = {
		action: "getNote",
		docId: docId
	};
	ensureLoaded("notesDialog", function() {
		var data = {
			header: header || "",
			docId: docId,
			item : item
		};
		dialogData($("#notesDialog"), data);
		getDataEx("NetisUtils/srvrutil_manageNotes.aspx", serverData, analyseViewNotes);
	});
}

function onChangeNote(json, item, docId)
{
	if (item) {
		item.hasNote = json.hasNote;
		renderResultList();
	}
	if (docId == getGlobal("$docId")) {
		setGlobal("$docHasNote", json.hasNote);
		render("toolbarDocument");
	}
}

function loadLang(lang) {
	$.getJSON("res/" + lang + ".js", function(data) {
		setGlobal("ui", data);
		renderUI();
	});
}

function setLang(lang) 
{
	loadLang(lang);
	setCookie("lang", lang);
}

function onRenderUI(callback)
{
	$(document).bind("renderUI", callback);
}

function renderUI() {
	render(document.body);
	$(document).trigger("renderUI");
}

function fillCombo(oCombo, arValues) 
{
	$.each(arValues, function() {
		var value = (this.value == null) ? this.toString() : this.value;
		var text = _(this.displayNameId) || this.displayName || this.name || value;
		$(document.createElement("option"))
		.val(value)
		.attr("title", text)
		.text(text)
		.appendTo(oCombo);
	})
	return oCombo;
}
