From 78ec0cbfa7db5a33af3a1b0b79149f94371bbc74 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sat, 21 Nov 2009 02:33:12 +0000 Subject: [PATCH] MINOR Updated jquery-concrete git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@92558 467b73ca-7a2a-4603-9d3b-597d59a354a9 --- forms/CalendarDateField.php | 2 +- forms/TabSet.php | 2 +- security/Security.php | 2 +- thirdparty/jquery-concrete/.piston.yml | 2 +- thirdparty/jquery-concrete/build.sh | 14 +- ...oncrete-0.9.js => jquery.concrete-dist.js} | 17 +- .../dist/jquery.concrete-latest.js | 1490 ----------------- 7 files changed, 18 insertions(+), 1511 deletions(-) rename thirdparty/jquery-concrete/dist/{jquery.concrete-0.9.js => jquery.concrete-dist.js} (98%) delete mode 100644 thirdparty/jquery-concrete/dist/jquery.concrete-latest.js diff --git a/forms/CalendarDateField.php b/forms/CalendarDateField.php index 116efb949..0f887a97a 100755 --- a/forms/CalendarDateField.php +++ b/forms/CalendarDateField.php @@ -28,7 +28,7 @@ class CalendarDateField extends DateField { } - Requirements::javascript(SAPPHIRE_DIR . '/thirdparty/jquery-concrete/dist/jquery.concrete-latest.js'); + Requirements::javascript(SAPPHIRE_DIR . '/thirdparty/jquery-concrete/dist/jquery.concrete-dist.js'); // javascript: custom Requirements::javascript(SAPPHIRE_DIR . '/javascript/CalendarDateField.js'); diff --git a/forms/TabSet.php b/forms/TabSet.php index 93f479896..15a9983e2 100644 --- a/forms/TabSet.php +++ b/forms/TabSet.php @@ -58,7 +58,7 @@ class TabSet extends CompositeField { Requirements::css(SAPPHIRE_DIR . '/thirdparty/jquery-ui-themes/smoothness/ui.all.css'); Requirements::css(SAPPHIRE_DIR . '/thirdparty/jquery-ui-themes/smoothness/ui.tabs.css'); - Requirements::javascript(SAPPHIRE_DIR . '/thirdparty/jquery-concrete/dist/jquery.concrete-latest.js'); + Requirements::javascript(SAPPHIRE_DIR . '/thirdparty/jquery-concrete/dist/jquery.concrete-dist.js'); Requirements::javascript(SAPPHIRE_DIR . '/javascript/TabSet.js'); diff --git a/security/Security.php b/security/Security.php index 46d9acb7c..46f9c3e4f 100644 --- a/security/Security.php +++ b/security/Security.php @@ -342,7 +342,7 @@ class Security extends Controller { Requirements::javascript(SAPPHIRE_DIR . '/thirdparty/jquery-ui/ui.core.js'); Requirements::javascript(SAPPHIRE_DIR . '/thirdparty/jquery-ui/ui.tabs.js'); - Requirements::javascript(SAPPHIRE_DIR . '/thirdparty/jquery-concrete/dist/jquery.concrete-latest.js'); + Requirements::javascript(SAPPHIRE_DIR . '/thirdparty/jquery-concrete/dist/jquery.concrete-dist.js'); Requirements::css(THIRDPARTY_DIR . '/jquery/themes/smoothness/ui.all.css'); Requirements::css(THIRDPARTY_DIR . '/jquery/themes/smoothness/ui.tabs.css'); diff --git a/thirdparty/jquery-concrete/.piston.yml b/thirdparty/jquery-concrete/.piston.yml index 83b4403ad..677996d46 100644 --- a/thirdparty/jquery-concrete/.piston.yml +++ b/thirdparty/jquery-concrete/.piston.yml @@ -1,7 +1,7 @@ --- format: 1 handler: - commit: 488376e8aa3c046cbf60adf43c42c76b5031fe20 + commit: 767bc6d5ae87459cc6534ddcf91054d28fdd252c branch: master lock: false repository_class: Piston::Git::Repository diff --git a/thirdparty/jquery-concrete/build.sh b/thirdparty/jquery-concrete/build.sh index 81152825c..33209abcf 100755 --- a/thirdparty/jquery-concrete/build.sh +++ b/thirdparty/jquery-concrete/build.sh @@ -1,17 +1,7 @@ #!/bin/sh -VER=$1 - -# Get the version - a tag if possible, otherwise a short ref (not well tested code) -if [ "$VER " = " " ] ; then \ - VER=`git rev-parse --abbrev-ref=strict HEAD` -fi -if [ "$VER" = "master" ] ; then \ - VER=`git show --pretty=format:"%h" --quiet` -fi - # Specify the output file's name -FILE="dist/jquery.concrete-$VER.js" +FILE="dist/jquery.concrete-dist.js" mkdir -p dist rm dist/*.js @@ -38,8 +28,6 @@ do \ echo >> $FILE done -ln -s `basename "$FILE"` dist/jquery.concrete-latest.js - # cp LICENSE /tmp/ # cp $FILE /tmp/ diff --git a/thirdparty/jquery-concrete/dist/jquery.concrete-0.9.js b/thirdparty/jquery-concrete/dist/jquery.concrete-dist.js similarity index 98% rename from thirdparty/jquery-concrete/dist/jquery.concrete-0.9.js rename to thirdparty/jquery-concrete/dist/jquery.concrete-dist.js index a0af690d9..3d1ac7622 100644 --- a/thirdparty/jquery-concrete/dist/jquery.concrete-0.9.js +++ b/thirdparty/jquery-concrete/dist/jquery.concrete-dist.js @@ -1,4 +1,4 @@ -/* jQuery.Concrete - Copyright 2009 Hamish Friedlander and SilverStripe. Version 0.9. */ +/* jQuery.Concrete - Copyright 2009 Hamish Friedlander and SilverStripe. Version . */ /* vendor/jquery.selector/jquery.class.js */ @@ -1166,7 +1166,10 @@ var console; var el = e.target; while (el && el != document && !e.isPropagationStopped()) { - one(el, arguments); + var ret = one(el, arguments); + if (ret !== undefined) e.result = ret; + if (ret === false) { e.preventDefault(); e.stopPropagation(); } + el = el.parentNode; } }; @@ -1186,7 +1189,10 @@ var console; contan el and rel, and so we can just stop bubbling */ if (is_or_contains(el, rel)) break; - one(el, arguments); + var ret = one(el, arguments); + if (ret !== undefined) e.result = ret; + if (ret === false) { e.preventDefault(); e.stopPropagation(); } + el = el.parentNode; } }; @@ -1227,7 +1233,10 @@ var console; // And if we decided that a change happened, do the actual triggering if (e.type == 'change') { while (el && el != document && !e.isPropagationStopped()) { - one(el, arguments); + var ret = one(el, arguments); + if (ret !== undefined) e.result = ret; + if (ret === false) { e.preventDefault(); e.stopPropagation(); } + el = el.parentNode; } } diff --git a/thirdparty/jquery-concrete/dist/jquery.concrete-latest.js b/thirdparty/jquery-concrete/dist/jquery.concrete-latest.js deleted file mode 100644 index a0af690d9..000000000 --- a/thirdparty/jquery-concrete/dist/jquery.concrete-latest.js +++ /dev/null @@ -1,1490 +0,0 @@ -/* jQuery.Concrete - Copyright 2009 Hamish Friedlander and SilverStripe. Version 0.9. */ - -/* vendor/jquery.selector/jquery.class.js */ - -/** - * Very basic Class utility. Based on base and jquery.class. - * - * Class definition: var Foo = Base.extend({ init: function(){ Constructor }; method_name: function(){ Method } }); - * - * Inheritance: var Bar = Foo.extend({ method_name: function(){ this._super(); } }); - * - * new-less Constructor: new Foo(arg) <-same as-> Foo(arg) - */ - -var Base; - -(function(){ - - var marker = {}, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/; - - // The base Class implementation (does nothing) - Base = function(){}; - - Base.addMethod = function(name, func) { - var _super = this._super; - if (_super && fnTest.test(func)) { - this.prototype[name] = function(){ - var tmp = this._super; - this._super = _super[name]; - try { - var ret = func.apply(this, arguments); - } - finally { - this._super = tmp; - } - return ret; - } - } - else this.prototype[name] = func; - } - - Base.addMethods = function(props) { - for (var name in props) { - if (typeof props[name] == 'function') this.addMethod(name, props[name]); - else this.prototype[name] = props[name]; - } - } - - // Create a new Class that inherits from this class - Base.extend = function(props) { - - // The dummy class constructor - var Kls = function() { - if (arguments[0] === marker) return; - - if (this instanceof Kls) { - if (this.init) this.init.apply(this, arguments); - } - else { - var ret = new Kls(marker); if (ret.init) ret.init.apply(ret, arguments); return ret; - } - } - - // Add the common class variables and methods - Kls.constructor = Kls; - Kls.extend = Base.extend; - Kls.addMethod = Base.addMethod; - Kls.addMethods = Base.addMethods; - Kls._super = this.prototype; - - // Attach the parent object to the inheritance chain - Kls.prototype = new this(marker); - - // Copy the properties over onto the new prototype - Kls.addMethods(props); - - return Kls; - }; -})();; - - -/* vendor/jquery.selector/jquery.selector.js */ - -(function($){ - - var tokens = { - UNICODE: /\\[0-9a-f]{1,6}(?:\r\n|[ \n\r\t\f])?/, - ESCAPE: /(?:UNICODE)|\\[^\n\r\f0-9a-f]/, - NONASCII: /[^\x00-\x7F]/, - NMSTART: /[_a-z]|(?:NONASCII)|(?:ESCAPE)/, - NMCHAR: /[_a-z0-9-]|(?:NONASCII)|(?:ESCAPE)/, - IDENT: /-?(?:NMSTART)(?:NMCHAR)*/, - - NL: /\n|\r\n|\r|\f/, - - STRING: /(?:STRING1)|(?:STRING2)|(?:STRINGBARE)/, - STRING1: /"(?:(?:ESCAPE)|\\(?:NL)|[^\n\r\f\"])*"/, - STRING2: /'(?:(?:ESCAPE)|\\(?:NL)|[^\n\r\f\'])*'/, - STRINGBARE: /(?:(?:ESCAPE)|\\(?:NL)|[^\n\r\f\]])*/, - - FUNCTION: /(?:IDENT)\(\)/, - - INTEGER: /[0-9]+/, - - WITHN: /([-+])?(INTEGER)?(n)\s*(?:([-+])\s*(INTEGER))?/, - WITHOUTN: /([-+])?(INTEGER)/ - } - - var rx = { - not: /:not\(/, - not_end: /\)/, - - tag: /((?:IDENT)|\*)/, - id: /#(IDENT)/, - cls: /\.(IDENT)/, - attr: /\[\s*(IDENT)\s*(?:([^=]?=)\s*(STRING)\s*)?\]/, - pseudo_el: /(?::(first-line|first-letter|before|after))|(?:::((?:FUNCTION)|(?:IDENT)))/, - pseudo_cls_nth: /:nth-child\(\s*(?:(?:WITHN)|(?:WITHOUTN)|(odd|even))\s*\)/, - pseudo_cls: /:(IDENT)/, - - comb: /\s*(\+|~|>)\s*|\s+/, - comma: /\s*,\s*/, - important: /\s+!important\s*$/ - } - - /* Replace placeholders with actual regex, and mark all as case insensitive */ - var token = /[A-Z][A-Z0-9]+/; - for (var k in rx) { - var src = rx[k].source; - while (m = src.match(token)) src = src.replace(m[0], tokens[m[0]].source); - rx[k] = new RegExp(src, 'gi'); - } - - /** - * A string that matches itself against regexii, and keeps track of how much of itself has been matched - */ - var ConsumableString = Base.extend({ - init: function(str) { - this.str = str; - this.pos = 0; - }, - match: function(rx) { - var m; - rx.lastIndex = this.pos; - if ((m = rx.exec(this.str)) && m.index == this.pos ) { - this.pos = rx.lastIndex ? rx.lastIndex : this.str.length ; - return m; - } - return null; - }, - peek: function(rx) { - var m; - rx.lastIndex = this.pos; - if ((m = rx.exec(this.str)) && m.index == this.pos ) return m; - return null; - }, - showpos: function() { - return this.str.slice(0,this.pos)+'' + this.str.slice(this.pos); - }, - done: function() { - return this.pos == this.str.length; - } - }) - - /* A base class that all Selectors inherit off */ - var SelectorBase = Base.extend({}); - - /** - * A class representing a Simple Selector, as per the CSS3 selector spec - */ - var SimpleSelector = SelectorBase.extend({ - init: function() { - this.tag = null; - this.id = null; - this.classes = []; - this.attrs = []; - this.nots = []; - this.pseudo_classes = []; - this.pseudo_els = []; - }, - parse: function(selector) { - var m; - - /* Pull out the initial tag first, if there is one */ - if (m = selector.match(rx.tag)) this.tag = m[1]; - - /* Then for each selection type, try and find a match */ - do { - if (m = selector.match(rx.not)) { - this.nots[this.nots.length] = SelectorsGroup().parse(selector) - if (!(m = selector.match(rx.not_end))) { - throw 'Invalid :not term in selector'; - } - } - else if (m = selector.match(rx.id)) this.id = m[1]; - else if (m = selector.match(rx.cls)) this.classes[this.classes.length] = m[1]; - else if (m = selector.match(rx.attr)) this.attrs[this.attrs.length] = [ m[1], m[2], m[3] ]; - else if (m = selector.match(rx.pseudo_el)) this.pseudo_els[this.pseudo_els.length] = m[1] || m[2]; - else if (m = selector.match(rx.pseudo_cls_nth)) { - if (m[3]) { - var a = parseInt((m[1]||'')+(m[2]||'1')); - var b = parseInt((m[4]||'')+(m[5]||'0')); - } - else { - var a = m[8] ? 2 : 0; - var b = m[8] ? (4-m[8].length) : parseInt((m[6]||'')+m[7]); - } - this.pseudo_classes[this.pseudo_classes.length] = ['nth-child', [a, b]]; - } - else if (m = selector.match(rx.pseudo_cls)) this.pseudo_classes[this.pseudo_classes.length] = [m[1]]; - - } while(m && !selector.done()); - - return this; - } - }) - - /** - * A class representing a Selector, as per the CSS3 selector spec - */ - var Selector = SelectorBase.extend({ - init: function(){ - this.parts = []; - }, - parse: function(cons){ - this.parts[this.parts.length] = SimpleSelector().parse(cons); - - while (!cons.done() && !cons.peek(rx.comma) && (m = cons.match(rx.comb))) { - this.parts[this.parts.length] = m[1] || ' '; - this.parts[this.parts.length] = SimpleSelector().parse(cons); - } - - return this.parts.length == 1 ? this.parts[0] : this; - } - }); - - /** - * A class representing a sequence of selectors, as per the CSS3 selector spec - */ - var SelectorsGroup = SelectorBase.extend({ - init: function(){ - this.parts = []; - }, - parse: function(cons){ - this.parts[this.parts.length] = Selector().parse(cons); - - while (!cons.done() && (m = cons.match(rx.comma))) { - this.parts[this.parts.length] = Selector().parse(cons); - } - - return this.parts.length == 1 ? this.parts[0] : this; - } - }); - - - $.selector = function(s){ - var cons = ConsumableString(s); - var res = SelectorsGroup().parse(cons); - - res.selector = s; - - if (!cons.done()) throw 'Could not parse selector - ' + cons.showpos() ; - else return res; - } - - $.selector.SelectorBase = SelectorBase; - $.selector.SimpleSelector = SimpleSelector; - $.selector.Selector = Selector; - $.selector.SelectorsGroup = SelectorsGroup; - -})(jQuery) -; - - -/* vendor/jquery.selector/jquery.selector.specifity.js */ - -(function($) { - - $.selector.SimpleSelector.addMethod('specifity', function() { - if (this.spec) return this.spec; - - var spec = [ - this.id ? 1 : 0, - this.classes.length + this.attrs.length + this.pseudo_classes.length, - ((this.tag && this.tag != '*') ? 1 : 0) + this.pseudo_els.length - ]; - $.each(this.nots, function(i,not){ - var ns = not.specifity(); spec[0] += ns[0]; spec[1] += ns[1]; spec[2] += ns[2]; - }); - - return this.spec = spec; - }) - - $.selector.Selector.addMethod('specifity', function(){ - if (this.spec) return this.spec; - - var spec = [0,0,0]; - $.each(this.parts, function(i,part){ - if (i%2) return; - var ps = part.specifity(); spec[0] += ps[0]; spec[1] += ps[1]; spec[2] += ps[2]; - }); - - return this.spec = spec; - }) - - $.selector.SelectorsGroup.addMethod('specifity', function(){ - if (this.spec) return this.spec; - - var spec = [0,0,0]; - $.each(this.parts, function(i,part){ - var ps = part.specifity(); spec[0] += ps[0]; spec[1] += ps[1]; spec[2] += ps[2]; - }); - - return this.spec = spec; - }) - - -})(jQuery); -; - - -/* vendor/jquery.selector/jquery.selector.matches.js */ - -/* -This attempts to do the opposite of Sizzle. -Sizzle is good for finding elements for a selector, but not so good for telling if an individual element matches a selector -*/ - -(function($) { - - /**** CAPABILITY TESTS ****/ - var div = document.createElement('div'); - div.innerHTML = '
'; - - // In IE 6-7, getAttribute often does the wrong thing (returns similar to el.attr), so we need to use getAttributeNode on that browser - var getAttributeDodgy = div.firstChild.getAttribute('id') !== 'test'; - - // Does browser support Element.firstElementChild, Element.previousElementSibling, etc. - var hasElementTraversal = div.firstElementChild && div.firstElementChild.tagName == 'FORM'; - - // Does browser support Element.children - var hasChildren = div.children && div.children[0].tagName == 'FORM'; - - var FUNC_IN = /^\s*function\s*\([^)]*\)\s*{/; - var FUNC_OUT = /}\s*$/; - - var funcToString = function(f) { - return (''+f).replace(FUNC_IN,'').replace(FUNC_OUT,''); - } - - // Can we use Function#toString ? - try { - var testFunc = function(){ return 'good' }; - if ((new Function('',funcToString(testFunc)))() != 'good') funcToString = false; - } - catch(e) { funcToString = false; console.log(e.message);/*pass*/ } - - /**** INTRO ****/ - - var GOOD = /GOOD/g; - var BAD = /BAD/g; - - var STARTS_WITH_QUOTES = /^['"]/g; - - var join = function(js) { - return js.join('\n'); - } - - var join_complex = function(js) { - code = new String(js.join('\n')); // String objects can have properties set. strings can't - code.complex = true; - return code; - } - - /**** ATTRIBUTE ACCESSORS ****/ - - var getAttr; - - // Good browsers - if (!getAttributeDodgy) { - getAttr = function(attr){ return 'var _'+attr+' = el.getAttribute("'+attr+'");' ; } - } - // IE 6, 7 - else { - // On IE 6 + 7, getAttribute still has to be called with DOM property mirror name, not attribute name. Map attributes to those names - var getAttrIEMap = { 'class': 'className', 'for': 'htmlFor' }; - - getAttr = function(attr) { - var ieattr = getAttrIEMap[attr] || attr; - return 'var _'+attr+' = el.getAttribute("'+ieattr+'",2) || (el.getAttributeNode("'+attr+'")||{}).nodeValue;'; - } - } - - /**** ATTRIBUTE COMPARITORS ****/ - - var attrchecks = { - '-': '!_K', - '=': '_K != "V"', - '!=': '_K == "V"', - '~=': '__K.indexOf(" V ") == -1', - '^=': '!_K || _K.indexOf("V") != 0', - '*=': '!_K || _K.indexOf("V") == -1', - '$=': '!_K || _K.substr(_K.length-"V".length) != "V"' - } - - /**** STATE TRACKER ****/ - - var State = $.selector.State = Base.extend({ - init: function(){ - this.reset(); - }, - reset: function() { - this.attrs = {}; this.wsattrs = {}; - }, - - prev: function(){ - this.reset(); - if (hasElementTraversal) return 'el = el.previousElementSibling'; - return 'while((el = el.previousSibling) && el.nodeType != 1) {}'; - }, - next: function() { - this.reset(); - if (hasElementTraversal) return 'el = el.nextElementSibling'; - return 'while((el = el.nextSibling) && el.nodeType != 1) {}'; - }, - prevLoop: function(body){ - this.reset(); - if (hasElementTraversal) return join([ 'while(el = el.previousElementSibling){', body]); - return join([ - 'while(el = el.previousSibling){', - 'if (el.nodeType != 1) continue;', - body, - ]); - }, - parent: function() { - this.reset(); - return 'el = el.parentNode;'; - }, - parentLoop: function(body) { - this.reset(); - return join([ - 'while((el = el.parentNode) && el.nodeType == 1){', - body, - '}' - ]); - }, - - uses_attr: function(attr) { - if (this.attrs[attr]) return; - this.attrs[attr] = true; - return getAttr(attr); - }, - uses_wsattr: function(attr) { - if (this.wsattrs[attr]) return; - this.wsattrs[attr] = true; - return join([this.uses_attr(attr), 'var __'+attr+' = " "+_'+attr+'+" ";']); - }, - - save: function(lbl) { - return 'var el'+lbl+' = el;'; - }, - restore: function(lbl) { - this.reset(); - return 'el = el'+lbl+';'; - } - }); - - /**** PSEUDO-CLASS DETAILS ****/ - - var pseudoclschecks = { - 'first-child': join([ - 'var cel = el;', - 'while(cel = cel.previousSibling){ if (cel.nodeType === 1) BAD; }', - ]), - 'last-child': join([ - 'var cel = el;', - 'while(cel = cel.nextSibling){ if (cel.nodeType === 1) BAD; }' - ]), - 'nth-child': function(a,b) { - var get_i = join([ - 'var i = 1, cel = el;', - 'while(cel = cel.previousSibling){', - 'if (cel.nodeType === 1) i++;', - '}', - ]); - - if (a == 0) return join([ - get_i, - 'if (i- '+b+' != 0) BAD;' - ]); - else if (b == 0 && a >= 0) return join([ - get_i, - 'if (i%'+a+' != 0 || i/'+a+' < 0) BAD;' - ]); - else if (b == 0 && a < 0) return join([ - 'BAD;' - ]); - else return join([ - get_i, - 'if ((i- '+b+')%'+a+' != 0 || (i- '+b+')/'+a+' < 0) BAD;' - ]); - } - }; - - // Needs to refence contents of object, so must be injected after definition - pseudoclschecks['only-child'] = join([ - pseudoclschecks['first-child'], - pseudoclschecks['last-child'] - ]); - - /**** SimpleSelector ****/ - - $.selector.SimpleSelector.addMethod('compile', function(el) { - var js = []; - - /* Check against element name */ - if (this.tag && this.tag != '*') { - js[js.length] = 'if (el.tagName != "'+this.tag.toUpperCase()+'") BAD;'; - } - - /* Check against ID */ - if (this.id) { - js[js.length] = el.uses_attr('id'); - js[js.length] = 'if (_id !== "'+this.id+'") BAD;'; - } - - /* Build className checking variable */ - if (this.classes.length) { - js[js.length] = el.uses_wsattr('class'); - - /* Check against class names */ - $.each(this.classes, function(i, cls){ - js[js.length] = 'if (__class.indexOf(" '+cls+' ") == -1) BAD;'; - }) - } - - /* Check against attributes */ - $.each(this.attrs, function(i, attr){ - js[js.length] = (attr[1] == '~=') ? el.uses_wsattr(attr[0]) : el.uses_attr(attr[0]); - var check = attrchecks[ attr[1] || '-' ]; - check = check.replace( /K/g, attr[0]).replace( /V/g, attr[2] && attr[2].match(STARTS_WITH_QUOTES) ? attr[2].slice(1,-1) : attr[2] ); - js[js.length] = 'if ('+check+') BAD;'; - }); - - /* Check against nots */ - $.each(this.nots, function(i, not){ - var lbl = ++lbl_id; - var func = join([ - 'l'+lbl+':{', - not.compile(el).replace(BAD, 'break l'+lbl).replace(GOOD, 'BAD'), - '}' - ]); - - if (!(not instanceof $.selector.SimpleSelector)) func = join([ - el.save(lbl), - func, - el.restore(lbl) - ]) - - js[js.length] = func; - }); - - /* Check against pseudo-classes */ - $.each(this.pseudo_classes, function(i, pscls){ - var check = pseudoclschecks[pscls[0]]; - if (check) { - js[js.length] = ( typeof check == 'function' ? check.apply(this, pscls[1]) : check ); - } - else if (check = $.find.selectors.filters[pscls[0]]) { - if (funcToString) { - js[js.length] = funcToString(check).replace(/elem/g,'el').replace(/return([^;]+);/,'if (!($1)) BAD;'); - } - else { - js[js.length] = 'if (!$.find.selectors.filters.'+pscls[0]+'(el)) BAD;' - } - } - }); - - js[js.length] = 'GOOD'; - - /* Pass */ - return join(js); - }); - - var lbl_id = 0; - /** Turns an compiled fragment into the first part of a combination */ - function as_subexpr(f) { - if (f.complex) - return join([ - 'l'+(++lbl_id)+':{', - f.replace(GOOD, 'break l'+lbl_id), - '}', - ]); - else - return f.replace(GOOD, ''); - } - - var combines = { - ' ': function(el, f1, f2) { - return join_complex([ - f2, - 'while(true){', - el.parent(), - 'if (!el || el.nodeType !== 1) BAD;', - f1.compile(el).replace(BAD, 'continue'), - '}' - ]); - }, - - '>': function(el, f1, f2) { - return join([ - f2, - el.parent(), - 'if (!el || el.nodeType !== 1) BAD;', - f1.compile(el) - ]); - }, - - '~': function(el, f1, f2) { - return join_complex([ - f2, - el.prevLoop(), - f1.compile(el).replace(BAD, 'continue'), - '}', - 'BAD;' - ]); - }, - - '+': function(el, f1, f2) { - return join([ - f2, - el.prev(), - 'if (!el) BAD;', - f1.compile(el) - ]); - } - }; - - $.selector.Selector.addMethod('compile', function(el) { - l = this.parts.length; - - expr = this.parts[--l].compile(el); - while (l) { - combinator = this.parts[--l]; - expr = combines[combinator](el, this.parts[--l], as_subexpr(expr)); - } - - return expr; - }); - - $.selector.SelectorsGroup.addMethod('compile', function(el) { - var expr = [], lbl = ++lbl_id; - - for (var i=0; i < this.parts.length; i++) { - expr[expr.length] = join([ - i == 0 ? el.save(lbl) : el.restore(lbl), - 'l'+lbl+'_'+i+':{', - this.parts[i].compile(el).replace(BAD, 'break l'+lbl+'_'+i), - '}' - ]); - } - - expr[expr.length] = 'BAD;'; - return join(expr); - }); - - $.selector.SelectorBase.addMethod('matches', function(el){ - this.matches = new Function('el', join([ - 'if (!el) return false;', - this.compile(new State()).replace(BAD, 'return false').replace(GOOD, 'return true') - ])); - return this.matches(el); - }); - -})(jQuery); - -; - - -/* src/jquery.focusinout.js */ - -(function($){ - - /** - * Add focusin and focusout support to bind and live for browers other than IE. Designed to be usable in a delegated fashion (like $.live) - * Copyright (c) 2007 Jörn Zaefferer - */ - $.support.focusInOut = !!($.browser.msie); - if (!$.support.focusInOut) { - // Emulate focusin and focusout by binding focus and blur in capturing mode - $.each({focus: 'focusin', blur: 'focusout'}, function(original, fix){ - $.event.special[fix] = { - setup: function(){ - if (!this.addEventListener) return false; - this.addEventListener(original, $.event.special[fix].handler, true); - }, - teardown: function(){ - if (!this.removeEventListener) return false; - this.removeEventListener(original, $.event.special[fix].handler, true); - }, - handler: function(e){ - arguments[0] = $.event.fix(e); - arguments[0].type = fix; - return $.event.handle.apply(this, arguments); - } - }; - }); - } - - (function(){ - //IE has some trouble with focusout with select and keyboard navigation - var activeFocus = null; - - $(document) - .bind('focusin', function(e){ - var target = e.realTarget || e.target; - if (activeFocus && activeFocus !== target) { - e.type = 'focusout'; - $(activeFocus).trigger(e); - e.type = 'focusin'; - e.target = target; - } - activeFocus = target; - }) - .bind('focusout', function(e){ - activeFocus = null; - }); - })(); - -})(jQuery);; - - -/* src/jquery.concrete.js */ - -var console; - -(function($) { - - var namespaces = {}; - - $.concrete = function() { - $.fn.concrete.apply(null, arguments); - } - - /** - * A couple of utility functions for accessing the store outside of this closure, and for making things - * operate in a little more easy-to-test manner - */ - $.extend($.concrete, { - /** - * Get all the namespaces. Useful for introspection? Internal interface of Namespace not guaranteed consistant - */ - namespaces: namespaces, - - /** - * Remove all concrete rules - */ - clear_all_rules: function() { - // Remove proxy functions - for (var k in $.fn) { if ($.fn[k].concrete) delete $.fn[k] ; } - // Remove namespaces, and start over again - namespaces = $.concrete.namespaces = {}; - }, - - WARN_LEVEL_NONE: 0, - WARN_LEVEL_IMPORTANT: 1, - WARN_LEVEL_BESTPRACTISE: 2, - - /** - * Warning level. Set to a higher level to get warnings dumped to console. - */ - warningLevel: 0, - - /** Utility to optionally display warning messages depending on level */ - warn: function(message, level) { - if (level <= $.concrete.warningLevel && console && console.log) { - console.warn(message); - if (console.trace) console.trace(); - } - } - }); - - - /** Stores a count of definitions, so that we can sort identical selectors by definition order */ - var rulecount = 0; - - var Rule = Base.extend({ - init: function(selector, name) { - this.selector = selector; - this.specifity = selector.specifity(); - this.important = 0; - this.name = name; - this.rulecount = rulecount++; - } - }); - - Rule.compare = function(a, b) { - var as = a.specifity, bs = b.specifity; - - return (a.important - b.important) || - (as[0] - bs[0]) || - (as[1] - bs[1]) || - (as[2] - bs[2]) || - (a.rulecount - b.rulecount) ; - } - - $.concrete.RuleList = function() { - var list = []; - - list.addRule = function(selector, name){ - var rule = Rule(selector, name); - - list[list.length] = rule; - list.sort(Rule.compare); - - return rule; - }; - - return list; - } - - var handlers = []; - - /** - * A Namespace holds all the information needed for adding concrete methods to a namespace (including the _null_ namespace) - */ - $.concrete.Namespace = Base.extend({ - init: function(name){ - if (name && !name.match(/^[A-Za-z0-9.]+$/)) $.concrete.warn('Concrete namespace '+name+' is not formatted as period seperated identifiers', $.concrete.WARN_LEVEL_BESTPRACTISE); - name = name || '__base'; - - this.name = name; - this.store = {}; - - namespaces[name] = this; - - if (name == "__base") { - this.injectee = $.fn - this.$ = $; - } - else { - // We're in a namespace, so we build a Class that subclasses the jQuery Object Class to inject namespace functions into - var subfn = function(){} - this.injectee = subfn.prototype = new $(); - - // And then we provide an overriding $ that returns objects of our new Class, and an overriding pushStack to catch further selection building - var bound$ = this.$ = function(a) { - // Try the simple way first - var jq = $.fn.init.apply(new subfn(), arguments); - if (jq instanceof subfn) return jq; - - // That didn't return a bound object, so now we need to copy it - var rv = new subfn(); - rv.selector = jq.selector; rv.context = jq.context; var i = rv.length = jq.length; - while (i--) rv[i] = jq[i]; - return rv; - } - this.injectee.pushStack = function(elems, name, selector){ - var ret = bound$(elems); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - ret.context = this.context; - - if ( name === "find" ) ret.selector = this.selector + (this.selector ? " " : "") + selector; - else if ( name ) ret.selector = this.selector + "." + name + "(" + selector + ")"; - - // Return the newly-formed element set - return ret; - } - - // Copy static functions through from $ to this.$ so e.g. $.ajax still works - // @bug, @cantfix: Any class functions added to $ after this call won't get mirrored through - $.extend(this.$, $); - - // We override concrete to inject the name of this namespace when defining blocks inside this namespace - var concrete_wrapper = this.injectee.concrete = function(spacename) { - var args = arguments; - - if (!spacename || typeof spacename != 'string') { args = $.makeArray(args); args.unshift(name); } - else if (spacename.charAt(0) != '.') args[0] = name+'.'+spacename; - - return $.fn.concrete.apply(this, args); - } - - this.$.concrete = function() { - concrete_wrapper.apply(null, arguments); - } - - for (var i = 0; i < handlers.length; i++) { - var handler = handlers[i], builder; - - // Inject jQuery object method overrides - if (builder = handler.namespaceMethodOverrides) { - var overrides = builder(this); - for (var k in overrides) this.injectee[k] = overrides[k]; - } - - // Inject $.concrete function overrides - if (builder = handler.namespaceStaticOverrides) { - var overrides = builder(this); - for (var k in overrides) this.$.concrete[k] = overrides[k]; - } - } - } - }, - - /** - * Returns a function that does selector matching against the function list for a function name - * Used by proxy for all calls, and by ctorProxy to handle _super calls - * @param {String} name - name of the function as passed in the construction object - * @param {String} funcprop - the property on the Rule object that gives the actual function to call - */ - one: function(name, funcprop) { - var namespace = this; - var funcs = this.store[name]; - - var one = function(el, args, i){ - if (i === undefined) i = funcs.length; - while (i--) { - if (funcs[i].selector.matches(el)) { - var ret, tmp_i = el.i, tmp_f = el.f; - el.i = i; el.f = one; - try { ret = funcs[i][funcprop].apply(namespace.$(el), args); } - finally { el.i = tmp_i; el.f = tmp_f; } - return ret; - } - } - } - - return one; - }, - - /** - * A proxy is a function attached to a callable object (either the base jQuery.fn or a subspace object) which handles - * finding and calling the correct function for each member of the current jQuery context - * @param {String} name - name of the function as passed in the construction object - */ - build_proxy: function(name) { - var one = this.one(name, 'func'); - - var prxy = function() { - var rv, ctx = $(this); - - var i = ctx.length; - while (i--) rv = one(ctx[i], arguments); - return rv; - }; - - return prxy; - }, - - bind_proxy: function(selector, name, func) { - var rulelist = this.store[name] || (this.store[name] = $.concrete.RuleList()); - - var rule = rulelist.addRule(selector, name); rule.func = func; - - if (!this.injectee.hasOwnProperty(name)) { - this.injectee[name] = this.build_proxy(name); - this.injectee[name].concrete = true; - } - - if (!this.injectee[name].concrete) { - $.concrete.warn('Warning: Concrete function '+name+' clashes with regular jQuery function - concrete function will not be callable directly on jQuery object', $.concrete.WARN_LEVEL_IMPORTANT); - } - }, - - add: function(selector, data) { - // For every item in the hash, try ever method handler, until one returns true - for (var k in data) { - var v = data[k]; - - for (var i = 0; i < handlers.length; i++) { - if (handlers[i].bind && handlers[i].bind.call(this, selector, k, v)) break; - } - } - }, - - has: function(ctx, name) { - var rulelist = this.store[name]; - if (!rulelist) return false; - - /* We go forward this time, since low specifity is likely to knock out a bunch of elements quickly */ - for (var i = 0 ; i < rulelist.length; i++) { - ctx = ctx.not(rulelist[i].selector); - if (!ctx.length) return true; - } - return false; - } - }); - - /** - * A handler is some javascript code that adds support for some time of key / value pair passed in the hash to the Namespace add method. - * The default handlers provided (and included by default) are event, ctor and properties - */ - $.concrete.Namespace.addHandler = function(handler) { - for (var i = 0; i < handlers.length && handlers[i].order < handler.order; i++) { /* Pass */ } - handlers.splice(i, 0, handler); - } - - $.concrete.Namespace.addHandler({ - order: 50, - - bind: function(selector, k, v){ - if ($.isFunction(v)) { - this.bind_proxy(selector, k, v); - return true; - } - } - }); - - $.extend($.fn, { - /** - * Main concrete function. Used for new definitions, calling into a namespace (or forcing the base namespace) and entering a using block - * - */ - concrete: function(spacename) { - var i = 0; - var selector = this.selector ? $.selector(this.selector) : null; - - /* By default we operator on the base namespace */ - var namespace = namespaces.__base || $.concrete.Namespace(); - - /* If the first argument is a string, then it's the name of a namespace. Look it up */ - if (typeof spacename == 'string') { - if (spacename.charAt('0') == '.') spacename = spacename.substr(1); - if (spacename) namespace = namespaces[spacename] || $.concrete.Namespace(spacename); - i=1; - } - - /* All remaining arguments should either be using blocks or definition hashs */ - while (i < arguments.length) { - var res = arguments[i++]; - - // If it's a function, call it - either it's a using block or it's a namespaced concrete definition - if ($.isFunction(res)) { - if (res.length != 1) $.concrete.warn('Function block inside concrete definition does not take $ argument properly', $.concrete.WARN_LEVEL_IMPORTANT); - res = res.call(namespace.$(this), namespace.$); - } - - // If we have a concrete definition hash, inject it into namespace - if (res) { - if (selector) namespace.add(selector, res); - else $.concrete.warn('Concrete block given to concrete call without selector. Make sure you call $(selector).concrete when defining blocks', $.concrete.WARN_LEVEL_IMPORTANT); - } - - - } - - /* Finally, return the jQuery object 'this' refers to, wrapped in the new namespace */ - return namespace.$(this); - }, - - /** - * Calls the next most specific version of the current concrete method - */ - _super: function(){ - var rv, i = this.length; - while (i--) { - var el = this[0]; - rv = el.f(el, arguments, el.i); - } - return rv; - } - }); - -})(jQuery); -; - - -/* src/jquery.concrete.dommaybechanged.js */ - -(function($){ - - /** What to call to run a function 'soon'. Normally setTimeout, but for syncronous mode we override so soon === now */ - var runSoon = window.setTimeout; - - /** The timer handle for the asyncronous matching call */ - var check_id = null; - - /** Fire the change event. Only fires on the document node, so bind to that */ - var triggerEvent = function() { - $(document).triggerHandler('DOMMaybeChanged'); - check_id = null; - } - - $.extend($.concrete, { - /** - * Make onmatch and onunmatch work in synchronous mode - that is, new elements will be detected immediately after - * the DOM manipulation that made them match. This is only really useful for during testing, since it's pretty slow - * (otherwise we'd make it the default). - */ - synchronous_mode: function() { - if (check_id) clearTimeout(check_id); check_id = null; - runSoon = function(func, delay){ func.call(this); return null; } - }, - - /** - * Trigger onmatch and onunmatch now - usefull for after DOM manipulation by methods other than through jQuery. - * Called automatically on document.ready - */ - triggerMatching: function() { - matching(); - } - }); - - function registerMutateFunction() { - $.each(arguments, function(i,func){ - var old = $.fn[func]; - $.fn[func] = function() { - var rv = old.apply(this, arguments); - if (!check_id) check_id = runSoon(triggerEvent, 100); - return rv; - } - }) - } - - function registerSetterGetterFunction() { - $.each(arguments, function(i,func){ - var old = $.fn[func]; - $.fn[func] = function(a, b) { - var rv = old.apply(this, arguments); - if (!check_id && (b !== undefined || typeof a != 'string')) check_id = runSoon(triggerEvent, 100); - return rv; - } - }) - } - - // Register core DOM manipulation methods - registerMutateFunction('append', 'prepend', 'after', 'before', 'wrap', 'removeAttr', 'addClass', 'removeClass', 'toggleClass', 'empty', 'remove'); - registerSetterGetterFunction('attr'); - - // And on DOM ready, trigger matching once - $(function(){ triggerEvent(); }) - -})(jQuery);; - - -/* src/jquery.concrete.events.js */ - -(function($) { - - /* If we are any browser other than IE or Safari, we don't have to do anything special to handle - * onchange delegation */ - $.support.bubblingChange = !($.browser.msie || $.browser.safari); - - /* Return true if node b is the same as, or is a descendant of, node a */ - if (document.compareDocumentPosition) { - var is_or_contains = function(a, b) { - return a && b && (a == b || !!(a.compareDocumentPosition(b) & 16)); - } - } - else { - var is_or_contains = function(a, b) { - return a && b && (a == b || (a.contains ? a.contains(b) : true)); - } - } - - /* Add the methods to handle event binding to the Namespace class */ - $.concrete.Namespace.addMethods({ - build_event_proxy: function(name) { - var one = this.one(name, 'func'); - - var prxy = function(e, originalevent) { - e = originalevent || e; - - var el = e.target; - while (el && el != document && !e.isPropagationStopped()) { - one(el, arguments); - el = el.parentNode; - } - }; - - return prxy; - }, - - build_mouseenterleave_proxy: function(name) { - var one = this.one(name, 'func'); - - var prxy = function(e) { - var el = e.target; - var rel = e.relatedTarget; - - while (el && el != document && !e.isPropagationStopped()) { - /* We know el contained target. If it also contains relatedTarget then we didn't mouseenter / leave. What's more, every ancestor will also - contan el and rel, and so we can just stop bubbling */ - if (is_or_contains(el, rel)) break; - - one(el, arguments); - el = el.parentNode; - } - }; - - return prxy; - }, - - build_change_proxy: function(name) { - var one = this.one(name, 'func'); - - var prxy = function(e) { - var el = e.target; - // If this is a keydown event, only worry about the enter key, since browsers only trigger onchange on enter or focus loss - if (e.type === 'keydown' && e.keyCode !== 13) return; - // Make sure this is event is for an input type we're interested in - if (el.tagName !== 'INPUT' && el.tagName !== 'TEXTAREA' && el.tagName !== 'SELECT') return; - - var $el = $(el), nowVal, oldVal = $el.data('changeVal'); - - // Detect changes on checkboxes & radiobuttons, which have different value logic. We don't use el.value, since el is part - // of a set, and we only want to raise onchange once for a single user action. - if (el.type == 'checkbox' || el.type == 'radio') { - if (!el.disabled && e.type === 'click') { - nowVal = el.checked; - // If radio, we get two changes - the activation, and the deactivation. We only want to fire one change though - if ((el.type === 'checkbox' || nowVal === true) && oldVal !== nowVal) e.type = 'change'; - } - } - // Detect changes on other input types. In this case value is OK. - else { - nowVal = el.value; - if (oldVal !== undefined && oldVal !== nowVal) e.type = 'change'; - } - - // Save the current value for next time - if (nowVal !== undefined) $el.data('changeVal', nowVal); - - // And if we decided that a change happened, do the actual triggering - if (e.type == 'change') { - while (el && el != document && !e.isPropagationStopped()) { - one(el, arguments); - el = el.parentNode; - } - } - }; - - return prxy; - }, - - bind_event: function(selector, name, func, event) { - var funcs = this.store[name] || (this.store[name] = $.concrete.RuleList()) ; - var proxies = funcs.proxies || (funcs.proxies = {}); - - var rule = funcs.addRule(selector, name); rule.func = func; - - if (!proxies[name]) { - switch (name) { - case 'onmouseenter': - proxies[name] = this.build_mouseenterleave_proxy(name); - event = 'mouseover'; - break; - case 'onmouseleave': - proxies[name] = this.build_mouseenterleave_proxy(name); - event = 'mouseout'; - break; - case 'onchange': - if (!$.support.bubblingChange) { - proxies[name] = this.build_change_proxy(name); - event = 'click focusin focusout keydown'; - } - break; - case 'onsubmit': - event = 'delegated_submit'; - case 'onfocus': - case 'onblur': - $.concrete.warn('Event '+event+' not supported - using focusin / focusout instead', $.concrete.WARN_LEVEL_IMPORTANT); - } - - if (!proxies[name]) proxies[name] = this.build_event_proxy(name); - $(document).bind(event, proxies[name]); - } - } - }); - - $.concrete.Namespace.addHandler({ - order: 40, - - bind: function(selector, k, v){ - if ($.isFunction(v) && (match = k.match(/^on(.*)/))) { - event = match[1]; - this.bind_event(selector, k, v, event); - return true; - } - } - }); - - // Find all forms and bind onsubmit to trigger on the document too. This is the only event that can't be grabbed via delegation. - - var form_binding_cache = $([]); // A cache for already-handled form elements - var delegate_submit = function(e){ $(document).triggerHandler('delegated_submit', e); } // The function that handles the delegation - - $(document).bind('DOMMaybeChanged', function(){ - var forms = $('form'); - // Only bind to forms we haven't processed yet - forms.not(form_binding_cache).bind('submit', delegate_submit); - // Then remember the current set of forms - form_binding_cache = forms; - }); - -})(jQuery); - ; - - -/* src/jquery.concrete.ctors.js */ - -(function($) { - - /* Add the methods to handle constructor & destructor binding to the Namespace class */ - $.concrete.Namespace.addMethods({ - bind_condesc: function(selector, name, func) { - var ctors = this.store.ctors || (this.store.ctors = $.concrete.RuleList()) ; - - var rule; - for (var i = 0 ; i < ctors.length; i++) { - if (ctors[i].selector.selector == selector.selector) { - rule = ctors[i]; break; - } - } - if (!rule) { - rule = ctors.addRule(selector, 'ctors'); - } - - rule[name] = func; - - if (!ctors[name+'proxy']) { - var one = this.one('ctors', name); - var namespace = this; - - var proxy = function(els, i, func) { - var j = els.length; - while (j--) { - var el = els[j]; - - var tmp_i = el.i, tmp_f = el.f; - el.i = i; el.f = one; - try { func.call(namespace.$(el)); } - catch(e) { el.i = tmp_i; el.f = tmp_f; } - } - } - - ctors[name+'proxy'] = proxy; - } - } - }); - - $.concrete.Namespace.addHandler({ - order: 30, - - bind: function(selector, k, v) { - if ($.isFunction(v) && (k == 'onmatch' || k == 'onunmatch')) { - this.bind_condesc(selector, k, v); - return true; - } - } - }); - - /** - * Finds all the elements that now match a different rule (or have been removed) and call onmatch on onunmatch as appropriate - * - * Because this has to scan the DOM, and is therefore fairly slow, this is normally triggered off a short timeout, so that - * a series of DOM manipulations will only trigger this once. - * - * The downside of this is that things like: - * $('#foo').addClass('tabs'); $('#foo').tabFunctionBar(); - * won't work. - */ - $(document).bind('DOMMaybeChanged', function(){ - // For every namespace - for (var k in $.concrete.namespaces) { - // That has constructors or destructors - var ctors = $.concrete.namespaces[k].store.ctors; - if (ctors) { - - // Keep a record of elements that have matched already - var matched = $([]), match, add, rem; - // Stepping through each selector from most to least specific - var j = ctors.length; - while (j--) { - // Build some quick-acccess variables - var sel = ctors[j].selector.selector, ctor = ctors[j].onmatch; dtor = ctors[j].onunmatch; - // Get the list of elements that match this selector, that haven't yet matched a more specific selector - res = add = $(sel).not(matched); - - // If this selector has a list of elements it matched against last time - if (ctors[j].cache) { - // Find the ones that are extra this time - add = res.not(ctors[j].cache); - // Find the ones that are gone this time - rem = ctors[j].cache.not(res); - // And call the desctructor on them - if (rem.length && dtor) ctors.onunmatchproxy(rem, j, dtor); - } - - // Call the constructor on the newly matched ones - if (add.length && ctor) ctors.onmatchproxy(add, j, ctor); - - // Add these matched ones to the list tracking all elements matched so far - matched = matched.add(res); - // And remember this list of matching elements again this selector, so next matching we can find the unmatched ones - ctors[j].cache = res; - } - } - } - }) - - -})(jQuery); -; - - -/* src/jquery.concrete.properties.js */ - -(function($) { - - var concrete_prepend = '__concrete!'; - - var getConcreteData = function(el, namespace, property) { - return el.data(concrete_prepend + namespace + '!' + property); - } - - var setConcreteData = function(el, namespace, property, value) { - return el.data(concrete_prepend + namespace + '!' + property, value); - } - - var getConcreteDataAsHash = function(el, namespace) { - var hash = {}; - var id = jQuery.data(el[0]); - - var matchstr = concrete_prepend + namespace + '!'; - var matchlen = matchstr.length; - - var cache = jQuery.cache[id]; - for (var k in cache) { - if (k.substr(0,matchlen) == matchstr) hash[k.substr(matchlen)] = cache[k]; - } - - return hash; - } - - var setConcreteDataFromHash = function(el, namespace, hash) { - for (var k in hash) setConcreteData(namespace, k, hash[k]); - } - - var concreteData = function(el, namespace, args) { - switch (args.length) { - case 0: - return getConcreteDataAsHash(el, namespace); - case 1: - if (typeof args[0] == 'string') return getConcreteData(el, namespace, args[0]); - else return setConcreteDataFromHash(el, namespace, args[0]); - default: - return setConcreteData(el, namespace, args[0], args[1]); - } - } - - $.extend($.fn, { - concreteData: function() { - return concreteData(this, '__base', arguments); - } - }); - - $.concrete.Namespace.addHandler({ - order: 60, - - bind: function(selector, k, v) { - if (k.charAt(0) != k.charAt(0).toUpperCase()) $.concrete.warn('Concrete property '+k+' does not start with a capital letter', $.concrete.WARN_LEVEL_BESTPRACTISE); - - var namespace = this; - g = function() { return this.concreteData(k) || v ; } - s = function(v){ return this.concreteData(k, v); } - - g.pname = s.pname = k; - - this.bind_proxy(selector, 'get'+k, g); - this.bind_proxy(selector, 'set'+k, s); - - return true; - }, - - namespaceMethodOverrides: function(namespace){ - return { - concreteData: function() { - return concreteData(this, namespace.name, arguments); - } - }; - } - }); - -})(jQuery); -; -