var PageList = Class.create();

PageList.lists = [];

PageList.create = function(container, tagName, onSelect) {
	var list = new PageList(container, tagName, onSelect);
	return list;
}

PageList.prototype = {
	initialize: function(container, tagName, onSelect) {
		var self = this;
		this.container = $(container);
		this.tagName = tagName;
		this.onSelect = onSelect || Prototype.emptyFunction;
		this.selectedItems = new Array();
		this.container.onselectstart = function() { return false; };
		this.container.onclick = this.clearSelection.bind(this);
		this.items = $A(this.container.getElementsByTagName(this.tagName));
		this.items.each( function(item) {
			item.onclick = self.itemClicked.bindAsEventListener(self);
		} );
	},
	
	clearSelection: function(){
		this.items.each( function(item) { item.removeClassName('selected'); } );
		this.onSelect([]);
	},
	
	itemClicked: function(event) {
		Event.stop(event); // keep container.onclick from firing an event!
		var item = Event.findElement(event, this.tagName);
		var self = this;
		
		if (!item) {
			return;
		}
		
		item.blur();
		
		if (event.shiftKey) {
			firstSelection = -1;
			lastSelection = -1;
			
			this.items.each( function(loopItem) {
				if (item == loopItem) {
					loopItem.addClassName('selected');
				};
				
				if (loopItem.hasClassName('selected')) {
					lastSelection = self.items.indexOf(loopItem);
					if (firstSelection < 0) { 
						firstSelection = lastSelection;
					}
				}
			} );
			
			for (var i = firstSelection; i <= lastSelection; i++) {
				this.items[i].addClassName('selected');
			}
			
		} else if (!event.metaKey && !event.ctrlKey) {
			this.items.each( function(loopItem) { loopItem.removeClassName('selected'); } );
			item.addClassName('selected');
		} else {
			if (item.hasClassName('selected')) {
				item.removeClassName('selected');
			} else {
				item.addClassName('selected');
			}
		}
		
		this.selectedItems = [];
		this.items.each( function(loopItem) { 
			if (loopItem.hasClassName('selected')) {
				self.selectedItems.push(loopItem.rel);
			}
		} );
		
		this.onSelect(this.selectedItems);
		
		return false;
	}
}
