function hide(element_id){
	element=document.getElementById(element_id);
	if (element==null) {
		alert("Cannot HIDE '"+element_id+"'");
	}
	element.style.display='none';
}

function show(element_id){
	element=document.getElementById(element_id);
	if (element==null) {
		alert("Cannot SHOW '"+element_id+"'");
	}
	element.style.display='block';
}

function get_dimensions(obj) {
	var result = { "left": 0, "right" : 0, "top": 0, "bottom" : 0, "width" : obj.offsetWidth, "height" : obj.offsetHeight };
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			result.left += obj.offsetLeft;
			result.top += obj.offsetTop;
			obj = obj.offsetParent;
		}
	} else {
		if (obj.x) {
			result.left += obj.x;
		}
		if (obj.y) {
			result.top += obj.y;
		}
	}
	result.right = result.left + result.width;
	result.bottom = result.top + result.height;
	return result;
}

function is_form_disabled(form) {
	return Boolean(form.is_disabled);
}

function disable_form(form, ignore_disabled_check) {
	if (!ignore_disabled_check && is_form_disabled(form)) {
		return;
	}
	var element;
	for (var i = 0; i < form.elements.length; i++) {
		element = form.elements[i];
		element.old_disabled = element.disabled;
		element.disabled = true;
	}
	form.is_disabled = true;
}

function enable_form(form, ignore_disabled_check) {
	if (!ignore_disabled_check && !is_form_disabled(form)) {
		return;
	}
	var element;
	for (var i = 0; i < form.elements.length; i++) {
		element = form.elements[i];
		element.disabled = element.old_disabled;
	}
	form.is_disabled = false;
}


function add_event_listener(el, evname, func) {
	if (el.attachEvent) { // IE
		el.attachEvent("on" + evname, func);
	} else if (el.addEventListener) { // Gecko / W3C
		el.addEventListener(evname, func, true);
	} else {
		el["on" + evname] = func;
	}
}

function form_keypress_handler(event) {	//	check for Enter here
	var on_enter_callback, on_enter;
	on_enter = this.getAttribute("on_enter");
	if (on_enter) {
		on_enter_callback = window[on_enter];
	} else {
		on_enter_callback = null;
	}
	var event_information = get_event_information(event || window.event);
	if (is_enter_pressed(event_information)) {
		if (on_enter_callback) {
			on_enter_callback();
		}
		return false;
	}
	return true;
}

function form_keydown_handler(event) {	//	check for Esc here
	var on_escape_callback, on_escape;
	on_escape = this.getAttribute("on_escape");
	if (on_escape) {
		on_escape_callback = window[on_escape];
	} else {
		on_escape_callback = null;
	}
	var event_information = get_event_information(event || window.event);
	if (is_escape_pressed(event_information)) {
		if (on_escape_callback) {
			on_escape_callback();
		}
		return false;
	}
	return true;
}

//	the point is to use keydown to catch Esc key and keypress to catch Enter,
//	because Safari and Chrome do not fire keypress for Esc and
//	keydown is fired when item from autocomplete menu is choosen using Enter
function add_form_listeners() {
	for (var i = 0; i < document.forms.length; i++) {
		var form = document.forms[i];
		if (form.getAttribute("on_enter")) {
			form.onkeypress = form_keypress_handler;
		}
		if (form.getAttribute("on_escape")) {
			form.onkeydown = form_keydown_handler;
		}
	}
}

function is_enter_pressed(event_information) {
	var tag_name = event_information.target.tagName.toLowerCase();
	var result = false;
	if (event_information.code == "13" && tag_name == "input" && event_information.target.type.toLowerCase() != "button") {
		result = true;
	}
	return result;
}

function is_escape_pressed(event_information) {
	var result = false;
	if (event_information.code == "27") {
		result = true;
	}
	return result;
}

function get_event_information(e) {
	var result = {};

	if (e.target) {
		result.target = e.target;
	} else if (e.srcElement) {
		result.target = e.srcElement;
	}

	if (browser.is_ie()) {
		result.code = window.event.keyCode;
	} else if (document.layers) {
		result.code = e.which;
	} else {
		result.code = e.keyCode;
	}

	return result;
}

add_event_listener(window, "load", add_form_listeners);

function trim(string) {
	string = string.replace(/^\s+/gi, "");
	string = string.replace(/\s+$/gi, "");
	return string;
}
function get_cookies() {
	var cookies_array = document.cookie.split(";");
	var cookies = {};
	for (var i = 0; i < cookies_array.length; i++) {
		var cookie_params = cookies_array[i].split("=");
		cookies[trim(cookie_params[0])] = unescape(cookie_params[1]);
	}
	return cookies;
}
function set_cookie(name, value, expires, path, domain, secure) {
	var cookie = name + "=" + escape(value);
	if (expires !== undefined) {
		cookie += ";expires=" + expires.toUTCString();
	}
	if (path !== undefined) {
		cookie += ";path=" + path;
	}
	if (domain !== undefined) {
		cookie += ";domain=" + domain;
	}
	if (secure) {
		cookie += ";secure";
	}
	document.cookie = cookie;
}
function get_cookie(name) {
	return get_cookies()[name];
}
