7c21310ed7218157170605fdf32c1c243c7be25e.svn-base 4.1 KB
Newer Older
1 2 3 4 5 6 7 8 9
/**
 * jQuery Interdependencies library
 *
 * http://miohtama.github.com/jquery-interdependencies/
 * https://github.com/miohtama/jquery-interdependencies
 *
 * Copyright 2012-2013 Mikko Ohtamaa, others
 */
 !function(t){"use strict";function n(t){window.console&&window.console.log&&console.log(t)}function e(n,e){return"#"==e[0]&&e.indexOf(" ")<0?t(e):n.find(e)}function o(t,n,e){this.init(t,n,e)}function i(){this.rules=[]}t.extend(o.prototype,{init:function(t,n,e){this.controller=t,this.condition=n,this.value=e,this.rules=[],this.controls=[]},evalCondition:function(n,e,o,i,r){if("=="==o||"OR"==o)return this.checkBoolean(i)==this.checkBoolean(r);if("!="==o)return this.checkBoolean(i)!=this.checkBoolean(r);if(">="==o)return Number(r)>=Number(i);if("<="==o)return Number(r)<=Number(i);if(">"==o)return Number(r)>Number(i);if("<"==o)return Number(r)<Number(i);if("()"==o)return window[i](n,e,r);if("any"==o)return t.inArray(r,i.split(","))>-1;if("not-any"==o)return-1==t.inArray(r,i.split(","));throw new Error("Unknown condition:"+o)},checkBoolean:function(t){switch(t){case!0:case"true":case 1:case"1":t=!0;break;case!1:case"false":case 0:case"0":t=!1}return t},checkCondition:function(t,e){if(!this.condition)return!0;var o=t.find(this.controller);0===o.size()&&e.log&&n("Evaling condition: Could not find controller input "+this.controller);var i=this.getControlValue(t,o);return e.log&&void 0===i&&n("Evaling condition: Could not exctract value from input "+this.controller),void 0!==i&&(i=this.normalizeValue(o,this.value,i),this.evalCondition(t,o,this.condition,this.value,i))},normalizeValue:function(t,n,e){return"number"==typeof n?parseFloat(e):e},getControlValue:function(t,n){return("radio"==n.attr("type")||"checkbox"==n.attr("type"))&&n.size()>1?n.filter(":checked").val():"checkbox"==n.attr("type")||"radio"==n.attr("type")?n.is(":checked"):n.val()},createRule:function(t,n,e){var i=new o(t,n,e);return this.rules.push(i),i},include:function(t){if(!t)throw new Error("Must give an input selector");this.controls.push(t)},applyRule:function(e,o,i){var r;r=void 0===i?this.checkCondition(e,o):i,o.log&&n("Applying rule on "+this.controller+"=="+this.value+" enforced:"+i+" result:"+r),o.log&&!this.controls.length&&n("Zero length controls slipped through");var l=o.show||function(t){t.show()},s=o.hide||function(t){t.hide()},c=t.map(this.controls,function(t,i){var r=e.find(t);return o.log&&0===r.size()&&n("Could not find element:"+t),r});r?(t(c).each(function(){o.log&&0===t(this).size()&&(n("Control selection is empty when showing"),n(this)),l(this)}),t(this.rules).each(function(){"OR"!==this.condition&&this.applyRule(e,o)})):(t(c).each(function(){o.log&&0===t(this).size()&&(n("Control selection is empty when hiding:"),n(this)),s(this)}),t(this.rules).each(function(){"OR"!==this.condition?this.applyRule(e,o,!1):this.applyRule(e,o)}))}}),t.extend(i.prototype,{createRule:function(t,n,e){var i=new o(t,n,e);return this.rules.push(i),i},applyRules:function(t,e){var o;for((e=e||{}).log&&n("Starting evaluation ruleset of "+this.rules.length+" rules"),o=0;o<this.rules.length;o++)this.rules[o].applyRule(t,e)},walk:function(){function n(o){e.push(o),t(o.children).each(function(){n(this)})}var e=[];return t(this.rules).each(function(){n(this)}),e},checkTargets:function(o,i){var r=0,l=this.walk();t(l).each(function(){if(0===o.find(this.controller).size())throw new Error("Rule's controller does not exist:"+this.controller);if(0===this.controls.length)throw new Error("Rule has no controls:"+this);t(this.controls).each(function(){if(0===e(o,this))throw new Error("Rule's target control "+this+" does not exist in context "+o.get(0));r++})}),i.log&&n("Controller check ok, rules count "+l.length+" controls count "+r)},install:function(n){t.deps.enable(t(document.body),this,n)}});var r={createRuleset:function(){return new i},enable:function(t,e,o){((o=o||{}).checkTargets||void 0===o.checkTargets)&&e.checkTargets(t,o);o.log&&n("Enabling dependency change monitoring on "+t.get(0));var i=function(){e.applyRules(t,o)},r=t.on?t.on("change.deps",null,null,i):t.live("change.deps",i);return e.applyRules(t,o),r}};t.deps=r}(jQuery);