document.observe("dom:loaded", function() {

	function formSelectElements(oForm, sQuery) {
		return oForm.getElements().findAll(function (oItem) {
			if (sQuery.length == 0) return true;
			if (sQuery.substr(sQuery.length - 1, 1) == '*')
				return oItem.name.startsWith(sQuery.substr(0, sQuery.length - 1));
			else
				return oItem.name == sQuery;
		});
	}
	
	function formReferedElements(oForm, oTest) {
		var sSelect = oTest.name;
		var iBeg = sSelect.indexOf('[');
		var iFin = sSelect.lastIndexOf(']');
		if ((iBeg>0) && (iFin>0) && (iFin > iBeg))
		{
			sSelect = sSelect.substring(iBeg + 1, iFin);
			return oForm.getElements().select(function (oItem) {
				return (oItem.name == sSelect);
			});
		}
		else
			return null; //new Enumerable()
	}
	
	// preload ajax-loader image
	(new Element('img')).src = "/images/vkev/ajax-loader.gif";
	
	
	$$("form").each(function(oForm) {

		formSelectElements(oForm, 'form-keys*').each( function (oTest) {
			formReferedElements(oForm, oTest).each ( function (oItem) {
				oItem.observe('keypress', function (event) {
					var iKeyNum = 0;
					if (window.event) { iKeyNum = event.keyCode; } 	// IE
					else if (e.which) { iKeyNum = event.which; } 	// Netscape/Firefox/Opera
					var sKeyChar = String.fromCharCode(iKeyNum);
					var re = new RegExp(oTest.getValue(), 'gi');
					if (re.test(sKeyChar)) {
						Event.stop(event);
						return false;
					}
				});
			});
		});


		oForm.observe("submit", function(event) {
			
			// validate input, textarea, etc data
			var sVerify = oForm.getInputs('hidden', 'form-verify').pluck('value').join();
			if (sVerify.length > 0) {
				var bProblems = false;	
				var bBlankMsg = false; 
				var oFirstProblem = null;
				var sFormVerify = "";
				var aErrTexts = new Array();
				var arrMatches = sVerify.match(/\[[^\[\]]+\]/g);
				if (arrMatches != null) {
					arrMatches.each( function (sItem) {
						var bBlankFound = false;
						var sElem = sItem.substr(1, sItem.length - 2);
						var aTests = oForm.getInputs('hidden', 'form-test' + sItem).pluck('value');
						var bElemFound = false;
						var bErrFound = false;
						
						formSelectElements(oForm, sElem).each (function(oElem) {
							bElemFound = true;
							if (oElem.visible()) {
								var bErr = false;
								var sVal = oElem.getValue(); 
								if ((aTests.length > 0) && !sVal.blank()) {
									aTests.each(function(sTest) {
										var re = new RegExp(sTest, "gi");
										bErr = !re.test(sVal);
									});
								}
								else {
									bErr = sVal.blank();
									bBlankFound |= bErr; 
								}
								bErrFound |= bErr;
								if (bErr && (oFirstProblem == null)) 
									oFirstProblem = oElem;
								oElem.setStyle({
									  backgroundColor: bErr ? '#ffe': ''
								});
							}
						});
						
						if (bElemFound) {
							
							bProblems |= bErrFound || bBlankFound;
							bBlankMsg |= bBlankFound;
							if (bErrFound && !bBlankFound) {
								var sErrText = oForm.getInputs('hidden', 'form-msg' + sItem).pluck('value').join(' ');
								if (sErrText.length>0) aErrTexts.push(sErrText);
							}
						}
						sVerify = sVerify.replace(sItem, (bElemFound && !bErrFound) ? '1' : '0');
					});
				}
				
				var bEvalErr = false;
				try {
					bEvalErr = !eval(sVerify);
				}
				catch (e) { alert(e); }
				
				bProblems = bProblems && bEvalErr;
				if (bProblems)
				{
					var sConfirm = "";
					sConfirm = aErrTexts.join(' ');
					if (bBlankMsg) {
						if (sConfirm.length > 0) sConfirm+=' ';
						sConfirm += oForm.getInputs('hidden', 'form-msg[blank]').pluck('value').join(' ');
					}
					if (sConfirm.length > 0) sConfirm+=' ';
					sConfirm += oForm.getInputs('hidden', 'form-msg[asksend]').pluck('value').join(' ');
					
					if (!confirm(sConfirm))
					{
						
						if (oFirstProblem) {
							oFirstProblem.focus();
							oFirstProblem.select();
						}
						
						Event.stop(event);
						return false;
					}
				}
			}
			
			if (oForm.getInputs("hidden", "form-ajax").pluck('value').include('yes'))
			{
			
				// send data using ajax method 
				oForm.getInputs('submit').invoke('disable');
				oForm.request( {
					onCreate: function () {
						// create ajax-loader icon on startup
						var oImg = new Element('img');
						oImg.src = "/images/vkev/ajax-loader.gif";
						oImg.width = 16;
						oImg.height = 16;
						oImg.hspace = 16;
						oForm.getInputs('submit')[0].insert({after:oImg});
					},
					onComplete: function(transport) {
						var sMsg = "";
						var sBtn = "";
						if ((transport.status == 200) && (transport.responseText.substr(0, 3) == "200")) {
							sMsg = oForm.getInputs('hidden', 'form-msg[success]').pluck('value').join(' ');
							sBtn = oForm.getInputs('hidden', 'form-msg[reset]').pluck('value').join(' ');;
						}
						else {
							//alert(transport.responseText);
							sMsg = oForm.getInputs('hidden', 'form-msg[failure]').pluck('value').join(' ');
							sBtn = oForm.getInputs('hidden', 'form-msg[resend]').pluck('value').join(' ');
						}
						oForm.getElements().invoke('setStyle', {backgroundColor:''});
						oForm.getInputs('submit').invoke('enable');
						oForm.getInputs('submit')[0].next().remove();	// remove ajax-loader icon.
						var oButton = new Element('input');
						oButton.type = "submit";
						oButton.value = sBtn;
						oButton.observe('click', function (event) {
							var oButton = Event.element(event);
							oButton.up().next().show();		// show form
							oButton.up().next().enable();	// enable form
							oButton.up().next().focusFirstElement().select();	// focus and select first form element.
							oButton.up().remove();			// remove div
							oButton.remove();				// remove button
						});
						var oDiv = new Element('div');
						oDiv.update(sMsg + "<br/><br/>");
							oDiv.insert( oButton );
							oDiv.clonePosition(oForm);
							oForm.insert( { before: oDiv } );
							oForm.hide();
						}    
					
				});			
					
				Event.stop(event);
			}
		}); // end of submit observe 
	});
	
	
	
});

 
