// STATE
var colour = [0, 0, 0];
var _history = [colour];
// ELEMENTS
var colour_fields = [],
inputs = [],
reds = [],
greens = [],
blues = [],
red_numbers = [],
green_numbers = [],
blue_numbers = [],
active_dragging = null,
history_element;
function back_in_time() {
if (_history.length < 2) {
return;
}
_history.pop();
colour = _history[_history.length - 1];
redraw();
}
function start_dragging(element) {
active_dragging = element;
}
function end_dragging() {
active_dragging = null;
}
function changed(element) {
switch (element.className) {
case "red":
colour = [
element.value,
colour[1],
colour[2]
];
break;
case "blue":
colour = [
colour[0],
colour[1],
element.value
];
break;
case "green":
colour = [
colour[0],
element.value,
colour[2]
];
break;
}
update_history();
redraw();
}
function dragging() {
if (active_dragging === null) {
return;
}
changed(active_dragging);
}
function redraw() {
colour_fields.forEach(function (e) {
var new_value = "rgb(" + colour[0] + ", " + colour[1] + ", " + colour[2] + ")";
if (e.style.backgroundColor !== new_value) {
e.style.backgroundColor = new_value;
}
});
reds.forEach(function (e) {
if (e.value !== colour[0]) {
e.value = colour[0];
}
});
greens.forEach(function (e) {
if (e.value !== colour[1]) {
e.value = colour[1];
}
});
blues.forEach(function (e) {
if (e.value !== colour[2]) {
e.value = colour[2];
}
});
red_numbers.forEach(function (e) {
var string_value = colour[0].toString();
if (string_value !== e.innerHTML) {
e.innerHTML = colour[0];
}
});
green_numbers.forEach(function (e) {
var string_value = colour[1].toString();
if (string_value !== e.innerHTML) {
e.innerHTML = colour[1];
}
});
blue_numbers.forEach(function (e) {
var string_value = colour[2].toString();
if (string_value !== e.innerHTML) {
e.innerHTML = colour[2];
}
});
history_element.innerHTML = "";
_history.forEach(function (e) {
var li = document.createElement("li");
li.appendChild(document.createTextNode(e));
history_element.appendChild(li);
});
}
function update_history() {
var last = _history[_history.length - 1];
if (last[0] === colour[0] && last[1] === colour[1] && last[2] === colour[2]) {
return;
}
_history.push(colour);
}
function reset() {
colour = [0, 0, 0];
update_history();
redraw();
}
function turnObjToArray(obj) {
return [].map.call(obj, function(element) {
return element;
});
}
function setup() {
colour_fields = turnObjToArray(document.getElementsByClassName("colour"));
reds = turnObjToArray(document.getElementsByClassName("red"));
greens = turnObjToArray(document.getElementsByClassName("green"));
blues = turnObjToArray(document.getElementsByClassName("blue"));
red_numbers = turnObjToArray(document.getElementsByClassName("red_number"));
green_numbers = turnObjToArray(document.getElementsByClassName("green_number"));
blue_numbers = turnObjToArray(document.getElementsByClassName("blue_number"));
history_element = document.getElementById("history");
window.addEventListener("mouseup", end_dragging);
window.addEventListener("mousemove", dragging);
redraw();
}
window.addEventListener("load", setup);
<div>
<div style="width: 300px; height: 200px" class="colour"></div>
<div>
<input type="range" min="0" max="255" class="red" onclick="changed(this);" onmousedown="start_dragging(this);" />
<span class="red_number"></span>
</div>
<div>
<input type="range" min="0" max="255" class="green" onclick="changed(this);" onmousedown="start_dragging(this);" />
<span class="green_number"></span>
</div>
<div>
<input type="range" min="0" max="255" class="blue" onclick="changed(this);" onmousedown="start_dragging(this);" />
<span class="blue_number"></span>
</div>
<div>
<input type="button" value="Reset" onclick="reset();" />
</div>
</div>
<div>
<div style="width: 300px; height: 200px" class="colour"></div>
<div>
<input type="range" min="0" max="255" class="red" onclick="changed(this);" onmousedown="start_dragging(this);" />
<span class="red_number"></span>
</div>
<div>
<input type="range" min="0" max="255" class="green" onclick="changed(this);" onmousedown="start_dragging(this);" />
<span class="green_number"></span>
</div>
<div>
<input type="range" min="0" max="255" class="blue" onclick="changed(this);" onmousedown="start_dragging(this);" />
<span class="blue_number"></span>
</div>
<div>
<input type="button" value="Reset" onclick="reset();" />
</div>
</div>
<div>
<input type="button" value="Back in time" onclick="back_in_time();" />
<ol id="history"></ol>
</div>