CValidator = function(form){
			this.form = form;
		}
		
	CValidator.prototype = {
					
					hints : {
							phone : '<p class=\"error\">Внимание! Вы неверно ввели номер телефона:<br /><span>Пример:</span> 89265555555</p>',
							cell : '<p class=\"error\">Внимание! Вы неверно ввели номер мобильного телефона:<br /><span>Пример:</span> 81234567891</p>',
							eml : '<p class=\"error\">Внимание! Вы неверно ввели адрес электронной почты:<br /><span>Пример:</span> primer@primer.pr</p>',
							pass : '<p class=\"error\">Внимание! Пароль введен в неверном формате:<br />Пароль должен содержать от 6 до 20 символов из списка: A-z, 0-9, ! @ # $ % ^ & * ( ) _ - +'
						},
					
					inputCol : null,

					form : null,
					
					curHints : new Array(),
					
					sliceHelper : function(slicer){
							var tmpBegin = this.inputCol;
							var tmpEnd = this.inputCol;
							this.inputCol = null;
							if(slicer == 0){
								var sliced = tmpBegin.slice(slicer+1)
								this.inputCol = sliced;
							}else{
								var beg = tmpBegin.slice(0,slicer);
								var end = tmpEnd.slice(slicer+1);
								var bteg = beg.add($.makeArray(end));
								this.inputCol = bteg;
								}
					},
					
					slice : function(val, pattern, el){
						var slicer = 0;
						if(val != '' && pattern.test(val)){
							for(var i = 0; i < this.inputCol.length; i++){
								if(this.inputCol[i].id == el.id){
									slicer = i;
									break;		
								}
							}
							this.sliceHelper(slicer);
							return true;
						}
						return false;
					},

					num : function(el){
							var val = el.value;
							var pattern = new RegExp("^[0-9]{1,20}$");
							this.slice(val, pattern, el)
						},

					eml : function(el){
							var pattern = new RegExp("^[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}$","i");
							if(!this.slice(el.value, pattern, el))
							{
								$(el).prev(".selected")
								this.curHints.push(this.hints.eml)
							}
						},

					txt : function(el){
						var val = el.value;
						var pattern = new RegExp("^[\\sЁёа-яА-Яa-zA-Z-]{2,40}$");
						this.slice(val, pattern, el);
					},
					
			
					login : function(el){
						if(this.inputCol.length == 1){
						var val = el.value;
						var xml = $.ajax({
   							type: "POST",
							url: "auth.wbp",
   							data: "Login="+val+"&FirstName=test&Email=test@test.tu&Password=123456&Confirmation=123456",
							async: false
						 }).responseXML;
						var response = $("auth-data",xml)[0].firstChild.nodeValue;
						var pattern = new RegExp("^Success$");
						this.slice(response.toString(), pattern, el);
						}
					},

					info : function(el){
						var val = el.value;
						var pattern = new RegExp("^[\\s0-9.,Ёёа-яА-Яa-zA-Z-\/]{2,150}$");
						this.slice(val, pattern, el);
					},

					booknumb : function(el){
						var val = el.value;
						var pattern = new RegExp("^[0-9a-zA-Z]{6}$");
						this.slice(val, pattern, el);
					},
					
					notnull : function(el, params){
						var val = el.value;
						var pattern = new RegExp("^.+$");
						this.slice(val, pattern, el)
					},
					
					chbx : function(el){
						var pattern = new RegExp("^true$");
						this.slice(el.checked, pattern, el);
					},
					
					pass : function(el){
						var pattern = new RegExp("^[a-zA-Z0-9!@#$%^*()_+\-]{6,20}$");
						if(el.value == $("#password2")[0].value){
							if(!this.slice(el.value, pattern, el))
								{
									$(el).prev(".selected")
									this.curHints.push(this.hints.pass)
								}
						}
					},
					
					cell : function(el){
						var pattern = new RegExp("^[0-9]{11}$");
						if(!this.slice(el.value, pattern, el))
							{
								$(el).prev(".selected")
								this.curHints.push(this.hints.cell)
							}
					},
					
					phone : function(el){
						var pattern = new RegExp("^[0-9]{7,14}$");
						if(!this.slice(el.value, pattern, el))
							{
								$(el).prev(".selected")
								this.curHints.push(this.hints.phone)
							}
					},
					
					colorize : function(elId)
					{
						var curEl = $('#'+elId).parent('div');
						if(curEl.length == 0){curEl = $('#'+elId).parent('fieldset');}
						var curClass = curEl.attr('class');
						var msg = "";
						if($('#'+elId).attr('inptype') == 'pass'){
							if($('#'+elId)[0].value != $("#password2")[0].value){
								msg = "<span class=\"errorText\">пароли не совпадают</span>";
							}else{
								msg = "<span class=\"errorText\">поле заполнено неверно</span>";
							}
						}else if($('#'+elId).attr('inptype') == 'login'){
							if($('#'+elId)[0].value == ''){
								msg = "<span class=\"errorText\">поле заполнено неверно</span>";
							}else{
								if(this.inputCol.length == 1){
									msg = "<span class=\"errorText\">логин уже существует</span>";
								}
							}
							
						}else if($('#'+elId).attr('inptype') != 'login'){
							msg = "<span class=\"errorText\">поле заполнено неверно</span>";
						}

						if($('#'+elId).attr('inptype') == 'login'){
							if(this.inputCol.length == 1 || $('#'+elId)[0].value == ''){
								curEl.attr('class',curClass + ' hasError').append(msg);
								if(!curClass.match("hasError"))
								{
									curEl.attr('class',curClass + ' hasError')
								}
							}
						}else{
							curEl.attr('class',curClass + ' hasError').append(msg);
							if(!curClass.match("hasError"))
							{
								curEl.attr('class',curClass + ' hasError')
							}
						}
						
					},

					deColorize : function(elId)
					{
						$('#validationErrors').css('display','none').empty();
						this.curHints.length = 0;
						var curEl = $('#'+elId).parent('div');
						if(curEl.length == 0){curEl = $('#'+elId).parent('fieldset');}
						var curClass = curEl.attr('class');
						curClass = curClass.replace('hasError','');
						curEl.attr('class', curClass).remove('span.errorText');
						$('span.errorText',curEl).remove();
						curEl.attr('class', curClass);
					},

					applyType : function(thisObj){
						var inpType = this.getAttribute('inptype');
							inpWparams = inpType.split('::');
						var thisObj = this.thisObj;
						thisObj[inpWparams[0]](this, inpWparams);
					},

					grab : function(){
						var inputCol = $('input[inptype], select[inptype], textarea[inptype]');
						for(var i = 0 ;i < inputCol.length;i++){
							inputCol[i].thisObj = this;
						}
						this.inputCol = inputCol;
						this.inputCol.each(
							function(){
								this.thisObj.deColorize(this.id);
								}
							)
					},
					
					check : function(){
						this.inputCol.each(this.applyType)
					},
					
					showErrors : function(){
						var errorBlock = $('#validationErrors');
						if(this.curHints.length != 0)
						{
							errorBlock.css("display","block");
							for(var i = 0; i < this.curHints.length; i++)
							{
								errorBlock.append(this.curHints[i]);
							}
						}
					},
					
					validate : function(formId, confirmHandler){
						this.grab();
						this.check();
						this.inputCol.each(
							function(){
								this.thisObj.colorize(this.id);
								}
							)
						if(this.inputCol.length == 1){
							this.check();}
						if(this.inputCol.length == 0)
						{
							try{
							this.deColorize("login");
							}catch(e){}
							var isContinue = true;
							if (typeof confirmHandler != "undefined")
							{
								isContinue = confirmHandler();
							}
							if (isContinue)
							{
								if(formId)
								{
									$("#"+formId).submit();
								}else{
									$('#sendForm').click();
								}
							}
						}
						else
						{
							this.showErrors();
						}
					}
				};
