(existing, toAdd, toRemove)
| 265 | } |
| 266 | |
| 267 | function resolveElementClasses(existing, toAdd, toRemove) { |
| 268 | var ADD_CLASS = 1; |
| 269 | var REMOVE_CLASS = -1; |
| 270 | |
| 271 | var flags = {}; |
| 272 | existing = splitClassesToLookup(existing); |
| 273 | |
| 274 | toAdd = splitClassesToLookup(toAdd); |
| 275 | forEach(toAdd, function(value, key) { |
| 276 | flags[key] = ADD_CLASS; |
| 277 | }); |
| 278 | |
| 279 | toRemove = splitClassesToLookup(toRemove); |
| 280 | forEach(toRemove, function(value, key) { |
| 281 | flags[key] = flags[key] === ADD_CLASS ? null : REMOVE_CLASS; |
| 282 | }); |
| 283 | |
| 284 | var classes = { |
| 285 | addClass: '', |
| 286 | removeClass: '' |
| 287 | }; |
| 288 | |
| 289 | forEach(flags, function(val, klass) { |
| 290 | var prop, allow; |
| 291 | if (val === ADD_CLASS) { |
| 292 | prop = 'addClass'; |
| 293 | allow = !existing[klass]; |
| 294 | } else if (val === REMOVE_CLASS) { |
| 295 | prop = 'removeClass'; |
| 296 | allow = existing[klass]; |
| 297 | } |
| 298 | if (allow) { |
| 299 | if (classes[prop].length) { |
| 300 | classes[prop] += ' '; |
| 301 | } |
| 302 | classes[prop] += klass; |
| 303 | } |
| 304 | }); |
| 305 | |
| 306 | function splitClassesToLookup(classes) { |
| 307 | if (isString(classes)) { |
| 308 | classes = classes.split(' '); |
| 309 | } |
| 310 | |
| 311 | var obj = {}; |
| 312 | forEach(classes, function(klass) { |
| 313 | // sometimes the split leaves empty string values |
| 314 | // incase extra spaces were applied to the options |
| 315 | if (klass.length) { |
| 316 | obj[klass] = true; |
| 317 | } |
| 318 | }); |
| 319 | return obj; |
| 320 | } |
| 321 | |
| 322 | return classes; |
| 323 | } |
| 324 |
no test coverage detected