/* 	Copyright 2008 Maximum Processing Inc
	
	ABOUT THIS SCRIPT

	
	Change Log
 	Created 12/03/2008 Nathan Townsend
*/


function SELECTQUERY(){

  this.inheritFrom = BaseComponent;

	this.inheritFrom();
	
	this.Src = "../../images/RuleSELECTQUERY.png";

  this.Title = "Select Query Component";
	
	this.ToolTip = "Performs a SQL select with parameters";
	
	var _xmlNode = null;
	

  this.Create = function()
  {
	  try{
		
		  var uo = new UndoObject();
			
			uo.AddUndo(RulesMaker.Load, RuleXML.GetVRM().xml);

      this.BaseCreate();
			
			this.SetType("SELECTQUERY");		

			_xmlNode = this.GetNode();

      var values = $(_xmlNode.find('>values')[0]);
      
      values.append(RuleXML.GetNewElement('query'));
			
      uo.AddRedo(RulesMaker.Load, RuleXML.GetVRM().xml);
      
      Undo.Add(uo);			

		} catch(err){Log.Add("SELECTQUERY.Create", err, LogType.Error);}    
  }
  
	this.Load = function(xmlNode)
  {
	  try{
		
		  _xmlNode = $(xmlNode);
		
		  this.BaseLoad(_xmlNode);
			
		} catch(err){Log.Add("SELECTQUERY.Load", err, LogType.Error);}	  	
  }
	
	this.AddParam = function()
	{
	  try{
		  
		  var values = $(_xmlNode.find(">values")[0]);
			
			var param = $(RuleXML.GetNewElement('param'));
			
			var n = RuleXML.GetNewElement('n');

      var t = RuleXML.GetNewElement('t');
			
			var v = RuleXML.GetNewElement('v');
			
			param.append(n);
			
			param.append(t);
			
			param.append(v);
			
			values.append(param);						
									
		
		} catch(err){Log.Add("SELECTQUERY.AddParam", err, LogType.Error);}	  
	}
	
	this.DeleteParam = function(ParamIndex)
	{
	  try{
			
		  var toRemove = _xmlNode.find(">values>param")[ParamIndex];

			toRemove.parentNode.removeChild(toRemove);
		
		} catch(err){Log.Add("SELECTQUERY.DeleteParam", err, LogType.Error);}
	}
	
	this.GetProperties = function(){
    try{
	
  	  var properties = this.GetBaseProperties();

  	  //properties[properties.length] = new PropertiesEditor.Property(PropertyFields.GetProperty("J2"), this.GetJ2, this.SetJ2);
      properties[properties.length] = new PropertiesEditor.Property(PropertyFields.GetProperty("Query"), this.GetQuery, this.SetQuery);
			
			var args = new RulesMaker.ComplexArgs(this.GetProperties, this.AddParam, this.DeleteParam);
      properties[properties.length] = new PropertiesEditor.Property(PropertyFields.GetProperty("QueryParams"), this.GetQueryParams, this.SetQueryParams, args);
  
  		return properties;		

		} catch(err){Log.Add("SELECTQUERY.GetProperties", err, LogType.Error);}

	}
	
  this.GetJ2 = function(){
    try{
      return $(_xmlNode.find(">j")[1]).text();
		} catch(err){Log.Add("BaseComponent.GetJ2", err, LogType.Error);}				
  } 		
	
  this.GetQuery = function(){
	  try{
		
      return $(_xmlNode.find(">values>query")[0]).text();

		} catch(err){Log.Add("SELECTQUERY.GetQuery", err, LogType.Error);}		
  }
	
	this.GetQueryParams = function()
	{
	  var params = new Array();
	
	  try{
		  
			_xmlNode.find(">values>param").each(function(){
  				var n = $(this).find(">n").text();			  
  				var t = $(this).find(">t").text();
  				var v = $(this).find(">v").text();
  				params[params.length] = new QueryParam(n, t, v);
			});

			
			return params;
			
		} catch(err){Log.Add("SELECTQUERY.GetQueryParams", err, LogType.Error);}	
	}
	

  this.SetJ2 = function(newValue){
	  try{
      $(_xmlNode.find(">j")[1]).text(newValue);
		} catch(err){Log.Add("BaseComponent.SetJ2", err, LogType.Error);}				
  }	
 
  this.SetQuery = function(newQuery)
  {
	 	try{
		
      var cdata = RuleXML.GetNewCDATA(newQuery);
      
      var elem = RuleXML.GetNewElement('query');
      
      $(elem).append(cdata);
			
      _xmlNode.find('>values')[0].replaceChild(elem, _xmlNode.find(">values>query")[0]);
			
		} catch(err){Log.Add("SELECTQUERY.SetQuery", err, LogType.Error);}
  }
	
	this.SetQueryParams = function(params)
	{
	  try{

			var i = 0;
			var names = new Array();
			
			_xmlNode.find(">values>param").each(function(){
  				$(this).find(">n").text(Utilities.Trim(params[i].Name));
  				$(this).find(">t").text(Utilities.Trim(params[i].Type));
  				$(this).find(">v").text(Utilities.Trim(params[i].Value));
  		    names[i] = params[i].Name;
					i++;
			});
			
			for(i=0; i<names.length; i++)
			{
  			for(j=0; j<names.length; j++)
  			{
  			  if((j!=i) && (names[j] == names[i]))
					{
					  Global.ShowMessage("The parameter name '" + names[i] + "' is used twice");
						return;
					}
  			}				  
			}			
						
		} catch(err){Log.Add("SELECTQUERY.SetQueryParams", err, LogType.Error);}	
	}	
	
	
	function QueryParam(Name, Type, Value)
	{
	  this.Name = Name;
		this.Type = Type;
		this.Value = Value;
	}
  

 
}
