// *** Global Variables ***

var PROTOTYPE_VERSION = parseFloat(Prototype.Version)

var isBrowserIE = document.all;

// *** Class: Enumerable ***

Object.extendEnumerable = function(source) {
	Object.extend(Enumerable, source);
	Object.extend(Array.prototype, source);
	if (PROTOTYPE_VERSION >= 1.6) {
		Object.extend(Hash.prototype, source);
		Object.extend(ObjectRange.prototype, source);
		Object.extend(Ajax.Responders, source);
	}
	Object.extend(Element.ClassNames.prototype, source);
};

Object.extendEnumerable({
	findIndex: function(iterator, context) {
		iterator = iterator.bind(context);
		var result;
		this.each(function(value, index) {
			if (iterator(value, index)) {
				result = index;
				throw $break;
			}
		});
		return result;
	},

	findAllIndexes: function(iterator, context) {
		iterator = iterator.bind(context);
		var results = [];
		this.each(function(value, index) {
			if (iterator(value, index)) {
				results.add(index);
			}
		});
		return results;
	}
});

// *** Class: HelperText ***

var HelperText = {
	CSS_CLASS_NAME: 'helpertext',

	_hide: function(element) {
		element = $(element);
		if (element.helperText) {
			if (element.hasClassName(HelperText.CSS_CLASS_NAME)) {
				element.removeClassName(HelperText.CSS_CLASS_NAME);
				if (element.value == element.helperText) {
					element.value = '';
				}
			}
		}
	},

	_show: function(element) {
		element = $(element);
		if (element.helperText) {
			if (element.value.empty()) {
				element.addClassName(HelperText.CSS_CLASS_NAME);
				element.value = element.helperText;
			}
		}
	},

	getValue: function(element) {
		element = $(element);
		var result = element.value;
		if ((element.helperText) && element.hasClassName(HelperText.CSS_CLASS_NAME)) {
			if (result == element.helperText) {
				result = '';
			}
		}
		return result;
	},

	setValue: function(element, value) {
		element = $(element);
		element.value = value || '';
		if (element.helperText) {
			if (!element.value.empty()) {
				element.removeClassName(HelperText.CSS_CLASS_NAME);
			} else if (!element.hasFocus) {
				element.addClassName(HelperText.CSS_CLASS_NAME);
				element.value = element.helperText;
			}
		}
	},

	decorate: function(element, helperText) {
		element = $(element);

		element.blur();

		element.helperText = helperText;
		element.hasFocus   = false;

		Event.observe(
			element,
			'focus',
			(function() { this.hasFocus = true; HelperText._hide(this); }).bindAsEventListener(element)
		);

		Event.observe(
			element,
			'blur',
			(function() { this.hasFocus = false; HelperText._show(this); }).bindAsEventListener(element)
		);

		if (element.form) {
			Event.observe(
				element.form,
				'submit',
				(function() { HelperText._hide(this); }).bindAsEventListener(element)
			);
		};

		HelperText._show(element);
	},

	decorateForm: function(form, infos) {
		form = $(form);
		infos.each(function(info) { HelperText.decorate(FORM_getField(form, info.element), info.text); });
	}
};

Form.Element.Serializers['textarea'] = function(element, value) {
    if (value === undefined) return HelperText.getValue(element);
    else HelperText.setValue(element, value);
};

function FORM_getField(form,elementName) {
	if (form) {
		var elements = form.elements;
		for (var i=0; i < elements.length; i++) {
			if ((elements[i].name) && (elements[i].name == elementName)) {
				return elements[i];
			}
		}
	}

	return null;
}

// *** Class: RadioGroup ***

var RadioGroup = Class.create({
	initialize: function(element, name) {
		element = $(element);
		if (element.type && (element.type.toLowerCase() == 'radio')) {
			this.form = $(element.form);
			this.name = element.name;
		} else if (element.tagName.toLowerCase() == 'form') {
			this.form = element;
			this.name = name;
		} else {
			throw 'Invalid arguments to RadioGroup constructor';
		}
	},

	getButtons: function() {
		return $A(this.form.getInputs('radio', this.name));
	},

	getButton: function(value) {
		return this.getButtons().find(function(e) { return (e.value == value); });
	},

	getButtonAt: function(index) {
		return this.getButtons()[index];
	},

	getCheckedButton: function() {
		return this.getButtons().find(function(e) { return e.checked; });
	},

	getValue: function() {
		var checkedButton = this.getCheckedButton();
		return (checkedButton) ? $F(checkedButton) : undefined;
	},

	getSelectedIndex: function() {
		var index = this.getButtons().findIndex(function(button) { return button.checked; });
		return (index != undefined) ? index : -1;
	},

	clear: function() {
		this.getButtons().each(function(e) { e.checked = false; });
		return this;
	},

	setCheckedButton: function(button) {
		if (button) {
			button.checked = true;
		} else {
			this.clear();
		}
		return this;
	},

	setValue: function(value) {
		this.setCheckedButton(this.getButton(value));
		return this;
	},

	setSelectedIndex: function(index) {
		this.setCheckedButton(this.getButtonAt(index));
		return this;
	},

	enable: function() {
		this.getButtons().each(function(e) { e.enable(); });
		return this;
	},

	disable: function() {
		this.getButtons().each(function(e) { e.disable(); });
		return this;
	}
});

function $RF(element, name) {
	return (new RadioGroup(element, name)).getValue();
}

function doOnLoad(func) {
	Event.observe(window, 'load', func);
}

function doOnReady(func) {
	if (PROTOTYPE_VERSION >= 1.6) {
		document.observe('dom:loaded', func);
	}
	else {
		alert("Current Prototype version \"" + PROTOTYPE_VERSION + "\" does not support the doOnReady() function");
	}
}

