/*
 * Author: Justin Ryll
 *
 * To add a field hint add "spAddFieldHint" class to element
 * To add a help box to non text input add "spAddHelp" class to element
 */
var spFormHandling = {};

spFormHandling.findPos = function(obj)
{
	var curleft = curtop = 0;
  if (obj != null) {
	if (obj.offsetParent)
	{
		do
		{
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		}
		while (obj = obj.offsetParent);
	}
  }
	return curtop;
}
spFormHandling.getStyle = function(el,styleProp)
{
	var x = document.getElementById(el);
	if (x.currentStyle)
		var y = x.currentStyle[styleProp];
	else if (window.getComputedStyle)
		var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp);
	return y;
}
var Body = {};
Body.Bottom =  document.getElementById("spBodyMain").offsetHeight;
Body.helpTop = spFormHandling.findPos(document.getElementById("spHelp"));
Body.fadingOut = false;

/*
 * Class: helpFormItem
 */
function helpFormItem(el, hasFieldHint)
{
	var element = el;
	this.element = element;
	this.elementTop = spFormHandling.findPos(this.element);

	YAHOO.util.Event.addFocusListener(element, spFormHandling.helpFocus, this, true);
	YAHOO.util.Event.addBlurListener(element, spFormHandling.helpBlur, this, true);
	var findLabel = function(testEl)
	{
		if (testEl.getAttribute("for") == element.id)
			return true;
		else if (YAHOO.util.Dom.hasClass(element, testEl.getAttribute("for")))
			return true;
		else
			return false;
	}

	//@scotto IE fixes
	//@scotto IE fails this validation: findLabel (not sure we need this)
	//this.label = YAHOO.util.Dom.getPreviousSiblingBy(element, findLabel);
	this.label = YAHOO.util.Dom.getPreviousSiblingBy(element);
	//@scotto the following two statment are the same for this method (possibly special cases?
	//this.helpBox = document.getElementById("spHelp_" + this.label.getAttribute("for"));
	this.helpBox = document.getElementById("spHelp_" + element.id);
	if (hasFieldHint)
	{
		this.fieldHintInit();
		YAHOO.util.Event.addFocusListener(element, spFormHandling.fieldHintFocus, this, true);
		YAHOO.util.Event.addBlurListener(element, spFormHandling.fieldHintBlur, this, true);
	}
}

helpFormItem.prototype.fieldHintInit = function ()
{
	if (this.element.value == "" || this.element.value == this.label.innerHTML)
	{
		if (!YAHOO.util.Dom.hasClass(this.element, "spInputDisabled"))
		{
			YAHOO.util.Dom.addClass(this.element, "spInputDisabled");
		}
		this.element.value = this.label.innerHTML;
	}
}

spFormHandling.fieldHintFocus = function()
{
	if (this.element.value == this.label.innerHTML)
	{
		this.element.value = "";
	}
	YAHOO.util.Dom.replaceClass(this.element, "spInputDisabled", "spInputEnabled");
}

spFormHandling.fieldHintBlur = function()
{
	if (this.element.value == "")
	{
		this.element.value = this.label.innerHTML;
		YAHOO.util.Dom.replaceClass(this.element, "spInputEnabled", "spInputDisabled");
	}
}

spFormHandling.helpFocus = function()
{
	// wait a second before showing help
	// if ie dont use setTimeout
	if (navigator.appName == "Microsoft Internet Explorer")
		spFormHandling.showHelp(this);
	else
		this.timer = setTimeout(spFormHandling.showHelp, 10, this); //250
}

spFormHandling.helpBlur = function()
{
	spFormHandling.hideHelp(this);
}

spFormHandling.showHelp = function(o)
{
	// clear timer
	if (navigator.appName != "Microsoft Internet Explorer")
		clearTimeout(o.timer);
	// turn off general help
	if (YAHOO.util.Dom.getStyle("spGeneralHelp", "display") != "none")
	{
		YAHOO.util.Dom.setStyle("spGeneralHelp", "display", "none");
	}
	
	YAHOO.util.Dom.setStyle(o.helpBox, "display", "block");

	if (o.elementTop < Body.helpTop)
	{
			o.elementTop = Body.helpTop;
	}

	var helpPositionTop;
	helpPositionTop = o.elementTop - Body.helpTop;

 
	if ((o.elementTop + o.helpBox.offsetHeight) > Body.Bottom + 50)
	{
		//helpPositionTop = o.elementTop - Body.helpTop;
		
	var xx = o.elementTop + o.helpBox.offsetHeight - Body.Bottom;
		helpPositionTop = helpPositionTop - xx + 10;
		//helpPositionTop = (2 * o.elementTop) + o.helpBox.offsetHeight - Body.Bottom - Body.helpTop;
		//helpPositionTop = o.elementTop + o.element.offsetHeight - (2 * o.helpBox.offsetHeight) + 90;
	}
	
	helpPositionTop = helpPositionTop + "px";
	YAHOO.util.Dom.setStyle(o.helpBox, "position", "absolute");
	YAHOO.util.Dom.setStyle(o.helpBox, "top", helpPositionTop);

	var attributes = {
		opacity: {to: 1}
	};
	var fadeIn = new YAHOO.util.Anim(o.helpBox, attributes, .005, YAHOO.util.Easing.easeOut);
	if (Body.fadingOut)
	{
		Body.fadeOut.onComplete.subscribe(function() {
			fadeIn.animate();
		});
	}
	else
	{
		fadeIn.animate();
	}
}

spFormHandling.hideHelp = function(o)
{
	var attributes = {
		opacity: {to: 0}
	};
	Body.fadingOut = true;
	Body.fadeOut = new YAHOO.util.Anim(o.helpBox, attributes, .005, YAHOO.util.Easing.easeOut);
	Body.fadeOut.animate();
	Body.fadeOut.onComplete.subscribe(function() {
		YAHOO.util.Dom.setStyle(o.helpBox, "display", "none");
		Body.fadingOut = false;
	});
}

spFormHandling.cleanFieldHints = function()
{
	for (var i = 0; i < spFormHandling.helpFormItems.length; i++)
	{
		
		if ( spFormHandling.helpFormItems[i].label !=null && spFormHandling.helpFormItems[i].element.value == spFormHandling.helpFormItems[i].label.innerHTML)
		{
			spFormHandling.helpFormItems[i].element.value = "";
		}
	}
}

spFormHandling.helpFormItems = new Array();

spFormHandling.init = function()
{
	var helpClass = YAHOO.util.Dom.getElementsByClassName("spAddHelp");
	var textBoxes = document.getElementsByTagName("input");
  var textAreas = document.getElementsByTagName("textarea");

	for (var i = 0; i < textBoxes.length; i++)
	{
		if (textBoxes[i].type == "text")
		{
			var oClass = new helpFormItem(textBoxes[i], true);
			spFormHandling.helpFormItems.push(oClass);
		}
	}
	
	for (var i = 0; i < helpClass.length; i++)
	{
		if (YAHOO.util.Dom.hasClass(helpClass[i], "spAddFieldHint"))
		{
			var oClass = new helpFormItem(helpClass[i], true);
			spFormHandling.helpFormItems.push(oClass);
		}
		else
		{
			var oClass = new helpFormItem(helpClass[i], false);
			spFormHandling.helpFormItems.push(oClass);
		}
	}

  for(i=0;i < textAreas.length; i++) {
    YAHOO.util.Event.addListener(textAreas[i], "keyup", spFormHandling.checkTextArea);
  }

	// find the forms on the page
	var forms = document.getElementsByTagName("form");
	for (var i = 0; i < forms.length; i++)
	{
		YAHOO.util.Event.addListener(forms[i], "submit", spFormHandling.cleanFieldHints);
	}
	
}

spFormHandling.checkTextArea = function() {
  var sp_max_ta_chars = sp_max_length[this.id];
  if(this.value.length > sp_max_ta_chars) {
    this.value = this.value.substring(0,sp_max_ta_chars);
    alert('You can only have ' + sp_max_ta_chars + ' characters in this box.');
  }
}

spFormHandling.init();