/*********

ВНИМАНИЕ! ПРИ САБМИТЕ НЕТ AJAX ПРОВЕРКИ ПОЛЕЙ!!!

*************/

var chigga = Class.create();

email  = "^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,})+$";

chigga.prototype = {	
	initialize : function(form) {
	 	chigga = this;
		this.checkTimer = this.checkTimer || 0.3;	// Интервал проверки элементов формы
		this.defaultCheckOnLoad |= 1; // При загрузке проверять поля
		this.checkHash = new Array;
		this.inputs = new Array;
		this.form = form;
////////////////////		this.ajaxElements = {}; //  Массив имен полей, которым требуется Ajax проверка, а также их статусов
		form.chigga = chigga;
		form.right = false;
		
		// При нажатии на submit
		form.onsubmit = function() {
			chigga.form.right = true;
			chigga.checkedAjax = chigga.checkAjaxElements;
			// Проверяем каждое поле
			Form.getElements(form).each(function(obj) { 
				if (obj.regExp) {
					reg = new RegExp(obj.regExp);
					if (!reg.test(Form.Element.getValue(obj))) {
						Element.removeClassName(obj, "rightInput");
						Element.addClassName(obj, "badInput");
						chigga.inputs[obj.name].bubble.setOpacity();
						chigga.form.right = false;
					}
				}
				// Если есть Ajax проверка..
				if (typeof obj.ajaxVar != 'undefined') obj.checkAjax();
			}); 
///////////////////				alert(chigga.ajaxElements);
			// Если всё хорошо - делаем submit
			if (form.right)  {
				return true;
			} else {
				for (i in document.bubbles) {
					if (document.bubbles[i].bubbleDiv) {
						newLeft = Position.cumulativeOffset(document.bubbles[i].obj)[0]+Element.getDimensions(document.bubbles[i].obj).width-Element.getDimensions(document.bubbles[i].obj).width/2-16;
						newTop = Position.cumulativeOffset(document.bubbles[i].obj)[1]-Element.getDimensions(document.bubbles[i].bubbleDiv).height-this.scrollTop-$('content').scrollTop;
						if (Position.within($('content'), newLeft, newTop) && Position.within($('content'), newLeft, newTop+document.bubbles[i].bubbleDiv.offsetHeight*2))	{
							document.bubbles[i].bubbleDiv.style.display = 'block';
							document.bubbles[i].iframe.style.display = 'block';
							document.bubbles[i].bubbleDiv.style.top=newTop;
							document.bubbles[i].iframe.style.top=newTop;
						} else {
							document.bubbles[i].bubbleDiv.style.display = 'none';
							document.bubbles[i].iframe.style.display = 'none';
						}
					}
				}
				return false;
			}
		}


		Form.getElements(form).each(function(obj) { 
			chigga.inputs[obj.name] = obj;
			chigga[obj.name] = obj;
			// Вешаем на каждый объект формы функцию проверки
			chigga.inputs[obj.name].check = function(regExp, errMsg) {
				if (this.bubble) {
					this.bubble.addMsg(errMsg);
					this.regExp.push(regExp);
				} else {
					this.bubble = new bubble(this, errMsg);
					this.bubble.disableOnClick = 1;
					this.regExp = new Array(regExp);
					if (chigga.defaultCheckOnLoad) chigga.checkField(this);
					// Если есть Ajax проверка..
					if (typeof obj.ajaxVar != 'undefined') this.checkAjax();
				}
				new Form.Element.Observer(this, chigga.checkTimer, chigga.checkField);
			}

			// Если поле нужно проверить с помощью Ajax
			chigga.inputs[obj.name].ifExist = function(URI, errMsg) {
				this.ajaxVar = [URI, errMsg];
				this.ajaxBubble = new bubble(this, errMsg);
				this.ajaxBubble.disableOnClick = 1;
				this.checkAjax = function() {
					obj = this;
					if (typeof chigga.inputs[obj.name].ajaxVar != 'undefined') {
						var rand = Math.round(Math.random(100)*100);
						var pars = 'form='+ chigga.form.name +'&obj='+ obj.name  +'&value='+ obj.value + '&' + rand;
						obj.ajax = new Ajax.Request( obj.ajaxVar[0], {method: 'post', parameters: pars, onComplete: showResponse} );
					}
				}
//////////////////				chigga.ajaxElements.'asd' = 1;// += { 'asd' : 1}
//////////////////				alert(chigga.ajaxElements.length);
				Event.observe(this, 'blur', chigga.CheckAjaxOnBlurElement, true);
			}

		});
	},
	
// Запускается при изменении любого проверяемого поля
	checkField : function(obj) {
		chigga.inputs[obj.name].passed = false;
		obj.regExp.each(function(regElem) {
			reg = new RegExp(regElem);
			// Проверяем каждым регом значение поля
			if (!reg.test(Form.Element.getValue(obj))) {
				chigga.inputs[obj.name].passed = true;
			}
		});
		if (!chigga.inputs[obj.name].passed) {
			obj.isBad = 0;
			Element.removeClassName(obj, "badInput");
			Element.addClassName(obj, "rightInput");
			Event.stopObserving(chigga.inputs[obj.name], 'blur', chigga.onBlurElement, true);
			chigga.inputs[obj.name].bubble.removeOpacity();
		} else {
			obj.isBad = 1;
			Element.removeClassName(obj, "rightInput");
			Element.addClassName(obj, "badInput");
//*&&&&&&&&&&&&&&&&!!!!! - УБИЛ ОСНОВНУЮ ФУНКЦИОНАЛЬНОСТЬ!.. (СРАНЫЙ ИЕ)			Event.observe(chigga.inputs[obj.name], 'blur', chigga.onBlurElement, true);
		}
		// Если есть Ajax проверка - убираем этот балон при изменении поля
//		alert(obj.ajaxVar)
		if  (typeof obj.ajaxVar != 'undefined') {
			chigga.inputs[obj.name].ajaxBubble.removeOpacity();
		}
	},
	
// Если юзер сваливает из неправильно заполненного поля
	onBlurElement : function(e) {
		obj = e.srcElement || e.target;
		alert(obj.name)
		chigga.inputs[obj.name].bubble.setOpacity();
	},

// Ф-ция проверки значения поля с помощью AJAX
	CheckAjaxOnBlurElement: function(e) {
		obj = e.srcElement || e.target;
		if (typeof obj.ajaxVar != 'undefined') obj.checkAjax();
	}

}

/***************** ВНЕШНИЕ ФУНКЦИИ ***********************/

function showResponse(originalRequest) {
	// 0 = form name
	// 1= form element name
	// 2 = response value
	var resp = (originalRequest.responseText).split("\r\n");
	var form = document.forms[resp[0]];
	if (form) {
		var chigga = form.chigga;
		var obj = form[resp[1]];
		var resp = resp[2];
		if (resp == 1) {
			Element.removeClassName(obj, "rightInput");
			Element.addClassName(obj, "badInput");
			// begin: Special for STUPID IE !!!
			if (chigga.inputs[obj.name].bubble)	{
				chigga.inputs[obj.name].bubble.removeOpacity();
			}
			// end: Special for STUPID IE !!!
			chigga.inputs[obj.name].ajaxBubble.setOpacity();
			form.right = false;
		} else {
			if (obj.isBad == 0) {
				Element.removeClassName(obj, "badInput");
				Element.addClassName(obj, "rightInput");
/////////////////alert(form.chigga.ajaxElements.length);
/////////////////				for (i in form.chigga.ajaxElements) {
////////////////					document.body.innerHTML += i;
///////////////				}
			}
			chigga.inputs[obj.name].ajaxBubble.removeOpacity();
		}
	}
}
