function addEvent(element, type, handler) {
    if (!handler.$$guid) handler.$$guid = addEvent.guid++;
    if (!element.events) element.events = {};
    var handlers = element.events[type];
    if (!handlers) {
        handlers = element.events[type] = {};
        if (element["on" + type]) {
            handlers[0] = element["on" + type];
        }
    }
    handlers[handler.$$guid] = handler;
    element["on" + type] = handleEvent;
};
addEvent.guid = 1;

function removeEvent(element, type, handler) {
    if (element.events && element.events[type]) {
        delete element.events[type][handler.$$guid];
    }
};

function handleEvent(event) {
	event = event || window.event;
	var handlers = this.events[event.type];
	for (var i in handlers) {
		this.$$handleEvent = handlers[i];
		this.$$handleEvent(event);
	}
};

var formHelper = {
	messageIdentity : 'msg_',
	messageTimer 	: [],
	visibleClass 	: 'shown',
	hiddenClass 	: 'hidden',
	tipOffsetX 		: 32,
	tipOffsetY 		: -19,
	fieldDisplayed 	: null,
	displayTip 		: function() {   
		var element 		= arguments[0];
		var action 			= arguments[1] || 'show';
		var timed 			= arguments[2];
		var messageIdent 	= arguments[3] || this.messageIdentity;
		if (element) {
			switch (typeof(element)) {
				case 'string':
					if (action 	== 'show') this.toggleDisplayed();
					if (timed 	== 'timed') {
						this.messageTimer = window.setTimeout(function(){formHelper.tipById(element,action,messageIdent)},500000);
					} else {
						window.clearTimeout(this.messageTimer);
						this.tipById(element,action,messageIdent);					
					}
					break;
				case 'object':
					window.clearTimeout(this.messageTimer);
					this.toggleImage(element.id);
					this.tipByObject(element.id,action,messageIdent);
					switch(action) {
						case 'show' :
							this.fieldDisplayed = element.id;
							break;
						case 'hide' :
							this.fieldDisplayed = null;
							break;
					}
					break;
				default:
					return false;
			}
		}
	},
	tipById : function() {	
		var element 		= document.getElementById(arguments[0]);
		var action 			= arguments[1] || 'show';
		var messageIdent 	= arguments[2] || this.messageIdentity;
		if(element) {
			var messageContainer = element.id;
			if(messageContainer) {
				this.tipByObject(messageContainer,action,messageIdent);
			} else {  
				return false;
			}
		}
	},
	tipByObject : function() {
		var tipOffsetY 	= arguments[3] || this.tipOffsetY;
		var tipOffsetX 	= arguments[3] || this.tipOffsetX;
		var element 	= arguments[0];
		element 		= document.getElementById(element);
		var action 		= arguments[1] || 'show';
		if (element) {
			var lookfor = element.id;
			var ident 	= arguments[2] || this.messageIdentity;
			lookfor 	= ident+lookfor;
			lookfor 	= document.getElementById(lookfor);
			switch(action) {
				case 'show':
  					var displayCoords 	= this.findCoordinates('tip-'+element.id);	
					var containerCoords = {theTop: 0, theLeft: 0};
					if (document.getElementById('container')) containerCoords = this.findCoordinates('container')
					lookfor.style.top 	= parseInt(displayCoords.theTop - 23 - containerCoords.theTop) +'px';
					lookfor.style.left 	= (parseInt(displayCoords.theLeft - containerCoords.theLeft) + 16)+'px';
					this.resetZ();
					this.swapClasses(lookfor,this.hiddenClass,this.visibleClass)
					lookfor.style.zIndex = "100";
			 		break;
			 	case 'hide':
  					this.swapClasses(lookfor,this.visibleClass,this.hiddenClass);
  					lookfor.style.zIndex = "0";	
			 		break;
			 	default:
					return false;
			}
		} else {
			return false;
		}
	},
	resetZ : function()	{
		if(getElementsByClassNameFromElement) {
			var theClass 	= this.visibleClass;
		  	var theElements = getElementsByClassNameFromElement(theClass,'div');
		  	for(i=0;i<theElements.length;i++) {
		    	theElements[i].style.zIndex = "0";
		  }		
		}
	},
	findCoordinates : function() {
		var elem = document.getElementById(arguments[0]);
		if (elem) {
			var theCoords 	= this.cumulativeOffset(elem);
		    var eltop 		= theCoords[1];
		    var elleft 		= theCoords[0];
			var thePosition = {theTop: eltop, theLeft: elleft};
			return thePosition;
		}			
	},
	cumulativeOffset: function(element) {
	var valueT = 0, valueL = 0;
	    do {
	    	valueT += element.offsetTop  || 0;
	    	valueL += element.offsetLeft || 0;
	    	element = element.offsetParent;
	    } while (element);
	    return [valueL, valueT];
     },
	swapClasses : function() {
		var elem 				= arguments[0];
		var theClass 			= arguments[1];
		var replacementClass 	= arguments[2];
		var theExp 				= new RegExp("(^|\\s)" + theClass + "(\\s|$)");
		elem.className 			= elem.className.replace(theExp, " "+replacementClass);
	},
	toggleImage: function() {
       	var imgId 	= "tip-" + arguments[0];
       	var img 	= document.getElementById(imgId);
       	if (img) {
       		if (img.onmouseover) img.onmouseover 	= null; else img.onmouseover 	= function(){formHelper.displayTip(this.id.replace('tip-',''));formHelper.rollQuestions(this);};
			if (img.onclick) img.onclick 			= null; else img.onclick 		= function(){formHelper.displayTip(this.id.replace('tip-',''));};
       		if (img.onmouseout) img.onmouseout 		= null; else img.onmouseout 	= function(){formHelper.displayTip(this.id.replace('tip-',''),'hide','timed');formHelper.rollQuestions(this);};
       	}
	},
	toggleDisplayed : function() {
		var errorMsgs = document.getElementById('chart-box') 
		var errorMsgs = getElementsByClassNameFromElement('error','div',errorMsgs);
		for (i=0;i<errorMsgs.length;i++) {	
			if (errorMsgs[i].id != 'msg_'+this.fieldDisplayed) {this.swapClasses(errorMsgs[i],this.visibleClass,this.hiddenClass);}
		}
	},
	infoDuplicator : function() { 
		var fromField 	= arguments[0];
		var toField 	= arguments[1];
		if (fromField && toField) { 
			fromField 	= document.getElementById(fromField);
			toField 	= document.getElementById(toField);
			if (fromField && toField) {
				toField.value = fromField.value;
			} else { 
				return false;
			}
		} else {
			return false;
		}
	},
	infoToggle : function() {
		var theCheckbox 	= arguments[0];
		var theFields 		= arguments[1];
		var theContainer 	= document.getElementById('hidden-elements');
		var currentField,destinationField;
		switch(theContainer.className) {
			case 'hidden':
				theContainer.className = null;
				break;
			default :
				theContainer.className = 'hidden';
		}
		if (theFields) { 
			for(i=0;i<theFields.length;i++) { 
				if(theCheckbox.checked) {
					currentField 		= document.getElementById(theFields[i][0])
					currentField.value 	= '';
				} else {
					currentField 		= document.getElementById(theFields[i][0]);
					destinationField 	= document.getElementById(theFields[i][1]);
					currentField.value 	= destinationField.value;
				}
			}
		} else {
			return false;
		}
	},
	rollQuestions : function() {
		var theElement 		= arguments[0];
		var swapIndicator 	= "_on";
		if (theElement) {
			var newsrc;
			var src 	= theElement.src;
			var ftype 	= src.substring(src.lastIndexOf('.'),src.length);
			var theExp 	= new RegExp(swapIndicator);
			if(theExp.test(src)) { 
				newsrc = src.replace(swapIndicator,'');
			} else {
				newsrc = src.replace(ftype,swapIndicator+ftype);
			}
			theElement.src=newsrc;
		} else {
			return false;
		}
	}
}

function assignDuplicator(element_id,destination) {
	var the_element = document.getElementById(element_id);
	if (the_element) {
		addEvent(the_element,'blur',function(){formHelper.infoDuplicator(this.id,destination)})
	}
}

function assignInfoLockTips() {
	assignTips("addinfo");
	assignTips("addlock");
	assignTips("addlocksecond");
}
function assignTips(theClass) {
	var inputs = getElementsByClassNameFromElement(theClass);
	var theExp = new RegExp("(^|\\s)" + theClass + "(\\s|$)");
	for(i=0;i<inputs.length;i++) {   
		if (inputs[i].className.match(theExp)) {
	    	addEvent(inputs[i],'focus',function(){formHelper.displayTip(this)});
	    	if (!inputs[i].getAttribute('citioverlayon')) addEvent(inputs[i],'blur',function(){formHelper.displayTip(this,'hide')});
		    if (!document.getElementById('tip-' + inputs[i].id)) {
				var infoImage 		= document.createElement('img');
		    	infoImage.id 		= 'tip-' + inputs[i].id;
				if (theClass == 'addinfo') {
					if (typeof(addInfoImage) != "undefined") infoImage.src = addInfoImage;
					else infoImage.src	= 'img/apply/questionmark.gif';
					infoImage.className = 'whats-this'; 					
				} 
				if (theClass == 'addlocksecond') {
					if (typeof(addLockImage) != "undefined") infoImage.src = addLockImage;
					else infoImage.src	= 'img/apply/icon_lock.gif';
					infoImage.className = 'whats-this-locksecond'; 					
				}
				if (theClass == 'addlock') {
					if (typeof(addLockImage) != "undefined") infoImage.src = addLockImage;
					else infoImage.src	= 'img/apply/icon_lock.gif';
					infoImage.className = 'whats-this-lock'; 					
				}
				
		    	infoImage.alt 		= ''; 								
				if(inputs[i].tagName =="SELECT") {
		    		infoImage.className    += ' forselect';
		    		var displayCoords 		= formHelper.findCoordinates(inputs[i].id);
					infoImage.style.top 	= displayCoords.theTop;
					infoImage.style.left 	= parseInt(displayCoords.theLeft)+inputs[i].offsetWidth;
		    	}
		    	if (inputs[i].type == 'radio') {
		    		infoImage.className    += ' forselect'
		    	 	var fieldCoords 		= formHelper.findCoordinates(inputs[i].id);
				 	infoImage.style.top 	= fieldCoords.theTop +'px';
				 	infoImage.style.left 	= parseInt(fieldCoords.theLeft)+ inputs[i].offsetWidth + 10 + 'px';
			    	infoImage.onmouseover 	= function(){formHelper.displayTip(this.id.replace('tip-',''));formHelper.rollQuestions(this);};
			    	infoImage.onclick 		= function(){formHelper.displayTip(this.id.replace('tip-',''));};
			    	if (!inputs[i].getAttribute('citioverlayon')) infoImage.onmouseout 	= function(){formHelper.displayTip(this.id.replace('tip-',''),'hide','timed');formHelper.rollQuestions(this);};
			    	inputs[i].parentNode.parentNode.getElementsByTagName(inputs[i].parentNode.tagName)[inputs[i].parentNode.parentNode.getElementsByTagName(inputs[i].parentNode.tagName).length-1].appendChild(infoImage);
		    	} else {
					infoImage.onmouseover 	= function(){formHelper.displayTip(this.id.replace('tip-',''));formHelper.rollQuestions(this);};
			    	infoImage.onclick 		= function(){formHelper.displayTip(this.id.replace('tip-',''));};
			   		if (!inputs[i].getAttribute('citioverlayon')) infoImage.onmouseout 	= function(){formHelper.displayTip(this.id.replace('tip-',''),'hide','timed');formHelper.rollQuestions(this);};
					inputs[i].parentNode.parentNode.getElementsByTagName(inputs[i].parentNode.tagName)[inputs[i].parentNode.parentNode.getElementsByTagName(inputs[i].parentNode.tagName).length-1].appendChild(infoImage);
				}
			}
		}
	}
}

function autoTab(field1, len, field2, e) {
	if (e.which && e.which != "9" && e.which != "16") {
		if (document.getElementById(field1).value.length == len) {
			document.getElementById(field2).focus();
		}
	} else if (e.keyCode && e.keyCode != "9" && e.keyCode != "16") {
		if (document.getElementById(field1).value.length == len) {
			document.getElementById(field2).focus();
		}
	}
}
