var Help = {
	
	handleHelp: function() {
		helpElements = $A($$('form .help'));
		if (helpElements) {
			helpElements.each(function(help) {
				formElements = $(help.parentNode).getElementsBySelector("input, select, textarea, button");
				if (formElements) {
					formElements.each(function(f) {
						if ((f.readAttribute("type") == "radio") ||
							(f.readAttribute("type") == "checkbox") ||
							(f.tagName == 'BUTTON')) {
							f.observe("mouseover", Help.show);
			        		f.observe("mouseout", Help.hide);									
						} else {
							f.observe("focus", Help.show);
			        		f.observe("blur", Help.hide);				
						}
		 			});
	 			}
			});
		}
	},
	
	show: function() {
		triggerElement = this;
		helpElements = $(this.parentNode).getElementsBySelector('.help');
		if (helpElements && (helpElements.size() > 0)) {
			help = helpElements[0];
			help.setStyle({display: "block", position: "absolute"});
			if ((triggerElement.readAttribute("type") == "radio") ||
				(triggerElement.readAttribute("type") == "checkbox")) {
				
				element = triggerElement;
				while(element && element.tagName != 'FORM')	{
					element = element.parentNode;
				}
				if (element != null)
				{
					//align element after widest input type or label
					textElements = $(element).getElementsBySelector('input[type=text]');
					if (textElements && (textElements.size() > 0)) {
						width = textElements.invoke('getWidth').max()+textElements.collect(function(e) {return e.positionedOffset()[0];} ).max();
			    		help.setStyle({left: (width-4)+"px"});															
			    		help.setStyle({top: (triggerElement.positionedOffset()[1]-(triggerElement.getHeight()/2)-4)+"px"});															
					} else	{
						textElements = element.getElementsBySelector('label');
						if (textElements) {
							width = textElements.invoke('getWidth').max()+textElements.pluck('offsetLeft').max();
				    		help.setStyle({left: width+4+"px"});															
				    		help.setStyle({top: (triggerElement.positionedOffset()[1]-(triggerElement.getHeight()/2))+"px"});
			    		}																					
					}
				}
			} else {
				position = triggerElement.positionedOffset();
				help.setStyle({left: (position[0]+triggerElement.getWidth()-4)+"px"});							
		    	help.setStyle({top: (position[1]-2)+"px"});															
			}
		};
		return true;
	},
	
	hide: function() {
		helpElements = $(this.parentNode).getElementsBySelector('.help');
		if (helpElements) {
			helpElements.each(function(help) {
				help.hide();	
			});
		}
		return true;
	},
	
	hideAll: function() {
		helpElements = $A($$('form .help'));
		if (helpElements) {
			helpElements.each(function(help) {
				help.hide();
			});	
		}
	}

}

Event.observe(window, 'load', function() {
	Help.handleHelp();
});