All pastes #244084 Raw Edit

Gareth Adams

public text v1 · immutable
#244084 ·published 2006-11-09 08:08 UTC
rendered paste body
function kyanFormMagic() {

	this.initialCallbacks = []

	this.dependency = function( element, target, condition, options ) {

		// Turn first argument into an array of applicable elements
		var elements = this.toElementArray(element);

		// Turn first argument into an array of applicable elements
		target = this.toFormElement(target);

		if(!target) {return;}

		var targetType = target.nodeName.toLowerCase() == 'input' ? target.type.toLowerCase() : target.nodeName.toLowerCase();

		switch(targetType) {
			case 'radio':
			case 'checkbox':
				for(var i = 0; i < elements.length; i++) {
					var callback = this.checkableCallback(target, elements[i], condition);
					this.addEvent(target, 'click', callback);
					callback();
				}
		}
	}

	this.checkableCallback = function(target, dependent_element, value) {
		return function(event) {
			dependent_element.disabled = (target.checked == !value);
			if(event) { kfm.log(event.type + ' ' + target.checked); }
		}
	}

	this.toElementArray = function(arg) {
		if(typeof arg == 'object' && arg.length) {
			var out = [];
			for(var i = 0; i < arg.length; i++) {
				out[out.length] = this.toElement(arg[i]);
			}
			return out;
		} else {
			return [this.toElement(arg)];
		}
	}

	this.toElement = function(arg) {
		if(typeof arg == 'string') {
			return document.getElementById(arg);
		} else if(arg.nodeName) {
			return arg;
		} else {
			return null;
		}
	}

	this.toFormElement = function(arg) {
		var element = this.toElement(arg);
		var nn = element.nodeName ? element.nodeName.toLowerCase() : 'null';
		switch(nn) {
			case 'input':
			case 'select':
			case 'textarea':
				return element;
			default:
				return null;
		}
	}

	this.addEvent = function(obj, evType, fn){ 
		if (obj.addEventListener){ 
			obj.addEventListener(evType, fn, false); 
			return true; 
		} else if (obj.attachEvent){ 
			var r = obj.attachEvent("on"+evType, fn); 
			return r; 
		} else { 
			return false; 
		} 
	}

	this.log = function(text) {
		document.getElementById('log').innerHTML += text;
		document.getElementById('log').innerHTML += "<br>";
	}

}




<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
	<head>
		<title>Page Title</title>
		<script type='text/javascript'>
		</script>
	</head>
	<body>
		<form action=''>
			<input id='one' type='checkbox' checked>
			<input id='two' type='checkbox'>
		</form>
		<script type='text/javascript' src='form.js'>
		</script>
		<script type='text/javascript'>
			window.kfm = new kyanFormMagic();
			kfm.dependency('two', 'one', true);
		</script>
		<div id='log'></div>
	</body>
</html>