function Tag(name, id, label, properties, otherData, tagsRef) {
	try {
		var container = document.createElement('a');
		var span1 = document.createElement('span');
		var span2 = document.createElement('span');
		var span3 = document.createElement('span');
		var span4 = document.createElement('span');
		var nameDiv = document.createElement('div');
		var nameInput = document.createElement('input');
		var closeDiv = document.createElement('div');
		var self = this;
		
		if (properties) {

			if (typeof(properties) != 'string') {
				for (var i in properties) {
					nameDiv[i] = properties[i];
				}
			}
		}
		nameDiv.innerHTML = label;
		nameDiv.className += ' name';

		nameInput.type = 'hidden';
		nameInput.value = id;
		nameInput.name = name;
		
		closeDiv.innerHTML = 'x';
		closeDiv.className = 'close';
		closeDiv.onclick = function(){
			self.destroy()
		};

		clearBoth = document.createElement('div');
		clearBoth.style.fontSize = '0px';
		clearBoth.setAttribute('clear', 'both');

		container.className = 'tag';
		container.setAttribute('href', '#');
		container.setAttribute('tabindex', '-1');

		span4.appendChild(nameInput);
		span4.appendChild(nameDiv);
		span4.appendChild(closeDiv);
		span4.appendChild(clearBoth);
		
		span3.appendChild(span4);
		span2.appendChild(span3);
		span1.appendChild(span2);
		
		container.onclick = function(event){
			noBubble(event);
			if (!self._disableSelect)
				self.select();
			return false;
		}
		container.appendChild(span1);
		
		if (tagsRef)
			this.tagsRef = tagsRef;
		this.id = id;
		this.name = name;
		this.label = label;
		this.closeDiv = closeDiv;
		this.container = container;
		this.selected = false;
		this.otherData = otherData;
		this.nameInput = nameInput;
		return this;
	} 
	catch (e) {
		alert('Tag error: ' + e.message);
	}
}

Tag.prototype = {
	id: null,
	name: null,
	label: null,
	container: null,
	closeDiv: null,
	selected: null,
	nameInput: null,
	otherData: null,
	tagsRef: null,

	checkBox: function(selectedFunction, notSelectedFunction) {
		var self = this;
		this.checkBoxHelper();
		this.disableClose();
		self.container.onclick = function(event) {
			noBubble(event);
			if (self.selected) {
				self.deselect();
				self.checkBoxHelper();
				if (typeof(notSelectedFunction) == 'function')
					notSelectedFunction();
			}
			else {
				self.select();
				self.checkBoxHelper();
				if (typeof(selectedFunction) == 'function')
					selectedFunction();
			}
			return false;
		};
	},
	
	checkBoxHelper: function() {
		if (this.name.indexOf('[]') == -1) {
			if (this.selected)
				this.nameInput.value = this.id;
			else this.nameInput.value = '';
		}
		else {
			if (this.selected)
				this.nameInput.name = this.name;
			else this.nameInput.name = null;
		}
	},

	getContainer: function(){
		return this.container;
	},
	
	onclick: function(funcName) {
		if (typeof(funcName) == 'function') {
			var self = this;
			this.container.onclick = function(event){
				noBubble(event);
				if (!self._disableSelect)
					self.select();
				funcName(self.id, self.label, self);
				return false;
			}
		}
	},
	
	disableSelect: function() {
		this._disableSelect = true;
	},
	
	select: function() {
		this.selected = true;
		this.addClassName(this.container, 'tagSelected');
		if (this.tagsRef)
			this.tagsRef.tagSelected(this);
	},
	
	deselect: function() {
		this.selected = false;
		this.removeClassName(this.container, 'tagSelected');
	},
	
	destroy: function(){
		this.container.parentNode.removeChild(this.container);
		if (this.tagsRef)
			this.tagsRef.tagRemoved(this);
	},
	
	disableClose: function() {
		this.closeDiv.style.display = 'none';
	},
	
	addClassName: function(elt, className) {
		if (typeof elt == 'string')
			var elt = document.getElementById(elt);
		if (elt.className.indexOf(className) > -1)
			return;
		else elt.className += ' ' + className;
	},

	removeClassName: function (elt, className) {
		if (typeof elt == 'string')
			var elt = document.getElementById(elt);
		if (elt.className.indexOf(className) > -1) {
			var classes = elt.className.split(' ');
			var tmp = '';
			for (var i = 0; i < classes.length; i++) {
				if (classes[i] != className) {
					tmp += classes[i];
					if (i + 1 < classes.length) tmp += ' ';
				}
			}
			elt.className = tmp;
		}
	}
};