function on_sort_order_click(obj, field_name, direction) {
	var form = get_form(obj);
	form.sort_field.value = field_name;
	form.sort_direction.value = direction;
	form.offset.value = "0";
//	form.submit();
	on_form_submit(form);
}
function on_list_form_header_link_click(obj, offset) {
	var form = get_form(obj);
	form.offset.value = offset;
//	form.submit();
	on_form_submit(form);
}
function on_limit_change(obj) {
	var form = obj.form;
	form.offset.value = 0;
//	form.submit();
	on_form_submit(form);
}
function clear_form(form) {
	var clearable_attribute;
	for (j = 0; j < form.elements.length; j++) {
		clearable_attribute = form.elements[j].attributes.getNamedItem("clearable");
		if (clearable_attribute || form.elements[j].type == 'text' || form.elements[j].type == 'select-one' || form.elements[j].type == 'textarea') {
			form.elements[j].value = "";
		}
	}
}
function on_new_button_click(module_name) {
	var form = document.forms["new_button"];
	form.action = COMMON.LOCAL_SITE_URL + "/" + module_name + "/EditView" + COMMON.URL_COMPANY_BEGIN;
//	form.submit();
	load_in_popup(form);
}
function on_calendar_update(cal) {
	var field = cal.params.inputField;
	get_obj_by_path(field, "prev").value = cal.date.print("%Y-%m-%d %H:%M:%S");
}
function on_belongs_to_click(obj) {
	var form = obj.form;
	var radio_buttons = form.elements["belongs_to"];
	var parent_selector;
	var parent_row;
	for (var i = 0; i < radio_buttons.length; i++) {
		parent_selector = form.elements[radio_buttons[i].value];
		parent_row = get_obj_by_path(parent_selector, "parent 9");
		if (radio_buttons[i].checked) {
			parent_selector.disabled = false;
			parent_row.style.display = "";
		} else {
			parent_selector.disabled = true;
			parent_row.style.display = "none";
		}
	}
}
function validate_data(form) {
	var error_elements = [];
	var error_messages = [];
	var element;
	var required_attribute;
	var validation_pattern_attribute;
	var display_name_attribute;
	var regexp;
	var error;
	for (var i = 0; i < form.elements.length; i++) {
		error = false;
		element = form.elements[i];
		if (element.disabled) {
			continue;
		}
		required_attribute = element.attributes.getNamedItem("required");
		validation_pattern_attribute = element.attributes.getNamedItem("validation_pattern");
		display_name_attribute = element.attributes.getNamedItem("display_name");
/*		
		if (required_attribute) {
			if (validation_pattern_attribute) {
				regexp = new RegExp(validation_pattern_attribute.nodeValue);
				error = !regexp.test(element.value);
			} else {
				error = element.value == "";
			}
		} else if (element.value != "") {
			if (validation_pattern_attribute) {
				regexp = new RegExp(validation_pattern_attribute.nodeValue);
				error = !regexp.test(element.value);
			}
		}
*/		
		var value = element.value;
		if (element.tagName.toLowerCase() == "input" && element.type == "radio") {
			value = "";
			for (var j = 0; j < form.elements.length; j++) {
				var temp_element = form.elements[j];
				if (temp_element.tagName.toLowerCase() == "input" && temp_element.type == "radio" && temp_element.name == element.name) {
					if (temp_element.checked) {
						value = temp_element.value;
						break;
					}
				}
			}
		}
		if (validation_pattern_attribute && (required_attribute || value != "")) {
			regexp = new RegExp(validation_pattern_attribute.nodeValue);
			error = !regexp.test(value);
		} else if (required_attribute) {
			error = value == "";
		}
		
		if (error) {
			error_elements.push(element);
			error_messages.push(display_name_attribute.nodeValue + " is not valid");
		}
	}
	//	custom validation
	if (form.elements["custom_validation_function_name"]) {
		var function_name = form.elements["custom_validation_function_name"].value;
		if (function_name && window[function_name] && typeof window[function_name] == "function") {
			var custom_validation_results = window[function_name](form);
			for (var i = 0; i < custom_validation_results.error_elements.length; i++) {
				error_elements.push(custom_validation_results.error_elements[i]);
				error_messages.push(custom_validation_results.error_messages[i]);
			}
		}
	}
	if (error_elements.length) {
		alert("The following error(s) occurred:\n" + error_messages.join(",\n") + ".");
		try {
			error_elements[0].focus();
		} catch (e) {
		}
		return false;
	} else {
		return true;
	}
}
function swap_search_display(obj) {
	var div = get_obj_by_path(obj, "parent 3 next");
	if (div.style.display == "none") {
		div.style.display = "block";
		obj.title = "Hide Search";
		obj.value = "Hide Search";
	} else {
		div.style.display = "none";
		obj.title = "Show Search";
		obj.value = "Show Search";
	}
}

function get_form_call_id(form) {
	var url_parts = form.action.replace(/\?.*$/, "").split("/");
	var call_id = url_parts[url_parts.length - 1];
	if (url_parts[url_parts.length - 2] != "json") {
		call_id = url_parts[url_parts.length - 2] + "_" + call_id;
	}
	return call_id;
}
function refresh_page() {
	on_form_submit(document.forms["main_list_form"]);
}
function on_form_submit(form) {
	var parameters = get_form_parameters(form);
	disable_form(form);
	https.get_object({ call_id: get_form_call_id(form), parameters: parameters, callback: on_form_submit_handle, arguments: [ form ] });
	return false;
}

function basic_handle(result) {
	if (result.error_message) {
		alert(result.error_message);
		return false;
	} else {
		return true;
	}
}

function on_form_submit_handle(result, form) {
	if (basic_handle(result)) {
		document.getElementById("main_container").innerHTML = result.html;
		//	result html may contain javascript code which should be executed manually
		eval_javascript(document.getElementById("main_container"));
	} else {
		enable_form(form);
	}
}

function eval_javascript(node) {
	if (node.nodeType == 1 && node.nodeName.toLowerCase() == "script") {
		if (node.firstChild) {
			eval(node.firstChild.nodeValue);
		}
	} else if (node.childNodes) {
		for (var i = 0; i < node.childNodes.length; i++) {
			eval_javascript(node.childNodes[i]);
		}
	}
}

add_event_listener(window, "load", add_form_listeners);

function load_in_popup(form, parameters) {	//	form can be either html form to be submitted and loaded in dhtml popup or an url
	if (typeof form == "object") {
		https.get_object({ call_id: get_form_call_id(form), parameters: get_form_parameters(form), callback: load_in_popup_handle });
	} else {
		if (parameters === undefined) {
			parameters = {};
		}
		https.get_object({ url: form, parameters: parameters, callback: load_in_popup_handle });
	}
}

function get_json_url(module, action, record) {
	var result = "json/" + module + "_" + action;
	if (record) {
		result += "/" + record;
	}
	result += COMMON.URL_COMPANY_BEGIN;
	return result
}

function popup_edit_handle() {
	var popup = YAHOO.dialog.popup;
	load_in_popup(get_json_url(popup.current_module, "EditView", popup.current_record));
}
function popup_delete_handle() {
	var popup = YAHOO.dialog.popup;
	if (confirm("Delete is unrevertable. Continue?")) {
		load_in_popup(get_json_url(popup.current_module, "Delete", popup.current_record));
	}
}
function popup_save_handle() {
	var popup = YAHOO.dialog.popup;
	if (validate_data(popup.form)) {
		//	if there's upload field, form should be submitted via iframe
		if (popup.form.max_file_size) {
			var upload_frame = document.getElementById("upload_frame");
			popup.form.action = get_json_url(popup.current_module, "Save", popup.current_record);
			popup.form.submit();
		} else {
			load_in_popup(get_json_url(popup.current_module, "Save", popup.current_record), get_form_parameters(popup.form));
		}
	}
}
function popup_change_password_handle() {
	var popup = YAHOO.dialog.popup;
	load_in_popup(get_json_url(popup.current_module, "ChangePassword", popup.current_record));
}
function popup_change_password_save_handle() {
	var popup = YAHOO.dialog.popup;
	if (validate_data(popup.form)) {
		load_in_popup(get_json_url(popup.current_module, "ChangePasswordSave", popup.current_record), get_form_parameters(popup.form));
	}
}
function popup_change_password_cancel_handle() {
	popup_cancel_handle();
/*
	var popup = YAHOO.dialog.popup;
	load_in_popup(get_json_url(popup.current_module, "DetailView", popup.current_record));
*/
}
function popup_import_users_handle() {
	var popup = YAHOO.dialog.popup;
	if (validate_data(popup.form)) {
		var upload_frame = document.getElementById("upload_frame");
		popup.form.action = get_json_url(popup.current_module, "ImportSave", popup.current_record);
		popup.form.submit();
	}
}

function popup_cancel_handle() {
	YAHOO.dialog.popup.cancel();
}

function load_in_popup_handle(result) {
	var popup = YAHOO.dialog.popup;
	if (basic_handle(result)) {
		if (result.upload_result && result.upload_result.callback_result) {
			if (result.upload_result.callback_result.text) {
				alert(result.upload_result.callback_result.text);
			}
			if (result.upload_result.callback_result.close) {
				popup_cancel_handle();
				return;
			}
		}
		if (result.close) {
			popup_cancel_handle();
			if (result.refresh) {
				refresh_page();
			}
			return;
		}
		if (result.refresh) {
			refresh_page();
			return;
		}
		if (result.title !== undefined) {
			popup.setHeader(result.title);
		}
		if (!result.width) {
			result.width = 650;
		}
		popup.cfg.setProperty("width", result.width + "px");
		popup.form.innerHTML = result.content;
		popup.current_module = result.module;
		popup.current_action = result.action;
		popup.current_record = result.record;

		var buttons = [];
		var focus_first = false;
		var on_enter = "";
		var on_escape = "";
		for (var i = 0; i < result.buttons.length; i++) {
			switch (result.buttons[i]) {
				case "edit":
					buttons.push({ text:"Edit", handler: popup_edit_handle, isDefault: false });
					break;
				case "delete":
					buttons.push({ text:"Delete", handler: popup_delete_handle, isDefault: false });
					break;
				case "save":
					buttons.push({ text:"Save", handler: popup_save_handle, isDefault: false });
					focus_first = true;
					on_enter = "popup_save_handle";
					break;
				case "cancel":
//					buttons.push({ text:"Cancel", handler: popup_cancel_handle, isDefault: false });
					on_escape = "popup_cancel_handle";
					break;
				case "change_password":
					buttons.push({ text:"Change Password", handler: popup_change_password_handle, isDefault: false });
					break;
				case "change_password_save":
					buttons.push({ text:"Change Password", handler: popup_change_password_save_handle, isDefault: false });
					focus_first = true;
					on_enter = "popup_change_password_save_handle";
					break;
				case "change_password_cancel":
					buttons.push({ text:"Cancel", handler: popup_change_password_cancel_handle, isDefault: false });
					on_escape = "popup_change_password_cancel_handle";
					break;
				case "import_users":
					buttons.push({ text:"Import", handler: popup_import_users_handle, isDefault: false });
					on_escape = "popup_change_password_cancel_handle";
					break;
				case "import_items":
					buttons.push({ text:"Import", handler: popup_import_users_handle, isDefault: false });
					on_escape = "popup_change_password_cancel_handle";
					break;
				default:
					alert("Unknown button type \"" + result.buttons[i] + "\"");
			}
		}
		popup.configButtons("buttons", [ buttons ], popup);
		popup.form.setAttribute("on_enter", on_enter);
		popup.form.setAttribute("on_escape", on_escape);
		popup.show();
		popup.center();
		var xy = popup.cfg.getProperty("xy");
		popup.cfg.setProperty("xy", [Math.max(xy[0], 0), Math.max(xy[1], 0)]);
		popup.cfg.refireEvent("iframe");
		if (focus_first) {
			//	because of IE I'm forced to use timeout
			window.setTimeout(function() { focus_on_first_element(popup.form) }, 100);
		}
	}
}

function on_upload_frame_load(frame) {
	if (frame.contentWindow.location.href == "about:blank") {	//	initial load
		return;
	}
//	alert(frame.contentWindow.document.documentElement.body.firstChild.nodeValue);
	var response = frame.contentWindow.document.body.firstChild.nodeValue;
	try {
		eval("var result = " + response);
	} catch (e) {
		alert(e + "\n\nSource code is:\n\n" + response);
		return;
	}
	load_in_popup_handle(result);
}

function multimedia_cancel_handle() {
	var obj = get_obj_by_path(YAHOO.dialog.multimedia_dialog.form, "child");
	while (obj) {
		try {
			obj.Stop();
		} catch (e) {
		}
		obj = get_obj_by_path(obj, "next");
	}
	YAHOO.dialog.multimedia_dialog.form.innerHTML = "";
	YAHOO.dialog.multimedia_dialog.hide();
}

function view_image_in_dhtml_window(header, image_path, width, height) {
	width = Number(width);
	height = Number(height);
	YAHOO.dialog.multimedia_dialog.setHeader(header);
	var html = "<div style=\"display:none\"><img onclick=\"multimedia_cancel_handle()\" class=\"clickable\" src=\"" + full_htmlspecialchars(image_path) + "\" width=\"" + width + "\" height=\"" + height + "\" alt=\"\" onload=\"on_dhtml_image_loaded()\" /></div>";
	html += "<table class=\"loading_asset\" height=\"" + height + "px\"><tr><td>Loading Asset</tr></td></table>";
	YAHOO.dialog.multimedia_dialog.form.innerHTML = html;
	YAHOO.dialog.multimedia_dialog.form.parentNode.parentNode.style.width = (width + 10).toString() + "px";
	YAHOO.dialog.multimedia_dialog.form.parentNode.parentNode.style.height = (height + 40).toString() + "px";
	YAHOO.dialog.multimedia_dialog.center();
	YAHOO.dialog.multimedia_dialog.show();
}

function on_dhtml_image_loaded() {
	var image_div = get_obj_by_path(YAHOO.dialog.multimedia_dialog.form, "child");
	var loading_div = get_obj_by_path(image_div, "next");
	image_div.style.display = "block";
	loading_div.style.display = "none";
}

function get_page_size() {
	var xScroll, yScroll;
	
	if (window.innerHeight && window.scrollMaxY) {
		xScroll = document.body.scrollWidth;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}
	
	var windowWidth, windowHeight;
	if (self.innerHeight) {        // all except Explorer
		windowWidth = self.innerWidth;
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) { // other Explorers
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}

	// for small pages with total height less then height of the viewport
	if (yScroll < windowHeight){
		pageHeight = windowHeight;
	} else {
		pageHeight = yScroll;
	}
	
	// for small pages with total width less then width of the viewport
	if (xScroll < windowWidth){
		pageWidth = windowWidth;
	} else {
		pageWidth = xScroll;
	}
	
	var scrollTop = 0, scrollLeft = 0;
	if (typeof(window.pageYOffset) == "number") {
		//	Netscape compliant
		scrollTop = window.pageYOffset;
		scrollLeft = window.pageXOffset;
	} else if (document.body && (document.body.scrollLeft || document.body.scrollTop)) {
		//	DOM compliant
		scrollTop = document.body.scrollTop;
		scrollLeft = document.body.scrollLeft;
	} else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
		//	IE6 standards compliant mode
		scrollTop = document.documentElement.scrollTop;
		scrollLeft = document.documentElement.scrollLeft;
	}
	return { page_width: pageWidth, page_height: pageHeight, window_width: windowWidth, window_height: windowHeight, scroll_top: scrollTop, scroll_left: scrollLeft };
}

function show_overlay(text) {
	var obj = document.getElementById("overlay");
	var page_size = get_page_size();
	obj.style.height = page_size.page_height + "px";
	obj.style.display = "block";
	var text_container = get_obj_by_path(obj, "child 0 0 0 0 0");
	set_node_value(text_container, text);
	var dimensions = get_dimensions(text_container);
	var x = Math.round((dimensions.width - 145) / 2);
	var y = Math.round((dimensions.height));
	text_container.style.backgroundPosition = x.toString() +  "px 45px";
	
	dimensions = get_dimensions(get_obj_by_path(obj, "child"));
	var table_left = Math.floor(page_size.scroll_left + (page_size.window_width - dimensions.width) / 2);;
	var table_top = Math.floor(page_size.scroll_top + (page_size.window_height - dimensions.height * 2) / 2);
	if (table_left > 0) {
		get_obj_by_path(obj, "child").style.left = table_left.toString() + "px";
	}
	if (table_top > 0) {
		get_obj_by_path(obj, "child").style.top = table_top.toString() + "px";
	}
}

function hide_overlay() {
	document.getElementById("overlay").style.display = "none";
}

function clear_default_input_value(input) {
	if (input.is_cleared) {
		return;
	}
	input.value = "";
	input.is_cleared = true;
}
function update_shopping_cart(number_items) {
	var text = number_items + " Item";
	if (number_items != 1) {
		text += "s";
	}
	set_node_value(document.getElementById("shopping_cart_info"), text);
	document.getElementById("shopping_cart_indicator").className = number_items > 0 ? "bold" : "";
}

function custom_address_validation(form) {
	var error_elements = [];
	var error_messages = [];
	var is_canadian = form.country.value == "CA";
	if (form.zip.value != "" && !is_valid_zip(form.zip.value, is_canadian)) {
		error_elements.push(form.zip);
		error_messages.push("Zip is not valid, an example of correct Zip: " + (is_canadian ? "T1A 1B2" : "30092"));
	}
	return { error_messages: error_messages, error_elements: error_elements };
}

function add_item_parameter(obj) {
	var container = get_obj_by_path(obj, "parent 1 prev child");
	var first_child = get_obj_by_path(container, "child");
	if (first_child && first_child.tagName.toLowerCase() == "i") {
		container.removeChild(first_child);
	}
	var div = document.createElement("div");
	div.className = "item_parameter";
	var input = document.createElement("input");
	input.type = "hidden";
	input.name = "parameter_id[]";
	div.appendChild(input);
	var input = document.createElement("input");
	input.type = "text";
	input.name = "parameter_name[]";
	input.className = "input_text";
	input.setAttribute("display_name", "Parameter Name");
	input.setAttribute("validation_pattern", "\\S");
	input.setAttribute("required", "required");
	div.appendChild(input);
	var a = document.createElement("a");
	a.href = "#";
	a.onclick = remove_item_parameter;
	a.appendChild(document.createTextNode("Remove"));
	div.appendChild(a);
	container.appendChild(div);
}
function remove_item_parameter(obj) {
	if (obj === undefined || !obj.tagName) {
		obj = this;
	}
	var container = obj.parentNode.parentNode;
	container.removeChild(obj.parentNode);
	if (not_text_child_length(container) == 0) {
		var i = document.createElement("i");
		i.appendChild(document.createTextNode("There are no parameters defined"));
		container.appendChild(i);
	}
	return false;
}
function on_item_sort_order_cancel(obj) {
	var input = get_obj_by_path(obj, "parent prev child");
	if (input.disabled) {
		return;
	}
	input.value = input.getAttribute("original_value");
}
function on_item_sort_order_delete(obj) {
	var input = get_obj_by_path(obj, "parent prev child");
	if (input.disabled) {
		return;
	}
	var item_id = input.getAttribute("item_id");
	var category_id = input.getAttribute("category_id");
	var item_name = input.getAttribute("item_name");
	if (!confirm("You are sure wish to remove item \"" + item_name + "\" from this category?")) {
		return false;
	}
	https.get_object({ call_id: "RemoveItemFromCategory", parameters: { item_id: item_id, category_id: category_id }, callback: basic_handle });
	var row = get_obj_by_path(input, "parent 1");
	row.parentNode.removeChild(row);
}
function on_item_sort_order_save(obj) {
	var input = get_obj_by_path(obj, "parent prev child");
	if (input.disabled) {
		return;
	}
	var item_id = input.getAttribute("item_id");
	var category_id = input.getAttribute("category_id");
	input.disabled = true;
	https.get_object({ call_id: "SaveItemSortOrder", parameters: { item_id: item_id, category_id: category_id, sort_order: input.value }, callback: on_item_sort_order_save_handle, arguments: [ input ] });
}
function on_item_sort_order_save_handle(result, input) {
	input.disabled = false;
	if (basic_handle(result)) {
		input.value = result.sort_order;
		input.setAttribute("original_value", result.sort_order);
	}
}

function on_import_users_click() {
	var form = document.forms["new_button"];
	form.action = COMMON.LOCAL_SITE_URL + "/Users/Import" + COMMON.URL_COMPANY_BEGIN;
	load_in_popup(form);
}

function on_import_items_click() {
	var form = document.forms["new_button"];
	form.action = COMMON.LOCAL_SITE_URL + "/Items/Import" + COMMON.URL_COMPANY_BEGIN;
	load_in_popup(form);
}
