1 | define(["dojo/sniff"], function(has){ |
---|
2 | |
---|
3 | // module: |
---|
4 | // dojox/app/utils/config |
---|
5 | |
---|
6 | return { |
---|
7 | // summary: |
---|
8 | // This module contains the config |
---|
9 | |
---|
10 | configProcessHas: function(/*Object*/ source){ |
---|
11 | // summary: |
---|
12 | // scan the source config for has checks and call configMerge to merge has sections, and remove the has sections from the source. |
---|
13 | // description: |
---|
14 | // configProcessHas will scan the source config for has checks. |
---|
15 | // For each has section the items inside the has section will be tested with has (sniff) |
---|
16 | // If the has test is true it will call configMerge to merge has sections back into the source config. |
---|
17 | // It will always remove the has section from the source after processing it. |
---|
18 | // The names in the has section can be separated by a comma, indicating that any of those being true will satisfy the test. |
---|
19 | // source: |
---|
20 | // an object representing the config to be processed. |
---|
21 | // returns: |
---|
22 | // the updated source object. |
---|
23 | for(var name in source){ |
---|
24 | var sval = source[name]; |
---|
25 | if(name == "has"){ // found a "has" section in source |
---|
26 | for(var hasname in sval){ // get the hasnames from the has section |
---|
27 | if(!(hasname.charAt(0) == '_' && hasname.charAt(1) == '_') && sval && typeof sval === 'object'){ |
---|
28 | // need to handle multiple has checks separated by a ",". |
---|
29 | var parts = hasname.split(','); |
---|
30 | if(parts.length > 0){ |
---|
31 | while(parts.length > 0){ |
---|
32 | var haspart = parts.shift(); |
---|
33 | // check for has(haspart) or if haspart starts with ! check for !(has(haspart)) |
---|
34 | if((has(haspart)) || (haspart.charAt(0) == '!' && !(has(haspart.substring(1))))){ // if true this one should be merged |
---|
35 | var hasval = sval[hasname]; |
---|
36 | this.configMerge(source, hasval); // merge this has section into the source config |
---|
37 | break; // found a match for this multiple has test, so go to the next one |
---|
38 | } |
---|
39 | } |
---|
40 | } |
---|
41 | } |
---|
42 | } |
---|
43 | delete source["has"]; // after merge remove this has section from the config |
---|
44 | }else{ |
---|
45 | if(!(name.charAt(0) == '_' && name.charAt(1) == '_') && sval && typeof sval === 'object'){ |
---|
46 | this.configProcessHas(sval); |
---|
47 | } |
---|
48 | } |
---|
49 | } |
---|
50 | return source; |
---|
51 | }, |
---|
52 | |
---|
53 | configMerge: function(/*Object*/ target, /*Object*/ source){ |
---|
54 | // summary: |
---|
55 | // does a deep copy of the source into the target to merge the config from the source into the target |
---|
56 | // description: |
---|
57 | // configMerge will merge the source config into the target config with a deep copy. |
---|
58 | // anything starting with __ will be skipped and if the target is an array the source items will be pushed into the target. |
---|
59 | // target: |
---|
60 | // an object representing the config which will be updated by merging in the source. |
---|
61 | // source: |
---|
62 | // an object representing the config to be merged into the target. |
---|
63 | // returns: |
---|
64 | // the updated target object. |
---|
65 | |
---|
66 | for(var name in source){ |
---|
67 | var tval = target[name]; |
---|
68 | var sval = source[name]; |
---|
69 | if(tval !== sval && !(name.charAt(0) == '_' && name.charAt(1) == '_')){ |
---|
70 | if(tval && typeof tval === 'object' && sval && typeof sval === 'object'){ |
---|
71 | this.configMerge(tval, sval); |
---|
72 | }else{ |
---|
73 | if(target instanceof Array){ |
---|
74 | target.push(sval); |
---|
75 | }else{ |
---|
76 | target[name] = sval; |
---|
77 | } |
---|
78 | } |
---|
79 | } |
---|
80 | } |
---|
81 | return target; |
---|
82 | } |
---|
83 | }; |
---|
84 | |
---|
85 | }); |
---|