/* ********************************************************************************************************** */

var joVMM = new joVMMData();

/* ********************************************************************************************************** */

var REGEX_ENTITY_ID							= "[a-zA-Z]+[a-zA-Z0-9_]*";
var REGEX_MACRO_ID							= "\\$" + REGEX_ENTITY_ID;

var REGEX_MACRO_REPETITOR					= "(\\{[+]?[1-9]+[0-9]*\\})?";
var REGEX_ENTITY_DIMENSION_FLOAT		= "(\\([+]?\\d+(\\.\\d+)?([eEdD][+-]?\\d+)?\\))";
var REGEX_ENTITY_DIMENSION_COMPLEX		= "(\\([+]?\\d+(\\.\\d+)?([eEdD][+-]?\\d+)?(,[+]?\\d*(\\.\\d+)?([eEdD][+-]?\\d+)?)*\\))";
var REGEX_FILENAME							= "[0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_]*";

/* ********************************************************************************************************** */

var regex_name									= new RegExp ("^" + REGEX_ENTITY_ID);
var regex_macro								= new RegExp ("^" + REGEX_ENTITY_ID + REGEX_MACRO_REPETITOR + "$");
var regex_complex								= new RegExp ("^" + REGEX_ENTITY_ID + REGEX_ENTITY_DIMENSION_COMPLEX + "$");
var regex_float								= new RegExp ("^" + REGEX_ENTITY_ID + REGEX_ENTITY_DIMENSION_FLOAT + "$");

/* ********************************************************************************************************** */

function joVMMData()
{
	this.project_name							= "";
	this.xmlData 								= null;
	this.xmlSaveData							= null;
	
	this.Ajax										= null;
	this.NewData 								= _joVMMData_NewData;
	this.LoadData 								= _joVMMData_LoadData;
	this.InitData								= _joVMMData_InitData;
	this.BuildData								= _joVMMData_BuildData;
	this.PostData 								= _joVMMData_PostData;

	this.CheckLogin							= _joVMMData_CheckLogin;
	this.SubmitLogin							= _joVMMData_SubmitLogin;

	this.RemoveFile							= _joVMMData_RemoveFile;
	this.LoadFile 								= _joVMMData_LoadFile;
	this.UserName								= "";
	this.UserDir									= "";
	
	this.LastEditedEntity					= null;
	
	this.entities								= new Array();
	this.RemoveEntity							= _joVMMData_RemoveEntity;
	this.CopyEntity							= _joVMMData_CopyEntity;
	this.AddEntity								= _joVMMData_AddEntity;
	this.GetEntityByID						= _joVMMData_GetEntityByID;
	this.EntityHasBodyEntities			= _joVMMData_EntityHasBodyEntities;
	this.EntityIsInUse						= _joVMMData_EntityIsInUse;
	this.EntityIsInDevice					= _joVMMData_EntityIsInDevice;
	this.EntityExistsInCollection		= _joVMMData_EntityExistsInCollection;
	
	this.GetObjectHeight					= _joVMMData_GetObjectHeight;
	this.GetHighestEntityHeight			= _joVMMData_GetHighestEntityHeight;
	this.GetSmallestEntityWidth 			= _joVMMData_GetSmallestEntityWidth;
	
	this.FindDestinationObjects			= _joVMMData_FindDestinationObjects;
	
	this.GetObjectLayerArray				= _joVMMData_GetObjectLayerArray;
	this.CombineObjectLayerArrays		= _joVMMData_CombineObjectLayerArrays;
	this.ObjectCalcLayerHeightsArray	= _joVMMData_ObjectCalcLayerHeightsArray;
	
	this.GetCountSubObjects				= _joVMMData_GetCountSubObjects;
	this.GetListValues 						= _joVMMData_GetListValues;
	
	this.SaveTaskFormData					= _joVMMData_SaveTaskFormData;
	this.PrepareSaveData					= _joVMMData_PrepareSaveData;
	this.PrepareSaveDataNode				= _joVMMData_PrepareSaveDataNode;
	
	this.ValidateDataForSimulation		= _joVMMData_ValidateDataForSimulation;
}

/* ********************************************************************************************************** */

function _joVMMData_SaveTaskFormData()
{
	var simulator = joVMMApp.GetGuiObject ("vmm_device_simulator");

	if (simulator)
	{
		simulator.SaveData();
	}
}

/* ********************************************************************************************************** */

function _joVMMData_PrepareSaveData (as_preview)
{
	this.xmlSaveData = "";
	
	if (this.xmlData && this.xmlData.childNodes && this.xmlData.childNodes.element_first)
	{
		this.xmlSaveData = as_preview ? '{?xml version="1.0" encoding="UTF-8"?}' : '<?xml version="1.0" encoding="UTF-8"?>';
		this.PrepareSaveDataNode (this.xmlData.childNodes.element_first, 0, as_preview);
	}
		
	return this.xmlSaveData;
}

/* ********************************************************************************************************** */

function _joVMMData_PrepareSaveDataNode (node, depth, as_preview)
{
	this.xmlSaveData += (as_preview ? joDEBUG_SCREEN_LINE_FEED : "\n");
	for (i = 0; i < depth; i++)	this.xmlSaveData += (as_preview ? joDEBUG_SCREEN_TAB : "\t");
	
	this.xmlSaveData += (as_preview ? "{" : "<") + node.name;
	
	for (j = 0; node.attributes && j < node.attributes.length; j++)
	{
		this.xmlSaveData += " " + node.attributes[j][0] + '="' + node.attributes[j][1] + '"';
	}
	
	if (node.childNodes.element_first)
	{
		this.xmlSaveData += (as_preview ? "}" : ">");
		
		var child = node.childNodes.element_first;
		while (child)
		{
			this.PrepareSaveDataNode (child, depth + 1, as_preview);
			child = child.element_next;
		}
		
		this.xmlSaveData += (as_preview ? joDEBUG_SCREEN_LINE_FEED : "\n");
		for (i = 0; i < depth; i++)	this.xmlSaveData += (as_preview ? joDEBUG_SCREEN_TAB : "\t");

		this.xmlSaveData += (as_preview ? "{/ " : "</") + node.name + (as_preview ? "}" : ">");
	}
	else
	{
		this.xmlSaveData += (as_preview ? "/}" : "/>");
	}
}

/* ********************************************************************************************************** */

function _joVMMData_SubmitLogin (username, password)
{
	var http_params		= "user=" + username + "&pass=" + password;
	var php_filename		= joGUI.GetLocaleText("php_path") + "/pass_check.php";
   this.Ajax 				= new Ajax.Request (php_filename, { method: 'post', parameters: http_params, onComplete: function (filedata) { joVMM.CheckLogin (filedata.responseText) } } );
}

/* ********************************************************************************************************** */

function _joVMMData_CheckLogin (result)
{
	if (result != "")
	{
		result = result.split("\n")[0];
		this.UserName 	= joGetFormField (document.dialog_login_form, "username").value;
		this.UserDir 	= this.UserName + "." + result + "/";

		if (JO_DEBUG) joFIND ("info_username").innerHTML = joGUI.GetLocaleText ("user") + ":<b> " + this.UserName + "</b>";
		joGUI.CloseModalDialog ('dialog_login');
		joOnLogin();
	}
	else
	{
		alert (joGUI.GetLocaleText ("invalid_login"));
		joGetFormField (document.dialog_login_form, "password").value = "";
		joGetFormField (document.dialog_login_form, "password").focus();
	}
}

/* ********************************************************************************************************** */

function _joVMMData_PostData (script_filename, post_params, fallback_function, param1)
{
	script_filename 		= joGUI.GetLocaleText("php_path") + "/" + script_filename;
   this.Ajax 				= new Ajax.Request (script_filename, { method: 'post', parameters: post_params, onComplete: function (filedata) { fallback_function (filedata.responseText, param1) } } );
}

/* ********************************************************************************************************** */

function _joVMMData_NewData()
{
	joVMMApp.GetGuiObject("vmm_device_simulator").ResetTaskForm();
	
	joVMM.project_name = "";
	this.LoadData ("vmm_template_" + joGUI.langID + ".xml", true);
}

/* ********************************************************************************************************** */

function _joVMMData_LoadData (file_name, from_root)
{
	joVMMApp.GetGuiObject("vmm_device_simulator").ResetTaskForm();
	
	var file_path 			= joGUI.GetLocaleText("file_path") + "/" + (from_root ? "" : this.UserDir) + file_name;

	this.xmlData 			= null;
	this.project_name		= (from_root ? "" : file_name.substr (0, file_name.lastIndexOf(".")));
	this.xmlData 			= new joTreeNodeClass (this, "#document");
   this.Ajax 				= new Ajax.Request (file_path, { method: 'get', onComplete: function (filedata) { joVMM.InitData (filedata.responseXML); } } );
}

/* ********************************************************************************************************** */

function _joVMMData_LoadFile (file_name, fallback_function)
{
	var file_path 			= joGUI.GetLocaleText("file_path") + "/" + this.UserDir + file_name;
   this.Ajax 				= new Ajax.Request (file_path, { method: 'get', onComplete: function (filedata) { fallback_function (filedata.responseText); } } );
}

/* ********************************************************************************************************** */

function _joVMMData_InitData (filedata)
{
	this.filedata 							= filedata;
	this.BuildData 						(filedata.getElementsByTagName ("oee_vmm")[0], this.xmlData.childNodes);
	
	var entities							= this.xmlData.FindNode ("entities");
	
	this.entities["material"]			= entities.FindNode ("materials");
	this.entities["object"]			= entities.FindNode ("objects");
	this.entities["macro"]				= entities.FindNode ("macros");
	this.entities["device"]			= this.xmlData.FindNode ("device");
	
 	joFIND ("vmm_device_model_Body").innerHTML = joVMM.project_name;
	joOnInitData();
	joVMMApp.ActivateMenu();
}

/* ********************************************************************************************************** */

function _joVMMData_BuildData (source_node, dest_parent_obj)
{
	if (source_node.nodeType == 1)
	{
		var nodeName 				= source_node.nodeName;
		var new_dest_obj			= new joTreeNodeClass (dest_parent_obj, nodeName);
		dest_parent_obj.AppendElement (new_dest_obj);
		
		for (var i = 0; i < source_node.attributes.length; i++)
		{
			new_dest_obj.SetAttribute (source_node.attributes[i].nodeName, source_node.attributes[i].nodeValue);
		}
		
		for (var i = 0; i < source_node.childNodes.length; i++)
		{
			this.BuildData (source_node.childNodes[i], new_dest_obj.childNodes);
		}
	}
	else if (source_node.nodeType == 3 && escape (source_node.data.charAt(0)) != "%0A") 
	{
		dest_parent_obj.parent.data = source_node.data;
	}
}

/* ********************************************************************************************************** */

function _joVMMData_RemoveEntity (data_collection_name, data_name, entity_id)
{
	var result = false;
	var del_collection	= this.xmlData.FindNode (data_collection_name);
	if (del_collection) result = del_collection.RemoveNode (data_name, "id", entity_id);
	return result;
}

/* ********************************************************************************************************** */

function _joVMMData_CopyEntity (data_collection_name, data_name, entity_id)
{
	var new_node = null;
	var copy_collection	= this.xmlData.FindNode (data_collection_name);

	if (copy_collection)
	{
		var source_node = copy_collection.FindNodeByAttribute (data_name, "id", entity_id);
		if (source_node)
		{
			new_node = source_node.CopyNode (source_node.parent);
			copy_collection.childNodes.AppendElement (new_node, null);
			
			var new_node_id = new_node.GetAttribute ("id") + "_new";
			
			while (this.EntityExistsInCollection (new_node_id, copy_collection))
			{
				new_node_id += "_new";
			}
			
			
			new_node.SetAttribute ("id", new_node_id);
		}
	}

	return new_node;
}

/* ********************************************************************************************************** */

function _joVMMData_EntityHasBodyEntities (entity)
{
	var result = false;
	
	if (entity)
	{
		var entity_body 	= entity.FindNode ("body", false);
		if (entity_body && entity_body.childNodes && entity_body.childNodes.element_first) result = true;
	}
	
	return result;
}

/* ********************************************************************************************************** */

function _joVMMData_EntityExistsInCollection (entity_id, data_collection)
{
	var result = false;
	if (data_collection && data_collection.childNodes && data_collection.childNodes.element_first)
	{
		element = data_collection.childNodes.element_first;
		while (element && !result)
		{
			element_id = element.GetAttribute ("id");
			if (element_id == entity_id) result = true;
			else element = element.element_next;		
		}
	}
	return result;
}

/* ********************************************************************************************************** */

function _joVMMData_EntityIsInDevice (entity_type_name, entity_id)
{
	var result 					= false;
	var object_list			= joVMMApp.GetGuiObject ("vmm_" + entity_type_name + "_list");

	if (object_list)
	{
		var dest_objects 			= [];
		var dest_object_ids 	= [];
		for (var i = 0; i < object_list.destination_data_types.length && !dest_objects.length; i++)
		{
			joVMM.FindDestinationObjects (object_list.data_name, entity_id, object_list.destination_data_types[i], dest_objects, dest_object_ids);
		}
		
		var count_objs = dest_objects.length;
		
		if (count_objs) // entity in use
		{
			// if objects are reffered in macros these macros should also be in device - check for input file production
			
			if (1) // mandatory_in_device)
			{
				var macro_list = joVMMApp.GetGuiObject ("vmm_macro_list");
				
				for (var i = 0; i < dest_objects.length; i++)
				{
					if (dest_objects[i].name == "macro")
					{
						if (!this.EntityIsInDevice (dest_objects[i].name, dest_objects[i].GetAttribute ("id")))
							count_objs--;
					}
				}
				result = (count_objs ? true : false);
			}
			else
			{
				result = true;
			}
		}	
	}
	return result;
}

/* ********************************************************************************************************** */

function _joVMMData_EntityIsInUse (entity_type_name, entity_id)
{
	var result = "";

	var object_list			= joVMMApp.GetGuiObject ("vmm_" + entity_type_name + "_list");

	if (object_list)
	{
		var dest_objects		 	= new Array();
		var dest_object_ids 	= new Array();
	
		for (var i = 0; i < object_list.destination_data_types.length; i++)
		{
			this.FindDestinationObjects (entity_type_name, entity_id, object_list.destination_data_types[i], dest_objects, dest_object_ids);
		}
		
		if (dest_objects.length) // already in use --> message for user
		{
			
			for (var i = 0; i < dest_objects.length; i++)
			{
				if (i) result += "<br />";
				var dest_object = dest_objects[i];
				if (dest_object.name == "macro" || dest_object.name == "object")
				{
					result 	+= joGUI.GetLocaleText (dest_objects[i].name) + " '" + dest_object_ids[i] + "'";
				}
				else
				{
					result	+= joGUI.GetLocaleText (dest_object_ids[i]);
				}
			}
		}
	}
	return result;
}

/* ********************************************************************************************************** */

function _joVMMData_GetEntityByID (entity_type_name, entity_id)
{
	var result = null;
	
	if (entity_type_name != "" && entity_id != "")
	{
		var entities = this.entities[entity_type_name];
		if (entities && entities.childNodes && entities.childNodes.element_first)
		{
			var entity = entities.childNodes.element_first;
			while (entity && !result)
			{
				if (entity.GetAttribute ("id") == entity_id)
				{
					result = entity;
				}
				else entity = entity.element_next;
			}
		}
	}
	return result;
}

/* ********************************************************************************************************** */

function _joVMMData_AddEntity (parent_node, data_name, data_id)
{
	var add_collection	= this.xmlData.FindNode (data_collection_name);

	var new_dest_obj		= new joTreeNodeClass (add_collection, data_name);
	new_dest_obj.SetAttribute	("id", data_id);

	return new_dest_obj;
}

/* ********************************************************************************************************** */

function _joVMMData_FindDestinationObjects (obj_data_name, obj_data_id, dest_data_name, dest_object_names, dest_object_ids)
{
	var entities	= this.xmlData.FindNode ("entities");
	var obj 			= this.entities[dest_data_name].childNodes.element_first;
	var obj_body, source;

	while (obj)
	{
		obj_body 	= obj.FindNode ("body", false);
		if (obj_body)
		{
			source 		= (obj_body.childNodes) ? obj_body.childNodes.element_first : null;
			
			while (source)
			{
				if (source.name == obj_data_name && source.GetAttribute ("id") == obj_data_id)
				{
					dest_object_names.push (obj);
					dest_object_ids.push (obj.GetAttribute ("id"));
					break;
				}
				source = source.element_next;
			}
		}		
		obj = obj.element_next;
	}
}

/* ********************************************************************************************************** */

function _joVMMData_GetObjectHeight (entity_node)
{
	var result = 0;
	
	if (entity_node)
	{
		switch (entity_node.name)
		{
			case "object":
			{
				var object_body = entity_node.FindNode ("body", false);
				
				if (object_body && object_body.childNodes)
				{
					var material_height;
					
					var material = object_body.childNodes.element_first;
					while (material)
					{
						material_height = joGetRealPartAsFloat (material.GetAttribute ("thickness", 0));
						result += material_height;
						material = material.element_next;
					}
				}
			}
			break;
			
			case "macro":
			{
				var macro_body = entity_node.FindNode ("body", false);
				
				if (macro_body && macro_body.childNodes)
				{
					var object_height = 0;
					var data_entity;
					
					var object = macro_body.childNodes.element_first;
					while (object)
					{
						data_entity = joVMM.entities[object.name].FindNodeByAttribute (object.name, "id", object.GetAttribute ("id"));
						object_height = this.GetObjectHeight (data_entity);
						result = Math.max (result, parseFloat (object_height));
						object = object.element_next;
					}
				}
			}
			
		}
	}
	return result;
}

/* ********************************************************************************************************** */
// entity_node can be either macro or device node
// this function returns the highest sub entity's height
// can call itself recursively (because of possibly embedded macros)
//
function _joVMMData_GetHighestEntityHeight (parent_node)
{
	var result = 0;
	if (parent_node && parent_node.childNodes.element_first)
	{
		var body_entity	= parent_node.childNodes.element_first;
		var data_entity;
		var body_entity_id;
		while (body_entity)
		{
			if (parent_node.name == "device")
			{
				var subbody_obj = body_entity.FindNode ("body", false);
				if (subbody_obj && subbody_obj.childNodes.element_first)
				{
					result = Math.max (result, this.GetHighestEntityHeight (subbody_obj.FindNode ("body", false)));
				}
			}
			else
			{
				body_entity_id = body_entity.GetAttribute ("id");
				data_entity = joVMM.entities[body_entity.name].FindNodeByAttribute (body_entity.name, "id", body_entity_id);
				if (data_entity) result = Math.max (result, this.GetObjectHeight (data_entity));
			}
			body_entity = body_entity.element_next;
		}
	}
	return result;
}

/* ********************************************************************************************************** */

function _joVMMData_GetSmallestEntityWidth (parent_node)
{
	var result = 0;
	if (parent_node && parent_node.childNodes.element_first)
	{
		var body_entity	= parent_node.childNodes.element_first;
		var data_entity;
		var body_entity_id;
		var subbody_entity;
		var subentity;
		while (body_entity)
		{
			if (parent_node.name == "device")
			{
				if (parent_node.childNodes && parent_node.childNodes.element_first)
				{
					var subbody_obj = parent_node.childNodes.element_first;
					while (subbody_obj)
					{
						var subelement_width = this.GetSmallestEntityWidth (subbody_obj.FindNode ("body", false));
						if (subelement_width) result = result ? Math.min (result, subelement_width) : subelement_width;
						
						subbody_obj = subbody_obj.element_next;
					}					
				}
			}
			else if (body_entity.name == "macro")
			{
				body_entity_id = body_entity.GetAttribute ("id");
				data_entity = joVMM.entities[body_entity.name].FindNodeByAttribute (body_entity.name, "id", body_entity_id);

				if (data_entity)
				{
					subbody_entity = data_entity.FindNode ("body", false);
					if (subbody_entity && subbody_entity.childNodes.element_first)
					{
						subentity = subbody_entity.childNodes.element_first;
						while (subentity)
						{
							var entity_width = joGetRealPartAsFloat (subentity.GetAttribute ("width", 0));
							result = result ? Math.min (result, entity_width) : entity_width;
							subentity = subentity.element_next;
						}
					}
				}
			}
			else
			{
				var entity_width = joGetRealPartAsFloat (body_entity.GetAttribute ("width", 0));
				result = result ? Math.min (result, entity_width) : entity_width;
			}
			body_entity = body_entity.element_next;
		}
	}
	return result;
}

/* ********************************************************************************************************** */

function _joVMMData_GetObjectLayerArray (object)
{
	var result 			= [];
	var object_body 	= object.FindNode ("body");
	var old_height		= new joVirtNumber ("0");	
	
	if (object_body && object_body.childNodes.element_first)
	{
		var layer		= object_body.childNodes.element_first;
		while (layer)
		{		
			cum_height	= new joVirtNumber (joGetRealPartAsFloat (layer.GetAttribute ("thickness")) + "");	
			cum_height.Add (old_height);
			old_height.Clone (cum_height);
			result.push (cum_height);
			layer = layer.element_next;
		}			
	}
	
	return result;
}

/* ********************************************************************************************************** */

function _joVMMData_CombineObjectLayerArrays (layers1, layers2)
{
	var result		 			= [];
	var count1		 			= layers1.length;
	var count2		 			= layers2.length;
	var curr1 					= 0;
	var curr2 					= 0;
	
	while (curr1 < count1 || curr2 < count2)
	{
		if (curr1 >= count1)
		{
			result.push (layers2[curr2]);
			curr2++;
		}
		else if (curr2 >= count2)
		{
			result.push (layers1[curr1]);
			curr1++;
		}
		else
		{
			if (layers1[curr1].IsEqualTo (layers2[curr2]))
			{
				result.push (layers1[curr1]);
				curr1++;
				curr2++;
			}
			else if (layers1[curr1].IsSmallerThan (layers2[curr2]))
			{
				result.push (layers1[curr1]);
				curr1++;
			}
			else
			{
				result.push (layers2[curr2]);
				curr2++;
			}
		}
	}
	
	return result;
}

/* ********************************************************************************************************** */

function _joVMMData_ObjectCalcLayerHeightsArray (layers)
{
	if (layers)
	{
		for (var i = layers.length - 1; i; i--)
		{
			layers[i].Subtract (layers[i-1]);
		}
	}
	return layers;
}

/* ********************************************************************************************************** */

function _joVMMData_GetCountSubObjects (device)
{
	var result 			= 0;
	var device_part	= device.childNodes.element_first;
	while (device_part)
	{
		var part_name = device_part.GetAttribute ("id");
		var elements = device_part.FindNode ("body");
		if (elements && part_name != "FrameTop" && part_name != "FrameBottom")
		{
			var element = elements.childNodes.element_first;
			while (element)
			{
				if (element.name == "object") 
				{
					result++;
				}
				else 
				{
					var macro = joVMM.entities["macro"].FindNodeByAttribute ("macro", "id", element.GetAttribute ("id", ""));
					var macro_count = parseInt (element.GetAttribute ("count"));
					for (var i = 0; macro && i < macro_count; i++)
					{
						var subelements = macro.FindNode ("body");
						if (subelements)
						{
							var subelement = subelements.childNodes.element_first;
							while (subelement)
							{
								result++;
								subelement = subelement.element_next;
							}
						}
					}						
				}
				element = element.element_next;
			}
		}
		
	
		device_part = device_part.element_next;
	}
	return result;
}

/* ********************************************************************************************************** */

function _joVMMData_GetListValues (list_value_name)
{
	var result		= [];
	var obj 			= this.entities[list_value_name].childNodes.element_first;
	var obj_body, source;

	while (obj)
	{
		if (list_value_name != "object" ||  joIsBoolean (obj.GetAttribute ("is_virtual")))
			result.push (obj.GetAttribute ("id"));
		obj = obj.element_next;
	}
	return result;
}

/* ********************************************************************************************************** */

function OnUpload (result)
{
	if (result == "1")
	{
		joGUI.Alert (joGUI.GetLocaleText ('save_ok'), joGUI_ALERT_TYPE_NOTE, joGUI_ALERT_BUTTON_OK);
	}
	else if (result != "")
	{
		joGUI.Alert (result, joGUI_ALERT_TYPE_ERROR, joGUI_ALERT_BUTTON_OK);
	}
}

/* ********************************************************************************************************** */

function OnStartJob (result)
{
	if (result == "1")
	{
		joGUI.Alert (joGUI.GetLocaleText ('job_started'), joGUI_ALERT_TYPE_NOTE, joGUI_ALERT_BUTTON_OK);
	}
	else if (result != "")
	{
		joGUI.Alert (result, joGUI_ALERT_TYPE_ERROR, joGUI_ALERT_BUTTON_OK);
	}
}

/* ********************************************************************************************************** */

function OnStopOrDeleteJob (result)
{
	if (result == "1")
	{
		joVMMApp.GetGuiObject ('vmm_calc_results').OnStopOrDeleteJob();
	}
}

/* ********************************************************************************************************** */

function _joVMMData_RemoveFile (filename)
{
	var http_params		= "path=" + this.UserDir + filename + ".xml";
	var php_filename		= joGUI.GetLocaleText("php_path") + "/file_remove.php";
   this.Ajax 				= new Ajax.Request (php_filename, { method: 'post', parameters: http_params, onComplete: function (filedata) { RefreshFileList (filedata.responseText) } } );
}

/* ********************************************************************************************************** */

function _joVMMData_ValidateDataForSimulation()
{
	var result = "";
	if (this.project_name == "")
	{
		result = "warning_project_not_saved";
	}
	else
	{
		//...................................................................................check if device is empty
		var device_part, part_body;
		var this_device = this.entities["device"];
		if (this_device && this_device.childNodes.element_first)
		{
			device_part = this_device.childNodes.element_first;
			while (device_part && device_part.name != "main")
			{
				device_part = device_part.element_next;
			}
			if (device_part && device_part.childNodes.element_first)
			{
				part_body = device_part.childNodes.element_first;
				if (part_body.childNodes.element_first)
				{
					result = "ok";
				}
			}
		}
		if (result != "ok") result = "error_start_empty_device";
	}
	
	if (result == "") result = "ok";
	
	return result;
}


