
RuleXML = new function() {


    var _xml = null;

    return {

        AddComponent: function(xmlNode) {
            try {

                $(_xml).find("vrm>" + this.CurrentProcess).append(xmlNode);

            } catch (err) { Log.Add("RuleXML.AddComponent", err, LogType.Error); }
        },
				
				AppendXML: function(xmlNodes){
				  try{
					  
						var proc = $(_xml).find("vrm>" + this.CurrentProcess);

						proc.append(xmlNodes);
				
          } catch (err) { Log.Add("RuleXML.AppendXML", err, LogType.Error); }					
				},
				
        GetComponent: function(ID) {
            try {

                if (typeof ID != "number")
                    ID = parseInt(ID);
										
								var ret = "";

                $(_xml).find("vrm>" + this.CurrentProcess + ">c").each(function() {

                    if (parseInt($(this).find(">n").text()) == ID)
                      ret = this.xml;
                });
								
								return ret;


            } catch (err) { Log.Add("RuleXML.GetComponent", err, LogType.Error); }
        },
				

        DeleteComponent: function(ID) {
            try {

						    var toRemove = null;
								
                $(_xml).find("vrm>" + this.CurrentProcess + ">c").each(function() {

                    if ($(this).find(">n").text() == ID)  // flag the component for removal
										  toRemove = this;
											
										$(this).find("j").each(function(){  	// clear any references to the component
										  if($(this).text() == ID)
											  $(this).text("");
										});
                });
								
								if(toRemove != null)
  								toRemove.parentNode.removeChild(toRemove);


            } catch (err) { Log.Add("RuleXML.DeleteComponent", err, LogType.Error); }
        },
    
        Load: function(xml) 
        {

            try {

                _xml = xml;
    
            } catch (err) { Log.Add("RuleXML.GetComponent", err, LogType.Error); }            
            
        },
				
				// gets the component that links to the component specified
				GetFromComponent: function(ID)
				{
				  try {
					
					  if(typeof ID != "number")
						  ID = parseInt(ID);
							
						var ctrl = null;
					
					  $(_xml).find("vrm>" + this.CurrentProcess + ">c").each(function() {
						
						  var _compID = parseInt($(this).find("n").text());
						
							$(this).find("j").each(function(){  	
							  
								var j = $(this).text();
								
							  if( j == ID.toString() )
									ctrl = RuleStorage.GetComponent(_compID);
						  
							});

						});
						
						return ctrl;
						
					} catch (err) { Log.Add("RuleXML.GetFromComponent", err, LogType.Error); }
				},
        
        GetNewElement: function(nodeName) {
            try {

                return _xml.createElement(nodeName);

            } catch (err) { Log.Add("RuleXML.GetNewElement", err, LogType.Error); }
        },

        GetNewCDATA: function(strContent) {
            try {

                return _xml.createCDATASection(strContent);

            } catch (err) { Log.Add("RuleXML.GetNewElement", err, LogType.Error); }
        },
				
				ReplaceCDATA: function(elem, value)
				{
				  try{
					
					  var parentNode = $(elem)[0].parentNode;
				 
  				  var n = $(elem)[0].nodeName;
  					
            var cdata = RuleXML.GetNewCDATA(value);
						
            var newElem = RuleXML.GetNewElement(n);
						
            $(newElem).append(cdata);
  					
  					parentNode.replaceChild(newElem, $(elem)[0]);
						
						
          } catch (err) { Log.Add("RuleXML.ReplaceCDATA", err, LogType.Error); }				
				},
				

        GetNextComponentNumber: function() {
            try {

                var _id = -1;
								
								var zeroFound = false;
								
                $(_xml).find('vrm>' + this.CurrentProcess + '>c').each(function() {
                    var comp = $(this).find(">n").text();
										if(comp == '0')
										  zeroFound = true;

                    if (parseInt(comp) > _id)
                        _id = parseInt(comp);
                });
								
								if(!zeroFound)
								  return 0;

                return _id + 1;

            } catch (err) { Log.Add("RuleXML.GetNextComponentNumber", err, LogType.Error); }
        },
				
				GetVRM: function()
				{
				  return _xml;
				},
				
        GetFunctionXML: function() {
            try {

                return $(_xml).find("vrm>function");

            } catch (err) { Log.Add("RuleXML.GetFunctionXML", err, LogType.Error); }
        },				

        GetPostProcessXML: function() {
            try {

                return $(_xml).find("vrm>postproc");

            } catch (err) { Log.Add("RuleXML.GetPostProcessXML", err, LogType.Error); }
        },

        GetPreProcessXML: function() {
            try {

                return $(_xml).find("vrm>preproc");

            } catch (err) { Log.Add("RuleXML.GetPreProcessXML", err, LogType.Error); }
        },

        SetPostProcessXML: function(xmlNode) {
            try {

                $(_xml).find('vrm>postproc').text($(xmlNode).text());

            } catch (err) { Log.Add("RuleXML.GetPostProcessXML", err, LogType.Error); }
        },

        SetPreProcessXML: function(xmlNode) {
            try {

                $(_xml).find('vrm>preproc').text($(xmlNode).text());

            } catch (err) { Log.Add("RuleXML.GetPreProcessXML", err, LogType.Error); }
        },
				
				GetCanvasHeight: function(proc)
				{
            try {
						    var node = $(_xml).find('vrm>function').find(proc);
								
								if(node.length == 0)
								  return "1000";
						
                return node.text();

            } catch (err) { Log.Add("RuleXML.SetCanvasHeight", err, LogType.Error); }
				},
				
				SetCanvasHeight: function(height, proc)
				{
            try {
						
						    var node = $(_xml).find('vrm>function').find(proc);
								
								if(node.length == 0)
								{
								  $(_xml).find('vrm>function').append(RuleXML.GetNewElement(proc));
									node = $(_xml).find('vrm>function').find(proc);									
								}
								
						
                $(_xml).find('vrm>function').find(proc).text(height);

            } catch (err) { Log.Add("RuleXML.SetCanvasHeight", err, LogType.Error); }
				},
				
				GetEditorNotes: function()
				{
				  try{
					  var notes = $(_xml).find('vrm>function>editorNotes');

						if(notes.length == 0)
						  return "";

						return notes.text();
						
					}catch(err){Log.Add("RuleXML.GetEditorNotes", err, LogType.Error);}
				},
				
				SetEditorNotes: function(value)
				{
				  try{

				
            var cdata = RuleXML.GetNewCDATA(value);
            
            var elem = RuleXML.GetNewElement('editorNotes');
            
            $(elem).append(cdata);
						
					  var notes = $(_xml).find('vrm>function>editorNotes');
						
						if(notes.length > 0)
  						notes[0].parentNode.removeChild(notes[0]);
						
						$(_xml).find('vrm>function').append(elem);
						
						
					}catch(err){Log.Add("RuleXML.SetEditorNotes", err, LogType.Error);}				
				},

        CurrentProcess: ""


    }

} 



function CDATABatch()
{
  var arr = new Array();

  this.Add = function(elem, value)
	{
	  arr[arr.length] = new Pair(elem, value); 
	}
	
	this.Process = function()
	{
	  for(var i = 0; i < arr.length; i++)
		{
		  RuleXML.ReplaceCDATA(arr[i].e, arr[i].v);
		}
	}

	function Pair(e, v)
	{
	  this.e = e; 
		this.v = v;
	}

}




