
var VN_Validator = Class.create();

VN_Validator.prototype = {

	initialize : function(formId, onSubmitCallback) {

		if ($(formId))
		{
			this._formName			= formId;
			this._form 				= $(formId);
			this._elements 			= this._form.getElements();
			this._elementsCount		= this._elements.length;
			this._onSubmitCallback  = onSubmitCallback;

			if (typeof beforeValid == 'undefined') {

				this._beforeValid  		= function() {return true;};
			} else {
				this._beforeValid  		= beforeValid;
			}
			this._form.onsubmit 	= this._validateForm.bind(this);

			this._setValidation();

			this._errorTexts = new Array();
			this._validRules = new Array();
		}
	},

	addErrorText : function(elmName, validOption, errorText) {

		this._errorTexts[elmName + '_' + validOption] = errorText;
	},

	addValidRule : function(elmName, validOption, rule) {

		this._validRules[elmName + '_' + validOption] = rule;
	},

	_getValidRule : function(elmName, validOption, notFound) {

		var result = notFound;

		if (this._validRules[elmName + '_' + validOption]) {

			result = this._validRules[elmName + '_' + validOption];
		}

		return result;
	},

	_getErrorText : function(elmName, validOption) {

		var result = 'Error!';

		if (this._errorTexts[elmName + '_' + validOption]) {

			result = this._errorTexts[elmName + '_' + validOption];
		}

		return result;
	},

	_showCustomError : function(customErrorId, errorValue) {

		$(customErrorId).update(errorValue);
		new Effect.Appear(customErrorId);
	},

	_hideCustomError : function(customErrorId) {

		$(customErrorId).update(errorValue);
		new Effect.Fade(customErrorId);
	},

	_validateForm : function() {

		if (this._beforeValid() == false) {

			return false;
		}

		var result 	= true;
		var tmp 	= true;

		var selectId = -1;

		for (var i = 0 ; i < this._elementsCount ; i++) {

			if (this._elements[i]) {

				if (this._elements[i].id != 'cancel_button' && this._elements[i].id != 'submit_button') {

					if (this._validateElement(this._elements[i]) == false) {

						if (selectId == -1) { selectId = i; }

						tmp = false;
					}
				}
			}
		}

		if (tmp) {
			
			if (Element.hasClassName(this._form, 'add_comments')) {
	  		this._AddCommentsForm();
	  	}
	  	else 
	  		if (Element.hasClassName(this._form, 'add_topic')) {
					this._AddTopicForm();
	  		}
	  		else 
		  		if (Element.hasClassName(this._form, 'add_post')) {
						this._AddPostForm();
		  		}
		  		else 
	  		if (Element.hasClassName(this._form, 'vote_form')) {
						this._VoteForm();
		  		} else
			  		if (Element.hasClassName(this._form, 'add_answer')) {
								this._AnswerForm();
				  		}
		  		
						else {
							return this._onSubmitCallback();
						}
				
			
		} else {

			if (selectId >= 0) {
				//pp ponizsza linika
		//pp		if (this._elements[selectId].id == 'VALID_PHONE'){this._elements[selectId -3].activate();} else
			this._elements[selectId].activate();

			}
		}

		return false;
	},

	_setValidation : function() {

		this._elements.each( function(el) {

				if (el.id != 'cancel_button' && el.id != 'submit_button') {

					var extObj = Object.extend({

							element  : el,
							validObj : this

						}, {});

					el.onblur  = function (e) {

						if (typeof e == 'undefined' || typeof e.explicitOriginalTarget == 'undefined') {

							var checkButton = document.activeElement;

						} else {

							var checkButton = e.explicitOriginalTarget;
						}


						if (checkButton && checkButton.id != 'cancel_button' && checkButton.id != 'submit_button') {

							this.validObj._validateElement(this.element);
						}

						return true;

					}.bind(extObj);
				}
			}.bind(this)

		);
	},

	_validateElement : function(el) {

		var errors 			= '';

		if (el.className != '') {

			var classes 		= $w(el.className);
			var classesCount 	= classes.length;
			var test 			= true;

			for (i = 0 ; i < classesCount ; i++) {

				switch (classes[i]) {

					case 'form-required':
						if (el.value == '') { test = false; };
						break;
					case 'form-checkbox-required':
						if (!el.checked) { test = false; };
						break;
					case 'form-pass-confirm':
						if (!this._validPassConfirm(el.value, this._getValidRule(el.name, classes[i], false))) { test = false; };
						break;

					case 'form-email':
						if (!this._validEmail(el.value)) { test = false; };
						break;

					case 'form-code-check':
						if (!this._validCode(el.value, this._getValidRule(el.name, classes[i], false))) { test = false; };
						break;

					case 'form-unique':
						if (!this._validUnique(el.value, this._getValidRule(el.name, classes[i], false))) { test = false; };
						break;

					case 'form-check-correct':
						if (!this._validCheckCorrect(el.value, this._getValidRule(el.name, classes[i], false))) { test = false; };
						break;

					case 'form-length-min':
						if (!this._validStringLenMin(el.value, this._getValidRule(el.name, classes[i], 0))) { test = false; };
						break;

					case 'form-length-max':
						if (!this._validStringLenMax(el.value, this._getValidRule(el.name, classes[i], 10))) { test = false; };
						break;

					case 'form-length':
						if (!this._validStringLen(el.value, this._getValidRule(el.name, classes[i], 1))) { test = false; };
						break;

					case 'form-min':
						if (!this._validFloatMin(el.value, this._getValidRule(el.name, classes[i], 1))) { test = false; };
						break;

					case 'form-max':
						if (!this._validFloatMax(el.value, this._getValidRule(el.name, classes[i], 1))) { test = false; };
						break;

					case 'form-phone':
						if (!this._validePhone(el.value)) { test = false; };
						break;

					case 'form-zip-code':
						if (!this._valideZipCode(el.value)) { test = false; };
						break;

					case 'form-check-year':
						if (!this._valideYear(el.value)) { test = false; };
						break;

					case 'form-check-month':
						if (!this._valideMonth(el.value)) { test = false; };
						break;

					case 'form-check-day':
						if (!this._valideDay(el.value)) { test = false; };
						break;

					case 'form-check-int':
						if (!this._valideInt(el.value)) { test = false; };
						break;

					case 'form-check-string':

						if (!this._valideString(el.value)) { test = false; };
						break;

				}

				if (test === false) {

					errors = this._getErrorText(el.name, classes[i]);


					test = true;
					break;
				}
			}
		
if ((Element.hasClassName(this._form, 'email-to-friend') || Element.hasClassName(this._form, 'arange_viewing')) && errors !='') alert (errors);
		else
			this._showError(el, errors);
		}

		return (errors == '') ? true : false;
	},

	_getElementId : function(el) {

		return el.id ? el.id : el.name;
	},

	_showError : function(el, errors) {

		var errorId = this._getElementId(el);

		var oldErrors = $('validator-error-' + errorId) ? $('validator-error-' + errorId).innerHTML : '';

		if (errors != '' && oldErrors.capitalize() != errors.capitalize()) {

			if ($('validator-error-' + errorId)) {

				$('validator-error-' + errorId).update(errors);
			} else {

				var advice = '<span class="validator-error" style="display: block;" id="validator-error-' + errorId + '">' + errors + '</span>';

				if(el.type == 'checkbox') {
					new Insertion.After(el.nextSiblings()[0], advice);
				} else {

							new Insertion.After(el, advice);

				}
			}

		} else if (errors == '') {

			this._removeError(el);
		}
	},

	_removeError : function(el) {

		var errorId = this._getElementId(el);
		var error 	= $('validator-error-' + errorId);

		if (error) {

			error.remove();




		}
	},

	_validPassConfirm : function(pass, passConfirm) {

		var result = false;

		if (pass == $(passConfirm).value) {

			result = true;
		}

		return result;
	},

	_validCheckCorrect : function(checkFild, url) {

		this._validCorrectResult = false;

		if (url != false) {

			var query = '?checkFild=' + checkFild;

			new Ajax.Request(
				url,
				{
					asynchronous 	: false,
					method			: 'POST',
		      		parameters		: query,
					onComplete		: function (req) {

						if (req.responseText == '1') {

							this._validCorrectResult = true;
						} else {

							this._validCorrectResult = false;
						}

					}.bind(this)
				}
			)
		}
		return this._validCorrectResult;
	},

	_validUnique : function(checkFild, url) {

		this._validUniqueResult = false;

		if (url != false) {

			var query = '?checkFild=' + checkFild;

			new Ajax.Request(
				url,
				{
					asynchronous 	: false,
					method			: 'POST',
		      		parameters		: query,
					onComplete		: function (req) {

						if (req.responseText == '1') {

							this._validUniqueResult = true;
						} else {

							this._validUniqueResult = false;
						}

					}.bind(this)
				}
			)
		}
		return this._validUniqueResult;
 	},

	_validCode	: function(code, url) {
		
		this._validCodeResult = false;
		
		if (url != false) {
			
			var query = '?codeDec=' + code;
			
			new Ajax.Request(
				url,
				{
					asynchronous 	: false,
					method			: 'POST',
		      		parameters		: query,
					onComplete		: function (req) {	
					
						if (req.responseText.substr(0,1) == '1') {
						
							this._validCodeResult = true;
						} else {
					
							this._validCodeResult = false;
						}
					}.bind(this)	
				}
			);
		}
		return this._validCodeResult;
	},

	_validEmail	: function(email) {

		var result = false;
	
		if (email.match(/\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/) != null) {
			
				result = true;
		}
		//BO NIE JEST WYMAGANY
		if (email =='' || email == null ) result = true;
		return result;
	},

	_validStringLen : function(string, len) {

		return (string.length == len) ? true : false;
	},

	_validStringLenMin : function(string, minLen) {

		return (string.length >= minLen) ? true : false;
	},

	_validStringLenMax : function(string, maxLen) {

		return (string.length <= maxLen) ? true : false;
	},

	_validFloatMin : function(floatVar, min) {

		return (floatVar >= min) ? true : false;
	},

	_validFloatMax : function(floatVar, max) {

		return (floatVar <= max) ? true : false;
	},

	_validePhone : function(number) {

		if (number == '' ) return true;
		var result = false;
		var filtr = /^\+?([0-9\- \ ]{7,})+$/;
		if (filtr.test(number)) {result = true; if ($('validator-error-VALID_PHONE'))$('validator-error-VALID_PHONE').remove()};
		return result;

	},


	_valideZipCode : function(zipCode) {

		var result = false;

		if (zipCode == '' || zipCode.match(/\d\d\-?\d\d\d$/) != null) {
	//	if (zipCode == '' || zipCode.match(/^([0-9\-\ ]{1,})+$/) != null) {
			result = true;
		}
		return result;
	},



		_valideYear : function(number) {
			if (number == '' ) return true;
			var result = false;
			var filtr = /^([0-9\.]{4,4})+$/;
			var filtr1= /^([\.]{1,4})+$/;
			if (filtr.test(number)  || filtr1.test(number)) {
				if (parseInt(number) > 1900 || filtr1.test(number)) result = true;
			}
			return result;
		},

		_valideMonth : function(number) {
			if (number == '' ) return true;
			var result = false;
			var filtr = /^([0-9\.]{1,2})+$/;
			if (filtr.test(number)) {
				if (parseInt(number) > 0 && parseInt(number)< 13)	result = true;
			}
			return result;
		},


		_valideDay : function(number) {
		if (number == '') return true;
			var result = false;
			var filtr = /^([0-9]{1,2})+$/;
			if ( filtr.test(number)) {
				if (parseInt(number) > 0 && parseInt(number)< 32) result = true;
			}
			return result;
		},


		_valideInt : function(number) {
			if (number == '') return true;
			var result = false;
			var filtr = /^([0-9]{1,})+$/;
			if (filtr.test(number)) {
				result = true;
			}
			return result;
		},


			_valideString : function(number) {
			if (number == '') return true;
			var result = false;
			var filtr = /^([^0-9]{2,})+$/;
			if (number == '' || filtr.test(number)) {
				result = true;
			}
			return result;
		},
		
		
		_AddCommentsForm: function(){
			var url = '/comments/addcomment/';
					
			new Ajax.Request(
				url,
				{
					asynchronous 	: false,
					method			  : 'POST',
	      	parameters		: Form.serialize(this._form),
					onComplete		: function (req) {
									
					if (req.responseText.substr(0,1) == '1') {
							Form.reset(this._form);
							$('send_status').innerHTML = 'Kometarz został dodany';
							$('send_status').show();
							$('send_status').scrollTo();
						} else {
							$('send_status').innerHTML = 'Wystąpiły błedy podczas dodawania komentarza, proszę spróbować później'; 
							$('send_status').show();
							$('send_status').scrollTo();
						}
//						
//						setTimeout( function() {
//							Element.show(div);
//						}.bind(this), 2000);
						return false;
				}.bind(this)
				});	
				return false;	
		},
		
		_AddTopicForm: function(){
			var url = '/forum/addtopic/';
					
			new Ajax.Request(
				url,
				{
					asynchronous 	: false,
					method			  : 'POST',
	      	parameters		: Form.serialize(this._form),
					onComplete		: function (req) {
									
					if (req.responseText.substr(0,1) == '1') {
							Form.reset(this._form);
							$('send_status').innerHTML = 'Temat został dodany';
							$('send_status').show();
							$('send_status').scrollTo();
						} else {
							$('send_status').innerHTML = 'Wystąpiły błedy podczas dodawania tematu, proszę spróbować później'; 
							$('send_status').show();
							$('send_status').scrollTo();
						}
//						
//						setTimeout( function() {
//							Element.show(div);
//						}.bind(this), 2000);
						return false;
				}.bind(this)
				});	
				return false;	
		},		
		
		_AddPostForm: function(){
			var url = '/forum/addpost/';
					
			new Ajax.Request(
				url,
				{
					asynchronous 	: false,
					method			  : 'POST',
	      	parameters		: Form.serialize(this._form),
					onComplete		: function (req) {
									
					if (req.responseText.substr(0,1) == '1') {
							Form.reset(this._form);
							$('send_status').innerHTML = 'Post został dodany';
							$('send_status').show();
							$('send_status').scrollTo();
						} else {
							$('send_status').innerHTML = 'Wystąpiły błedy podczas dodawania posta, proszę spróbować później'; 
							$('send_status').show();
							$('send_status').scrollTo();
						}
//						
//						setTimeout( function() {
//							Element.show(div);
//						}.bind(this), 2000);
						return false;
				}.bind(this)
				});	
				return false;	
		},
		
		
		_VoteForm: function(){
			
			switch(this._formName){
				case 'vote_form_gallery':
					var url = '/Galleries/addvote/';
					break;
				case 'vote_form_club':
					var url = '/Clubs/addvote/';
				break;	
				case 'vote_form_review':
					var url = '/Reviews/addvote/';
				break	
						
			}
			
				
			new Ajax.Request(
				url,
				{
					asynchronous 	: false,
					method			  : 'POST',
	      	parameters		: Form.serialize(this._form),
					onComplete		: function (req) {
						
					var ret = req.responseJSON;
		
				switch (parseInt(ret.status)){
      
        case 1:
           // alert('test'+ret.count);
						$('send_status_vote').innerHTML = 'Dziękujemy za oddanie głosu.';
						$('send_status_vote').show();
						$('send_status_vote').scrollTo();
						Element.update($('rating') , ret.rating);
						Element.update($('count') ,'('+ret.count+' głosy)');
						Form.reset(this._form);
						this._form.hide();
        break;
        
        case 2:
        	    Form.reset(this._form);
						  $('send_status_vote').innerHTML = 'Już oddałeś głos.';
							$('send_status_vote').show();
					   	$('send_status_vote').scrollTo();
					 	 this._form.hide();
        break;
        
        default:
        	$('send_status_vote').innerHTML = 'Wystąpiły błedy podczas dodawania glosu, proszę spróbować później'; 
					$('send_status_vote').show();
					$('send_status_vote').scrollTo();
        
        
        
        
        }
				
	
//						setTimeout( function() {
//							Element.show(div);
//						}.bind(this), 2000);
						return false;
				}.bind(this)
				});	
				return false;	
		
		},
		
		
		_AnswerForm: function(){
			var url = '/contests/addanswer/';
					
			new Ajax.Request(
				url,
				{
					asynchronous 	: false,
					method			  : 'POST',
	      	parameters		: Form.serialize(this._form),
					onComplete		: function (req) {
									
					if (req.responseText.substr(0,1) == '1') {
							Form.reset(this._form);
							$('send_status').innerHTML = 'Odpowiedź została wysłana';
							$('send_status').show();
							$('send_status').scrollTo();
						} else {
							$('send_status').innerHTML = 'Wystąpiły błedy podczas przesyłania odpowiedzi, proszę spróbować później'; 
							$('send_status').show();
							$('send_status').scrollTo();
						}
//						
//						setTimeout( function() {
//							Element.show(div);
//						}.bind(this), 2000);
						return false;
				}.bind(this)
				});	
				return false;	
		},		

		
		_SendEmailArangeForm: function(){
			
			var url = '/forms/sendmailarange/';
			
			var div = Element.up(this._form , 'div');
			Element.hide(div);
			var preload = Element.previous(div , 'div.preload'); 
			Element.show(preload);
			
			new Ajax.Request(
				url,
				{
					asynchronous 	: false,
					method			  : 'POST',
      		parameters		: Form.serialize(this._form),
					onComplete		: function (req) {
						
					Element.hide(preload);
					
					if (req.responseText.substr(0,1) == '1') {
						$('info_send').show();
						$('send_error').hide();
						$('send_status').show();
						Form.reset(this._form);
					//	Element.hide(Element.down(this._form , 'div.show_info'));
						$('show_info_a').hide();
					
						//Element.hide(Element.down(this._form , 'p.send_error_a'));
						//Element.show(Element.down(this._form , 'p.send_status_a'));
							
					} else {
						//Element.hide(Element.down(this._form , 'p.send_status_a'));
						//Element.show(Element.down(this._form , 'p.send_error_a'));
						$('info_send').show();
						$('show_info_a').hide();
						$('send_error').show();
						$('send_status').hide();
					}
					setTimeout( function() {
						Element.show(div);
					}.bind(this), 2000);
					return false;
				}.bind(this)
				});	
				return false;	
		}
}
