selectController = function(container, className, options)
{
	var me = this;
	
	me.container = $(container);
	me.options = options;
	me.className = className;
	me.elements = {};
	me.selected = {};
	me.selectedCount = 0;
	me.lastSelected = null;
	
	
	me.unselectAll = function()
	{
		me.selected = {};

		me.elements.each(function(element)
		{
			element.removeClassName('selected');
		});
		
		me.selectedCount = 0;
		me.selectionChanged();		
	}
	
	me.getSelection = function()
	{
		return me.selected;
	}
	
	me.selectionChanged = function()
	{
		var out = '';
/*		for(i in me.selected)
		{			
			var offset = me.selected[i].positionedOffset();
		
			out += i+' ('+offset.top+' '+offset.left+') -- ';
		}
		
		
		debug(out);
	*/	
		if(me.options.onChange)
		{
			me.options.onChange();		
		}
	}
	
	me.setLastSelected = function(element)
	{
		me.elements.each(function(element){element.removeClassName('lastSelected');});
		element.addClassName('lastSelected');
		me.lastSelected = element;
	}
	
	me.toggleSelect = function(element)
	{
		if(me.isSelected(element)) 
		{
			me.unselect(element);
		}
		else
		{
			me.select(element);
		}
		
		me.setLastSelected(element);
		
		
	}
	
	me.isSelected = function(element)
	{
		return me.selected[element.identify()] || element.hasClassName('selected');
	}
	
	me.unselect = function(element)
	{
		delete me.selected[element.identify()];
		me.selectedCount--;
		element.removeClassName('selected');	
		
		//me.selectionChanged();
	}
	
	me.select = function(element)
	{
	
		me.selected[element.identify()] = element;
		element.addClassName('selected');
		element.focus();
		me.selectedCount++;
		me.selectionChanged();
	}
	
	me.selectOne = function(element)
	{
		me.unselectAll();
		me.selectedCount = 1;
		me.select(element);
		me.setLastSelected(element);
	}
	
	me.init = function()
	{
	
		me.elements = $(me.container).select("."+me.className);
		
		
		me.elements.each(function(element)
		{
			element.select('a').each(function(a)
			{
				a.observe('dblclick', function()
				{
					document.location.assign(a.href);
					
				});
			});
			
		
			//alert(element.identify());
			element.observe("click", function(event)
			{
//				debug(element.identify());
			
				if(event.ctrlKey)
				{
					me.toggleSelect(element);		
					return preventDefaultEvent(event);
				}
				else if(event.shiftKey)
				{
					if(me.lastSelected)
					{
					
					
						var lastSelIndex = me.elements.indexOf(me.lastSelected);
						var clickedIndex = me.elements.indexOf(element);
						
						//alert([lastSelIndex, clickedIndex]);	
						
						if(lastSelIndex < clickedIndex)
						{
							for(var i=lastSelIndex+1; i < clickedIndex; i++)
							{
								me.select(me.elements[i]);
							}
						}
						else if(lastSelIndex > clickedIndex)
						{
							for(var i=lastSelIndex-1; i > clickedIndex; i--)
							{
								me.select(me.elements[i]);
							}							
						}
						me.select(element);
						me.setLastSelected(element);
					}
					else
					{
						me.selectOne(element);
					}
				}
				else if(!me.options.onlyControlClicks)
				{
					me.selectOne(element);
					
					return preventDefaultEvent(event);
				}
				
				return true;
			});
		});
		
		$(me.container).observe('click', function(event)
		{
			var ancestors = event.element().ancestors();
			
			for(i in ancestors)
			{
				if(!ancestors[i] || !ancestors[i].hasClassName)
				{
					break;
				}
				
				if(ancestors[i].hasClassName(me.className))
				{
					return true;
				}
			}
			
			me.unselectAll();	
			me.elements.each(function(element){element.removeClassName('lastSelected');});
			me.lastSelected = null;
				
			return false;
		});

		$(document.body).observe('keyup', function(event)
		{	
		
			if(event.keyCode == Event.KEY_ESC)
			{
				me.unselectAll();
			}
			
			/*if(me.lastSelected)
			{
				var near = getNearElements(me.elements, me.lastSelected);
				var newElement = false;
				
				if(event.keyCode == Event.KEY_DOWN)
				{
					if(near.down) newElement = near.down;
				}
				else if(event.keyCode == Event.KEY_UP)
				{
					if(near.up) newElement = near.up;
				}
				else if(event.keyCode == Event.KEY_LEFT)
				{
					if(near.left)
					{
						newElement = near.left;
					}
					else
					{
						newElement = me.lastSelected.previous();
					}
				}
				else if(event.keyCode == Event.KEY_RIGHT)
				{
					if(near.right)
					{
						newElement = near.right;
					}
					else
					{
						newElement = me.lastSelected.next();					
					}
				}
				
				if(newElement)
				{
					me.selectOne(newElement);
				}
			}
			else
			{
				me.selectOne(me.elements.first());
			}*/
			
			preventDefaultEvent(event);
		});
	}
	
	me.init();
}


selectionCommandBinder = function(select)
{
	var me = this;
	
	me.select = select;
	
	me.bindings = {};
	
	me.bindKey = function(code, callback)
	{
		me.bindings[code] = callback;
	}
	
	me.onKeyUp = function(event)
	{
		if(me.bindings[event.keyCode])
		{
			for(i in me.select.selected)
			{
				var element = select.selected[i];
				
				me.bindings[event.keyCode](element);
			}
		}
	}
	
	$(document.body).observe('keyup', me.onKeyUp);

	
}




function initFolderSelection()
{
	Sortable.create('folderObjects', 
	{
		constraint: false, 
		tag: 'div', 
		scroll: window,
		
		onChange: function(element)
		{
			if(element)
			{
				currentlyMoving = element;
			}
			
			element.select('a').each(function(link)
			{
				link.observe('click', preventDefaultEvent);
				link.observe('mouseup', preventDefaultEvent);
			}); 
			
		},
		
		
		
		onUpdate: function(container)
		{
			
			if(currentlyMoving)
			{
				var elementName = currentlyMoving.object.id;
				var elementIndex = container.childElements().indexOf(currentlyMoving);
				
				var url = document.location+'reorder';
				
				new Ajax.Request(url, 
				{
					parameters: {nolayout: 1, name: elementName, index: elementIndex},
					method: 'post',
				});
	
				currentlyMoving.select('a').each(function(link)
				{
					link.stopObserving('click', preventDefaultEvent);
					link.stopObserving('mouseup', preventDefaultEvent);
				}); 
				
			
			}
			
			
			
			return true;
		}
	
	});
	
	
	
	document.select = new selectController('folderObjects', 'previewBlock', 
	{
//		onlyControlClicks: true, 
		onChange: function()
		{

		},
	});
}



