1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
function state_classes(updateall) { var value = display.value * 1, tempcolor; for (var i = 1; i <= 118; i++) { tempcolor = updateall; if (!boil[i] && !melt[i]) { if (element_ids[i].state !== "Unknown") { tempcolor = true; element_ids[i].state = "Unknown"; } } else if (value > boil[i]) { if (element_ids[i].state !== "Gas") { tempcolor = true; element_ids[i].state = "Gas"; } } else if (value > melt[i]) { if (element_ids[i].state !== "Liquid") { tempcolor = true; element_ids[i].state = "Liquid"; } } else if (element_ids[i].state !== "Solid") { tempcolor = true; element_ids[i].state = "Solid"; } if (tempcolor) { if (wholetable.inverted) element_ids[i].style.backgroundColor = statecolors[1][element_ids[i].state]; else element_ids[i].style.color = statecolors[0][element_ids[i].state]; } } }
Refactorings
No refactoring yet !
Tien Dung
September 16, 2008, September 16, 2008 00:52, permalink
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
function state_classes(updateall) { var value = display.value * 1, tempcolor; var element, state, states = ["Unknown", "Gas", "Liquid", "Solid"]; for (var i = 1; i <= 118; i++) { tempcolor = updateall; element = element_ids[i]; for (var j = 0; j < state.length; j++) { state = states[j]; if (element.state !== state) { if ( (state === "Unknown" && !boil[i] && !melt[i]) || (state === "Gas" && value > boil[i]) || (state === "Liquid" && value > melt[i]) || (state === "Solid") { tempcolor = true; element.state = state; break; } } } if (tempcolor) { if (wholetable.inverted) element.style.backgroundColor = statecolors[1][element.state]; else element.style.color = statecolors[0][element.state]; } } }
Tien Dung
September 16, 2008, September 16, 2008 06:44, permalink
or using eval(..)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
function state_classes(updateall) { var value = display.value * 1, tempcolor; var element, state, validations = { "Unknown" : "!boil[i] && !melt[i]", "Gas" : "value > boil[i]", "Liquid" : "value > melt[i]", "Solid" : "true" }; for (var i = 1; i <= 118; i++) { tempcolor = updateall; element = element_ids[i]; for ( state in validations ) if ( validations.hasOwnProperty(state) && element.state !== state && eval(validations[state]) ) { tempcolor = true; element.state = state; break; } if (tempcolor) { if (wholetable.inverted) element.style.backgroundColor = statecolors[1][element.state]; else element.style.color = statecolors[0][element.state]; } } }
Adam
September 18, 2008, September 18, 2008 04:47, permalink
Using Prototype and taking some liberties about your application design.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
var State = { validations: $H({ "Unknown": function(index, value) { !boil[index] || !melt[index] }, "Gas": function(index, value) { value > boil[index] }, "Liquid": function(index, value) { value > melt[index] }, "Solid": function(index, value) { true } }), classes: function(updateAll) { var value = State.display.value * 1; State.elements.each(function(element, index) { var refresh = updateAll || State.validations.any(function(state, method) { return method(index, value) ? element.state = state : false; }); if (refresh) { State.refresh(element); } }); }, refresh: function(element) { if (State.wholeTable.inverted) { element.style.backgroundColor = State.colours[1][element.state]; } else { element.style.color = State.colours[0][element.state]; } } }
Logic is cheap and DOM is expensive, so I set an element's current state in a variable and only change the color if its state has changed. The code seems much longer than necessary, though. Passing in true to updateall recolors everything, a rare occurence, otherwise 0 is passed in.