var Selection = Class.create();

Selection.prototype = {
  initialize: function(options) {
		this.data = new Array();
    this.setOptions(options);
  },
	
  setOptions: function(options) {
    this.options = {
      backgroundColor:  '#6699ff',
      color:            '#fff',
      prefix:           'a_',
      className:        'selected',
			addMode:          'new'
    }
    
    Object.extend(this.options, options || {});
  },

	add: function(e, selectionData) {
		//alert(selectedNodeId + "_" + uri + "(" + application.uri + "_" + application.subUri + ")")
		if (this.options.addMode == 'new') {
			if (e) {
				if (!e.ctrlKey) {
					this.clear();
				}
			}
		}
			
		if (selectionData != null)	{
			if (selectionData.element == null) {
				selectionData.element = this.options.prefix + selectionData.nodeId + "_" + selectionData.uri
			}
			this.data.push(selectionData);
			this.refreshClassName();
		}
		
	},
	
	pop: function() {
		var data = this.data.pop();
		
		var selectedElement;
		if (data.element) { 
			selectedElement = $(data.element);
			if (selectedElement) {
				selectedElement.className = this.removeFromClassname(selectedElement.className, this.options.className);
			}
		}
	},

	getElement: function(index) {
		return $(this.data[index].element);
	},

	elementExists: function(uri, nodeId) {
		return $(this.options.prefix + nodeId + "_" + uri);
	},

	selectionData: function() {
		return ((this.data.length > 0)? this.data[this.data.length-1]: null);
	},
	
	clear: function() {
		var selectedElement;
		for (var i = 0; i < this.data.length; i++) {
			selectedElement = this.getElement(i);
			if (selectedElement != null)
			{
				selectedElement.className = this.removeFromClassname(selectedElement.className, this.options.className);
			}
		}
		
		this.data.length = 0;
	},
	
	removeFromClassname: function(className, toBeRemoved ){
		if (className.indexOf(toBeRemoved) != -1)
		{
			className = className.substring(0, className.indexOf(toBeRemoved));
		}
		return className;
	},
	
	refreshClassName: function(){
		var selectedElement = this.getElement(this.data.length-1);
		if (selectedElement != null) {
	    var separator = (selectedElement.className != '')? ' ': '';
			selectedElement.className = selectedElement.className + separator + this.options.className;
		}
	},
	
	reset: function() {
		this.clear()
		this.options.addMode = 'new';
	},

	length: function() {
		return this.data.length;
	},

	toRequest: function() {
		var s = "";
		for (var i = 0; i < this.data.length; i++) { // items === nodes ?
			s += "&uri=" + escape(this.data[i].uri);
			s += "&selectedNodeId=" + escape(this.data[i].nodeId);
		}
		
		return s;
	}
};

