/*
*	Copyright 2005 Connecticut Business Applications, LLC. All rights reserved.
*	@author	Jacques Almeida
*	@version	1.1
*/
var FormManager={
	currentIndex:-1,
	elementSet:[],
	locked:false,
	stateBeforeLocked:null,
	EventManager:{
		CLEAR_FOCUS:0,
		UPDATE_FOCUS:1,
		AUTO_FORWARD_ON_MAX_LENGTH:2,
		AUTO_FORWARD_ON_PAUSE:3,
		AUTO_FORWARD_ON_PAUSE_OR_MAX_LENGTH:4,
		RESTRICT_TO_UPPERCASE:5,
		RESTRICT_TO_LOWERCASE:6,
		RESTRICT_TO_INTEGER:7,
		RESTRICT_TO_POSITIVE_INTEGER:8,
		RESTRICT_TO_FLOAT:9,
		VALIDATE_EMAIL:10,
		VALIDATE_URL:11,
		dispatchEvent:function(k,id){
			var e=EventFactory.create(k,id);
			var em=FormManager.EventManager;
			switch(e.id){
				case em.CLEAR_FOCUS:{
					TimerMonitor.destroy();
					FormManager.currentIndex=-1;
					break;
				}
				case em.UPDATE_FOCUS:{
					var es=FormManager.elementSet;
					var i=es.length;
					while(i--&&es[i]!=e.target);
					FormManager.currentIndex=i;
					break;
				}
				case em.AUTO_FORWARD_ON_MAX_LENGTH:{
					if(ValidatorUtilities.isControl(e)) return;
					var component=FormManager.elementSet[FormManager.currentIndex];
					if(component==null) return;
					var length=component.getAttribute("maxlength");
					var value=component.value;
					if(length==null||value.length<parseInt(length)) return;
					FormManager.focusNextElement();
					break;
				}
				case em.AUTO_FORWARD_ON_PAUSE:{
					if(ValidatorUtilities.isControl(e)) return;
					TimerMonitor.invokeEvent(em.autoForward,1500);
					break;
				}
				case em.AUTO_FORWARD_ON_PAUSE_OR_MAX_LENGTH:{
					if(ValidatorUtilities.isControl(e)) return;
					var component=FormManager.elementSet[FormManager.currentIndex];
					if(component==null) return;
					var length=component.getAttribute("maxlength");
					var value=component.value;
					if(length!=null&&parseInt(length)<=value.length){
						FormManager.focusNextElement();
						return;
					}
					TimerMonitor.invokeEvent(em.autoForward,1500);
					break;
				}
				case em.RESTRICT_TO_UPPERCASE:{
					return ValidatorUtilities.isUpperCase(e)||ValidatorUtilities.isControl(e);
				}
				case em.RESTRICT_TO_LOWERCASE:{
					return ValidatorUtilities.isLowerCase(e)||ValidatorUtilities.isControl(e);
				}
				case em.RESTRICT_TO_INTEGER:{
					return ValidatorUtilities.isPositiveInteger(e)||ValidatorUtilities.isNegative(e)||ValidatorUtilities.isControl(e);
				}
				case em.RESTRICT_TO_POSITIVE_INTEGER:{
					var b=ValidatorUtilities.isPositiveInteger(e)||ValidatorUtilities.isControl(e);
					e.stopPropagation(!b);
					return b;
				}
				case em.RESTRICT_TO_FLOAT:{
					return ValidatorUtilities.isFloat(e)||ValidatorUtilities.isControl(e);
				}
				case em.VALIDATE_EMAIL:{return EmailValidator.isValid(e);}
				case em.VALIDATE_URL:{return EmailValidator.isValid(e);}
			}
			return true;
		},
		autoForward:function(){FormManager.focusNextElement();},
		autoForwardOnMaxLength:function(e){
			FormManager.EventManager.dispatchEvent((!e)?window.event:e,FormManager.EventManager.AUTO_FORWARD_ON_MAX_LENGTH);
		},
		autoForwardOnPause:function(e){
			FormManager.EventManager.dispatchEvent((!e)?window.event:e,FormManager.EventManager.AUTO_FORWARD_ON_PAUSE);
		},
		autoForwardOnPauseOrMaxLength:function(e){
			FormManager.EventManager.dispatchEvent((!e)?window.event:e,FormManager.EventManager.AUTO_FORWARD_ON_PAUSE_OR_MAX_LENGTH);
		},
		restrictToUpperCase:function(e){
			return FormManager.EventManager.dispatchEvent((!e)?window.event:e,FormManager.EventManager.RESTRICT_TO_UPPERCASE);
		},
		restrictToLowerCase:function(e){
			return FormManager.EventManager.dispatchEvent((!e)?window.event:e,FormManager.EventManager.RESTRICT_TO_LOWERCASE);
		},
		restrictToPositiveInteger:function(e){
			return FormManager.EventManager.dispatchEvent((!e)?window.event:e,FormManager.EventManager.RESTRICT_TO_POSITIVE_INTEGER);
		},
		restrictToFloat:function(e){
			return FormManager.EventManager.dispatchEvent((!e)?window.event:e,FormManager.EventManager.RESTRICT_TO_FLOAT);
		},
		restrictToInteger:function(e){
			return FormManager.EventManager.dispatchEvent((!e)?window.event:e,FormManager.EventManager.RESTRICT_TO_INTEGER);
		},
		validateEmail:function(e){
			return FormManager.EventManager.dispatchEvent((!e)?window.event:e,FormManager.EventManager.VALIDATE_EMAIL);
		},
		updateFocus:function(e){
			FormManager.EventManager.dispatchEvent((!e)?window.event:e,FormManager.EventManager.UPDATE_FOCUS);
		},
		clearFocus:function(e){
			FormManager.EventManager.dispatchEvent((!e)?window.event:e,FormManager.EventManager.CLEAR_FOCUS);
		}
	},
	initialize:function(){
		var f=document.getElementsByTagName("form");
		var k=f.length;
		var j=-1;
		if(0<k){
			var em=FormManager.EventManager;
			var d=k;
			do{	var e=f[k-d].elements;
				var l=e.length;
				if(0<l){
					var i=l;
					do{	var o=e[l-i];
						switch(o.type){
						case "checkbox":
						case "button":
						case "file":
						case "image":
						case "password":
						case "radio":
						case "reset":
						case "select-multiple":
						case "select-one":
						case "submit":
						case "text":
						case "textarea":
							o.onblur=em.clearFocus;
							o.onfocus=em.updateFocus;
							FormManager.elementSet[++j]=o;
							break;
						default:break;
						}
					}while(--i);
				}
			}while(--d);
		}
	},
	addListeners:function(){
		var e=FormManager.elementSet;
		var l=e.length;
		if(0<l){
			var d=l;
			var em=FormManager.EventManager;
			do{
			var o=e[l-d];
			switch(o.type){
				case "checkbox":
					break;
				case "button":
					break;
				case "file":
					break;
				case "image":
					break;
				case "password":
					/*o.onkeyup=em.autoForwardOnPauseOrMaxLength;*/
					o.onkeyup=em.autoForwardOnMaxLength;
					break;
				case "radio":
					break;
				case "reset":
					break;
				case "select-multiple":
					/*o.onkeyup=em.autoForwardOnPause;*/
					break;
				case "select-one":
					/*o.onkeyup=em.autoForwardOnPause;*/
					break;
				case "submit":
					break;
				case "text":
					switch(o.className){
						case "ctl-numeric":
							o.onkeydown=em.restrictToInteger;
							/*o.onkeyup=em.autoForwardOnPauseOrMaxLength;*/
							o.onkeyup=em.autoForwardOnMaxLength;
							break;
						case "ctl-currency":
							o.onkeydown=em.restrictToFloat;
							o.onkeyup=em.autoForwardOnMaxLength;
							break;
						case "ctl-area-code":
						case "ctl-phone":
						case "ctl-phone-1":
						case "ctl-phone-2":
							o.onkeydown=em.restrictToPositiveInteger;
							o.onkeyup=em.autoForwardOnMaxLength;
							break;
						case "ctl-postal-code":
							/*o.onkeyup=em.autoForwardOnPauseOrMaxLength;*/
							o.onkeyup=em.autoForwardOnMaxLength;
							break;
						case "ctl-email":
							/*o.onkeyup=em.autoForwardOnPauseOrMaxLength;*/
							o.onkeyup=em.autoForwardOnMaxLength;
							o.onchange=function(){alert(EmailValidator.validate(this.value));};
							break;
						default:
							/*o.onkeyup=em.autoForwardOnPauseOrMaxLength;*/
							o.onkeyup=em.autoForwardOnMaxLength;
							break;
					}
					break;
				case "textarea":
					/*o.onkeyup=em.autoForwardOnPauseOrMaxLength;*/
					o.onkeyup=em.autoForwardOnMaxLength;
					break;
				default:break;

			}
			}while(--d);
		}
	},
	lock:function(){
		var e=FormManager.elementSet;
		var i=e.length-1;
		if(-1<i){
			do{	FormManager.stateBeforeLocked[i]=e[i].disabled;
				if(!e[i].disabled) e[i].disabled=true;
			}while(i--);
		}
		FormManager.locked=true;
	},
	unlock:function(){
		var e=FormManager.elementSet;
		var i=e.length-1;
		if(-1<i) do{
			if(!FormManager.stateBeforeLocked[i])
				e[i].disabled=false;
		}while(i--);
		FormManager.locked=false;
		FormManager.stateBeforeLocked=null;
	},
	getCurrentElement:function(){
		return FormManager.elementSet[FormManager.currentIndex];
	},
	updateFocus:function(o){
		var e=FormManager.elementSet;
		var i=e.length;
		while(i--&&e[i]!=o);
		FormManager.currentIndex=i;
	},
	focusPreviousElement:function(){
		if(FormManager.locked) return;
		if(-1<--FormManager.currentIndex)
			FormManager.currentIndex=FormManager.elementSet.length;
		FormManager.elementSet[FormManager.currentIndex].focus();
	},
	focusNextElement:function(){
		if(FormManager.locked) return;
		if(!((++FormManager.currentIndex)<FormManager.elementSet.length))
			FormManager.currentIndex=0;
		FormManager.elementSet[FormManager.currentIndex].focus();
	},
	getCurrentForm:function(){
		var n=FormManager.elementSet[FormManager.currentIndex];
		if(n!=null)
			while((n=n.parentNode)!=null&&n.nodeType!=1&&n.nodeName!="FORM");
		return n;
	}
};
