var joGUI = new joGUIClass();

var joGUI_COL_FIELD_VALUE_OK					= "#ffffff";
var joGUI_COL_FIELD_VALUE_WARNING			= "#ffff00";
var joGUI_COL_FIELD_VALUE_INVALID			= "#ff8866";

var joGUI_ALERT_TYPE_NOTE						= 1;
var joGUI_ALERT_TYPE_WARNING					= 2;
var joGUI_ALERT_TYPE_ERROR					= 4;

var joGUI_ALERT_BUTTON_OK						= 1;
var joGUI_ALERT_BUTTON_CANCEL				= 2;

function joGUIClass()
{
	this.xmlData									= null;
	this.list_data_source						= null;
	this.langID										= "en";
	this.LoadGUI									= _joGUI_LoadGUI;
	this.InitGUI									= _joGUI_InitGUI;
	
	this.DisableEnterKey						= _joGUI_DisableEnterKey;
	
	this.OpenModalDialog						= _joGUI_OpenModalDialog;
	this.CloseModalDialog 						= _joGUI_CloseModalDialog;
	this.ShowShadow								= _joGUI_ShowShadow;
	this.HideShadow								= _joGUI_HideShadow;
	this.HideControl								= _joGUI_HideControl;
	this.ShowControlHeader						= _joGUI_ShowControlHeader;
	this.MoveControl								= _joGUI_MoveControl;
	
	this.Alert										= _joGUI_Alert;
	
	this.BuildForm									= _joGUI_BuildForm;
	this.ShowFormField							= _joGUI_ShowFormField;
	this.ShowValidatorInfo						= _joGUI_ShowValidatorInfo;
	this.ShowFieldValidState					= _joGUI_ShowFieldValidState;
	this.ShowFormValidState					= _joGUI_ShowFormValidState;
	this.AddFieldValidator						= _joGUI_AddFieldValidator;
	this.ValidateFormField						= _joGUI_ValidateFormField;
	this.FillForm									= _joGUI_FillForm;
	this.SaveForm									= _joGUI_SaveForm;
	this._AddFieldValidatorAttribString 	= _joGUI_AddFieldValidatorAttribString;
	this.OnUpdateFormStatusCallback			= null;
	
	this.InitLocaleText							= _joGUI_InitLocaleText;
	this._InitLocaleTextNodes					= _joGUI_InitLocaleTextNodes;
	this.GetLocaleText							= _joGUI_GetLocaleText;
	this.GetLocaleTitle							= _joGUI_GetLocaleTitle;

	this.ShowColorControl						= _joGUI_ShowColorControl;
	
	this.GetDependendLeftPos					= _joGUI_GetDependendLeftPos;
	this.GetDependendTopPos					= _joGUI_GetDependendTopPos;
}

/* ********************************************************************************************************** */

function _joGUI_LoadGUI (language)
{
	if (language && language != "") this.langID = language;
	
	var myAjax 		= new Ajax.Request ("gui/oee_vmm_gui.xml", { method: 'get', onComplete: function (filedata) { joGUI.InitGUI (filedata.responseXML); } } );
}

/* ********************************************************************************************************** */

function _joGUI_InitGUI (filedata)
{
	this.xmlData = filedata;
	joGUI.InitLocaleText();
	joOnInitGUI();
}

/* ********************************************************************************************************** */

function _joGUI_DisableEnterKey()
{
	document.onkeypress = OnKeyPressEnter;
}

/* ********************************************************************************************************** */

function OnKeyPressEnter (event)
{
	if (!event) event = window.event;
	if (event.keyCode == 13) 
	{	
		return false;
	}
}

/* ********************************************************************************************************** */

function _joGUI_InitLocaleText()
{
	this._InitLocaleTextNodes (Array ("SPAN", "TD", "A", "DIV"), "joLocaleText");
	this._InitLocaleTextNodes (Array ("INPUT"), "joLocaleValue");
	this._InitLocaleTextNodes (Array ("BUTTON", "TD", "BUTTON", "A"), "joLocaleTitle");
	this._InitLocaleTextNodes (Array ("IMG"), "joLocaleAlt");
	
}

/* ********************************************************************************************************** */
<!-- Locale Text -->
/* ********************************************************************************************************** */

function _joGUI_InitLocaleTextNodes (nodetype_array, data_type)
{
	var i, j, k;
	
	for (j = 0; j < nodetype_array.length; j++)
	{
		var allObjects = document.getElementsByTagName (nodetype_array[j]);
		var ObjClass;
		var thisobj;
	
		for (i = 0; i < allObjects.length; i++)
		{
			thisobj = allObjects[i];
			ObjClass = thisobj.className + "";
			if (ObjClass.indexOf (data_type) != -1)
			{
				var classes = ObjClass.split (" ");
			
				for (k = 0; k < classes.length; k++)
				{
					if (classes[k].indexOf (data_type) != -1)
					{
						var locale_name = classes[k].replace (data_type + "_", "");
						var node_text = this.GetLocaleText (locale_name);
						switch (data_type)
						{
							case "joLocaleText": 	joDOM.AddText (thisobj, node_text); break;
							case "joLocaleAlt": 	
								joDOM.SetAttribute (thisobj, "alt", node_text); 
							break;
							case "joLocaleValue": 	joDOM.SetAttribute (thisobj, "value", node_text); break;
							case "joLocaleTitle": 	joDOM.SetAttribute (thisobj, "title", node_text); break;
						}
					}
				}	
			}
		}
	}
}

/* ********************************************************************************************************** */

function _joGUI_GetLocaleText (text_id)
{
	var result = "";
	try
	{
		var text_list = this.xmlData.getElementsByTagName ("locale_text");
		var text_resource;
	
		for (var i = 0; result == "" && i < text_list.length; i++)
		{
			text_resource = text_list[i];
	
			if (text_resource.getAttribute("id") == text_id)
			{
				result = text_resource.getElementsByTagName (this.langID)[0].firstChild.data;
			}
		}
	}
	catch (e)
	{
		result = "+++" + text_id + "+++";
	}

	return result;
}

/* ********************************************************************************************************** */

function _joGUI_GetLocaleTitle (title_parent_node, title_node_name)
{
	var result = "";
	if (!title_node_name) title_node_name = "title";
	var title_node = title_parent_node.getElementsByTagName (title_node_name)[0];
	if (title_node) result = title_node.getElementsByTagName (this.langID)[0].firstChild.nodeValue;
	return result;
}

/* ********************************************************************************************************** */
<!-- Dialogs -->
/* ********************************************************************************************************** */

function _joGUI_OpenModalDialog (dialog_id, dialog_width, dialog_height, zIndex, form_name, default_button)
{
	var form_node 			= joDOM.GetForm (form_name);
	var default_node		= null;
	
	if (zIndex == null || zIndex == "") zIndex = 2;

	this.ShowShadow (dialog_id, zIndex - 1);

	joCenterPopupDiv (dialog_id, dialog_width, dialog_height);
	joFIND (dialog_id).style.zIndex = zIndex;
	joShowPopupByName (dialog_id);
	
	
	if (form_node)
	{
		if (form_node.elements.length && default_node && default_button != "")
				default_node = form_node.elements[default_button];
		else	default_node = form_node.elements[0];
	}
	
	if (default_node && !default_node.disabled && default_node.style.visibility != "hidden" && default_node.style.display != "none" && default_node.type != "hidden") default_node.focus();
}

/* ********************************************************************************************************** */

function _joGUI_HideShadow (dialog_id)
{
	var shadow = joFIND (dialog_id + "_shadow");
	if (shadow)
	{
		document.body.removeChild (shadow);
		shadow = null;
	}
}

/* ********************************************************************************************************** */

function _joGUI_ShowShadow (dialog_id, zIndex)
{
	if (!joFIND (dialog_id + "_shadow"))
	{
		var modal_shadow				= document.createElement ('DIV');
		modal_shadow.id 				= dialog_id + "_shadow";
		modal_shadow.className 	= "modal_shadow fullwindow";
		modal_shadow.innerHTML 	= '<span></span>';
		modal_shadow.style.zIndex	= zIndex;
		document.body.appendChild (modal_shadow);
	}
}

/* ********************************************************************************************************** */

function _joGUI_CloseModalDialog (dialog_id, remove_node)
{
	this.HideShadow (dialog_id);
	joHidePopupByName (dialog_id);
	
	if (remove_node == true)
	{
		var node			= joFIND (dialog_id);
		if (node)
		{
			var del_dlg 	= document.body.removeChild (node);
			del_dlg 			= null;
		}
	}
}

/* ********************************************************************************************************** */
<!-- Forms -->
/* ********************************************************************************************************** */

function _joGUI_BuildForm (form_node_name, gui_canvas_node, data_obj)
{
	var elements, element;
	var input_node;
	var validator, field_type, field_type;
	
	this.list_data_source	= data_obj;
	var form 					= joDOM.GetSubNode (this.xmlData, "forms/form", form_node_name);

	if (form)
	{
		var form_style				= joDOM.GetAttribute (form, "form_style", "dialog");
		
		switch (form_style)
		{
			case "dialog":
			{
				var table_node, tr_node, td_node;
				table_node 	= joAddTableChildNode (gui_canvas_node, "table_form");
				
				elements = form.childNodes;
				for (var j = 0; j < elements.length; j++)
				{
					element = elements[j];
					
					if (element.nodeType != 3)
					{
						
						switch (element.nodeName)
						{
							case "ruler":
							{
								tr_node 										= joAddHTMLChildNode (table_node, "TR", "");
									td_node 									= joAddHTMLChildNode (tr_node, "TD", "gap");
										td_node.colSpan					= 2;
										td_node.innerHTML					= "<span></span>";
								tr_node 										= joAddHTMLChildNode (table_node, "TR", "");
									td_node 									= joAddHTMLChildNode (tr_node, "TD", "ruler");
										td_node.colSpan					= 2;
										td_node.innerHTML					= "<span></span>";
								tr_node 										= joAddHTMLChildNode (table_node, "TR", "");
									td_node 									= joAddHTMLChildNode (tr_node, "TD", "gap");
										td_node.colSpan					= 2;
										td_node.innerHTML					= "<span></span>";
								break;
							}
						
							case "image":
							{
								tr_node 										= joAddHTMLChildNode (table_node, "TR", "");
									td_node 									= joAddHTMLChildNode (tr_node, "TD", "image");
										td_node.colSpan					= 2;
										var img_node 						= joAddHTMLChildNode (td_node, "IMG");
											img_node.src					= "images/" + element.getAttribute ("image_name");
									break;
							}
						
							case "field":
							{
								field_type									= joDOM.GetFirstChildNode (element.getElementsByTagName ("field_gui")[0]);
								
									//..........................................................................title cell
									tr_node 									= joAddHTMLChildNode (table_node, "TR", "");
										td_node 								= joAddHTMLChildNode (tr_node, "TD", "title");
											if (field_type.nodeName != "field_hidden")
											{
												joDOM.AddText 				(td_node, this.GetLocaleTitle (element));
												validator					= element.getElementsByTagName("validator")[0];
												field_type					= element.getElementsByTagName("field_gui")[0].firstChild;
												if (field_type.nodeType == 3) 
														field_type 			= field_type.nextSibling;
												this.ShowValidatorInfo (td_node, validator, field_type.nodeName);
											}							
										
										//.....................................................................form field cell
										td_node 								= joAddHTMLChildNode (tr_node, "TD", "data");
											input_node						= this.ShowFormField (td_node, element);
								break;
							}
						}
					
					}					
				}
				break;
			}
			
			case "embedded":
			{
				elements = form.childNodes;
				for (var j = 0; j < elements.length; j++)
				{
					element = elements[j];
					if (element.nodeType != 3)
					{
						
						joDOM.AddText (gui_canvas_node, this.GetLocaleTitle (element) + " ");
						
						// form field cell
						input_node	= this.ShowFormField (gui_canvas_node, element);
					}					
				}
				break;
			}	
		}
	}
}

/* ********************************************************************************************************** */

function _joGUI_ShowValidatorInfo (parent_node, validator_element, field_type)
{
	var mandatory_state			= joDOM.GetAttribute (validator_element, "mandatory_state", "0");
	var data_type;
	
	switch (field_type)
	{
		case "field_select":
		case "field_list":
			data_type 				= "list"; 
			break;
		case "field_color":
			data_type 				= "color"; 
			break;
		default:
			data_type				= joDOM.GetAttribute (validator_element, "data_type", "0");
			break;
	}
	
	var info_node					= joAddHTMLChildNode (parent_node, "SPAN", "type_info");
		info_node.title			= joGUI.GetLocaleText ("type_" + data_type);
		info_node.innerHTML		= "i";
}

/* ********************************************************************************************************** */

function _joGUI_ShowFormField (parent_node, field_element)
{
	var comment			= this.GetLocaleTitle (field_element, "comment");
	var field_type		= joDOM.GetFirstChildNode (field_element.getElementsByTagName ("field_gui")[0]);
	var field_size		= joDOM.GetAttribute (field_type, "size", 10);
	var input_node		= null;
	var validator		= field_element.getElementsByTagName("validator")[0];
	var length_max		= joDOM.GetAttribute (validator, "length_max", "0") - 0;
	var default_val	= joDOM.GetAttribute (field_element, "data_default", "");
	var field_id		= field_element.getAttribute("id");

	switch (field_type.nodeName)
	{
		case "field_edit":
		{
			input_node = joAddFormFieldChildNode (parent_node, "text", field_id, "input", field_size, length_max, comment);
			this.AddFieldValidator (input_node, field_element);
			this.ValidateFormField (input_node, false);
			if  (default_val)
			{
				input_node.value = default_val;
				joGUI.ValidateFormField (input_node, true);
			}
			break;
		}	
		case "field_hidden":
		{
			input_node = joAddFormFieldChildNode (parent_node, "hidden", field_id, "input");
			if  (default_val)
			{
				input_node.value = default_val;
			}
			break;
		}	
		case "field_checkbox":
		{
			input_node = joAddFormFieldChildNode (parent_node, "checkbox", field_id, "checkbox");
			break;
		}	
		case "field_color":
		{
			var color_picker_node = joAddHTMLChildNode (parent_node, "DIV", "jo_color_picker input", field_id);
			joAddEvent (color_picker_node, "click", joCallColorPicker);
			joAddEvent (color_picker_node, "keyup", joCallColorPicker);
			if  (default_val)
			{
				//color_picker_node.style.backgroundColor = "#ff00ff"; ???
			}
			break;
		}	
		case "field_list":
		{
			var list_obj 				= joDOM.GetFirstChildNode (joDOM.GetSubNode (field_element, "field_gui"));
			var list_type 				= joDOM.GetAttribute (list_obj, "entity_name");
			var with_empty_value 	= joNumCheck (joDOM.GetAttribute (list_obj, "with_empty_value", "false"), "boolean");

			var options = this.list_data_source.GetListValues (list_type);
			if ((options && options.length) || with_empty_value)
			{
				var select_node, option_node;
				
				select_node = joAddHTMLChildNode (parent_node, "SELECT", "", field_id);
				if (with_empty_value)
				{
					option_node 					= joAddHTMLChildNode (select_node, "OPTION");
						option_node.value			= "";
						option_node.innerHTML 	= this.GetLocaleText ("none");
				}
				for (var i = 0; options && i < options.length; i++)
				{
					option_node 					= joAddHTMLChildNode (select_node, "OPTION");
						option_node.value			= options[i];
						option_node.innerHTML 	= options[i];
				}
			}
			break;
		}
		case "field_select":
		{
			var select_node, option_node, title, value;
			
			select_node = joAddHTMLChildNode (parent_node, "SELECT", "", field_id);
			
			
			elements = field_type.childNodes;
			for (var j = 0; j < elements.length; j++)
			{
				element = elements[j];
				if (element.nodeType != 3)
				{
					title 							= this.GetLocaleTitle (element);
					value								= joDOM.GetAttribute (element, "value");
					option_node 					= joAddHTMLChildNode (select_node, "OPTION");
						option_node.value			= value;
						option_node.innerHTML 	= (title == "" ? value : title);

				}					
			}
			
			break;
		}
	}
	
	return input_node;
}

/* ********************************************************************************************************** */

function _joGUI_AddFieldValidator (field_node, field_element)
{
	var validator					= field_element.getElementsByTagName("validator")[0];
	var validator_attributes	= this._AddFieldValidatorAttribString (validator, "data_type", "") + "," 
										+ this._AddFieldValidatorAttribString (validator, "mandatory_state", "") + "," 
										+ this._AddFieldValidatorAttribString (validator, "length_min", -1) + "," 
										+ this._AddFieldValidatorAttribString (validator, "length_max", -1);

	field_node.setAttribute ("mandatory_inherit_field_id", joDOM.GetAttribute (validator, "mandatory_inherit_field_id", ""));
	field_node.setAttribute ("validator_attributes", validator_attributes);
	joAddEvent (field_node, "keyup", joCallValidator);
	joAddEvent (field_node, "change", joCallValidator);
	joAddEvent (field_node, "blur", joCallValidator);
}

/* ********************************************************************************************************** */

function _joGUI_AddFieldValidatorAttribString (validator, attribute_name, default_value)
{
	return attribute_name + ':' + joDOM.GetAttribute (validator, attribute_name, default_value);
}

/* ********************************************************************************************************** */

function _joGUI_ShowFieldValidState (field_node, valid, set_form_valid_state)
{
	if (field_node)
	{
//		field_node.style.borderColor = valid ? joGUI_COL_FIELD_VALUE_OK : joGUI_COL_FIELD_VALUE_INVALID;
//		field_node.style.borderWidth = valid ? "1" : "2";
		field_node.style.backgroundColor = valid ? joGUI_COL_FIELD_VALUE_OK : joGUI_COL_FIELD_VALUE_INVALID;
		field_node.setAttribute ("valid", valid ? "1" : "0");
		
		if (set_form_valid_state) this.ShowFormValidState (field_node.form, field_node)
	}
}

/* ********************************************************************************************************** */

function _joGUI_ShowFormValidState (form_node, field_node)
{
	var result = true;
	for (var i = 0; result && i < form_node.elements.length; i++)
	{
		if (joDOM.GetAttribute (form_node.elements[i], "valid", "1") == "0") result = false;
	}
	
	joDOM.SetAttribute (form_node, "vmm_ok", result ? "true" : "false");
	
	var ok_button = joDOM.GetFormElement (form_node, "button_ok");
	if (ok_button) 
	{
		ok_button.disabled = !result;
	}
	
	if (this.OnUpdateFormStatusCallback)
	{
		(this.OnUpdateFormStatusCallback) (form_node, result, field_node);
	}
}

/* ********************************************************************************************************** */

function joCallValidator (event)
{
	var event_node = (window.event) ? event.srcElement : objSrc = event.target;	// browser incompatibilities
	var valresult = joGUI.ValidateFormField (event_node, true);

	/* ??? not working :-(
	if (valresult && event.type == "blur")
	{
		//event_node.focus();
		event_node.select();
		return false;
	}
	*/
}

/* ********************************************************************************************************** */

function _joGUI_ValidateFormField (form_field, set_form_valid_state)
{
	var result 								= null;
	var field_ok							= true;
	var attribs 							= (form_field.getAttribute ("validator_attributes")).split(",");
	var mandatory_inherit_field_id 	= form_field.getAttribute ("mandatory_inherit_field_id");
	var form_value							= form_field.value;
	var form_value_length;
	var attrib;
	var attrib_name;
	var attrib_value;
	var v = new Array();
	
	//...................................init validator (v)
	for (var i = 0; i < attribs.length; i++)
	{
		attrib = attribs[i].split(":");
		v[attrib [0]] = "" + attrib [1];
	}
	
	try
	{
		form_value_length = form_value.length;
		
		if (v["mandatory_state"] == "mandatory" && form_value == "") throw "Empty";
		
		if (v["mandatory_state"] == "inherited" && mandatory_inherit_field_id != "")
		{
			var inherit_field = joGetFormField (form_field.form, mandatory_inherit_field_id);
			var inherit_field_value_length = inherit_field.value.length;
			if ((form_value_length ? 1 : 0) != (inherit_field_value_length ? 1 : 0)) throw "Dependency";
		}
				
		if (v["length_min"] != -1 && form_value_length < v["length_min"] && form_value_length) throw "Min Length";
		if (v["length_max"] != -1 && form_value_length > v["length_max"]) throw "Max Length";
		
		// ??? check data type
		if (form_value_length)
		{
			var valtype = "";
			switch (v["data_type"])
			{
				case "integer":							valtype = "int";	break;
				case "integer_positive":				valtype = "posint";	break;
				case "integer_zero_or_positive":	valtype = "uint";	break;
				case "float":								valtype = "float";	break;
				case "float_positive":					valtype = "posfloat";	break;
				case "float_zero_or_positive":		valtype = "ufloat";	break;
				case "complex":							valtype = "complex";	break;
				case "complex_positive":				valtype = "ucomplex";	break;
				case "id":
				{
					var regex_name			= /^[a-zA-Z]+[a-zA-Z0-9_]*$/;
					if (form_value.search (regex_name) == -1) throw "Data Type";
					break;
				}
			}
			if (valtype != "" && !joNumCheck (form_value, valtype)) throw "Data Type";
		}
	}
	catch (e) { field_ok = false; result = form_field; }
	
	//................................check inheriting fields
	for (var j = 0; !result && j < form_field.form.elements.length; j++)
	{
		if (form_field.form.elements[j].getAttribute ("mandatory_inherit_field_id") == form_field.name)
		{
			this.ValidateFormField (form_field.form.elements[j], set_form_valid_state);
		}
	}
	
	// set state now
	this.ShowFieldValidState (form_field, field_ok, set_form_valid_state);
	
	return result;
}

/* ********************************************************************************************************** */

function _joGUI_ShowControlHeader (parent_node, title)
{
	var control_header			= joAddHTMLChildNode (parent_node, "DIV", "joControlHeader");


	var header_title				= joAddHTMLChildNode (control_header, "P", "title");
	header_title.innerHTML 	= title;
	
	var header_close				= joAddHTMLChildNode (control_header, "P", "close");
	header_close.onmouseover	= function () { this.className = "close_active"; }
	header_close.onmouseout	= function () { this.className = "close"; }
	header_close.onclick		= function () { joGUI.HideControl (color_control); }
	header_close.innerHTML 	= "x";

	// control gets movable
	parent_node.onmousedown 		= joInitMoveDiv;
	control_header.onmousedown 	= joInitMoveDivActivator;
}

/* ********************************************************************************************************** */

var color_picker;
var color_control = null;

function _joGUI_ShowColorControl (input_node, zIndex)
{
	color_picker					= input_node;

	if (!color_control) // first time initialization
	{
		color_control 			= joAddHTMLChildNode (document.body, "DIV", "jo_color_control", "jo_color_control");
		this.ShowControlHeader (color_control, this.GetLocaleText ("color"));
		color_control.style.zIndex = zIndex;
		
		var color_node_web 	= joAddHTMLChildNode (color_control, "DIV", "color_web");
		
		for (var r = 15; r >= 0; r -= 3)
		{
			for (var g = 0; g <= 15; g += 3)
			{
				for (var b = 0; b <= 15; b += 3)
				{
					var red = baseConverter (r,10,16) + '';
					var green = baseConverter (g,10,16) + '';
					var blue = baseConverter (b,10,16) + '';
					
					var color = '#' + red + red + green + green + blue + blue;
					var div = document.createElement('DIV');
					div.setAttribute ('rgbColor', color);
					div.style.backgroundColor 	= color;
					div.innerHTML 						= '<span></span>';
					div.className						= 'jo_color_square';
					div.title 							= color;	
					div.onclick 						= function() { color_picker.style.backgroundColor = this.style.backgroundColor; joGUI.HideControl (color_control); };
					div.onmouseover					= function() { joFIND ('jo_color_active').style.backgroundColor = this.style.backgroundColor };
					color_node_web.appendChild (div);
				}
			}
		}
		var active_color				= joAddHTMLChildNode (color_control, "DIV", "jo_color_active", "jo_color_active");
		active_color.innerHTML 	= "<span></span>";
	}
	
	joShowDiv (color_control);

	this.ShowShadow ("jo_color_control", zIndex - 1);
	this.MoveControl (color_control, input_node);
}

/* ********************************************************************************************************** */
	
function _joGUI_MoveControl (control_node, position_inherit_node)
{
	control_node.style.left 	= this.GetDependendLeftPos (position_inherit_node) + 2 + 'px';
	control_node.style.top 	= this.GetDependendTopPos (position_inherit_node) + position_inherit_node.offsetHeight + 4 + 'px';
}

/* ********************************************************************************************************** */
	
function _joGUI_HideControl (control_node)
{
	if (control_node)
	{
		joGUI.HideShadow (control_node.id);
		joHideDiv (control_node);
	}
}

/* ********************************************************************************************************** */
	
function _joGUI_GetDependendLeftPos (inputObj)
{
  var returnValue = inputObj.offsetLeft;
  while ((inputObj = inputObj.offsetParent) != null) returnValue += inputObj.offsetLeft;
  return returnValue;
}

/* ********************************************************************************************************** */
	
function _joGUI_GetDependendTopPos (inputObj)
{
	var returnValue = inputObj.offsetTop;
	while((inputObj = inputObj.offsetParent) != null) returnValue += inputObj.offsetTop;
	return returnValue;
}

/* ********************************************************************************************************** */

function joCallColorPicker (event)
{
	var event_node = (window.event) ? event.srcElement : objSrc = event.target;	// browser incompatibilities
	joGUI.ShowColorControl (event_node, 60);
}

/* ********************************************************************************************************** */

function _joGUI_FillForm (html_form_node, data_node, gui_form_node_name)
{
	var gui_form_node = joDOM.GetSubNode (this.xmlData, "forms/form", (gui_form_node_name && gui_form_node_name != "") ? gui_form_node_name : html_form_node.name);

	if (gui_form_node)
	{
		var fields = gui_form_node.getElementsByTagName ("field");
		var field;
		var data = "";
		var html_field_name, field_node, html_field_type;
		
		for (var i = 0; i < fields.length; i++)
		{
			field 				= fields[i];
			data					= "";
			html_field_name	= joDOM.GetAttribute (field, "id");
			html_field_type 	= joDOM.GetFirstChildNode (joDOM.GetSubNode (field, "field_gui")).nodeName;
			
			// init with data
			if (data_node)
			{
				var data_attrib, data_path, gui_node;
				gui_node 			= data_node;
				data_attrib 		= joDOM.GetAttribute (field, "data_attribute");
				data_path 			= joDOM.GetAttribute (field, "data_path");
				
				if (data_path != "") 
				{
					var path_parts = data_path.split ("/");
					for (var j = 0; gui_node && j < path_parts.length; j++)
					{
						gui_node = gui_node.FindNode (path_parts[j]);
					}
				}
				if (data_attrib != "")
				{
					if (gui_node)
					{
						data = gui_node.GetAttribute (data_attrib);
					}
				}
				else	
				{
					data = joDOM.GetNodeValue (gui_node);
				}
			}
		
			// set data and validate form fields
			switch (html_field_type)
			{
				case "field_edit":
				{
					field_node = joGetFormField (html_form_node, html_field_name);
					if (field_node) 
					{
						field_node.value = data;
						this.ValidateFormField (field_node, false);
					}
					break;
				}
				case "field_hidden":
				{
					field_node = joGetFormField (html_form_node, html_field_name);
					if (field_node) field_node.value = data;
					break;
				}
				case "field_checkbox":
				{
					field_node = joGetFormField (html_form_node, html_field_name);
					if (field_node && joIsBoolean (data))
					{
						field_node.checked = true;
					}
					break;
				}
				case "field_color":
				{
					field_node = joDOM.GetNode (html_field_name);
					if (field_node) field_node.style.backgroundColor = data;
					break;
				}
				case "field_select":
				case "field_list":
				{
					field_node = joDOM.GetNode (html_field_name);
					if (field_node)
					{
						for (var j = 0; j < field_node.options.length; j++)
						{
							if (field_node.options[j].value == data)
							{
								field_node.options[j].selected = "selected";
								break;
							}
						}
					}
					break;
				}	
			}
		}
	}
	
	this.ShowFormValidState (html_form_node, null); // really to be called at form building already?: yes, if no data loaded
}

/* ********************************************************************************************************** */

function _joGUI_SaveForm (html_form_node, data_collection_node, data_name, data_node, gui_form_node_name)
{
	var gui_form_node = joDOM.GetSubNode (this.xmlData, "forms/form", (gui_form_node_name && gui_form_node_name != "") ? gui_form_node_name : html_form_node.name);

	var fields = gui_form_node.getElementsByTagName ("field");
	var field;
	var data = "";
	var html_field_name, field_node, html_field_type;
	
	if (!data_node)
	{
		data_node = data_collection_node.AppendNode (data_name);
	}
	
	for (var i = 0; i < fields.length; i++)
	{
		field 				= fields[i];
		html_field_name	= joDOM.GetAttribute (field, "id");
		html_field_type 	= joDOM.GetFirstChildNode (joDOM.GetSubNode (field, "field_gui")).nodeName;
		
		// set data and validate form fields
		switch (html_field_type)
		{
			case "field_password":
			case "field_hidden":
			case "field_edit":
			{
				field_node = joGetFormField (html_form_node, html_field_name);
				if (field_node) data = field_node.value;
				break;
			}
			case "field_checkbox":
			{
				field_node = joGetFormField (html_form_node, html_field_name);
				data = field_node.checked ? "true" : "false";
				break;
			}
			case "field_color":
			{
				field_node = joDOM.GetNode (html_field_name);
				if (field_node) 
				{
					data = (field_node.style.backgroundColor != "" ? field_node.style.backgroundColor : "#ffffff");
				}
				
				break;
			}	
			case "field_select":
			case "field_list":
			{
				field_node = joDOM.GetNode (html_field_name);
				for (var j = 0; j < field_node.options.length; j++)
				{
					if (field_node.options[j].selected)
					{
						data = field_node.options[j].value;
						break;
					}
				}
				break;
			}
		}

		var data_attrib, data_path, gui_node;
		gui_node 			= data_node;
		data_attrib 		= joDOM.GetAttribute (field, "data_attribute");
		data_path 			= joDOM.GetAttribute (field, "data_path");
		
		if (data_path != "") 
		{
			var path_parts = data_path.split ("/");
			for (var j = 0; gui_node && j < path_parts.length; j++)
			{
				gui_node = gui_node.FindNode (path_parts[j], true);
			}
		//	gui_node = data_node.FindNode (data_path, true);
		}
		
		if (data_attrib != "")
				gui_node.SetAttribute (data_attrib, data);
		else	gui_node.SetData (data);	
	}
	return data_node;
}

/* ********************************************************************************************************** */

function _joGUI_Alert (msg_str, msg_type, alert_buttons, fallback_function, fallback_data)
{
	var msg_title, dialog_node, title_node, content_node, footer_node, message_node, button_node;
	switch (msg_type)
	{
			case joGUI_ALERT_TYPE_WARNING:
				msg_title = this.GetLocaleText ("joGUI_warning");
			break;
			case joGUI_ALERT_TYPE_ERROR:
				msg_title = this.GetLocaleText ("joGUI_error");
			break;
			case joGUI_ALERT_TYPE_NOTE:
			default:
				msg_title = this.GetLocaleText ("joGUI_note");
			break;
	}
	if (msg_title == "") msg_type = "Alert";

	dialog_node									= joAddHTMLChildNode (document.body, "DIV", "joMovableDiv joDialog", "joGUI_alert");
		dialog_node.onmousedown 			= joInitMoveDiv;
		title_node								= joAddHTMLChildNode (dialog_node, "DIV", "joMovableActivator joDialogHeader");
			title_node.innerHTML 			= msg_title;
			title_node.onmousedown 		= joInitMoveDivActivator;
			
		content_node							= joAddHTMLChildNode (dialog_node, "DIV");
			message_node						= joAddHTMLChildNode (content_node, "P", "joGUI_alert_message");
				message_node.innerHTML 	= msg_str;
			
		footer_node								= joAddHTMLChildNode (dialog_node, "DIV", "joDialogFooter");
			button_node;
		
				if (alert_buttons & joGUI_ALERT_BUTTON_OK)
				{
					button_node					= joAddHTMLChildNode (footer_node, "BUTTON", "joTextButton");
					button_node.innerHTML	= joGUI.GetLocaleText ("ok");
					button_node.onclick		= function() { if (fallback_function) eval (fallback_function) (joGUI_ALERT_BUTTON_OK, fallback_data); joGUI.CloseModalDialog ("joGUI_alert", true) };
					joDOM.SetAttribute 		(button_node, "name", "button_ok");
					joDOM.SetAttribute 		(button_node, "title", joGUI.GetLocaleText ("ok"));
				}
				if (alert_buttons & joGUI_ALERT_BUTTON_CANCEL)
				{
					button_node					= joAddHTMLChildNode (footer_node, "BUTTON", "joTextButton");
					button_node.innerHTML	= joGUI.GetLocaleText ("cancel");
					button_node.onclick		= function() { if (fallback_function) eval (fallback_function) (joGUI_ALERT_BUTTON_CANCEL, fallback_data); joGUI.CloseModalDialog ("joGUI_alert", true) };
					joDOM.SetAttribute 		(button_node, "name", "cancel");
					joDOM.SetAttribute 		(button_node, "title", joGUI.GetLocaleText ("cancel"));
				}
			
	joGUI.OpenModalDialog ("joGUI_alert", 300, -1, 100);		
}

