/*
	Comment: Script to Replace standart selects with Customizable ComboBox
	Author: Webmaster
	Date: 14/06/2006
	Version: RC1.0
*/

// MAIN OPTIONS AND SKINNING
/* DEFAULT *
var BORDER_COLOR = "#5588cc"; // color of border for options and select
var SELECT_IMG = "/img/select.gif"; // image for select button
var OPTIONS_BG = "#ffffff"; // background color of options layer
var OPTIONS_HOVER_BG = "#5588cc"; // hover background color for option
var OPTIONS_TEXT = "#000000"; // text color for option
var OPTIONS_HOVER_TEXT = "#ffffff"; // hover text color for option
var OPTIONS_SELECTED_BG = "#ddeeff"; // background color of options layer
var OPTIONS_SELECTED_HOVER_BG = "#5588cc"; // hover background color for option
var OPTIONS_SELECTED_TEXT = "#000000"; // text color for option
var OPTIONS_SELECTED_HOVER_TEXT = "#ffffff"; // hover text color for option
var OPTIONS_LIMIT = 20; // limit of options per layer
var SCROLL_UP_IMG = '/img/upsort.gif'; // image of scroll up button
var SCROLL_DOWN_IMG = '/img/downsort.gif'; // image of scroll down button
var SCROLL_SPEED = 10; // speed in msc for scrolling
var OPTIONS_HIDE_TIME = 500; // time to hide options after mouseout
*/
var DEFAULT_WIDTH = 120;
var BORDER_COLOR = "#5588cc"; // Цвет бордера для всех элементов комбобокса
var SELECT_IMG = "/img/select.gif"; // Рисунок для открытия списка опций
var OPTIONS_BG = "#ffffff"; // background color of options layer
var OPTIONS_HOVER_BG = "#5588cc"; // hover background color for option
var OPTIONS_TEXT = "#000000"; // text color for option
var OPTIONS_HOVER_TEXT = "#ffffff"; // hover text color for option
var OPTIONS_SELECTED_BG = "#ddeeff"; // background color of options layer
var OPTIONS_SELECTED_HOVER_BG = "#5588cc"; // hover background color for option
var OPTIONS_SELECTED_TEXT = "#000000"; // text color for option
var OPTIONS_SELECTED_HOVER_TEXT = "#ffffff"; // hover text color for option
var OPTIONS_LIMIT = 15; // limit of options per layer
var SCROLL_UP_IMG = '/img/upsort.gif'; // image of scroll up button
var SCROLL_DOWN_IMG = '/img/downsort.gif'; // image of scroll down button
var SCROLL_SPEED = 10; // speed in msc for scrolling
var OPTIONS_HIDE_TIME = 500; // time to hide options after mouseout


// SYSTEM VARIABLES
var selects = new Array();
var selects_ops = new Array();
var ops_timer;
var ops_interval;
var chnge = new Array();
var scroll_stop = false;
var old_ops = new Array();
var scroll_last_id = 0;
var options_visible = false;

function fn_is_new(select_id, input_id, input_name, option_selected_value, option_selected_text, input_class, input_style) {
	// Constructor of ComboBox
	this.s_id = input_id;
	this.s_name = input_name;
	this.s_value = option_selected_value;
	this.s_text = option_selected_text;
	this.s_class = input_class;
	this.s_style = input_style;
	// create options
	selects_ops[select_id] = new Array();
	if (!input_id || input_id.length == 0) {
		return;
	}
	var orig_ops = GetDiv(input_id).options;
	if (orig_ops && (typeof orig_ops) !== 'undefined') {
		for (var option_id=0; option_id < orig_ops.length; option_id++) {
			selects_ops[select_id][option_id] = new fn_is_option(option_id, orig_ops[option_id].value, orig_ops[option_id].text, ( (orig_ops[option_id].getAttribute('img')) ? orig_ops[option_id].getAttribute('img') : null ) );
		}
	}
	var result = '<table cellspacing="0" cellpadding="0" border="0">' +
				'<tr><td>' +
				'<input type="hidden" id="' + input_id + '" name="' + input_name + '" value="' + option_selected_value + '" />' +
				'<input type="text" id="' + input_id + '_face" name="' + input_name + '_face" value="' + option_selected_text + '" style="border:1px solid ' + BORDER_COLOR + ';border-right:none;height:20px;width:' + input_style + 'px;" onKeyUp="fn_is_search(event,' + select_id + ',this.value)" autocomplete="off">' +
				'</td><td>' +
				'<img name="'+ input_id+'_img" id="'+ input_id +'_img" src="' + SELECT_IMG + '" width="20" height="20" align="absmiddle" border="0" vspace="0" hspace="0" onClick="fn_is_options_show(\'' + select_id + '\')" border="0" style="cursor:hand;cursor:pointer;" />' +
				'</td></tr>' +
				'<tr><td colspan="2">' +
				fn_is_options(select_id, input_style, 0) +
				'</td></tr></table>';
	this.htm = result;
	if (GetDiv(input_id).onchange !== null && (typeof GetDiv(input_id).onchange) !== 'undefined') {
		chnge[select_id] = GetDiv(input_id).onchange;
	}
}

function fn_is_option(option_id, option_value, option_text, option_img) {
	// Constructor of each option for ComboBox
	this.o_id = option_id;
	this.o_value = option_value;
	this.o_text = option_text;
	this.o_img = option_img;
}

function fn_is_options(select_id, input_style, start_option_id) {
	// Layer with options
	var ob = selects[select_id];
	var result = '<div id="opts_' + select_id + '" style="position:absolute;display:none;visibility:hidden;border:1px solid ' + BORDER_COLOR + ';background:' + OPTIONS_BG + ';width:' + (input_style+22) + 'px;height:auto;padding:1px 1px 1px 1px;">' +
				fn_is_options_array(select_id, start_option_id) +
				'</div>';
	return(result);
}

function fn_is_options_array(select_id, start_option_id, custom_options_array) {
	// returns HTML parsed list of currently visible options
	var result = '<table cellspacing="0" cellpadding="0" width="100%">' +
					'<tr><td style="width:100%;" id="opts_' + select_id + '_scrolling" valign="top">' +
					fn_is_options_array_get(select_id, start_option_id, custom_options_array) +
					'</td>';
	if (selects_ops[select_id].length > OPTIONS_LIMIT) {
		result += '<td style="width:0pt;" valign="top"><table cellspacing="0" cellpadding="1" border="0" width="100%">' +
					'<tr style="height:auto;"><td valign="top" align="center"><img src="' + SCROLL_UP_IMG + '" onmouseover="this.style.border=\'1px solid ' + BORDER_COLOR + '\'" onmousedown="fn_is_scrollup(' + select_id + ')" onmouseup="fn_is_scroll_clearInterval(' + select_id + ')" onmouseout="this.style.border=\'none\';fn_is_scroll_clearInterval(' + select_id + ')" /></td></tr>' +
					'<tr style="height:auto;"><td valign="bottom" align="center"><img src="' + SCROLL_DOWN_IMG + '" onmouseover="this.style.border=\'1px solid ' + BORDER_COLOR + '\'" onmousedown="fn_is_scrolldown(' + select_id + ')" onmouseup="fn_is_scroll_clearInterval(' + select_id + ')" onmouseout="this.style.border=\'none\';fn_is_scroll_clearInterval(' + select_id + ')" /></td></tr>' +
					'</table></td>';
	}
	result += '</tr></table>';
	scroll_last_id = start_option_id;
	return(result);
}

function fn_is_options_array_get(select_id, start_option_id, custom_options_array) {
	var result = '<table cellspacing="0" cellpadding="1" border="0" width="100%" style="table-layout:fixed;">';
	var ar = new Array();
	
	if ((typeof custom_options_array) !== 'undefined') {
		ar = custom_options_array;
	} else {
		ar = selects_ops[select_id];
	}
	
	if (start_option_id > ((ar.length-1)-OPTIONS_LIMIT)) {
		start_option_id = ((ar.length-1)-OPTIONS_LIMIT);
	}
	
	start_option_id = (start_option_id < 0) ? 0 : start_option_id;
	
	scroll_last_id = start_option_id;
	
	for (var option_id=start_option_id; option_id<=(start_option_id + OPTIONS_LIMIT); option_id++) {
		if (option_id < ar.length) {
			var op = ar[option_id];
			if (op && op.o_text) {
				result += '<tr style="height:16px;">';
				if (selects_ops[select_id][option_id] && selects_ops[select_id][option_id].o_img)
				{
					result += '<td width="20" nowrap="nowrap"><img src="' + selects_ops[select_id][option_id].o_img + '" border="0" align="absmiddle" width="20" height="20" /></td>';
				}
				else
				{
					result += '<td width="1" nowrap="nowrap"> </td>';
				}
				if (selects[select_id] && selects[select_id].s_value && selects[select_id].s_value == op.o_value) {
					result += '<td nowrap="nowrap" bgColor="' + OPTIONS_SELECTED_BG + '" onMouseOver="this.bgColor=\'' + OPTIONS_SELECTED_HOVER_BG + '\';this.style.color=\'' + OPTIONS_SELECTED_HOVER_TEXT + '\'" onMouseOut="this.bgColor=\'' + OPTIONS_SELECTED_BG + '\';this.style.color=\'' + OPTIONS_SELECTED_TEXT + '\'" style="cursor:pointer;color:' + OPTIONS_SELECTED_TEXT + ';" onClick="fn_is_option_select(' + select_id + ',' + op.o_id + ')" style="white-space:nowrap;"><div style="overflow:hidden;" title="' + rep(op.o_text,'"','&quot;') + '">' + rep(op.o_text,'"','&quot;') + '</div></td>';
				} else {
					result += '<td nowrap="nowrap" bgColor="' + OPTIONS_BG + '" onMouseOver="this.bgColor=\'' + OPTIONS_HOVER_BG + '\';this.style.color=\'' + OPTIONS_HOVER_TEXT + '\'" onMouseOut="this.bgColor=\'' + OPTIONS_BG + '\';this.style.color=\'' + OPTIONS_TEXT + '\'" style="cursor:pointer;color:' + OPTIONS_TEXT + ';" onClick="fn_is_option_select(' + select_id + ',' + op.o_id + ')" style="white-space:nowrap;"><div style="overflow:hidden;" title="' + rep(op.o_text,'"','&quot;') + '">' + rep(op.o_text,'"','&quot;') + '</div></td>';
				}
				result += '</tr>';
			}
		} else {
			if (option_id == (ar.length-1)) {
				scroll_stop = true;
			}
			break;
		}
	}
	result += '</table>';
	
	return(result)
}

function fn_is_options_show(select_id) {
	// Show/Hide layer with list of options
	var dv = GetDiv('opts_' + select_id);
	if (dv == null) {
		return;
	}
	var sel_vis;
	var selected_idx = 0;
	
	for (var option_id=0; option_id<selects_ops[select_id].length; option_id++) {
		if (selects[select_id].s_value == selects_ops[select_id][option_id].o_value) {
			selected_idx = option_id;
		}
	}
	
	var maxlength = selects_ops[select_id].length;
	maxlength = (maxlength > OPTIONS_LIMIT) ? OPTIONS_LIMIT : maxlength;
	var res = GetPos(document.body);
	if (res) {
		var b_bottom_line = res.height;
		var b_right_line = res.width;
		
		var sel = GetPos(GetDiv(selects[select_id].s_id).parentNode);
		if (sel) {
			if ((sel.y + (maxlength * 20)) > b_bottom_line) {
				dv.style.bottom = Math.round(b_bottom_line - sel.y);
			}
			if ((sel.x + 200) > b_right_line) {
				dv.style.right = Math.round(b_right_line - sel.x);
			}
		}
	}
	
	if (dv.style.display == 'none' || dv.style.visibility == 'hidden') {
		dv.style.display = 'block';
		dv.style.visibility = 'visible';
		
		fn_is_options_hide_except(select_id);
		
		dv.innerHTML = fn_is_options_array(select_id, selected_idx);
		
		dv.onmousemove = new Function('e','fn_is_clearTimer(' + select_id + ');');
		dv.onmouseout = new Function('e','fn_is_setTimer(' + select_id + ');');
		sel_vis = 'hidden';
		options_visible = true;
	} else {
		dv.style.display = 'none';
		dv.style.visibility = 'hidden';
		dv.onmousemove = null;
		dv.onmouseout = null;
		fn_is_clearTimer(select_id);
		fn_is_scroll_clearInterval(select_id);
		sel_vis = 'visible';
		options_visible = false;
	}
	
	var s = document.getElementsByTagName('SELECT');
	for (var i=0; i < s.length; i++) {
		s[i].style.visibility = sel_vis;
	}
	
	if (isOp) {
		var ifr = document.getElementsByTagName('IFRAME');
		for (i=0; i<ifr.length; i++) {
			ifr[i].style.visibility = sel_vis;
		}
	}
}

function fn_is_key(e, select_id, select_value) {
	var kc = e.keyCode;
	if (kc == 40) {
		fn_is_key_scrolldown(select_id);
		return;
	}
	
	if (kc == 38) {
		fn_is_key_scrollup(select_id);
		return;
	}
	
	if (kc == 13) {
		//alert('Option ' + scroll_last_id + ' will be selected');
		return;
	}
	
	fn_is_search(select_id, select_value);
}

function fn_is_options_hide_except(select_id) {
	// Hide ALl Inactive Options when Try to open new Layer with list of options
	var dvs = document.getElementsByTagName('DIV');
	for (var i=0; i<dvs.length; i++) {
		if (dvs[i].id && dvs[i].id.indexOf('opts_') !== -1 && dvs[i].id !== ('opts_' + select_id)) {
			if (dvs[i].display == 'block' || dvs[i].style.visibility == 'visible') {
				dvs[i].style.display = 'none';
				dvs[i].style.visibility = 'hidden';
			}
		}
	}
}

function fn_is_setTimer(select_id) {
	// set up Timer for visibility of Layer with Options
	fn_is_clearTimer(select_id);
	ops_timer = window.setTimeout("fn_is_options_show(" + select_id + ");",OPTIONS_HIDE_TIME);
}

function fn_is_clearTimer(select_id) {
	// Clear Timer for visibility of Layer with list of Options
	if (ops_timer) {
		window.clearTimeout(ops_timer);
	}
}

function fn_is_option_select(select_id, option_id) {
	// Select One Of Option from List
	var ob = selects[select_id];
	var op = selects_ops[select_id][option_id];
	var inp = GetDiv(ob.s_id);
	var inp_face = GetDiv(ob.s_id + '_face');
	if (inp == null) {
		return;
	}
	inp_face.value = rep(op.o_text,'"','\'');
	inp.value = op.o_value;
	fn_is_options_show(select_id);
	// execute onChange event
	if (chnge[select_id] && op.o_value.length > 0) {
		
		var v1 = chnge[select_id]
		var v2 = chnge[select_id].toString();

		if (chnge[select_id]!==null && (typeof chnge[select_id])!=='undefined' && chnge[select_id].toString().indexOf('this.value')!==-1) {
			var e = chnge[select_id].toString();
			e = rep(e,' ','');
			if (isNaN(parseInt(op.o_value))) {
				e = rep(e,'+this.value+','\'' + op.o_value + '\'');
				e = rep(e,'this.value','\'' + op.o_value + '\'');
			} else {
				e = rep(e,'\'+this.value+\'',op.o_value);
				e = rep(e,'this.value',op.o_value);
			}
			if (e.indexOf('function')!==-1) {
				var st = (e.indexOf('{'))+1;
				var en = (e.indexOf('}'));
				var function_text = (e.substring(st,en));
				eval(function_text);
			} else {
				alert('Unknown event:\n' + e.toString() + '\n');
			}
		}
	}
}

function fn_is_key_scrollup(select_id) {
	// Scroll Up List of Options by keyCode = 38
	var dv = GetDiv('opts_' + select_id + '_scrolling');
	if (dv == null || scroll_last_id < 0) {
		return;
	}
	if (dv.style.display == 'none' || dv.style.visibility == 'hidden') {
		fn_is_options_show(select_id);
	}
	dv.innerHTML = fn_is_options_array_get(select_id, (scroll_last_id-1));
}

function fn_is_scrollup(select_id) {
	// Scroll Up List of Options
	var dv = GetDiv('opts_' + select_id + '_scrolling');
	if (dv == null || scroll_last_id < 0) {
		fn_is_scroll_clearInterval(select_id);
		scroll_stop = false;
		return;
	}
	dv.innerHTML = fn_is_options_array_get(select_id, (scroll_last_id-3));
	fn_is_scroll_setInterval('up', select_id, (scroll_last_id-3));
}

function fn_is_key_scrolldown(select_id) {
	// Scroll Down List of Options by KeyCode = 40
	var dv = GetDiv('opts_' + select_id + '_scrolling');
	if (dv == null || (scroll_last_id >= (selects_ops[select_id].length-1)) || scroll_stop == true) {
		scroll_stop = false;
		return;
	}
	if (dv.style.display == 'none' || dv.style.visibility == 'hidden') {
		fn_is_options_show(select_id);
	}
	dv.innerHTML = fn_is_options_array_get(select_id, (scroll_last_id+1));
}

function fn_is_scrolldown(select_id) {
	// Scroll Down List of Options
	var dv = GetDiv('opts_' + select_id + '_scrolling');
	if (dv == null || (scroll_last_id >= (selects_ops[select_id].length-1)) || scroll_stop == true) {
		fn_is_scroll_clearInterval(select_id);
		scroll_stop = false;
		return;
	}
	dv.innerHTML = fn_is_options_array_get(select_id, (scroll_last_id+3));
	fn_is_scroll_setInterval('down', select_id, (scroll_last_id+3));
}

function fn_is_scroll_setInterval(updown, select_id, start_option_id) {
	// set up interval for scrolling Up/Down
	fn_is_scroll_clearInterval(select_id);
	if (updown == 'up') {
		ops_interval = window.setInterval("fn_is_scrollup(" + select_id + "," + start_option_id + ");",SCROLL_SPEED);
	} else {
		ops_interval = window.setInterval("fn_is_scrolldown(" + select_id + "," + start_option_id + ");",SCROLL_SPEED);
	}
}

function fn_is_scroll_clearInterval(select_id) {
	// clear interval for scrolling
	if (ops_interval) {
		window.clearInterval(ops_interval);
	}
}

function fn_is_search(e, select_id, searchStr) {
	// Start Search in Options for input value
	var kc = e.keyCode;
	if (kc == 40 || kc == 38 || kc == 13 && options_visible == true) {
		if (kc == 40) {
			//alert('Will go down for 1 pos');
		}
		if (kc == 38) {
			//alert('Will go up for 1 pos');
		}
		if (kc == 13) {
			//alert('Will select focused pos')
		}
		return;
	} else {
		if (searchStr && searchStr.length > 0) {
			var inp = GetDiv(selects[select_id].s_id);
			var inp_face = GetDiv(selects[select_id].s_id + '_face');
			if (!inp) {
				return;
			}
			inp.value = '';
			var dv = GetDiv('opts_' + select_id);
			if (!dv) {
				return;
			}
			
			var new_ops = new Array();
			new_ops = fn_is_options_search_array(select_id, searchStr);
			
			dv.innerHTML = fn_is_options_array(select_id,0,new_ops);
			
			if (dv.style.display == 'none' || dv.style.visibility == 'hidden') {
				fn_is_options_show(select_id);
			}
			
			inp_face.focus();
		}
	}
}

function fn_is_options_search_array(select_id, searchStr) {
	// Return Result Array of Search in List by input value
	var result = new Array();
	var orig_ops = selects_ops[select_id];
	var inc = 0;
	for (var option_id=0; option_id < orig_ops.length; option_id++) {
		if (orig_ops[option_id] && orig_ops[option_id].o_text && orig_ops[option_id].o_text.toLowerCase().indexOf(searchStr.toLowerCase())!==-1) {
			result[inc] = new fn_is_option(option_id, orig_ops[option_id].o_value, orig_ops[option_id].o_text);
			inc++;
		}
	}
	return(result);
}

function fn_is_init() {
	//Main Initialization
	var start_timer = new Date().getSeconds();
	var sels = document.getElementsByTagName('SELECT');
	var x=0;
	for (var select_id=0; select_id<sels.length; select_id++) {
		var ob = sels[select_id];
		if (ob.getAttribute('convert')=='1') {
			var input_id = ob.id;
			var input_name = ob.name;
			var input_value = (ob.value) ? ob.value : '';
			var input_text = (ob.options[ob.selectedIndex].text) ? rep(ob.options[ob.selectedIndex].text,'"','\'') : '';
			var input_class = (ob.className) ? ob.className : null;
			var res = GetPos(ob);
			var input_style = (res.width || (ob.clientWidth || ob.style.pixelWidth)) - 22;
			input_style = (input_style <= 0 || isNaN(input_style)) ? DEFAULT_WIDTH : input_style;
			selects[x] = new fn_is_new(x, input_id, input_name, input_value, input_text, input_class, input_style);
			x++;
		}
	}
	
	for (var i=0; i<selects.length; i++) {
		fn_is_draw(i);
	}
	var end_timer = new Date().getSeconds();
	var res_timer = end_timer - start_timer;
}

function fn_is_draw(select_id) {
	// Replace original select with prepared custom ComboBox
	var ob = selects[select_id];
	var orig_ob = GetDiv(ob.s_id);
	if (orig_ob==null) {
		return;
	}
	orig_ob.style.visibility = 'hidden';
	orig_ob.style.display = 'none';
	var trg = orig_ob.parentNode;
	trg.innerHTML = ob.htm;
}

fn_is_init();
