]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - jssource/src_files/include/javascript/yui3/build/attribute/attribute-complex.js
Release 6.2.0beta4
[Github/sugarcrm.git] / jssource / src_files / include / javascript / yui3 / build / attribute / attribute-complex.js
1 /*
2 Copyright (c) 2009, Yahoo! Inc. All rights reserved.
3 Code licensed under the BSD License:
4 http://developer.yahoo.net/yui/license.txt
5 version: 3.0.0
6 build: 1549
7 */
8 YUI.add('attribute-complex', function(Y) {
9
10     /**
11      * Adds support for attribute providers to handle complex attributes in the constructor
12      *
13      * @module attribute
14      * @submodule attribute-complex
15      * @for Attribute
16      */
17
18     var O = Y.Object,
19         DOT = ".";
20
21     Y.Attribute.Complex = function() {};
22     Y.Attribute.Complex.prototype = {
23
24         /**
25          * Utility method to split out simple attribute name/value pairs ("x") 
26          * from complex attribute name/value pairs ("x.y.z"), so that complex
27          * attributes can be keyed by the top level attribute name.
28          *
29          * @method _normAttrVals
30          * @param {Object} valueHash An object with attribute name/value pairs
31          *
32          * @return {Object} An object literal with 2 properties - "simple" and "complex",
33          * containing simple and complex attribute values respectively keyed 
34          * by the top level attribute name, or null, if valueHash is falsey.
35          *
36          * @private
37          */
38         _normAttrVals : function(valueHash) {
39             var vals = {},
40                 subvals = {},
41                 path,
42                 attr,
43                 v, k;
44
45             if (valueHash) {
46                 for (k in valueHash) {
47                     if (valueHash.hasOwnProperty(k)) {
48                         if (k.indexOf(DOT) !== -1) {
49                             path = k.split(DOT);
50                             attr = path.shift();
51                             v = subvals[attr] = subvals[attr] || [];
52                             v[v.length] = {
53                                 path : path, 
54                                 value: valueHash[k]
55                             };
56                         } else {
57                             vals[k] = valueHash[k];
58                         }
59                     }
60                 }
61                 return { simple:vals, complex:subvals };
62             } else {
63                 return null;
64             }
65         },
66
67         /**
68          * Returns the initial value of the given attribute from
69          * either the default configuration provided, or the 
70          * over-ridden value if it exists in the set of initValues 
71          * provided and the attribute is not read-only.
72          *
73          * @param {String} attr The name of the attribute
74          * @param {Object} cfg The attribute configuration object
75          * @param {Object} initValues The object with simple and complex attribute name/value pairs returned from _normAttrVals
76          *
77          * @return {Any} The initial value of the attribute.
78          *
79          * @method _getAttrInitVal
80          * @private
81          */
82         _getAttrInitVal : function(attr, cfg, initValues) {
83
84             var val = (cfg.valueFn) ? cfg.valueFn.call(this) : cfg.value,
85                 simple,
86                 complex,
87                 i,
88                 l,
89                 path,
90                 subval,
91                 subvals;
92
93             if (!cfg.readOnly && initValues) {
94
95                 // Simple Attributes
96                 simple = initValues.simple;
97                 if (simple && simple.hasOwnProperty(attr)) {
98                     val = simple[attr];
99                 }
100
101                 // Complex Attributes (complex values applied, after simple, incase both are set)
102                 complex = initValues.complex;
103                 if (complex && complex.hasOwnProperty(attr)) {
104                     subvals = complex[attr];
105                     for (i = 0, l = subvals.length; i < l; ++i) {
106                         path = subvals[i].path;
107                         subval = subvals[i].value;
108                         O.setValue(val, path, subval);
109                     }
110                 }
111             }
112
113             return val;
114         }
115     };
116
117     Y.mix(Y.Attribute, Y.Attribute.Complex, true, null, 1);
118
119
120 }, '3.0.0' ,{requires:['attribute-base']});