
var CJValidationCode = new Class({
	
	// constructor
	initialize: function(Element, Type, Events, Options){
	
		try{
			this.Options = Options;
		}catch(e){
			this.Options = null;
		}		
		try{
			this.Element = $(Element);
		}catch(e){
			this.Element = null;
		}
		this.Events = Events;
		this.ForceValid = null;
	
		// Code bekommen
		var Code = null;
		
		switch(Type){
			case 'Empty': 
				var Code = this.EmptyValidator;
			break;
			case 'Email': 
				var Code = this.EmailValidator;
			break;
			case 'Length': 
				var Code = this.LengthValidator;
			break;
			case 'Compare': 
				var Code = this.CompareValidator;
			break;
			case 'Substring':
				var Code = this.SubstringValidator;
			break;
		}
		
		this.Code = Code;
	},
	
	Validate: function(){		
		var valid = false;		
		if(this.Options == null){
			valid = this.Code(this.Element);
		}else{			
			valid = this.Code(this.Element, this.Options);
		}
		
		try{
			if(this.Events!=null){
				if(this.Events.OnCheck!=null){
					this.Events.OnCheck(this.Element);
				}
			}
		}
		catch(e){}
		
		return valid;
		
	},
	
	FireEvents: function(valid){
		if(valid){
			if(this.Events.OnValid!=null){
				this.Events.OnValid(this.Element, valid);
			}
		}else{
			if(this.Events.OnInvalid!=null){
				this.Events.OnInvalid(this.Element, valid);
			}
		}
	},
	
	/* VALIDATORS BEGIN */
	SubstringValidator: function(Element, ValOptions){
		var Valid = false;
				
		// prüfung
		try{
			var v = true;
			var cs = false;
			if(ValOptions.CaseSensitive != null){
				if(ValOptions.CaseSensitive){
					cs = true
				}else{
					cs = false;
				}
			}else{
				cs = false;
			}
			
			for(i=0; i<ValOptions.Values.length; i++){
				if(cs){
					if(Element.value.substring(ValOptions.From, ValOptions.To) == ValOptions.Values[i]){
						Valid = true;
						break;
					}
				}else{
					if(Element.value.substring(ValOptions.From, ValOptions.To).toUpperCase() == ValOptions.Values[i].toUpperCase()){
						Valid = true;
						break;
					}
				}
			}
			
			return Valid;
		}
		catch(e){
			return false;
		}
	},
	
	EmptyValidator: function(Element){
		var Valid = false;
		
		// CODE
		if(Element.value.length==0){
			Valid = false;
		}else{
			Valid = true;
		}
		return Valid;
	},
	
	AjaxValidator: function(Element, ValOptions){
		var valid = false;
		
		// ajax erstellen
		try{
			var a = new CJAjax(ValOptions.URL,
			{
				OnComplete: function(Content){
					alert('FERTIG');
				}
			});
		}
		catch(e){return false}
		
	},
	
	LengthValidator: function(Element, ValOptions){
		var Valid = false;
		if(Element.value.length>=ValOptions.Min && Element.value.length<=ValOptions.Max){
			Valid = true;
		}else{
			Valid = false;
		}
		return Valid;
	},
	
	EmailValidator: function(Element){
		var filter = /^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i;
		var regex = new RegExp(filter);
		return regex.test(Element.value);
	},
	
	CompareValidator: function(Element, ValOptions){
		var Valid = false;		
		if(Element.value==ValOptions.Element.value){
			Valid = true;
		}
		return Valid;
	}
	/* VALIDATORS END */
});


	
var CJValidator = new Class({
	
	// Constructor
	initialize: function(ValidBox){

		// Validbox benutzen?
		try{
			this.ValidBox = $(ValidBox);
		}catch(e)
		{
			this.ValidBox = null
		}
		
		// Holder
		this.Validators = {};
		this.Options = {};
		this.Slides = {};
		this.Count = 0;
	
	},	
	
	/*
	 * Element: An Welches Element soll die onchange Geschichte verknüpft werden?
	 * Validator: ValidationObjekt
	 * Options: Viewoptions
	 */
	BindValidator: function(Validator, Element, EventType, Options)
	{
		// testen
		var Slide = null;
		
		try{
			Element = $(Element);
			if(Options != null){
				if(Options.MessageValid != null){
					if(Options.MessageValid == ''){
						Options.MessageValid = '&nbsp;';
					}
				}
				if(Options.MessageInvalid != null){
					if(Options.MessageInvalid == ''){
						Options.MessageInvalid = '&nbsp;';
					}
				}
			}
			Slide = this.CreateSlider(Options);
			this.Validators[this.Count] = Validator;
			this.Slides[this.Count] = Slide;
			this.Options[this.Count] = Options;
			this.Count++;
			this.AddEvent(Element, EventType, Options, Validator, this.ValidBox, Slide);
			return this.Count;
		}
		catch(e){}
	},
		
	/* Validators begin */
	
	
	/* Validators end */
	
	
	Validate: function(WithEffects, FireEvents){
		if(FireEvents==null){
			FireEvents = false;
		}
		var valid = false;
		var Res = true;
		for(var i = 0; i<this.Count; i++){
			var Code = this.Validators[i];
			if(WithEffects != null){
				if(WithEffects){
					valid = this.ValidateThis(Code, true, FireEvents);
				}else{
					valid = this.ValidateThis(Code, false, FireEvents);
				}
			}else{
				valid = this.ValidateThis(Code, false, FireEvents);
			}
			if(valid == false){
				Res = false;
			}
		}
				
		return Res;
	},
	
	ValidateThis: function(Validator, WithEffects, FireEvents){
		try{
			var valid = Validator.Validate();
			var ID = null;
			for(var i = 0; i<this.Count; i++){
				if(this.Validators[i] === Validator){
					ID = i;
					break;
				}
			}
			
			// tmp;
			if(FireEvents!=null){
				if(FireEvents){
					Validator.FireEvents(valid);
				}
			}			
						
			if(WithEffects!=null){
				if(WithEffects){
					// Helpklasse erstellen
					var CJV = new CJValidatorPrivates(this.Options[ID], this.Slides[ID]);
					CJV.DoHTMLEvents(valid);
				}
			}
			
			return valid;
		}
		catch(e){}
	},
	
	GetSlider: function(Validator){
		try{
			for(var i = 0; i<this.Count; i++){
				if(this.Validators[i] === Validator){
					ID = i;
					break;
				}
			}
			
			return this.Slides[i];
		}catch(e){return null}
	},
		
	
	/* PRIVATES */
	CreateSlider: function(Options){
		try {
			// Box fertigmachen
			if(Options.MessageBoxID != null && Options.UseSlideEffect == true){
				// ausblenden
				$(Options.MessageBoxID).style.display='none';
				
				// SliderBauen
				mySlide = new Fx.Slide($(Options.MessageBoxID)).hide();
				
				// Einblenden
				$(Options.MessageBoxID).style.display='block';
			}else{
				mySlide = null;
			}
			return mySlide;
		} catch(e)
		{
			return null;
		}
	},
	
	AddEvent: function(myElement, EventType, Options, Validator, ValidBox, mySlide){
		// Events zum Auslösen der Geschichte einbauen
		var oldValue = null;
		var oldValid = null;
		myElement.addEvent(EventType, function(c){
			c = new Event(c);	
			
			// Helpklasse erstellen
			var CJV = new CJValidatorPrivates(Options, mySlide);
						
			// Validator ausführen
			var Valid = false;
			if(oldValue != myElement.value){
				Valid = Validator.Validate();
				oldValid = Valid;
			}
			
			Valid = oldValid;
			
			oldValue = myElement.value;
			
						
			// Interne Events durchführen
			try{
				CJV.DoHTMLEvents(Valid);
				Validator.FireEvents(Valid);
			}catch(e){}
			
			// Validbox??
			if(ValidBox != null){
				ValidBox.value = Valid;
			}
						
			c.stop();
		});
	}

});

CJValidator.implement(new Events);
CJValidator.implement(new Options);

/* CLASS CJValidator.Privates */
var CJValidatorPrivates = new Class({
	
	// constructor
	initialize: function(Options, Slider){
		this.Options = Options;
		this.Slider = Slider;
	},
	
	DoHTMLEvents: function(Valid){
		try{
			if(this.Options.MessageBoxID != null){
				// MSGBox definiert, weiter gehts
				if(Valid){
					// OK
					if(this.Options.MessageValid!=null){
						// DO
						// Valid, wenn sichtbar wieder ausblenden
						if(this.Slider != null && this.Options.UseSlideEffect == true){
							if(this.Slider.open==1){
								this.Slider.slideOut();
							}
						}
						
						$(this.Options.MessageBoxID).innerHTML = this.Options.MessageValid;
					}
				}else{
					if(this.Options.MessageInvalid!=null){
						// DO
						// Invalid, wenn nicht sichbar einblenden
						if(this.Slider != null && this.Options.UseSlideEffect == true){
							if(this.Slider.open==0){
								this.Slider.slideIn();
							}
						}
						$(this.Options.MessageBoxID).innerHTML = this.Options.MessageInvalid;
					}
				}
			}
		}catch(e){}
	}
		
});






