var InputHint = {   
  InitializePage: function()
  {
    var list = Element.select(document, "input[type='text']");    
    list.each(function(input) { 
      new InputHint.Add(input, 
        input.getAttribute("inputhint"), 
        input.getAttribute("inputhintclass"));
    });     
  },
  Add: function (element, hint, inputHintClass)
  {
    var _element = $(element);
    var _hint = _Trim(hint);
    var _hasValue = false;
    var _inputHintClass = _Trim(inputHintClass);
    if (_inputHintClass.length == 0) {
      _inputHintClass = "active";
    }     
     
    this.GetValue = _GetValue;
    this.SetValue = _SetValue;
    this.HasValue = _HasValue;
    this.GetHint = _GetHint;
    this.SetHint = _SetHint;
    this.Clear = _Clear;
     
    _Initialize()
    
    function _Initialize() 
    {
      if (_element) {    
        Event.observe(_element, "blur", _OnBlur);
        Event.observe(_element, "focus", _OnFocus);  
        Event.observe(_element, "keypress", _OnKeyPress);        
        _element.GetValue = _GetValue;
        _element.SetValue = _SetValue;
        _element.HasValue = _HasValue;
        _element.GetHint = _GetHint;
        _element.SetHint = _SetHint;
        _element.Clear = _Clear;
        
        if (_Trim(_element.value).length == 0) {
          _element.value = _hint;
          _hasValue = false;
        } else {
          _hasValue = true;
        }
        _UpdateClass(!_hasValue);
      }
    }  
    
    function _GetValue()
    {
      if ((_hasValue) && (_element)) {
        return _element.value;
      } else {
        return "";
      }
    }
    
    function _SetValue(value)
    {
      value = _Trim(value);
      if ((value.length > 0) && (_element)) {
        _element.value = value;
        _hasValue = true;
        _UpdateClass(false);
      }
    }
    
    function _HasValue()
    {
      return _hasValue;
    }
      
    function _GetHint()
    {
      return _hint;
    }
    
    function _SetHint(value)
    {
      value = _Trim(value);
      if (_element) {
        _hint = value;
        if (!_hasValue) {
          _element.value = _hint;
        }
      }      
    }
    
    function _Clear()
    {      
      _hasValue = false;
      _element.value = _hint;      
    }
    
    function _Trim(text) 
    {
      if ((text) && (typeof text == "string")) {
        return text.replace(/^\s+|\s+$/g, '');
      } else {
        return "";
      }
    }
    
    function _OnBlur()
    {
      if (_Trim(_element.value).length == 0) {
        _element.value = _hint;
        _hasValue = false;
      } else {
        _hasValue = true;
      }
      _UpdateClass(!_hasValue)
    }
    
    function _OnFocus()
    {
      if (!_hasValue) {
        _element.value = "";
      }
      _UpdateClass(false);
    }
    
    function _OnKeyPress(event)
    {
      if (_Trim(_element.value).length == 0) {
        _hasValue = false;
      } else {
        _hasValue = true;
      }
    }
    
    function _UpdateClass(hintVisible)
    {  
      if (hintVisible) {
        Element.addClassName(_element, _inputHintClass);
      } else {
        Element.removeClassName(_element, _inputHintClass);
      }
    }
  }
}

var Knowmax = {
  InputHint: InputHint
}

Event.observe(window, "load", _OnKnowmaxLoad);

function _OnKnowmaxLoad() 
{
  Knowmax.InputHint.InitializePage();
}
