var ClassNameHelper = {
	hasClassName: function(element, className) {
		return (element.className != null && element.className.length > 0 &&
			(element.className == className || new RegExp("(^|\\s)"+className+"(\\s|$)").test(element.className)));
	},

	addClassName: function(element, className) {
		if(!this.hasClassName(element, className)) {
			element.className += (element.className ? ' ' : '') + className;
		}
	},

	removeClassName: function(element, className) {
		element.className = 
			element.className.replace(new RegExp("(^|\\s+)" + className + "(\\s+|$)")," ");
		element.className = element.className.replace(/^\s+/, '').replace(/\s+$/, ''); // strip unnecessary whitespace
	}
}

var ValueHelper = {
	getValue: function(element) {
		return ValueHelper['e' + element.nodeName.toLowerCase()](element);
	},
	
	setValue: function(element, value) {
		ValueHelper['e' + element.nodeName.toLowerCase()](element, value);
		return element;
	},
	
	clear: function(element) {
		element.value = '';
		return element;
	},
	
  einput: function(element, value) {
    switch(element.type.toLowerCase()) {
      case 'checkbox':
      case 'radio':
        return ValueHelper.inputSelector(element, value);
      default:
        return ValueHelper.etextarea(element, value);
    }
  },

  etextarea: function(element, value) {
    if (value === undefined) return element.value;
    else element.value = value;
  },

  eselect: function(element, index) { // setting val does not work in safari
    if (index === undefined)
      return this.selectOne(element);
    else {
      var opt, value, single = !(index && index.constructor === Array);
      for (var i = 0, length = element.length; i < length; i++) {
        opt = element.options[i];
        value = this.optionValue(opt);
        if (single) {
          if (value == index) {
						opt.selected = true;
						element.selectedIndex = i;
            return;
          }
        } else { 
					opt.selected = index.include(value);
				}
      }
    }
  },

  inputSelector: function(element, value) {
    if (value === undefined) return element.checked ? element.value : null;
    else element.checked = !!value;
  },

  selectOne: function(element) {
    var index = element.selectedIndex;
    return index >= 0 ? this.optionValue(element.options[index]) : null;
  },
	
  optionValue: function(opt) {
		if(opt.hasAttribute) { 	
	    return opt.hasAttribute('value') ? opt.value : opt.text;
		} else {
			return (typeof opt.attributes['value'] != "undefined" ? opt.value : opt.text);
		}
  }
};
