IRIS.util.FormUtils = function() {

	return {

		setChecked: function( element, checked ) {
			if( typeof element == 'string' ) {
				element = document.getElementById(element);
			}
			if( element ) {
				element.checked = checked;
			}
		},

		setAllChecked: function( form, inputName, checked ) {
			if( typeof form != 'object' ) {
				form = document.getElementById(form);
			}
			else if( form.nodeName.toLowerCase() != 'form' ) {
				var parent = form.parentNode;
				do {
					if( parent.nodeName.toLowerCase() == 'form' ) {
						form = parent;
						break;
					}
				}
				while( parent = parent.parentNode );
			}
			for( var i = 0; i < form.elements.length; i++ ) {
				var element = form.elements[i];
				if( element.name == inputName ) {
					element.checked = checked;
				}
			}
		},
	
		setSelected: function( select, selectedOption, bool, createOption ) {
			if( typeof select != 'object' ) {
				select = document.getElementById(select);
			}
			if( typeof selectedOption == 'boolean' ) {
				for( var i = 0; i < select.options.length; i++ ) {
					select.options[i].selected = selectedOption;
				}
			}
			else {
				if( typeof bool == 'undefined' ) {
					bool = true;
				}
				if( typeof selectedOption == 'integer' ) {
					select.options[selectedIndex].selected = bool;
				}
				else {
					var found = false;
					for( var i = 0; i < select.options.length; i++ ) {
						if( select.options[i].value == selectedOption ) {
							select.options[i].selected = true;
							found = true;
						}
					}
					if( !found && createOption ) {
						FormUtils.addOption(select, selectedOption).selected = true;
					}
				}
			}
		},
	
		addOption: function( select, value, label ) {
			if( typeof label == 'undefined' ) {
				label = value;
			}
			var option = new Option(value, label);
			try {
				select.add(option,null);
			}
			catch (e) {
				select.add(option,select.length);
			}
			return option;
		},
	
		clearForm: function( element ) {
			while( element.tagName.toUpperCase() != 'FORM' ) {
				element = element.parentNode;
			}
			if( element ) {
				var form = element, str = '', type, tagName;
				for( var i = 0; i < form.elements.length; i++ ) {
					element = form.elements[i];
					tagName = element.tagName.toUpperCase();
					if( tagName == 'SELECT' ) {
						element.selectedIndex = false;
						for( var j = 0; j < element.options.length; j++ ) {
							element.options[j].selected = false;
						}
					}
					else if( tagName == 'INPUT' ) {
						type = element.type.toUpperCase();
						if( type == 'RADIO' || type == 'CHECKBOX' ) {
							if( element.value == 'null' ) {
								element.checked = true;
							}
							else {
								element.checked = false;
							}
						}
						else if( type != 'SUBMIT' && type != 'RESET' 
								&& type != 'BUTTON' && type != 'HIDDEN' ) {
							element.value = '';
						}
					}
				}
			}
			return false;
		},

		insertAtCaret: function(obj, text) {
			if(document.selection) {
				obj.focus();
				var orig = obj.value.replace(/\r\n/g, "\n");
				var range = document.selection.createRange();

				if(range.parentElement() != obj) {
					return false;
				}

				range.text = text;

				var actual = tmp = obj.value.replace(/\r\n/g, "\n");

				for(var diff = 0; diff < orig.length; diff++) {
					if(orig.charAt(diff) != actual.charAt(diff)) break;
				}

				for(var index = 0, start = 0; 
					tmp.match(text) 
						&& (tmp = tmp.replace(text, "")) 
						&& index <= diff; 
					index = start + text.length
				) {
					start = actual.indexOf(text, index);
				}
			} else if(obj.selectionStart) {
				var start = obj.selectionStart;
				var end   = obj.selectionEnd;
				obj.value = obj.value.substr(0, start) 
					+ text 
					+ obj.value.substr(end, obj.value.length);
			}
			if(start != null) {
				this.setCaretTo(obj, start + text.length);
			} else {
				obj.value += text;
			}
		},

		setCaretTo: function(obj, pos) {
			if(obj.createTextRange) {
				var range = obj.createTextRange();
				range.move('character', pos);
				range.select();
			} else if(obj.selectionStart) {
				obj.focus();
				obj.setSelectionRange(pos, pos);
			}
		}

	}

}();