Lisi.CoreUtils = function() {
	var instance = this;
	this.init = function() {		
		AUI().use(
			'node',
			function(A) {
				instance.AUI = A;
			}
		)
	},
	this.inArray = function(val, array) {
		for (var i = 0; i < array.length; i++) {
			if (val.toLowerCase() == array[i].toLowerCase()) {
				return true;
			}
		}
		return false;
	},
	this.checkValue = function(val, obj) {
		if (obj.value == val) {
			obj.value = "";
		}
	}, 
	this.checkOutValue = function(val, obj) {
		if (obj.value.match(/^\s*$/)) {
			obj.value = val;
		}
	}
	/* 
	* Tagging 
	*/
	this.tagging = function(options) {		
		if (typeof instance.AUI == "undefined") {
			AUI().use(
				'node',
				function(A) {
					instance.AUI = A;
					instance.taggingIntern(options);
				}
			)
		} else {
			instance.taggingIntern(options);
		}
	},	
	this.taggingIntern = function(options) {
		var form = options.form;
		var addButton = options.addButton;
		var tagsSummary = options.tagsSummary;
		var tagsEntries = options.tagsEntries;
		var tagsInput = options.tagsInput;

		instance.addButton = instance.AUI.one("#" + addButton);
		instance.tagsSummary = instance.AUI.one("#" + tagsSummary);
		instance.tagsInput = instance.AUI.one("#" + tagsInput);
		instance.tagsEntries = instance.AUI.one("#" + tagsEntries);
		instance.addedTags = instance.tagsEntries.get('value') != '' ? instance.tagsEntries.get('value').split(",") : [];
		instance.addButton.on('click',
			function() {
				var newTags = instance.tagsInput.get('value').split(',');
				for (var i = 0; i < newTags.length; i++) {
					var tag = instance.AUI.Lang.trim(newTags[i]);
					if (tag != '') {
						if (!instance.inArray(tag, instance.addedTags)) {
							tag = tag.split(" ").join("");
							instance.addedTags.push(tag);
						}
					}
				}
				instance.updateTags();				
			}
		);
		instance.updateTags();
	},
	this.updateTags = function() {		
		
		instance.tagsSummary.set("innerHTML", "");
		instance.AUI.Array.each(instance.addedTags, function(value, index, array) {
			var tagSpan = instance.tagsSummary.create("<span class='lisi-tag'>" + value + "</span>");
			var tagAnchor = tagSpan.create("<a class='lisi-tag-delete' href='javascript: void(0);'></a>");
			var tagClose = tagAnchor.create("<span class='close'></span>");
			tagAnchor.appendChild(tagClose);
			tagSpan.appendChild(tagAnchor);			
			tagAnchor.on('click',
				function() {
					instance.deleteTag(index);	
				}
			);			
			
			instance.tagsSummary.appendChild(tagSpan);

		});
		instance.tagsEntries.set('value', instance.addedTags);
		instance.tagsInput.set('value', '');
	}
	this.deleteTag = function(index) {
		instance.addedTags.splice(index, 1);
		instance.updateTags();
	},
	/* 
	* Switcher
	*/
	this.switcher = function(options) {		
		if (typeof instance.AUI == "undefined") {
			AUI().use(
				'node',
				function(A) {
					instance.AUI = A;
					instance.switcherIntern(options);
				}
			)
		} else {
			instance.switcherIntern(options);
		}
	},	
	this.switcherIntern = function(options) {
		var select = options.select;
		var container = options.container;
		
		instance.uncheck = options.uncheck;
		instance.select = instance.AUI.one("#" + select);
		instance.container = instance.AUI.one("#" + container);
		instance.select.on('change',
			function() {
				var valueClass = instance.select.get('value');
				if (instance.uncheck) {
					instance.container.get('children').all('input[type="checkbox"]').set("checked", false);				
				}
				instance.container.get('children').addClass('lisi-hide');				
				instance.container.all('.' + valueClass).removeClass('lisi-hide');
			}
		);
	}	
	/* 
	* Duplicater
	*/
	this.duplicator = function(options) {		
		if (typeof instance.AUI == "undefined") {
			AUI().use(
				'node',
				function(A) {
					instance.AUI = A;
					instance.duplicatorIntern(options);
				}
			)
		} else {
			instance.duplicatorIntern(options);
		}
	},
	this.duplicatorIntern = function(options) {
		instance.duplicator = {};
		instance.duplicator.form = instance.AUI.one("#" + options.form);;
		instance.duplicator.container = options.container;
		
		instance.duplicator.setNames = function(container, counter, clone) {
			container.all("input").each(function(node, index) {
				if (!node.hasClass("setted")) {
					var name = clone ? node.get("name").substring(0, node.get("name").length - 2) : node.get("name");
					node.set("name", name + "_" + counter);
					node.addClass("setted");
				}
			});			
			container.all("textarea").each(function(node, index) {
				if (!node.hasClass("setted")) {
					var name = clone ? node.get("name").substring(0, node.get("name").length - 2) : node.get("name");
					node.set("name", name + "_" + counter);
					node.addClass("setted");
				}
			});			
			container.all("select").each(function(node, index) {
				if (!node.hasClass("setted")) {
					var name = clone ? node.get("name").substring(0, node.get("name").length - 2) : node.get("name");
					node.set("name", name + "_" + counter);
					node.addClass("setted");
				}
			});
		}		
		
		for (var i = 0; i < instance.duplicator.container.length; i++) {
			instance.AUI.all("#" + instance.duplicator.container[i].id).each(function(container, index) {
				instance.duplicator.setNames(container, index, false);
				if (instance.duplicator.container[i].isContainer) {
					var size = instance.duplicator.form.create("<input type='hidden' value='" + (index + 1) + "' name='" + instance.duplicator.container[i].name + "Size' id='" + instance.duplicator.container[i].id + "Size'/>");
					instance.duplicator.form.insert(size, instance.duplicator.form.get("firstChild"));
					container.addClass("container");				
				} 			
				var navigation = container.create("<div class='duplicator-nav'></div>");
				var button = navigation.create("<a class='duplicator-button add' href='javascript:void(0)'></a>");
				navigation.appendChild(button);
				if (index > 0 && !container.hasClass("first")) {
					var buttonDelete = navigation.create("<a class='duplicator-button delete' href='javascript:void(0)'></a>");
					navigation.appendChild(buttonDelete);
				}
				container.insert(navigation, container.get('firstChild'));
			});
		}

		instance.duplicator.updateButtons = function() {
			instance.AUI.all('.duplicator-button.add').each(function(node, index) {
				node.detach("click"); 
				node.on("click", 
					function() {
						var parentNode = instance.AUI.one(this).get("parentNode").get("parentNode");
						var newNode = parentNode.cloneNode(true);
						if (parentNode.hasClass("container")) {
							var id = parentNode.get("id");
							var currentSize = parseInt(instance.AUI.one("#" + id + "Size").get("value"));
							instance.AUI.one("#" + id + "Size").set("value", currentSize + 1);
							newNode.all(".setted").each(function(node, index) {
								node.removeClass("setted");
							});
							instance.duplicator.setNames(newNode, currentSize, true);
						}						
						if (instance.AUI.one(this).get("parentNode").one('.delete') == null) {
							var navigation = newNode.one('.duplicator-nav');
							var button = navigation.create("<a class='duplicator-button delete' href='javascript:void(0)'></a>");
							navigation.appendChild(button);
						}
						parentNode.insert(newNode, "after");
						instance.duplicator.updateButtons();
					}
				);		
			});			
			instance.AUI.all('.duplicator-button.delete').each(function(node, index) {
				node.detach("click"); 
				node.on("click", 
					function() {
						var parentNode = instance.AUI.one(this).get("parentNode").get("parentNode");
						if (parentNode.hasClass("container")) {
							var id = parentNode.get("id");
							var currentSize = parseInt(instance.AUI.one("#" + id + "Size").get("value"));
							instance.AUI.one("#" + id + "Size").set("value", currentSize - 1);
						}						
						parentNode.remove();
					}
				);		
			});
		}
		instance.duplicator.updateButtons();
	}
	/* 
	* Files 
	*/
	this.files = function(options) {		
		if (typeof instance.AUI == "undefined") {
			AUI().use(
				'node',
				function(A) {
					instance.AUI = A;
					instance.filesIntern(options);
				}
			)
		} else {
			instance.filesIntern(options);
		}
	},
	this.filesIntern = function(options) {
		instance.files = {};
		instance.files.container = {};
		instance.files.containerNew = {};
		instance.files.form = instance.AUI.one("#" + options.form);
		instance.files.removeFiles = instance.files.form.create("<input type='hidden' name='removeFiles'/>");
		instance.files.form.append(instance.files.removeFiles);
		for (var a = 0; a < options.container.length; a++) {
			instance.files.container["container" + a + "-size"] = 0;
			instance.files.container["container" + a] = instance.AUI.one("#" + options.container[a]);
			if (typeof options.containerNew[a] != "undefined") {
				instance.files.containerNew["container" + a] = instance.AUI.one("#" + options.containerNew[a]);
			}
			instance.files.container["container" + a].all(".lisi-file-delete").each(function(node, index) {
				node.setAttribute("container", "container" + a);
				node.on("click", function() {
					var currentFiles = instance.files.removeFiles.get("value") != "" ? instance.files.removeFiles.get("value").split(",") : new Array();;
					currentFiles.push(node.get("rel"));
					instance.files.removeFiles.set("value", currentFiles);
					node.get("parentNode").remove();
					instance.files.container[node.getAttribute("container") + "-size"]--;
					if (instance.files.container[node.getAttribute("container") + "-size"]  == 0) {
						instance.files.container[node.getAttribute("container")].remove();
						instance.files.containerNew[node.getAttribute("container")].removeClass("lisi-hide");
					}
				});
				instance.files.container["container" + a + "-size"]++;
			});
		}
	}
	/* 
	* Load Overlay
	*/
	this.loadOverlay = function(options) {		
		if (typeof instance.AUI == "undefined") {
			AUI().use(
				'node',
				function(A) {
					instance.AUI = A;
					instance.loadOverlayIntern(options);
				}
			)
		} else {
			instance.loadOverlayIntern(options);
		}
	},
	this.loadOverlayIntern = function(options) {
		instance.overlay = {};
		instance.overlay.text = options.text;
		if (typeof options.form != "undefined") {
			instance.overlay.form = instance.AUI.one("#" + options.form);
			instance.overlay.form.on("submit", function() {
				var overlay = instance.AUI.one("body").create("<div class='load'><div class='overlay'><span class='center'>" + instance.overlay.text + "</span></div></div>");	
				instance.AUI.one("body").insert(overlay, instance.AUI.one("body").get("firstChild"));
			});
		}		
		if (typeof options.button != "undefined") {
			instance.overlay.button = instance.AUI.one("#" + options.button);
			instance.overlay.button.on("click", function() {
				var overlay = instance.AUI.one("body").create("<div class='load'><div class='overlay'><span class='center'>" + instance.overlay.text + "</span></div></div>");	
				instance.AUI.one("body").insert(overlay, instance.AUI.one("body").get("firstChild"));
				instance.overlay.form.submit();
			});
		}		
	}
	
	/* 
	* Initialization itself
	*/	
	instance.init();
}
