/*
Script: moovalid.js
Lite Mootools form validation library
*/

var validate = new Class(
{		Implements: [Options, Events],
		options: {
			useAjaxSubmit:      false,
			AjaxSubmitOptions:	{}
		},	
		initialize: function(form, fields, options) {
			this.setOptions(options);
			this.form = $(form);
			this.fields = fields;
			this.errorinform = false;
			this.min = 0;
			this.max = 0;
			this.compItem='';

			this.styleAdd();
			
			$each(this.fields, function(type, el){
				if($(el) != null){
					$(el).addEvent('blur', function(){
						this.check($(el), type);
					}.bind(this))
				}
			}.bind(this));
			
			$(this.form).addEvent('submit', function(e){
				return this.onSubmit(e);
			}.bind(this))
		},
		onSubmit: function(e){
			this.errorinform = false;
			$each(this.fields, function(type, el){
					this.check($(el), type);
			}.bind(this));
			if(this.errorinform){
				return false;
			} else {
				if(this.options.useAjaxSubmit){
					e.stop();
					this.form.set('send', this.options.	AjaxSubmitOptions);
					this.form.send();
				} else {
					this.form.submit();
				}
			}

		},
		check: function(el, type)
		{	this.rmerrm(el,type);
			var typeArray = type.split(' ');
			typeArray.each(function(item, index)
			{	//alert(item);
				if(item.contains('[')){
					var intItem = item.replace('[', '').replace(']','').split('-');
					this.min = intItem[0];
					this.max = intItem[1];
					item = 'Length';
				};
				if(item.contains('{')){
					var intItem = item.replace('{', '').replace('}','').split('-');
					this.min = intItem[0];
					this.max = intItem[1];
					item = 'Range';
				};
				if(item.contains('('))
				{	this.compItem = item.replace('(', '').replace(')','');
					//alert(this.compItem);
					item = 'Compare';
				};

				if(!this.errored(el))
				{	switch(item)
					{	case "Required":
							var reqTest = el.value.test(/[^.*]/);
							if(!reqTest) this.errm(el,item); else this.rmerrm(el);
							break;
							
					}
					if(el.value.test(/[^.*]/)){
						switch(item){
							case "Alphabetic":
								var alphabeticTest = el.value.test(/^[a-z ._-]+$/i);
								if(!alphabeticTest) this.errm(el,item); else this.rmerrm(el);
							break;
							case "AlphaNumeric":
								var alphaNumericTest = el.value.test(/^[a-z ._-]+$/i);
								if(!alphaNumericTest) this.errm(el,item); else this.rmerrm(el);
							break;
							case "Numeric":
								var numericTest = el.value.search(/[^0-9\.\,\s\-\_]/);
								if(!numericTest) this.errm(el,item); else this.rmerrm(el);
							break;

							case "Email":
								var emailTest = el.value.test(/^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i);
								if(!emailTest) this.errm(el,item); else this.rmerrm(el);
							break;
							case "URL":
								var urlTest = el.value.test(/^(http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&amp;%\$#\=~])*$/i);
								if(!urlTest) this.errm(el,item); else this.rmerrm(el);
							break;
							case "Length":
								if(el.value.length < this.min || el.value.length > this.max ) {
									this.errm(el, item); 
								} else {
									this.rmerrm(el);
								}
							break;
							case "Data":
								var dataTest = el.value.test(/^\d{4}-\d{1,2}-\d{1,2}$/);
								if(dataTest)
								{	var dArr = el.value.split("-");
      								var d = new Date(dArr[1]+"/"+dArr[2]+"/"+dArr[0]);
      								//alert(d);
      								dataTest=d.getMonth() + 1 == dArr[1] && d.getDate() == dArr[2] && d.getFullYear() == dArr[0];
								}
								if(!dataTest) this.errm(el,item); else this.rmerrm(el);
							break;
							case "Range":
								if(el.value.toInt() < this.min || el.value.toInt() > this.max ) {
									this.errm(el, item); 
								} else {
									this.rmerrm(el);
								}
							break;
							case "Compare":
								if(el.value!=$(this.compItem).value)
									this.errm(el,item);
								else
									this.rmerrm(el);
							break;
							case "Checked":
								if(!el.checked)
									this.errm(el,item);
								else
									this.rmerrm(el);
							break;

						}
					}
				}
			}.bind(this))
		},
		errored: function(el){
			if(el.hasClass('errorElement')) {
				return true; 
			}else {
				return false;
			}
		},
		errm: function(el, type){
			el.addClass('errorElement');
			var errel = new Element('span', {'class':'errorText'});
			var msg = this.getMsg(type);
			errel.set('text', msg);
			var parent = el.getParent();
			errel.inject(parent);
			this.errorinform = true;
		},
		rmerrm: function(el){
			if(el.getNext()){
				el.getNext().dispose();
				el.removeClass('errorElement');
			}
		},
		getMsg: function(type)
		{	switch(type)
			{	case "Required":           return " Pole wymagane.";
				case "Alphabetic":         return " Może zawierać tylko litery.";
				case "Numeric":            return " Może zawierać tylko cyfry.";
				case "Range":			   return " Wartość musi się mieścić pomiedzy "+ this.min +" a "+this.max;
				case "Length":			   return " Długość tekstu musi się zawierać między "+this.min+" a "+this.max;
				case "Email":              return " Wprowadź prawidłowy adres e-mail.";
				case "URL":				   return " Wprowadź prawidłowy adres www.";
				case "AlphaNumeric":	   return " Może zawierać tylko litery i cyfry.";
				case "Compare":	   		   return " Pola się różnią ";
				case "Checked":	   		   return " Wymagane zaznaczenie ";
				case "Data":	   		   return " Nieprawidłowa data (YYYY-MM-DD)";
				default:                   return " Błąd niezdefiniowany";
			}
		},
		styleAdd: function(){
			/*var style = '  .errorElement{ border:1px #FF0000 solid;} ' + 
						'  .errorText{ color:#FF0000;} ' ;
            var el = new Element('style', { 'type': 'text/css' });
			el.set('text', style);
			el.inject(document.head);*/
			//zmieniłem bo nie działało w IE (styl dałem na stałe do css'a)
		}

})

