function ValidationBase()
{
  var _control = null;
	var _input = null;
 
	
	this.ValidationBaseLoad = function(ControlElement, InputElement)
	{
	  try{
  	  _control = ControlElement;
	  	_input = InputElement;
		}catch(err){Log.Add("ValidationBase.ValidationBaseLoad", err, LogType.Error)}
	}
		

	this.FilterInput = function()
	{
	  try{
		
  		if(Utilities.Trim(_input.val()).length == 0)
			  return;
		
	  	var filters = this.GetFilters();

			try
			{
  		  for(var i = 0; i<filters.length; i++){
				  if(filters[i].Filter.length > 0)
					{
    				var filter = new Filters[filters[i].Filter];
     		  	var val = filter.Test(_input.val(), filters[i].DType, filters[i].Param);
  	    		_input.val(val);
					}
    		}
      } catch(err) {
        alert( err);
      	_input.select();
      	_input.focus();
      }

  	}catch(err){Log.Add("ValidationBase.FilterInput", err, LogType.Error)}		
	}
   
	this.AttachFilter = function()
	{
		try{
		
			_input.bind("blur.filter", function(){
			
			  var p = $(this).parents(".component")[0];
				
		    var ctrl = Helper.GetEditorComponent(p);
				
			  ctrl.FilterInput();
		  
			});
			
  	}catch(err){Log.Add("ValidationBase.AttachFilter", err, LogType.Error)}			
	}

	this.DetachFilter = function()
	{
		try{
		
			_input.unbind("blur.filter");
			
  	}catch(err){Log.Add("ValidationBase.DetachFilter", err, LogType.Error)}			
	}
	
	
	
	
	this.GetValidationProperties = function(properties)
	{
	  try{
		
      var args = new RulesMaker.ComplexArgs(this.GetValidationProperties, this.AddFilter, this.DeleteFilter);

			switch(_control.attr("Ref"))
			{
			  case "EditorText":
          properties[properties.length] = new PropertiesEditor.Property(PropertyFields.GetProperty("EditorTextFilters"), this.GetFilters, this.SetFilters, args);
					break;
				case "EditorDropdown":
				  break;
			}
			
			return properties;
			
  	}catch(err){Log.Add("ValidationBase.AddValidationProperties", err, LogType.Error)}
	}
	
	this.AddFilter = function()
	{
	  try{
			
			if((_control.attr("filter")==null) || (_control.attr("filter").length == 0)){
		    _control.attr("filter", "");
	  		_control.attr("param",  "");
  			_control.attr("dtype",  "");
			} else {
  		  _control.attr("filter", _control.attr("filter") + "|");
	  		_control.attr("param", _control.attr("param") + "|");
		  	_control.attr("dtype", _control.attr("dtype") + "|");
			}
			
			Editor.ShowProperties(_control);
			
		}catch(err){Log.Add("ValidationBase.AddFilter", err, LogType.Error)}					  
	}
	
	
	this.DeleteFilter = function(FilterIndex)
	{
	  try{
		  
  		var filters = _control.attr("filter").split("|");
  		var params = _control.attr("param").split("|");
  		var dtypes =  _control.attr("dtype").split("|");
  		
			filters.splice(FilterIndex, 1);
			params.splice(FilterIndex, 1);
			dtypes.splice(FilterIndex, 1);
  		
			_control.attr("filter", filters.toPipeString());
  		_control.attr("param", params.toPipeString());
  		_control.attr("dtype", dtypes.toPipeString());
			
			if(_control.attr("filter").length == 0)
			{
			  _control.removeAttr("filter");
			  _control.removeAttr("param");
			  _control.removeAttr("dtype");								
			}
  		
			Editor.ShowProperties(_control);

		}catch(err){Log.Add("ValidationBase.DeleteFilter", err, LogType.Error)}			
	}
	
	this.GetFilters = function()
	{
	  try{
		
		  var filters, dtypes, params;
		  
			filters = _control.attr("filter");
			dtypes = _control.attr("dtype");
			params = _control.attr("param");
			
			if((filters == null) || (dtypes==null) || (params ==null))
			{
			  return new Array();
			}

      var ret = new Array();
						
			if(filters.indexOf("|") > -1)
			{	// multiple filters
			  filters = _control.attr("filter").split("|");
				dtypes = _control.attr("dtype").split("|");
				params = _control.attr("param").split("|");
    		 
    		for(var i = 0; i<filters.length; i++)
    		{
    		  var f = new Filter(filters[i], params[i], dtypes[i]);
    			ret[ret.length] = f;
    		}
			} 
			else 
			{ // only one filter
			  ret[0] = new Filter(filters, params, dtypes);
			}
			
			return ret;	
					
		}catch(err){Log.Add("ValidationBase.GetFilters", err, LogType.Error)}			
	}
	
	this.SetFilters = function(arr)
	{
	  try{
  		var filters = "";
			var params = "";
			var dtypes = "";
			
			var hasFilters = true;
			
			if(arr.length == 0)
			  hasFilters = false;
				
			if(arr.length == 1)
			{
			  //alert(arr.length);
				//alert(Utilities.ToString(arr));
			  var f = Utilities.ReplaceAll(arr[0].Filter, " ", "");
				if(f =="")
				  hasFilters = false;
			}
			
			if(!hasFilters)
			{
			  _control.removeAttr("filter");
			  _control.removeAttr("param");
			  _control.removeAttr("dtype");
				return;
			}
  	
  	  for(var i = 0; i<arr.length; i++)
  		{
			  var f = Utilities.ReplaceAll(arr[i].Filter, " ", "");
				if(f.length > 0)
			  {
    		  filters += arr[i].Filter + "|";
    			params += arr[i].Param + "|";
    			dtypes += arr[i].DType + "|";
			  }
  		}
  		
			if(arr.length > 0)
			{
  			filters = filters.removeLastChar();
    		params = params.removeLastChar();
  	  	dtypes = dtypes.removeLastChar();
			}
  		
			_control.attr("filter", filters);
  		_control.attr("param", params);
  		_control.attr("dtype", dtypes);
			
		}catch(err){Log.Add("ValidationBase.SetFilters", err, LogType.Error)}	
	}
	
	function Filter(filter, param, dtype)
	{
	  try{
		
  	  this.Filter = filter;
  		this.DType = dtype;
  		this.Param = param;
			

			
		}catch(err){Log.Add("ValidationBase.Filter", err, LogType.Error)}					
	}
	

   


}
