﻿function EntityCategoryAdmin(params) {

	var _selEntityType = params.selEntityType;
	var _categoryList = params.categoryList;
	var _catDialog = params.catDialog;
	var _selEntityCategories = _catDialog.find("select:eq(0)");
	var _selCategories = _catDialog.find("select:eq(1)");
	var _hiddenCategories = params.hiddenCategories;

	var _service = params.service;
	var _categories = new Array();
	var _currentCat = null;

	this.doCategory = doCategory;

	init();
	function init() {
		_selEntityCategories.change(function() { updateSubCategories(); });
		parseCategories(params.categories);
		buildCategoryList();
	}

	function updateEntityCategories() {
		var list = _selEntityCategories;
		setLoading(true, list);
		setLoading(true, _selCategories);

		$.post(_service, { cmd: "entityCategories", type: _selEntityType.val() }, function(data) {
			setLoading(false, list);
			if (error(data)) return;
			$.each(data.categories, function(i, item) {
				var selected = _currentCat != null && _currentCat.key == item.key;
				list.append($("<option>").val(item.key).text(item.name).attr("selected", selected));
			});
			updateSubCategories(true);
		}, "json");
	}

	function updateSubCategories(continued) {
		var list = _selCategories;
		if(!continued) setLoading(true, list);
		var val = _selEntityCategories.val();

		$.post(_service, { cmd: "categories", key: val }, function(data) {
			setLoading(false, list);
			if (error(data)) return;

			$.each(data.categories, function(i, item) {
				var selected = false;
				if (_currentCat != null) {
					for (var j in _currentCat.selectedIds) {
						if (_currentCat.selectedIds[j] == item.id) selected = true;
					}
				}
				list.append($("<option>").val(item.id).text(item.name).attr("selected", selected));
			});
		}, "json");
	}

	function setLoading(loading, list) {
		list.empty();
		if (loading) {
			$("<div>").addClass("loading").html("Loading...").insertAfter(list);
			list.hide();
		} else {
			list.find("+div.loading").fadeOut(300, function() {
				$(this).remove();
				list.show();
			});
		}
	}

	function doCategory(category) {
		_currentCat = category;
		updateEntityCategories();

		if (category != null) {
		} else {
			_selEntityCategories.val(-1);
			_selCategories.val(-1);
		}

		_catDialog.dialog({
			title: category == null ? "New Category" : "Edit '" + category.name + "'",
			modal: true,
			bgiframe: true,
			resizable: false,
			close: function() { $(this).dialog("destroy"); },
			buttons: {
				"Cancel": function() { $(this).dialog("destroy"); },
				"Ok": function() { saveCategory(category); }
			}
		});
	}

	function saveCategory(category) {
		var key = _selEntityCategories.val();
		var name = _selEntityCategories.find("option:selected").text();
		var selectedIds = _selCategories.val();

		if (typeof selectedIds == "string") selectedIds = [selectedIds];

		var temp = new Category({ key: key, name: name, selectedIds: selectedIds });

		if (category == null || category.key != key) {
			for (var i in _categories) {
				if (_categories[i].key == key) {
					showAlert("The category: '" + name + "' already exists, please select another.");
					return;
				}
			}
		}

		if (selectedIds == null || selectedIds.length == 0) {
			showAlert("You must select at least one category.");
			return;
		}

		if (category == null) {
			_categories.push(temp);
		} else {
			$.extend(category, temp);
		}

		buildCategoryList();
		updateCategoriesString();
		_catDialog.dialog("destroy");
	}

	function buildCategoryList() {
		var list = _categoryList.empty();

		$.each(_categories, function(i, item) {
			var selectedCount = item.selectedIds.length;
			var edit = $("<a href='javascript:;'><strong>" + item.name + "</strong> (" + selectedCount + ")</a>").click(function() {
				doCategory(item);
			});

			var remove = $("<a href='javascript:;'>X</a>").addClass("remove").click(function() {
				$.each(_categories, function(i, itemj) {
					if (item.key == itemj.key) {
						_categories.splice(i, 1);
						updateCategoriesString()
						return;
					}
				});
				buildCategoryList();
			});

			list.append($("<li>").append(edit).append(remove));
		});

		if (_categories.length == 0) {
			list.append("<li><strong>No categories</strong></li>");
		}
	}

	function error(data) {
		if (data.error != null) {
			alert(data.error);
			return true;
		}
		return false;
	}

	function showAlert(msg) {
		$("<div>").html(msg).dialog({
			title: "Alert",
			modal: true,
			bgiframe: true,
			resizable: false,
			buttons: {
				"Ok": function() { $(this).dialog("destroy"); }
			}
		});
	}

	function updateCategoriesString() {
		var val = "[";
		for (var i in _categories) {
			if (i > 0) val += ",";
			val += _categories[i].toString();
		}
		val += "]";
		_hiddenCategories.val(val);
	}

	function parseCategories(cats) {
		if (cats == null) return;
		$.each(cats, function(i, item) {
			_categories.push(new Category(item));
		});
	}
}

function Category(params) {
	if (params == null) params = {};

	this.key = params.key;
	this.name = params.name;
	this.id = params.id;
	this.selectedIds = params.selectedIds == null ? new Array() : params.selectedIds;

	this.toString = function() {
		var args = ["key", "name", "selectedIds"];

		var stringVal = "{";
		for (var i in args) {
			if (i > 0) stringVal += ",";
			var key = args[i];
			var val = this[key];

			stringVal += key + ":" + toJSON(val);
		}
		stringVal += "}";

		return stringVal;
	}

	function toJSON(val) {
		if (val == null) val = "";
		if (val.constructor == Array) {
			var temp = "[";
			for (var j in val) {
				if (j > 0) temp += ",";
				temp += toJSON(val[j]);
			}
			val = temp + "]";
		} else if (!isNaN(val)) {
			
		} else {
			val = "\"" + val + "\"";
		}

		return val;
	}
}