(existing, toAdd, toRemove)
| 195 | } |
| 196 | |
| 197 | function resolveElementClasses(existing, toAdd, toRemove) { |
| 198 | var ADD_CLASS = 1; |
| 199 | var REMOVE_CLASS = -1; |
| 200 | |
| 201 | var flags = {}; |
| 202 | existing = splitClassesToLookup(existing); |
| 203 | |
| 204 | toAdd = splitClassesToLookup(toAdd); |
| 205 | forEach(toAdd, function(value, key) { |
| 206 | flags[key] = ADD_CLASS; |
| 207 | }); |
| 208 | |
| 209 | toRemove = splitClassesToLookup(toRemove); |
| 210 | forEach(toRemove, function(value, key) { |
| 211 | flags[key] = flags[key] === ADD_CLASS ? null : REMOVE_CLASS; |
| 212 | }); |
| 213 | |
| 214 | var classes = { |
| 215 | addClass: '', |
| 216 | removeClass: '' |
| 217 | }; |
| 218 | |
| 219 | forEach(flags, function(val, klass) { |
| 220 | var prop, allow; |
| 221 | if (val === ADD_CLASS) { |
| 222 | prop = 'addClass'; |
| 223 | allow = !existing[klass]; |
| 224 | } else if (val === REMOVE_CLASS) { |
| 225 | prop = 'removeClass'; |
| 226 | allow = existing[klass]; |
| 227 | } |
| 228 | if (allow) { |
| 229 | if (classes[prop].length) { |
| 230 | classes[prop] += ' '; |
| 231 | } |
| 232 | classes[prop] += klass; |
| 233 | } |
| 234 | }); |
| 235 | |
| 236 | function splitClassesToLookup(classes) { |
| 237 | if (isString(classes)) { |
| 238 | classes = classes.split(' '); |
| 239 | } |
| 240 | |
| 241 | var obj = {}; |
| 242 | forEach(classes, function(klass) { |
| 243 | // sometimes the split leaves empty string values |
| 244 | // incase extra spaces were applied to the options |
| 245 | if (klass.length) { |
| 246 | obj[klass] = true; |
| 247 | } |
| 248 | }); |
| 249 | return obj; |
| 250 | } |
| 251 | |
| 252 | return classes; |
| 253 | } |
| 254 |
no test coverage detected