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 += "
";
}
}