//
// Author:	Martijn Polak <martijn.polak@amgate.com>
// Description: Javascript functions for the dropdown combobox control
//

// -- Init -------------------------------------------------------------------------------------------------------------------------------------

var openList;

// -- Dropdown combo ---------------------------------------------------------------------------------------------------------------------------

// Handles keydowns in the dropdown list
function listHandler(listname, interactive) {
var code = 0;
var jcount = 1;
var jindex = 0;

	if (navigator.appName == "Netscape") {
		code = event.which;
	} else {
		code = event.keyCode;
	}

	var new_sel;
	var old_sel = document.getElementById('listitem_' + listname + selectedItems[listname]);
	if (!old_sel) old_sel = document.getElementById('list_' + listname).firstChild;

	// Enter
	if (code == 13) {

		closeSelect(openList);

	// Escape
	} else if (code == 27) {

		// Should reset to original value
		closeSelect(openList);

	// Down
	} else if (code == 40) {

		if (old_sel) {
			new_sel = old_sel.nextSibling;
			if (new_sel) {
				listItemSelected(listname, new_sel, false, interactive);
				if (interactive) new_sel.scrollIntoView();
			}

		}

		return false;

	// Up
	} else if (code == 38) {

		if (old_sel) {
			new_sel = old_sel.previousSibling;
			if (new_sel) {
				listItemSelected(listname, new_sel, false, interactive);
				if (interactive) new_sel.scrollIntoView();
			}
		}

		return false;

	// pgUp
	} else if (code == 33) {

		if (old_sel) {

			jcount = Math.floor(old_sel.parentElement.offsetHeight / old_sel.offsetHeight);
			new_sel = old_sel;

			for (jindex = 0; jindex < jcount && new_sel; jindex++) {
				new_sel = new_sel.previousSibling;
			}

			if (!new_sel) new_sel = old_sel.parentElement.firstChild;

			if (new_sel) {
				listItemSelected(listname, new_sel, false, interactive);
				if (interactive) new_sel.scrollIntoView();
			}
		}

		return false;

	// pgDown
	} else if (code == 34) {

		if (old_sel) {

			jcount = Math.floor(old_sel.parentElement.offsetHeight / old_sel.offsetHeight);
			new_sel = old_sel;

			for (jindex = 0; jindex < jcount && new_sel; jindex++) {
				new_sel = new_sel.nextSibling;
			}

			if (!new_sel) new_sel = old_sel.parentElement.lastChild;

			if (new_sel) {
				listItemSelected(listname, new_sel, false, interactive);
				if (interactive) new_sel.scrollIntoView();
			}
		}

		return false;

	// Home
	} else if (code == 36) {

		if (old_sel) {

			new_sel = old_sel.parentElement.firstChild;
			if (new_sel) {
				listItemSelected(listname, new_sel, false, interactive);
				if (interactive) new_sel.scrollIntoView();
			}
		}

		return false;

	// End
	} else if (code == 35) {

		if (old_sel) {

			new_sel = old_sel.parentElement.lastChild;
			if (new_sel) {
				listItemSelected(listname, new_sel, false, interactive);
				if (interactive) new_sel.scrollIntoView();
			}
		}

		return false;

	}

	return true;

}

// Handles selecting listitems on arrow keys
function listSelectHandler(listname) {
var code = 0;
var retVal = true;

	if (navigator.appName == "Netscape") {
		code = event.which;
	} else {
		code = event.keyCode;
	}

	// Note: offsetHeight == 0 for hidden elements. therefore the pageup/down
	// amount cannot be calculated. Will look into it. [pgup=33, pgdown=34].
	if (code == 38 || code == 40) {
		retVal = listHandler(listname);
		document.getElementById('input_'+listname).select();
	}

	return retVal;

}

// Handles keydowns in comboboxes
function autoSelectHandler(listname) {
var code = 0;
var gotit = false;
var il = document.getElementById('list_' + listname);
var dvalue = document.getElementById('input_' + listname);
var tvalue;
var dlength = 0;

	if (navigator.appName == "Netscape") {
		code = event.which;
	} else {
		code = event.keyCode;
	}

	if (code == 32 || (code >= 41 && code <= 45) || (code >= 47 && code <= 254)) {

		if (il && dvalue && !useMac) {

			tmpChild = il.firstChild;

			for (;tmpChild;) {

				tvalue = removeAllHTML(tmpChild.innerHTML);

				if (tvalue.toLowerCase().indexOf(dvalue.value.toLowerCase()) == 0) {

					dlength = dvalue.value.length;
					dvalue.value = tvalue.substr(0, dvalue.value.length)
					dvalue.value += tvalue.substr(dvalue.value.length);

					if (dvalue.createTextRange()) {
						var rng = dvalue.createTextRange();
						rng.moveStart('character', dlength);
						rng.select();
					}

					listItemSelected(listname, tmpChild, true);
					gotit = true;
					break;

				}

				tmpChild = tmpChild.nextSibling;

			}

		}

	} else if (code == 40 || code == 34) {

		gotit = true;

	}

	if (!gotit && dvalue) document.getElementById(listname).value = dvalue.value;
	return true;

}

// Listitem selection handling for the manual combo box
function listItemOver(id) {

	var itm = document.getElementById('listitem_'+id);
	if (itm) itm.className = ((itm.className == 'ctrl_cmb_listitem_selected' || itm.className == 'ctrl_cmb_listitem_selected_over') ? 'ctrl_cmb_listitem_selected_over' : 'ctrl_cmb_listitem_over');

}

function listItemOut(id) {

	var itm = document.getElementById('listitem_'+id);
	if (itm) itm.className = ((itm.className == 'ctrl_cmb_listitem_selected_over' || itm.className == 'ctrl_cmb_listitem_selected') ? 'ctrl_cmb_listitem_selected' : 'ctrl_cmb_listitem');

}

function listItemSelected(listname, itemobj, selectonly, interactive) {

	var inp_value = document.getElementById(listname);
	var inp_text = document.getElementById('input_' + listname);
	var itemobj_value = document.getElementById(itemobj.id + '_value');
	var itemobj_text = document.getElementById(itemobj.id + '_text');

	var old_sel = document.getElementById('listitem_' + listname + selectedItems[listname]);
	selectedItems[listname] = itemobj_value.value;
	var new_sel = document.getElementById('listitem_' + listname + selectedItems[listname]);

	if (inp_value) {

		inp_value.value = itemobj_value.value;

		/* note: this should really be done at the bottom of this function, otherwise an onchange even can never properly select another listitem by using this function! */
		if (!selectonly && inp_text.onchange) inp_text.onchange();

	}

	if (!selectonly && inp_text && itemobj_text) {
		//inp_text.value = removeAllHTML(itemobj.innerHTML);
		inp_text.value = removeAllHTML(itemobj_text.value);
	}

	if (old_sel) old_sel.className = 'ctrl_cmb_listitem';
	if (new_sel) new_sel.className = 'ctrl_cmb_listitem_selected';

	if (!interactive) closeSelect(openList);

}

// Dropdown list
function openSelect(selectID, parentObject) {

	var openListId = (openList ? openList.id : -1);
	closeSelect(openList);

	var il = document.getElementById('list_' + selectID);
	var cmb = document.getElementById('combo_' + selectID);
	var topOffset = 0;
	var widthOffset = 0;

	if (il) {

		if (openListId == il.id) return;

		/*if (useMac) {

			il.style.left = (parentObject.offsetLeft + 2) + 'px';
			il.style.top = (parentObject.offsetTop + 2) + 'px';

		} else {

			if (cmb && cmb.currentStyle) {
				topOffset = Number(String(cmb.currentStyle.borderBottomWidth).replace(/px/, ''));
				widthOffset = Number(String(cmb.currentStyle.borderLeftWidth).replace(/px/, '')) + Number(String(cmb.currentStyle.borderRightWidth).replace(/px/, ''));
			}

			var totalOffset = new totalElementOffset(parentObject);
			il.style.left = totalOffset.x + 'px';
			il.style.top = (totalOffset.y + parentObject.offsetHeight + topOffset) + 'px';

		}*/

		il.style.display = '';

		// Must be stored in a variable (after the display property gets set) or IE will think it's 0
		var parentWidth = parentObject.offsetWidth;

		if (!useMac) {

			// Minimum width is the control's width, if smaller resize
			if (il.offsetWidth < parentWidth) {
				il.style.width = (parentWidth + widthOffset) + 'px';
				il.firstChild.style.width = '100%';
			}

		}

		openList = il;

	}

}

function closeSelect(selectID) {
	if (selectID) selectID.style.display = "none";
	openList = null;
}
