Char2Hex = new Object();
for(var i =  0; i<=255;i++ ) {
     var j = parseInt(i/16); var j2 = parseInt(i%16);
    Char2Hex[''+String.fromCharCode(i)] = ('%' + j.toString(16) + j2.toString(16) ).toUpperCase();
}

Char2Hex[';']='%3B';
Char2Hex['_']='%5F';
Char2Hex['À']='%C0';
Char2Hex['Á']='%C1';
Char2Hex['Â']='%C2';
Char2Hex['Ã']='%C3';
Char2Hex['Ä']='%C4';
Char2Hex['Å']='%C5';
Char2Hex['Æ']='%C6';
Char2Hex['Ç']='%C7';
Char2Hex['È']='%C8';
Char2Hex['É']='%C9';
Char2Hex['Ê']='%CA';
Char2Hex['Ë']='%CB';
Char2Hex['Ì']='%CC';
Char2Hex['Í']='%CD';
Char2Hex['Î']='%CE';
Char2Hex['Ï']='%CF';
Char2Hex['Ð']='%D0';
Char2Hex['Ñ']='%D1';
Char2Hex['Ò']='%D2';
Char2Hex['Ó']='%D3';
Char2Hex['Ô']='%D4';
Char2Hex['Õ']='%D5';
Char2Hex['Ö']='%D6';
Char2Hex['×']='%D7';
Char2Hex['Ø']='%D8';
Char2Hex['Ù']='%D9';
Char2Hex['Ú']='%DA';
Char2Hex['Û']='%DB';
Char2Hex['Ü']='%DC';
Char2Hex['Ý']='%DD';
Char2Hex['Þ']='%DE';
Char2Hex['ß']='%DF';
Char2Hex['à']='%E0';
Char2Hex['á']='%E1';
Char2Hex['â']='%E2';
Char2Hex['ã']='%E3';
Char2Hex['ä']='%E4';
Char2Hex['å']='%E5';
Char2Hex['æ']='%E6';
Char2Hex['ç']='%E7';
Char2Hex['è']='%E8';
Char2Hex['é']='%E9';
Char2Hex['ê']='%EA';
Char2Hex['ë']='%EB';
Char2Hex['ì']='%EC';
Char2Hex['í']='%ED';
Char2Hex['î']='%EE';
Char2Hex['ï']='%EF';
Char2Hex['ð']='%F0';
Char2Hex['ñ']='%F1';
Char2Hex['ò']='%F2';
Char2Hex['ó']='%F3';
Char2Hex['ô']='%F4';
Char2Hex['õ']='%F5';
Char2Hex['ö']='%F6';
Char2Hex['÷']='%F7';
Char2Hex['ø']='%F8';
Char2Hex['ù']='%F9';
Char2Hex['ú']='%FA';
Char2Hex['û']='%FB';
Char2Hex['ü']='%FC';
Char2Hex['ý']='%FD';
Char2Hex['þ']='%FE';
Char2Hex['ÿ']='%FF';
Char2Hex['¸']='%B8';
Char2Hex['¨']='%A8';

function urlencode(str) {
    if(!str || typeof(str) == "undefined" || str == null || str == "") return "";
    var reg = /([^A-Za-z0-9\-_.!~*\'() ])/;
    var res = '';
    for(var i=0;i<str.length;i++) {
        var char = str.substr(i,1);
        res = '' + res + (( reg.test(char) &&  typeof(Char2Hex[char]) != "undefined") ? Char2Hex[char] : char);
    }
    res = res.replace(/ /g, "+");
    return res;
}

var addressbook_title = 'Íàéäåíî';
var InsertAddress = 0;
var addressbook = [];
var ab_delimiter = ';';
var ab_delim_url = urlencode(ab_delimiter);
var dynamic_ab = {};

document.onclick = function (e) {
	if (typeof(e) == 'undefined') { // IE code
		e = window.event;
	}
	var obj;
	if (typeof(e.srcElement) != 'undefined') {
		obj = e.srcElement;
	}
	else if (typeof(e.target) != 'undefined') {
		obj = e.target;
	}
	if (typeof(obj) == 'undefined') {
		return;
	}
	for (var fieldname in dynamic_ab) {
		var ab = ab_get(fieldname);
		if (typeof(ab) != 'undefined') {
			if ((obj.id != 'dynamic_ab_'+fieldname) && (obj.id != 'ab_compose_'+fieldname)) {
				ab.hide();
			}
		}
	}
}

function addHandler(object, event, handler, useCapture) { 
	if (object.addEventListener) { 
		object.addEventListener(event, handler, useCapture ? useCapture : false); 
	} else if (object.attachEvent) { 
		object.attachEvent('on' + event, handler); 
	}
} 

addHandler(document, "click", function() {
	try {
		var ab = ab_get('name');
		ab.hide();
	} catch(e) {}
});

var ajax_search_flag = 1;
var query_in_process = 0;
var ajax_search_timer = null;
var ajax_search_interval = 1;
function AB_send () {
	ajax_search_flag = 1;
	if (ajax_search_timer != null) clearInterval(ajax_search_timer);
	var search = this.search;
	search = search.replace(/^\s+/, '');
	if (search.length >= 1 && !query_in_process) ajax_search_timer = setTimeout("AB_send_request('" + search + "')", ajax_search_interval);
	else this.hide();
	return false;
}

function AB_send_request (str) {
	//var str = str.replace(/\s+$/, '%20');
	str = urlencode(str);
	query_in_process = 1;
	setAjaxRequest(
		"GET", 
		"/include/citylist_str?delimiter=" + ab_delim_url + "&letters=" + str, 
		"delimiter=" + ab_delim_url + "&letters=" + str, 
		AB_send_handler, 
		0, 
		0, 0, 0
	);
}

function AB_send_handler () {
	query_in_process = 0;
	var res = this.req.responseText;
	var ab = ab_get('name');
	if (res == "") {
		ab.hide();
		return;
	}
	addressbook = [];
	addressbook = res.split(ab_delimiter);
	if (addressbook.length >= 1) {
		ajax_search_flag = 0;
		ab.items = addressbook.length;
		ab.draw();
	}
}

function AB_send_error () {
	query_in_process = 0;
	ajax_search_flag = 0;
	//alert('Error');
}

function ab_keyup (field, e) {
	var ab = ab_get(field);
	switch (e.keyCode) {
		// action keys
		case 27: // Esc
			ab.hide();
			return false;
		case 13: // Enter
			if (ab.is_show()) {
				ab.insert();
				return false;
			}
		case 38: // Up
		case 40: // Down
		case 33: // Page Up
		case 34: // Page Down
			if (ab.is_show()) {
				return false;
			}
			else if (ab.found) {
				ab.show();
				ab.movetop();
				return false;
			}
		case 37: // Left
		case 39: // Right
		case 35: // End
		case 36: // Home
			return true;
		case 9:  // Tab
			ab.hide();
			return true;
		case 8:  // Backspace
		default:
			ab.draw();
			break;
	}
}

function ab_keydown (field, e) {
	var ab = ab_get(field);
	switch (e.keyCode) {
		case 27: // Esc
			ab.hide();
			return false;
		case 38: // Up
			ab.moveup();
			return false;
		case 40: // Down
			ab.movedown();
			return false;
		case 33: // Page Up
			ab.movetop();
			return false;
		case 34: // Page Down
			ab.movebottom();
			return false;
		case 13: // Enter
			if (ab.is_show()) {
				ab.insert();
				return false;
			}
		case 9:  // Tab
			ab.hide();
			return true;
		default:
			return true;
	}
}

function ab_keypress (field, e) {
	var ab = ab_get(field);
	return (e.keyCode == 13 && ab.is_show()) ? false : true;
}

function ab_click (field, e) {
	var ab = ab_get(field);
	if (ab.is_show()) {
		ab.hide();
	}
	else if (ab.found) {
		ab.draw();
	}
}

function ab_mouseover (field_name, index) {
	var ab = ab_get(field_name);
	ab.mouseover(index);
}

function ab_mouseclick (field_name, index) {
	var ab = ab_get(field_name);
	ab.insert(index);
}

function ab_get (field) {
	try {
		document.getElementById("submId").disabled = document.getElementById("ab_compose_firstchars").value.length >=2 ? false : true;
	} catch(e) {}
	if (typeof(field) != 'object') {
		field = document.getElementById('ab_compose_'+field);	
	}
	if (typeof(field.name) == 'undefined') {
		return false;
	}
	if (typeof(dynamic_ab[field.name]) == 'undefined') {
		dynamic_ab[field.name] = new AB(field);
	}
	return dynamic_ab[field.name];
}


// AB object

function AB (field) {
	this.ab = document.createElement('div');
	this.ab.id = 'dynamic_ab_' + field.name;
	this.ab.className = 'dynamic_ab';
	this.field = field;

	var div = document.createElement('div');
	div.className = 'dynamic_ab_placeholder';

	this.field.parentNode.appendChild(div);
	div.appendChild(this.ab);

	this.show = AB_show;
	this.hide = AB_hide;
	this.is_show = AB_is_show;
	this.draw = AB_draw;
	this.select = AB_select;
	this.moveup = AB_moveup;
	this.movedown = AB_movedown;
	this.movetop = AB_movetop;
	this.movebottom = AB_movebottom;
	this.mouseover = AB_mouseover;
	this.insert = AB_insert;

	this.index = 0;
	this.search = '';
	this.found = 0;
	this.is_drawing = false;
	this.items = addressbook.length;
	this.hidemask = new Array(this.items);
	
	this.send = AB_send;
}

function AB_show () {
	this.ab.style.display = 'block';
}

function AB_hide () {
	this.ab.style.display = 'none';
}

function AB_is_show () {
	return (this.ab.style.display == 'block') ? 1 : 0;
}

function AB_moveup () {
	if (this.is_show() && this.found) {
		var index = this.index;
		while (true) {
			index--;
			if (index < 0) {
				index = this.items - 1;
			}
			if (this.hidemask[index] == 0) {
				break;
			}
		}
		this.select(index);
	}
}

function AB_movedown () {
	if (this.is_show() && this.found) {
		var index = this.index;
		while (true) {
			index++;
			if (index >= this.items) {
				index = 0;
			}
			if (this.hidemask[index] == 0) {
				break;
			}
		}
		this.select(index);
	}
}

function AB_movetop () {
	if (this.is_show() && this.found) {
		var index = 0;
		while (true) {
			if (this.hidemask[index] == 0) {
				break;
			}
			index++;
		}
		this.select(index);
	}
}

function AB_movebottom () {
	if (this.is_show() && this.found) {
		var index = this.items - 1;
		while (true) {
			if (this.hidemask[index] == 0) {
				break;
			}
			index--;
		}
		this.select(index);
	}
}

function AB_mouseover (index) {
	this.select(index);
}

function AB_draw () {
	if (this.is_drawing) {
		alert('busy');
		return true;
	}
	// enter critical section
	this.is_drawing = true;
	// get search pattern
	var search = this.field.value;
	search = search.replace(/^\s+/, '%20');
	var re_space = new RegExp('\\S');
	if (!re_space.test(search)) {
		this.hide();
		this.search = '';
		this.found = 0;
		this.is_drawing = false;
		return true;
	}
//OLD: if (search != this.search) {
	this.search = search;
	if (ajax_search_flag) {
		if (!this.send()) {
			this.found = 0;
			this.is_drawing = false;
			return true;
		}
	}
//OLD: var search_re = '(^|\\s|<|\\")' + search.replace(/([\\\^\$\*\+\?\{\}\.\(\)\|\[\]])/g, "\\$1");
//OLD: var re = new RegExp(search_re, 'i');
	var html = '';
	var found = 0;
	// search for matches
	var matches = 0;
	for (var i in addressbook) {
		if (addressbook[i] != search && matches < 100) {
			found += 1;
			this.hidemask[i] = 0;
			matches++;
		}
		else {
			this.hidemask[i] = 1;
		}
	}
	this.found = found;
	// select next visible matching item (if needed)
	if (found) {
		while (true) {
			if (this.hidemask[this.index] == 1) {
				this.index++;
				if (this.index >= this.items) {
					this.index = 0;
				}
			}
			else {
				break;
			}
		}
		this.index = 0; // New: bugfix
		for (var i in addressbook) {
			if (this.hidemask[i] == 0) {
				var item_html = html_escape(addressbook[i]);
				html += '<tr><td'+((i==this.index)?' class="active"':'')+' onmouseover="ab_mouseover(\''+this.field.name+'\','+i+');" onclick="ab_mouseclick(\''+this.field.name+'\','+i+');" id="ab_entry_'+this.field.name+'_'+i+'" nowrap><a href="#">'+item_html+'</a></td></tr>';
			}
		}
		this.ab.innerHTML = '<div class="dynamic_ab_list"><table width="100%" cellspacing="0" cellpadding="2" border="0" class="drowned"><tr><td><table width="100%" cellspacing=0 cellpadding=0 border=0 bgcolor="#FFFFFF"><tr><td class=title nowrap>'+addressbook_title+':</td></tr>'+html+'</table></td></td></table></div>';
		this.ab.childNodes[0].style.height = (found > 7) ? '12.8em': 'auto';
		if (!this.is_show()) {
			this.show();
		}
	}
	else {
		// hide addressbook
		this.hide();
		this.ab.innerHTML = '';
	}
//OLD: }
//OLD: else 
	if (this.found) {
		this.show();
	}
	// leave critical section
	this.is_drawing = false;
	ajax_search_flag = 1;
}

function AB_select (index) {
	if (this.index == index) {
		return true;
	}
	if (index < 0 || index >= this.items) {
		return false;
	}
	var oldentry = document.getElementById('ab_entry_' + this.field.name + '_'+ this.index);
	if (typeof(oldentry) == 'object') {
		oldentry.className = '';
	}
	var newentry = document.getElementById('ab_entry_' + this.field.name + '_'+ index);
	if (typeof(newentry) == 'object') {
		newentry.className = 'active';
		if ((navigator.userAgent.indexOf('MSIE') != -1) && (navigator.userAgent.indexOf('Opera') == -1)) {
			newentry.focus(); // IE
		} else {
			newentry.childNodes[0].focus(); // Firefox
		}
		this.field.focus();
	}
	this.index = index;
	return true;
}

function AB_insert () {
	if (!this.is_show()) {
		return false;
	}
	var value = this.field.value;
	var insert_pos = value.lastIndexOf(',');
	if (insert_pos > 0) {
		value = value.substr(0, insert_pos + 1);
		value += ' ';
	} else {
		value = '';
	}
	value += addressbook[this.index];
	this.hide();
	this.index = 0;
	this.search = '';
	this.found = 0;
	this.field.value = value;
	this.field.focus();
	return true;
}

function html_escape (text) {
	var html = '';
	for (var i=0; i < text.length; i++) {
		switch (text.charAt(i)) {
			case '&':
				html += '&amp;';
				break;
			case '"':
				html += '&quot;';
				break;
			case '>':
				html += '&gt;';
				break;
			case '<':
				html += '&lt;';
				break;
			case '%':
				html += '&#037;';
				break;
			case '\'':
				html += '&#039;';
				break;
			default:
				html += text.charAt(i);
				break;
		}
	}
	return html;
}
