Event.observe(window,'load',function(){
	var requiredElm = [];
	$$('form').each(function(elm){
		
		new Form.EventObserver(elm,checkFormCompletetion);
		
		var labels = elm.select('.formItem label');
		
		elm.observe(':customReset',resetForm);
		
		if (labels.length == 0) {
			return;
		}
		
		var maxWidth = labels.max(function(lbl){
			return lbl.offsetWidth;
		});
		
		var formWidth = elm.select('.formItem')[0].offsetWidth; 
		
		elm.select('.formItem').each(function(item){
			item.select('label').each(function(input){
				if (item.readAttribute('required') == 'true'){
					input.insert('<span style="color:#B31E1E; position:absolute; top:0; right:-5px;">*</span>');
					if (input.up('.panel').select('.reqInstr').length == 0) {
						input.up('.panel').insert('<span style="position:absolute; top:-14px; right:5px;" class="reqInstr">required field <span style="color:#B31E1E;">*</span></span>');
					}
				}
				input.setStyle({'width':maxWidth+'px'});
			});
			
			item.select('.input').each(function(input){
				if (item.readAttribute('required') == 'true'){
					input.select('input','select','textarea')[0].addClassName('required');
					input.observe('keyup',checkFormCompletetion);
				}
				input.setStyle({'width':(formWidth-maxWidth - 20)+'px'});
			});
			
			item.select('input[type="text"], input[type="file"], input[type="password"], input[type="checkbox"], input[type="radio"], select, textarea').each(function(input){
				input.observe(':customBlur',blurInput);
				input.observe(':customUnBlur',unBlurInput);
				if (input.readAttribute('collapse')) {
					input.observe('blur',blurInput);
					if (input.present() && $F(input)!='UI2NULL') {
						input.fire(':customBlur');
					}
				}
				
				input.observe(':setValid',setValid);
				input.observe(':setInvalid',setInvalid);
				if (input.readAttribute('ajaxUpdate')) {
					if (input.readAttribute('updateOn')) {
						input.observe(input.readAttribute('updateOn'),fireAjaxUpdater);
					}else{
						new Form.Element.EventObserver(input,fireAjaxUpdater);
					}
				}
				if (input.readAttribute('ajaxresponder')) {
					if (input.readAttribute('respondOn')) {
						input.observe(input.readAttribute('respondOn'),fireAjaxRequest);
					}else{
						new Form.Element.EventObserver(input,fireAjaxRequest);
					}
				}
				
				//if (input.readAttribute('preprocessOn') && input.readAttribute('preprocess')) {
				
				if (input.readAttribute('preprocess')) {
					if (input.readAttribute('preprocessOn')) {
						input.observe(input.readAttribute('preprocessOn'),preprocess);
					}else{
						input.observe(':preprocess',preprocess);
					}
				}
				
				if (input.readAttribute('postprocess')) {
					if (input.readAttribute('postProcessOn')) {
						input.observe(input.readAttribute('postProcessOn'),postprocess);
					}else{
						input.observe(':postprocess',postprocess);
					}
				}

				if (input.readAttribute('mask')) {
					input.observe(':mask',mask);
				}
				
				if (input.readAttribute('calendar')) {
					input.stopObserving('click');
					input.stopObserving('focus');
					input.observe('focus',displayCalendar);
					input.observe(':calendar',displayCalendar);
				}
			});
		});
	});
	
	function blurInput(evt,skipMatch)
	{
		var input;
		
		if (Object.isElement(evt)) {
			input = evt;
		}else{
			input = Event.element(evt);
		}
		if (input.visible() === false) {
			return;
		}
		if (input.match('input[type="radio"]') && input.checked==false) {
			return;
		}
		if (input.tagName == 'SELECT' && $F(input)=='UI2NULL') {
			return;
		}
		var wrapper = input.up('.input');
		// run matcher
		if (Object.isElement($(input.readAttribute('match'))) && skipMatch != true  && input.present()) {
			if (false == matchValues(input,$(input.readAttribute('match')))) {
				unBlurInput($(input.readAttribute('match')));
				unBlurInput(input);
				input.observe(':setMismatched',setMismatched);
				input.fire(':setMismatched');
				return;
			}else if($(input.readAttribute('match')).present()){
				blurInput($(input.readAttribute('match')),true);
				input.observe(':setMatched',setMatched);
				input.fire(':setMatched');
			}
		}
		
		// run validater
		if (input.readAttribute('validate') && input.present()) {
			if (true === validate(input)) {
				if ($(input.id+'-bad')) {
					$(input.id+'-bad').hide();
					input.up('.group').removeClassName('bad');
				}
				if ($(input.id+'-part')) {
					$(input.id+'-part').hide();
					input.up('.group').removeClassName('part');
				}
			}else{
				if ($(input.id+'-bad')) {
					$(input.id+'-bad').appear();
					input.up('.group').addClassName('bad');
				}
				if ($(input.id+'-part')) {
					$(input.id+'-part').hide();
					input.up('.group').removeClassName('part');
				}
				return;
			};
		}
		
		if ((input.readAttribute('collapse') || evt.eventName == ":customBlur") && wrapper.select('.value').length == 0) {
			if (input.present()) {
				if (input.match('input[type="radio"]')) {
					input.up('.input').select('div').each(function(elm){
						elm.down('input').hide();
						elm.hide();
					});
				}else{
					input.hide();
				}
				input.fire(':collapse');
				var changeElm = '<span style="cursor:pointer; display:inline-block; margin-left:10px;float:right"><img src="/assets/images/orange_arrow.png"> change</span>';
				input.fire(':preprocess');
				input.fire(':mask');
				
				var wrapperValue = $F(input);
				if (input.match('input[type="radio"]')) {
					wrapperValue = $('inputLabel_'+$F(input)).innerHTML;				
				}
				
				if (input.tagName == 'SELECT') {
					wrapperValue = input.options[input.selectedIndex].text;
				}
				
				if (input.type == 'password') {
					wrapperValue = $F(input).replace(/./g,'&bull;');
				}
				
				if (input.readAttribute('mask')) {
					wrapperValue = input.retrieve('maskValue');
				}
				
				input.fire(':wrapperCreated');
				wrapper.insert('<div class="value" style="cursor:pointer;">'+changeElm+wrapperValue+'</div>');
				input.fire(':postprocess');
				
				wrapper.observe('click',unBlurInput);
			}
		}
	}
	
	function setValid(event)
	{
		input = Event.element(event);
		if ($(input.id+'-bad')) {
			$(input.id+'-bad').hide();
			input.up('.group').removeClassName('bad');
		}
		if ($(input.id+'-part')) {
			$(input.id+'-part').hide();
			input.up('.group').removeClassName('part');
		}
	}
	
	function setInvalid(event)
	{
		input = Event.element(event);
		if ($(input.id+'-bad')) {
			$(input.id+'-bad').appear();
			input.up('.group').addClassName('bad');
		}
		if ($(input.id+'-part')) {
			$(input.id+'-part').hide();
			input.up('.group').removeClassName('part');
		}
	}

	function setMismatched(event)
	{
		input = Event.element(event);
		if ($(input.id+'-bad')) {
			$(input.id+'-bad').hide();
			input.up('.group').removeClassName('bad');
		}
		if ($(input.id+'-part')) {
			$(input.id+'-part').appear();
			input.up('.group').addClassName('part');
		}
	}

	function setMatched(event)
	{
		input = Event.element(event);
		if ($(input.id+'-bad')) {
			$(input.id+'-bad').hide();
			input.up('.group').removeClassName('bad');
		}
		if ($(input.id+'-part')) {
			$(input.id+'-part').hide();
			input.up('.group').removeClassName('part');
		}
	}
	
	function unBlurInput(evt)
	{
		var elm;
		if (Object.isElement(evt)) {
			elm = evt;
		}else{
			elm = Event.element(evt);
		}
		if (!elm.hasClassName('input')) {
			elm = elm.up('.input');
		}
		if (elm.select('input','select')[0].visible()) {
			return;
		}
	
		elm.select('.value').each(function(val)
			{
				elm.fire(':wrapperRemoved');
				val.remove();
			});

		if (elm.select('input[type="radio"]').length > 0) {
			elm.select('div').each(function(div){
				var input = div.down('input');
				input.show();
				div.setStyle('display:inline-block');
				//input.activate();
				input.fire(':restore');
				input.observe('blur',blurInput);
			});
			return;
		}
		
		elm.select('input, select').each(function(input)
			{
				input.show();
				input.activate();
				input.fire(':restore');
				input.observe('blur',blurInput);
			});
	}
	
	function highlightWrapper(evt)
	{
		var elm = Event.element(evt);
		new Effect.Highlight(elm);
	}
	
	function matchValues(workingInput,refInput)
	{
		if (!workingInput || !refInput) {
			return;
		}
		
		if (Object.isFunction(refInput)) {
			return;
		}
		$(workingInput).present();
		$(refInput).present();
		if ($(refInput).present() && $(workingInput).present()) {
			if ($F(workingInput) === $F(refInput)) {
				return true;
			}else{
				return false;
			}
		}
		return true;
	}
	
	function validate(input)
	{
		var str = '';
		switch(input.readAttribute('validate')) {
			case 'email':
				return /\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}\b/i.match($F(input));
				break;
			case 'number':
				return /^\d*$/.match($F(input));
				break;
			case 'zipcode':
				return /^\d{5}-\d{4}|\d{5}|[A-Z]\d[A-Z] \d[A-Z]\d$/i.match($F(input));
				//return /^(?:^\d{5}-\d{4}|\d{5}|[A-Z]\d[A-Z] \d[A-Z]\d$)$/m.match($F(input));
				break;
			case 'alpha':
				return /^\D*$/i.match($F(input));
				break;
			case 'creditcard':
				return /^(?:(4\d{3}[ -]*\d{4}[ -]*\d{4}[ -]*\d(?:\d{3})?)|(5[1-5]\d{2}[ -]*\d{4}[ -]*\d{4}[ -]*\d{4})|(6(?:011|5[0-9]{2})[ -]*\d{4}[ -]*\d{4}[ -]*\d{4})|(3[47]\d{2}[ -]*\d{6}[ -]*\d{5})|(3(?:0[0-5]|[68][0-9])\d[ -]*\d{6}[ -]*\d{4})|((?:2131|1800)[ -]*\d{6}[ -]*\d{5}|35\d{2}[ -]*\d{4}[ -]*\d{4}[ -]*\d{4}))$/.match($F(input));
				break;
			case 'any':
				return input.present() && ($F(input) != 'UI2NULL');
				break;
		}
		return 
	}

	function fireAjaxRequest(evt)
	{
		var input;
		if (Object.isElement(evt)) {
			input = evt;
		}else{
			input = Event.element(evt);
		}
		
		if (!input.present()) {
			return;
		}

		if (input.readAttribute('bindMinChar')) {
			if ($F(input).length < parseInt(input.readAttribute('bindMinChar'))) {
				return false;
			}
		}
		
		if (input.readAttribute('url') && !Object.isFunction(input.readAttribute('url'))) {
			var params = $H(input.up('form').serialize(true));
			params.set('formObserver',input.readAttribute('ajaxResponder'));
			new Ajax.Request(input.readAttribute('url'),
					{
					onCreate:function()
						{
							var indId = input.readAttribute('indicator');
							
							if (Object.isElement($(indId))) {
								$(input.readAttribute('indicator')).appear();
							}
						},
					onComplete:function(response)
						{
							if (Object.isElement($(input.readAttribute('indicator')))) {
								$(input.readAttribute('indicator')).fade();
							}
							input.fire(':responseComplete',response);
						},
					parameters:params,
					evalScripts: true
					});
		}
	}

	function fireAjaxUpdater(evt)
	{
		var input;
		if (Object.isElement(evt)) {
			input = evt;
		}else{
			input = Event.element(evt);
		}
		
		if (!input.present()) {
			return;
		}
		
		if (input.readAttribute('bindMinChar')) {
			if ($F(input).length < parseInt(input.readAttribute('bindMinChar'))) {
				return false;
			}
		}
		var updateElm = $(input.readAttribute('ajaxUpdate'));
		if (updateElm.readAttribute('url') && !Object.isFunction(updateElm.readAttribute('url'))) {
			var params = $H(input.up('form').serialize(true));
			
			new Ajax.Updater(updateElm,updateElm.readAttribute('url'),
					{
					onCreate:function()
						{
							var indId = input.readAttribute('indicator');
							
							if (Object.isElement($(indId))) {
								$(input.readAttribute('indicator')).appear();
							}
						},
					onComplete:function(response)
						{
							if (Object.isElement($(input.readAttribute('indicator')))) {
								$(input.readAttribute('indicator')).fade();
							}
							updateElm.fire(':updated',response);
						},
					parameters:params,
					evalScripts: true
					});
		}
	}
	
	function preprocess(evt)
	{
		var input = Event.element(evt);
		if (input.present()) {
			eval(input.readAttribute('preprocess')+'(input);');
		}
	}
	
	function postprocess(evt)
	{
		var input = Event.element(evt);
		if (input.present()) {
			eval(input.readAttribute('postprocess')+'(input);');
		}
	}
	
	function mask(evt)
	{
		var input = Event.element(evt);
		if (input.present()) {
			input.store('maskValue',eval(input.readAttribute('mask')+'(input);'));
		}
	}
	
	function displayCalendar(evt)
	{
		var input = Event.element(evt);
		if (input.tagName == 'IMG') {
			input = input.previous('input');
		}
		var calendarOptions = input.readAttribute('calendar').evalJSON();
		new CalendarDateSelect(input,
				{
					valid_date_check:function(date)
					{
						switch(true) {
							case (calendarOptions.past==true && calendarOptions.future==false):
								return(date <= (new Date()).stripTime());
								break;
							case (calendarOptions.past==false && calendarOptions.future==true):
								return(date >= (new Date()).stripTime());
								break;
							default:
								return true;
								break;
						}	
					},
					popup:calendarOptions.popup,
					year_range:parseInt(calendarOptions.years_range),
					time:Boolean(calendarOptions.time),
					onchange:function()
					{
						this.fire(':customBlur');
					}
				});
	}
	
	function checkFormCompletetion(form)
	{
		if (Object.isElement(form)) {
			if (!form.tagName == 'FORM') {
				form = form.up('form');
			}
		}else{
			form = Event.element(form).up('form');
		}
		
		var complete = true;
		form.select('.required').each(function(input){
			if (!input.present() || $F(input) == 'UI2NULL') {
				complete = false;
			}else{
				if (input.readAttribute('validate')) {
					if (false == validate(input)) {
						complete = false;
					}
				}
				if (input.readAttribute('match')) {
					if (false == matchValues(input,$(input.readAttribute('match')))) {
						complete = false;
					}
				}
			}
			if ($(input).readAttribute('type') =="checkbox") {
				if (input.checked == false) {
					complete = false;
				}
			}
		});
		
		if (complete == false) {
			form.fire(':incomplete');
			form.select('.UI2Button','.UI2BasicBlock').each(function(button){
				if (button.readAttribute('expectComplete')) {
					button.disable();
				}
				if (button.readAttribute('showOnComplete')) {
					button.hide();
				}
				if (button.readAttribute('hideOnComplete')) {
					button.show();
				}
			});
		}else{
			form.select('.UI2Button','.UI2BasicBlock').each(function(button){
				if (button.readAttribute('expectComplete')) {
					button.enable();
				}
				if (button.readAttribute('showOnComplete')) {
					button.show();
				}
				if (button.readAttribute('hideOnComplete')) {
					button.hide();
				}
			});
			form.fire(':complete');
//			form.select('.UI2Button[expectComplete="true"]').each(function(button){
//				button.enable();
//			});
		}
	}
	
	function resetForm(evt)
	{
		var form = Event.element(evt);
		form.reset();
		form.getElements().each(function(elm)
		{
			if (elm.type != 'hidden') {
				elm.clear();
				elm.fire(':customUnBlur');
			}
		});
	}
});

// processing functions
function ucfirst(input)
{
	    var f = $F(input).charAt(0).toUpperCase();
	    input.value = f + $F(input).substr(1);
}

// masking functions
function creditcardMask(input) {
	var last4 = $F(input).substr(-4,4);
	var length = $F(input).length-4;
	var ret = '';
	for (var i = length; i--;) {
		ret = ret+'&bull;';
	}
	return ret+last4;
}