/** 
 * @fileoverview This file is to be used for com.joyistar.ui.Panel class of AJAX Dev Library
 * @author 
 * @version 1.0 
 */
$package("js.ui.list");

js.ui.list.AbstractListBox = function (){
	this.renderers = new js.lang.Array();
}

js.ui.list.AbstractListBox.prototype = new js.ui.Container();

js.ui.list.AbstractListBox.prototype.getNativeClass = function (){
	return "js.ui.list.AbstractListBox";
}

js.ui.list.AbstractListBox.prototype.getModel = function(){
	if(!this.dataModel){
		this.dataModel = new js.ui.list.AbstractListModel();
		this.dataModel.setMultiSelected(this.multiSelected);
	}
	return this.dataModel; 
}
js.ui.list.AbstractListBox.prototype.bindUI = function (){
	var __this = this;
	this.ui.onkeydown = js.ui.list.AbstractListBox.__onkeydown;
	this.container = this.ui.getElementsByTagName("table")[0];
/*	this.ui.onclick = this.ui.oncontextmenu = function(){
		__this.clearSelection();
	}*/
	return this.ui;
}

js.ui.list.AbstractListBox.prototype.addItem = function(item){
	this.getModel().addElement(item);
	var table = this.getContainer();
	var row = table.insertRow(-1);
	var cell = row.insertCell(-1);
	var renderer = this.createCellRenderer();
	renderer.setValue(item);
	cell.renderer = renderer;
	cell.appendChild(renderer.getUI());
}

js.ui.list.AbstractListBox.prototype.getCellRenderer = function(idx){
	return this.renderers[idx];
}

js.ui.list.AbstractListBox.prototype.createCellRenderer = function(){
	if(!this.renderClass) this.renderClass = js.ui.list.AbstractListItemRenderer;
	var renderer = new this.renderClass(this);
	return renderer;
}

js.ui.list.AbstractListBox.prototype.multiSelected = false;

js.ui.list.AbstractListBox.prototype.clearSelection = function(){
	var sel = this.getSelectedIndex();
	this.getModel().clearSelection();
	if(sel>=0)
	for(var i=0; i<this.getModel().size(); i++){
		var renderer = this.getCellRenderer(i);
		if(renderer)
			renderer.paintSelect(false);
	}
}

js.ui.list.AbstractListBox.prototype.selectAll = function(){
	this.getModel().selectAll();
	for(var i=0; i<this.getModel().size(); i++){
		var renderer = this.getCellRenderer(i);
		if(renderer)
			renderer.paintSelect(true);
	}
}

js.ui.list.AbstractListBox.prototype.setSelected= function(idx, value){
	if(!this.multiSelected && value){
		var oldSelectedIndex = this.getSelectedIndex();
		if(oldSelectedIndex==idx)
			return;
		if (oldSelectedIndex>=0)
			this.clearSelection();
	}
	this.getModel().setSelected(idx, value);
	var renderer = this.getCellRenderer(idx);
	if(renderer)
		renderer.paintSelect();
}

js.ui.list.AbstractListBox.prototype.getSelectedIndex = function(){
	return this.getModel().getSelectedIndex();
}


js.ui.list.AbstractListBox.prototype.setSelectedValue = function(anObject, value){
	var idx = this.getModel().indexOf(anObject);
	this.setSelected(idx, value);
}

js.ui.list.AbstractListBox.prototype.isSelectedItem = function(item){
	return this.getModel().isSelectedItem(item);
}
js.ui.list.AbstractListBox.prototype.activeIndex = -1;

js.ui.list.AbstractListBox.prototype.size = function(){
	return this.getModel().size();
}

js.ui.list.AbstractListBox.prototype.getSelectedIndices = function(){
	return this.getModel().getSelectedIndices();
}

js.ui.list.AbstractListBox.prototype.getSelectedValues = function(){
	return this.getModel().getSelectedValues();
}

js.ui.list.AbstractListBox.__onkeydown = function(event){
	var __this = this.owner;
	if(!event) event = window.event;
	var keycode = event.keyCode ? event.keyCode : event.which;
	switch(keycode){
		case 39://right
		case 40://down
			if(__this.activeIndex<__this.size()-1){
				if(!event.shiftKey){
					__this.clearSelection();
					__this.setSelected(__this.activeIndex+1, true);
				}
				else{
					var idxs = __this.getSelectedIndices();
					var min_idx = idxs[0];
					var max_idx = idxs[idxs.length-1];
					if(__this.activeIndex<max_idx)
						__this.setSelected(__this.activeIndex, false);
					else
						__this.setSelected(__this.activeIndex+1, true);
				}
				__this.activeIndex++;
			}
			break;
		case 37://left
		case 38://top
			if(__this.activeIndex>0){
				if(!event.shiftKey){
					__this.clearSelection();
					__this.setSelected(__this.activeIndex-1, true);
				}
				else{
					var idxs = __this.getSelectedIndices();
					var min_idx = idxs[0];
					var max_idx = idxs[idxs.length-1];
					if(__this.activeIndex<=min_idx)
						__this.setSelected(__this.activeIndex-1, true);
					else
						__this.setSelected(__this.activeIndex, false);
				}
				__this.activeIndex--;

			}
			break;
		case 13://enter
				if(__this.onclickItem) __this.onclickItem(__this.activeIndex);
	}
}

js.ui.list.AbstractListBox.prototype.clear = function(){
	this.getModel().clear();
	this.renderers.clear();
	var e;var tb = this.getContainer();
	while(e=tb.firstChild)tb.removeChild(e);
}
