﻿function EntityBrowseAdmin(params) {

	var _browseCatDialog = params.browseCatDialog;
	var _selEntityTypeCategories = _browseCatDialog.find("select:eq(0)");
	var _subCategories = _browseCatDialog.find("select:eq(1)");
	var _deep = _browseCatDialog.find("input:checkbox");

	var _selEntityType = params.selEntityType;
	var _hiddenBrowseCategories = params.hiddenBrowseCategories;
	var _browseCatUl = params.browseCatUl;
	var _newLink = params.newLink;

	var browseCategories = new Array();
	var currentCat = null;
	var service = params.service;
	
	init();

	function init() {
		_selEntityTypeCategories.change(updateSubCategories);
		_newLink.click(function() { doBrowseCategory(); });

		parseBrowseCategoriesString();
		buildBrowseCategoryList();
	}

	function updateEntityTypeCategories() {
		var list = _selEntityTypeCategories;
		setLoading(true, list);

		$.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();
		}, "json");
	}

	function updateSubCategories() {
		var list = _subCategories;
		setLoading(true, list);

		var val = _selEntityTypeCategories.val();

		$.post(service, { cmd: "categories", key: val }, function(data) {
			setLoading(false, list);
			if (error(data)) return;

			list.append("<option value='-1'>");
			$.each(data.categories, function(i, item) {
				var selected = currentCat != null && currentCat.startFrom == item.name;
				list.append($("<option>").val(item.name).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 doBrowseCategory(category) {
		currentCat = category;
		updateEntityTypeCategories();

		if (category != null) {
			_deep.attr("checked", category.deep);
		} else {
			_selEntityTypeCategories.val(-1);
			_subCategories.val(-1);
			_deep.attr("checked", false);
		}

		_browseCatDialog.dialog({
			title: category == null ? "New Browse Category" : "Edit '" + category.name + "'",
			modal: true,
			bgiframe: true,
			resizable: false,
			close: function() { $(this).dialog("destroy"); },
			buttons: {
				"Cancel": function() { $(this).dialog("destroy"); },
				"Ok": function() { saveBrowseCategory(category); }
			}
		});
	}

	function saveBrowseCategory(category) {
		var key = _selEntityTypeCategories.val();
		var name = _selEntityTypeCategories.find("option:selected").text();
		var startFrom = _subCategories.val();
		var deep = _deep.attr("checked");

		var temp = new BrowseCategory({ key: key, name: name, startFrom: startFrom, deep: deep });

		if (category == null || category.key != key) {
			for (var i in browseCategories) {
				if (browseCategories[i].key == key) {
					showAlert("The browse category: '" + name + "' already exists, please select another.");
					return;
				}
			}
		}

		if (category == null) {
			browseCategories.push(temp);
		} else {
			$.extend(category, temp);
		}

		buildBrowseCategoryList();
		updateBrowseCategoriesString();
		_browseCatDialog.dialog("destroy");
	}

	function buildBrowseCategoryList() {
		var list = _browseCatUl.empty();
		
		$.each(browseCategories, function(i, item) {	
			var edit = $("<a href='javascript:;'><strong>" + item.name + "</strong></a>").click(function() {
				doBrowseCategory(item);
			});

			var remove = $("<a href='javascript:;'>X</a>").addClass("remove").click(function() {
				for (var i = 0; i < browseCategories.length; i++) {
					var itemj = browseCategories[i];
					if (item.key == itemj.key) {
						browseCategories.splice(i, 1);
						updateBrowseCategoriesString()
						i--;
					}
				}
				buildBrowseCategoryList();
			});

			list.append($("<li>").append(edit).append(remove));
		});

		if (browseCategories.length == 0) {
			list.append("<li><strong>No browse 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 updateBrowseCategoriesString() {
		var val = "";
		for (var i in browseCategories) {
			val += browseCategories[i].toString();
		}
		_hiddenBrowseCategories.val(val);
	}

	function parseBrowseCategoriesString() {
		var browseCatStr = _hiddenBrowseCategories.val();
		var reCat = /\([^\)]+\)/g;
		var matches = browseCatStr.match(reCat);
		if (matches != null) {
			for (var i = 0; i < matches.length; i++) {
				browseCategories.push(BrowseCategory.parse(matches[i].substr(1, matches[i].length - 2)));
			}
		}
	}


} 

function BrowseCategory(params) {
	if (params == null) params = {};

	this.key = params.key;
	this.name = params.name;
	this.startFrom = params.startFrom;
	this.deep = params.deep;

	this.toString = function() {
		var args = ["Key", "Alias", "StartFrom", "Deep"];
		var args2 = ["key", "name", "startFrom", "deep"];

		var stringVal = "(";
		for (var i in args) {
			if (i > 0) stringVal += ";";
			var key = args[i];
			var val = this[args2[i]];
			stringVal += args[i] + "=" + (val == null ? "" : val);
		}
		stringVal += ")";

		return stringVal;
	}
}

BrowseCategory.parse = function(val) {
	var args = ["Key", "Alias", "StartFrom", "Deep"];
	var args2 = ["key", "name", "startFrom", "deep"];

	var cat = new BrowseCategory();

	for (var i in args) {
		var match = val.match(new RegExp(args[i] + "=([^;]+)"));
		if (match != null) cat[args2[i]] = match[1];
	}

	cat.deep = cat.deep == "true" ? true : false;
	if (cat.name == null) cat.name = cat.key;
	return cat;
}