function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
  var rv = -1; // Return value assumes failure.
  if (navigator.appName == 'Microsoft Internet Explorer')
  {
    var ua = navigator.userAgent;
    var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  return rv;
}

var ieVersion = getInternetExplorerVersion();
// alert("MSIE version: " + ieVersion);


    function getSourceElementFromEvent(evt) {
        if(evt.currentTarget) {
            return evt.currentTarget;
        } else if(evt.srcElement) {
            return evt.srcElement;
        } else {
            // No support in this unknown browser:
            return null;
        }    
    }
    
    
    function proto_showHelp(event) {
        // var field = event.currentTarget;
        var field = getSourceElementFromEvent(event);
        if( !field ) {return; }  // No support in this browser.
        var isIE = document.all && field.attachEvent;
        // var ieVersion: Global defined!
        var csgDebug = document.getElementById("debugOutput");
        var helpData = null;
        
        if(document && document.createElement && document.createTextNode && !field.helpVisible && !field.working) {
            csgDebug.innerHTML = "Matched (focus / showHelp)";
            field.working = true;
            // proto_showHelp.prototype.alreadyDone = true;
            field.helpVisible = true;
            
            // Prevents re-showing help:
            helpData = field.getAttribute("title");
            // Does not disable tooltip in MSIE:
            //  field.removeAttribute("title");
            field.setAttribute("title", "");  // This does work in MSIE.
            
            el = document.createElement("label");
            el.setAttribute("class", "formHelp");
            // MSIE does not transform class attribute to right DOM value:
            if( isIE && (!el.className || el.className == "") ) {
                /* Probably MSIE: */
                el.className = "formHelp";
                // At least IE7 supports now opacity: el.filter = "alpha(opacity:90)";
            } else {
                // TODO: Close out Safari!
                
                // All other browsers get all hacks:
                if(el.KHTMLOpacity) el.KHTMLOpacity = "0.90";
                // Supports now opacity: if(el.MozOpacity) el.MozOpacity = "0.90";
            }
            
            // Rounded corners for Mozilla (IE does ignore style attribute at all):
            el.setAttribute("style", "-moz-border-radius: 9px;");
            
            csgDebug.innerHTML = field;
            // el.appendChild(document.createTextNode(field.getAttribute("title")));
            el.appendChild(document.createTextNode(helpData));
            elImg = document.createElement("img");
            elImg.setAttribute("alt", "");
            elImg.setAttribute("src", "css+img/speechBubbleMark2_transp.gif");
            
            if(!isIE) el.appendChild(elImg);
            
            // Insert new nodes into existing tree:
            //
            var containerOfField = field.parentNode;
            containerOfField.parentNode.insertBefore(el, containerOfField);
            
            if(ieVersion == 6) {
                elImg.className = "bubbleImg";
            } // else: No workaround needed.
            if(isIE) containerOfField.parentNode.insertBefore(elImg, containerOfField);
            
            // Try to force screenreader to read the help text
            // "label" does reach the focus on to the form element):
            el.focus();
            
            field.working = false;
        } // else: Avoid permanent calling alert.
          else {
            csgDebug.innerHTML = "NOT matched (focus / showhelp)";
        }
        
        /*
        if(event.preventDefault) event.preventDefault();    // DOM / Firefox
        if(event.stopPropagation) event.stopPropagation();
        if(event.returnValue != null) event.returnValue = false;    // MSIE
        if(event.cancelBubble != null) event.cancelBubble = true;   // MSIE
        */
        return false;  // Prevent default (in MSIE).
    } // End of function *proto_showHelp(..)*
    
    
    function proto_hideHelp(event) {
        // var field = event.currentTarget;
        var field = getSourceElementFromEvent(event);
        if( !field ) {return; }  // No support in this browser.
        var isIE = document.all && field.attachEvent;
        var csgDebug = document.getElementById("debugOutput");
        var el = null;
        var elImg = null;
        
        // Functions tested here are not needed - but were needed while
        // creating extra node. So try to remove only what was created
        // before:
        if(document && document.createElement && document.createTextNode && field.helpVisible && !field.working) {
            csgDebug.innerHTML = "Matched (blur / hideHelp)";
            field.working = true;
            field.helpVisible = false;
            if(isIE && field.parentNode.previousSibling && (field.parentNode.previousSibling.tagName == "img" || field.parentNode.previousSibling.tagName == "IMG")) {
                elImg = field.parentNode.previousSibling;
                elImg.parentNode.removeChild(elImg);
            } // else: No IE, no extra work needed.
            
            el = field.parentNode.previousSibling;
            // alert(el.getAttribute("class"));
            // csgDebug.innerHTML = el.firstChild.data;
            field.setAttribute("title", el.firstChild.data);
            // Causes Problems in Firefox:
            // el.blur();
            el.parentNode.removeChild(el);
            field.working = false;
        }
    }
    
    
    	// Prerequisite: ( document && document.getElementsByTagName ) is TRUE
	// (not checked in this function!):
	// Parameters:
	//  elemName: String: Tagname of element to add an event handler.
	//  requiredAttrib: String: Name of an attribute which a element with given tag name HAVE TO have, in order to get the event handler attached.
	//   eventType: String: The event type we want to watch for, e.g. click, mouseover, focus...
	//   handlerStd: Function: The handler function to execute for all normal standard compliant browsers.
	//   handlerIE: Function: The handler function to execute for Internet Explorer.
	//   phase: Boolean: If true, the event will be triggered in capturing phase (not recommended unless you know what you do), otherwise in target / bubbling phase (recommended).
	// 
	function setEventHandlerForGroup( elemName, requiredAttrib, eventType, handlerStd, handlerIE, phase ) {
		var inputs = document.getElementsByTagName(elemName);
		// Does NOT work properly: for( var el in inputs ) {
		for( var i=0; i<inputs.length; i++) {
			el = inputs[i];
			if(document.addEventListener) {
				if( el.hasAttribute(requiredAttrib) ) {
				    el.addEventListener(eventType, handlerStd, phase);
				} // else: not prepared for help.
			} else if (el.attachEvent){
				// Internet Explorer:
				// Problem with IE6:
				// if( el.hasAttribute(requiredAttrib) ) {
				if( el.getAttribute(requiredAttrib) != null ) {
				    var result = el.attachEvent( "on"+eventType, handlerIE );
				    // window.csgOut.innerHTML = result;
				} // else: not prepared for help.
				
			} // else: No support.
		} // End of *for*.
	} // End of *setEventHandlerForGroup( ...)*.



    function initFormHelp() {
		if( document && document.getElementsByTagName ) {
			// Init my own alert-replacement:
			window.csgOut = document.getElementById("debugOutput");
            // csgOut.innerHTML = "init";
            
			setEventHandlerForGroup( "input", "title", "focus", proto_showHelp, proto_showHelp, false );
			setEventHandlerForGroup( "textarea", "title", "focus", proto_showHelp, proto_showHelp, false );
			//setEventHandlerForGroup( "input", "title", "mouseover", proto_showHelp, proto_showHelp, false );
			//setEventHandlerForGroup( "textarea", "title", "mouseover", proto_showHelp, proto_showHelp, false );
			
			setEventHandlerForGroup( "input", "title", "blur", proto_hideHelp, proto_hideHelp, false );
			setEventHandlerForGroup( "textarea", "title", "blur", proto_hideHelp, proto_hideHelp, false );
			//setEventHandlerForGroup( "input", "title", "mouseout", proto_hideHelp, proto_hideHelp, false );
			//setEventHandlerForGroup( "textarea", "title", "mouseout", proto_hideHelp, proto_hideHelp, false );
		} // else: No Support at all.
	}
    


