/* Used at: "CRIF - Header" Web Template -> Source */

if (typeof Dynamics === "undefined") { Dynamics = { __namespace: true }; }
if (typeof Dynamics.Portal === "undefined") { Dynamics.Portal = { __namespace: true }; }

Dynamics.Portal.GenericFields = new function () {
	var self = this;

	// Valuing
	self.Attribute = new function () {
		this.get = function (fieldName) {
			return $("#" + fieldName).val();
		};
		this.set = function (fieldName, value) {
			$("#" + fieldName).val(value);
		};
		this.clean = function (fieldName) {
			$("#" + fieldName).val(null);
		};
		this.addOnChange = function (fieldName, callback) {
			$("#" + fieldName).change(callback);
		};
		this.fireOnChange = function (fieldName) {
			$("#" + fieldName).trigger("change");
		};
		this.setLabel = function (fieldName, newValue) {
			if (fieldName === "" || fieldName === null || fieldName === undefined)
				return;

			$("#" + fieldName + "_label").text(newValue);

		};
		this.getLabel = function (fieldName) {
			$("#" + fieldName + "_label").text();
		};
		this.encodeToHtmlText = function (fieldName) {
			var txt = this.get(fieldName);
			if (txt == null)
				return;
			txt = txt.replace(/&/g, '&amp;');
			txt = txt.replace(/"/g, "&quot;");
			txt = txt.replace(/</g, '&lt;');
			txt = txt.replace(/>/g, '&gt;');
			this.set(fieldName, txt);
		}
	};

	// Disabled (i campi disabled non saranno oggetti in fase di submit..usare read)
	self.Disabled = new function () {

		this.set = function (fieldName, value) {
			value ? disable(fieldName) : enable(fieldName);
		};

		this.get = function (fieldName) {
			return getEditability(fieldName);
		};

		function enable(fieldName) {
			$("#" + fieldName).attr('disabled', false);
		};

		function disable(fieldName) {
			$("#" + fieldName).attr('disabled', true);
		};

		function getEditability(fieldName) {
			return $("#" + fieldName).is(":disabled");
		};
	};

	self.Visibility = new function () {

		this.set = function (fieldName, value) {
			value ? show(fieldName) : hide(fieldName);
		};

		this.get = function (fieldName) {
			return getVisible(fieldName);
		};

		this.setVisibleRow = function (fieldName, value) {
			value ? showRow(fieldName) : hideRow(fieldName);
		};

		this.getVisibleRow = function (fieldName) {
			return getVisible(fieldName);
		};

		function show(fieldName) {
			//var allTd = $('td');

			//for (var i = 0; i < allTd.length; i++) {

			//	var item = $(allTd[index]);
			//	var tryFound = $(item).find("#" + fieldName);
			//	if (tryFound.length === 1) {
			//		$(item).show();
			//		return;
			//	}
			//}
			$("#" + fieldName).closest('td').show();
		};

		function hide(fieldName) {
			//var allTd = $('td');

			//for (var i = 0; i < allTd.length; i++) {

			//	var item = $(allTd[i]);
			//	var tryFound = $(item).find("#" + fieldName);
			//	if (tryFound.length === 1) {
			//		$(item).hide();
			//		return;
			//	}
			//}

			$("#" + fieldName).closest('td').hide();
		};

		function showRow(fieldName) {
			$("#" + fieldName).closest('tr').show();
		};

		function hideRow(fieldName) {
			$("#" + fieldName).closest('tr').hide();
		};

		function getVisible(fieldName) {
			return $("#" + fieldName).is(":visible");
		};
	};
}

Dynamics.Portal.OptionSet = new function () {
	var self = this;

	self.Attribute = new function () {

		this.get = function (fieldName) {
			var value = $("#" + fieldName).val();
			var name = $("#" + fieldName + " option:selected").text();

			var obj = {};
			obj.value = value;
			obj.name = name;
			return obj;
		};
		this.set = function (fieldName, value) {
			$("#" + fieldName).val(value);
		};

	};
	self.removeOption = function (fieldName, value) {
		$("#" + fieldName + " option[value='" + value + "']").remove();
	};

	self.removeAllOptions = function (fieldName, leaveEmpty) {
		$("#" + fieldName + " option").each(function () {
			if (leaveEmpty && $(this).val() == "") {
				return;
			}
			$(this).remove();
		});
	};

	self.loadValue = function (name, list, usingDescr, addEmptyOption) {
		self.removeAllOptions(name, !addEmptyOption);
		if (addEmptyOption) {
			$("#" + name).append($('<option value label=" "></option>'));
		}

		if (list === null || list === undefined || list.length === 0)
			return;

		for (let i = 0; i < list.length; i++) {
			var item = list[i];

			if (usingDescr) {
				$("#" + name)
					.append($("<option text=" + item.opt_text + " value=" + item.opt_value + " data-descr=" + item.opt_descr + ">"));

				[].forEach.call(document.querySelectorAll('#' + name),
					function (s) {
						s.addEventListener('focus', focus);
						s.addEventListener('blur', blur);
						s.addEventListener('change', change);
						blur.call(s);
					});

			} else {
				$("#" + name).append($('<option>',
					{
						value: item.value,
						text: item.text
					}));
			}

		}

		function focus() {
			[].forEach.call(this.options, function (o) {
				var descr = o.getAttribute('data-descr');
				if (descr === undefined || descr === null || descr === "")
					o.textContent = o.getAttribute('text')
				else
					o.textContent = o.getAttribute('text') + ' (' + o.getAttribute('data-descr') + ')';
			});
		}
		function blur() {
			[].forEach.call(this.options, function (o) {
				o.textContent = o.getAttribute('text');
			});
		}
		function change() {
			[].forEach.call(this.options, function (o) {
				o.textContent = o.getAttribute('text');
				$(':focus').blur();
			});
		}
	};

	self.setCurrentValue = function (name, currentValue) {

		let currentOptions = $.map($('#' + name + ' option'), function (option) {
			return {
				opt_text: option.text,
				opt_value: option.value
			};
		});

		if (!currentOptions || currentOptions.length === 0) {
			return;
		}

		let option = currentOptions.find(opt => opt.opt_value == currentValue);

		if (!option) {
			return;
		}

		$("#" + name + " option[value=" + currentValue + "]").prop("selected", "selected");

		//if (currentValue.value === "")
		//	return;




		//for (let i = 0; i < list.length; i++) {
		//	var item = list[i];

		//	if (currentValue == item.opt_value)
		//		$("#" + name + " option[value=" + item.opt_value + "]").prop("selected", "selected");

		//}
	};

	self.blank = function (name) {
		$("#" + name + " option[value='']").prop("selected", "selected");
	}
};

Dynamics.Portal.Lookup = new function () {
	var self = this;

	// Disabled
	self.Disabled = new function () {
		this.set = function (fieldName, value) {
			value ? disableLookup(fieldName) : enableLookup(fieldName);
		};
		this.get = function (fieldName) {
			return Dynamics.Portal.GenericFields.Disabled.get(fieldName);
		};

		function enableLookup(fieldName) {
			$("#" + fieldName).attr('disabled', false);
			$("#" + fieldName + "_name").attr('disabled', false);
			$("#" + fieldName + "_name").attr('readonly', true);

			$("#" + fieldName + "_entityname").next().show();

			$("input#" + fieldName + "_name").css("width", "100%");
		};

		function disableLookup(fieldName) {
			var width = $("#" + fieldName + "_name").width() + $("#" + fieldName + "_entityname").next().width();

			$("#" + fieldName).attr('disabled', true);
			$("#" + fieldName + "_name").attr('disabled', true);
			$("#" + fieldName + "_name").attr('readonly', true);
			$("#" + fieldName + "_name").removeAttr('readonly');
			$("#" + fieldName + "_entityname").next().hide();

			//$("#" + fieldName + "_name").width(width);
			$("#" + fieldName + "_name").parent().parent().css("width", "100%");
			$("#" + fieldName + "_name").parent().css("width", "100%");
		};
	};

	// Visibility
	self.Visibility = new function () {
		this.set = function (fieldName, value) {
			Dynamics.Portal.GenericFields.Visibility.set(fieldName, value);
		};
		this.get = function (fieldName) {
			Dynamics.Portal.GenericFields.Visibility.get(fieldName);
		};
	};

	// Readonly
	self.Readonly = new function () {
		this.set = function (fieldName, value) {
			value ? disableLookup(fieldName) : enableLookup(fieldName);
		};
		this.get = function (fieldName) {
			return Dynamics.Portal.GenericFields.Disabled.get(fieldName);
		};

		function enableLookup(fieldName) {
			$("#" + fieldName).attr('readonly', false);
			$("#" + fieldName + "_name").attr('readonly', false);
			$("#" + fieldName + "_name").attr('readonly', true);

			$("#" + fieldName + "_entityname").next().show();

			$("input#" + fieldName + "_name").css("width", "100%");
			$("#" + fieldName + "_name").parent().css('cursor', 'auto');
			$("#" + fieldName + "_name").parent().css('pointer-events', 'auto');
		};

		function disableLookup(fieldName) {
			var width = $("#" + fieldName + "_name").width() + $("#" + fieldName + "_entityname").next().width();

			$("#" + fieldName).attr('readonly', true);
			$("#" + fieldName + "_name").attr('readonly', true);
			$("#" + fieldName + "_name").attr('readonly', true);
			$("#" + fieldName + "_entityname").next().hide();

			//$("#" + fieldName + "_name").width(width);
			$("#" + fieldName + "_name").parent().parent().css("width", "100%");
			$("#" + fieldName + "_name").parent().css("width", "100%");
			$("#" + fieldName + "_name").parent().css('cursor', 'not-allowed');
			$("#" + fieldName + "_name").parent().css('pointer-events', 'none');
		};
	};

	// Required
	self.Required = new function () {
		this.set = function (fieldName, fieldLabel, value) {
			Dynamics.Portal.GenericFields.Required.set(fieldName, fieldLabel, value);
		}
		this.get = function (fieldName) {
			Dynamics.Portal.GenericFields.Required.get(fieldName);
		}
	};

	// Valuing
	self.Attribute = new function () {
		this.set = function (fieldName, id, value, entityname) {
			$("#" + fieldName + "_name").attr("value", value);
			$("#" + fieldName).attr("value", id);
			$("#" + fieldName + "_entityname").attr("value", entityname);
		};
		this.get = function (fieldName) {
			var obj = {};

			var name = $("#" + fieldName + "_name").val();
			var id = $("#" + fieldName).val();
			var entityName = $("#" + fieldName + "_entityname").val();

			if (name === "" || id === "" || entityName === "")
				return null;

			obj.value = name;
			obj.id = id;
			obj.entityname = entityName;

			return obj;
		};
		this.clean = function (fieldName) {
			var value = Dynamics.Portal.Lookup.Attribute.get(fieldName);
			if (value === null)
				return;

			$("#" + fieldName).parent().find('.btn.btn-default.clearlookupfield').trigger('click');
		};
		this.addOnChange = function (fieldName, callback) {
			Dynamics.Portal.GenericFields.Attribute.addOnChange(fieldName, callback);
		}
		this.fireOnChange = function (fieldName) {
			Dynamics.Portal.GenericFields.Attribute.fireOnChange(fieldName);
		}

	};

	// add open
	self.OpenLookup = new function () {
		this.add = function (lookuptextId, lookupguidId, webpageName, openWindowLocation) {
			$(document).ready(function () {

				$("#" + lookuptextId).click(function () {
					var dualScreenLeft = window.screenLeft != undefined ? window.screenLeft : screen.left;
					var dualScreenTop = window.screenTop != undefined ? window.screenTop : screen.top;

					var width = window.innerWidth
						? window.innerWidth
						: document.documentElement.clientWidth
							? document.documentElement.clientWidth
							: screen.width;
					var height = window.innerHeight
						? window.innerHeight
						: document.documentElement.clientHeight
							? document.documentElement.clientHeight
							: screen.height;

					var w = 600;
					var h = 600;

					var left = ((width / 2) - (w / 2)) + dualScreenLeft;
					var top = ((height / 2) - (h / 2)) + dualScreenTop;

					var recordID = $("#" + lookupguidId).val();

					var portalHostName = window.location.host;

					var portalURL = "https://" + portalHostName;

					var url = portalURL + "/" + webpageName + "/?id=" + recordID;

					if (openWindowLocation)
						window.open(url, 'width=' + w + ', height=' + h + ', top=' + top + ', left=' + left);
					else
						window.open(url, 'popup', 'width=' + w + ', height=' + h + ', top=' + top + ', left=' + left);
				});

				$("#" + lookupguidId).change(function () {

					$("#" + lookuptextId).css("color", "blue");
					$("#" + lookuptextId).css("cursor", "pointer");

				});

				var getLookupValue = $("#" + lookuptextId).val();

				if (getLookupValue) {

					$("#" + lookuptextId).css("color", "blue");
					$("#" + lookuptextId).css("cursor", "pointer");
				}

			});
		};

	};
};

Dynamics.Portal.Fetch = new function () {
	var self = this;

	self.checkIfExists = function (url, async) {
		var value = true;
		var asyncValue = async === "" ? false : true;

		var request = $.ajax({
			type: "GET",
			url: url,
			dataType: 'json',
			async: asyncValue
		});

		request.done(function (result) {
			if (result.value.length === 0)
				value = false;
		});

		return value;
	};

	self.execute = function (url, callback, async) {
		var asyncValue = async === "" ? false : true;

		var request = $.ajax({
			type: "GET",
			url: url,
			dataType: 'json',
			async: asyncValue
		});

		request.done(function (result) {
			callback(result);
		});
	};

	self.executeWithReturn = function (url, async) {
		var asyncValue = async === "" ? false : true;

		var request = $.ajax({
			type: "GET",
			url: url,
			dataType: 'json',
			async: asyncValue
		});

		var value = null;

		request.done(function (result) {
			value = result;
		});

		return value;
	};

};