var valueMap = {};
function hideAllHints(selector_name) {
	var hints = $$(selector_name);
	for (var i = 0; i < hints.length; i++) { hints[i].style.display = "none"; };
};
function prepareInputsForHints(scope) {
	var spans;
	if( scope ) {
		spans = $$(scope + " .hint");
	} else {
		spans = $$(".hint");
	};
	for (var i=0; i<spans.length; i++) {
		var span = spans[i];
		// get first adjacent form field
		var field = span.up().select("input")[0];
		if (!field) field = span.up().select("textarea")[0];
		if (!field) field = span.up().select("select")[0];
		if (!field) field = span.up().select("input")[0];
		if (field) {
		  // preserve any existing callbacks
		  var old_onfocus = function(){};
		  var old_onblur = function(){};
		 	if (typeof field.onfocus == "function") { old_onfocus = field.onfocus; }; 
		 	if (typeof field.onblur == "function") { old_onblur = field.onblur; }; 
			valueMap[field.identify()] = {
				"old_onfocus": old_onfocus,
				"old_onblur": old_onblur,
				"target_element": span.identify()
			};
			field.onfocus = function() { 
				hideAllHints(".hint");
				values = valueMap[$(this).identify()]; 
				values["old_onfocus"](); 
				$(values["target_element"]).style.display = "inline"; 
			};
			field.onblur = function() { 
				values = valueMap[$(this).identify()]; 
				values["old_onblur"](); 
				$(values["target_element"]).style.display = "none"; 
			};
		};
	};
	if( scope ){
		spans = $$(scope + " .hint-bubble");
	} else {
		spans = $$(".hint-bubble");
	};
	
	for (var i = 0; i < spans.length; i++) {
		var span = spans[i];
		var field = span.up().select("a")[0];
		if (!field) field = span.up().select("img")[0];
		if (field) {
		 	var old_fieldonclick = function(){};
	 		if (typeof field.onclick == "function") { old_fieldonclick = field.onclick; }; 

			valueMap[field.identify()] = {
				"old_fieldonclick": old_fieldonclick,
				"target_element": span.identify()
			};
			
			field.onclick = function() { 
				hideAllHints(".hint-bubble");
				values = valueMap[$(this).identify()]; 
				values["old_fieldonclick"](); 
				$(values["target_element"]).style.display = "inline"; 
			};
			
			var close_link = span.select("a.hint-close")[0];
			if (close_link) {
			 // preserve the existing onclick callback
			 	var old_onclick = function(){};
				if (typeof close_link.onclick == "function") { old_onclick = close_link.onclick; }; 

				valueMap[close_link.identify()] = {
					"old_onclick": old_onclick,
					"target_element": span.identify()
				};
				
				close_link.onclick = function() {
					values = valueMap[$(this).identify()]; 
					values["old_onclick"](); 
					$(values["target_element"]).style.display = "none"; 
				};
		  };
			
		};
		
	};
};