Initial commit
This commit is contained in:
commit
7dd2465032
54
css/style.css
Normal file
54
css/style.css
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
html, body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container {
|
||||||
|
width: 666px; /* muahaha */
|
||||||
|
height: 100%;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 32px;
|
||||||
|
background-color: #555;
|
||||||
|
|
||||||
|
color: #eee;
|
||||||
|
font-family: "Ubuntu", serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="text"] {
|
||||||
|
color: #fff;
|
||||||
|
font-family: "Ubuntu", serif;
|
||||||
|
background-color: #777;
|
||||||
|
border: 0;
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item input, .item span, .item label {
|
||||||
|
margin: 0 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#items {
|
||||||
|
list-style: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item {
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-focused {
|
||||||
|
background-color: #888;
|
||||||
|
}
|
||||||
|
|
||||||
|
#add {
|
||||||
|
display: block;
|
||||||
|
margin: 8px 0 16px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tax, .price {
|
||||||
|
width: 48px;
|
||||||
|
}
|
||||||
22
index.html
Normal file
22
index.html
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Grocery Splitter</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="css/style.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="container">
|
||||||
|
<h1>Grocery Splitter</h1>
|
||||||
|
<ul id="items"></ul>
|
||||||
|
<input id="add" type="button" value="Add" />
|
||||||
|
Tax: <input type="text" id="tax" name="tax" value="6.25" />%
|
||||||
|
<div id="output">
|
||||||
|
<p>The bill's total was $<span id="total">0.00</span>.</p>
|
||||||
|
<ul id="debts">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript" src="js/index.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
267
js/index.js
Normal file
267
js/index.js
Normal file
@ -0,0 +1,267 @@
|
|||||||
|
var shopperNames = ['Cal', 'Ian', 'Olivia'];
|
||||||
|
var KEYCODE_ENTER = 13;
|
||||||
|
var KEYCODE_DELETE = 8;
|
||||||
|
var KEYCODE_LEFT= 37;
|
||||||
|
var KEYCODE_UP= 38;
|
||||||
|
var KEYCODE_RIGHT = 39;
|
||||||
|
var KEYCODE_DOWN = 40;
|
||||||
|
|
||||||
|
function addItem() {
|
||||||
|
var item = document.createElement("li");
|
||||||
|
item.className = "item";
|
||||||
|
|
||||||
|
var name = document.createElement("input");
|
||||||
|
name.setAttribute("type", "text");
|
||||||
|
name.setAttribute("placeholder", "Item Name");
|
||||||
|
name.className = "name;";
|
||||||
|
item.appendChild(name);
|
||||||
|
|
||||||
|
var dollarSign = document.createElement("span");
|
||||||
|
dollarSign.innerText = "$";
|
||||||
|
item.appendChild(dollarSign);
|
||||||
|
|
||||||
|
var price = document.createElement("input");
|
||||||
|
price.setAttribute("type", "text");
|
||||||
|
price.setAttribute("placeholder", "Price");
|
||||||
|
price.className = "price";
|
||||||
|
item.appendChild(price);
|
||||||
|
|
||||||
|
for (var i in shopperNames) {
|
||||||
|
var shopperName = shopperNames[i];
|
||||||
|
var checkbox = createCheckbox(item, shopperName);
|
||||||
|
}
|
||||||
|
|
||||||
|
var remove = document.createElement("input");
|
||||||
|
remove.setAttribute("type", "button");
|
||||||
|
remove.setAttribute("value", "Remove");
|
||||||
|
remove.style.float = "right";
|
||||||
|
remove.tabIndex = "-1";
|
||||||
|
remove.addEventListener("click", function() { removeItem(item); }, false);
|
||||||
|
item.appendChild(remove);
|
||||||
|
hide(remove);
|
||||||
|
|
||||||
|
item.onkeydown = itemKeyListener;
|
||||||
|
|
||||||
|
item.addEventListener("click", function() { focusItem(item); }, false);
|
||||||
|
name.addEventListener("focus", function() { focusItem(item); }, false);
|
||||||
|
price.addEventListener("focus", function() { focusItem(item); }, false);
|
||||||
|
price.addEventListener("blur", function() {
|
||||||
|
price.value = parseFloat(price.value).toFixed(2);
|
||||||
|
if (price.value == "NaN") {
|
||||||
|
price.value = "";
|
||||||
|
}
|
||||||
|
}, false);
|
||||||
|
item.addEventListener("mouseover", function() { show(remove); }, false);
|
||||||
|
item.addEventListener("mouseout", function() { hide(remove); }, false);
|
||||||
|
|
||||||
|
var items = document.getElementById("items");
|
||||||
|
items.appendChild(item);
|
||||||
|
item.childNodes[0].focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeItem(item) {
|
||||||
|
var items = document.getElementById("items");
|
||||||
|
//console.log(items.childNodes.length);
|
||||||
|
if (items.childNodes.length > 1) items.removeChild(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
function itemKeyListener(event) {
|
||||||
|
//console.log(event.keyCode);
|
||||||
|
var items = document.getElementById("items");
|
||||||
|
if (event.keyCode == KEYCODE_ENTER) {
|
||||||
|
addItem();
|
||||||
|
} else if (event.keyCode == KEYCODE_DELETE) {
|
||||||
|
if (document.activeElement.className == "price" &&
|
||||||
|
!document.activeElement.value) {
|
||||||
|
document.activeElement.parentNode.childNodes[0].focus();
|
||||||
|
} else if ((!document.activeElement.parentNode.childNodes[0].value) &&
|
||||||
|
(!document.activeElement.parentNode.childNodes[2].value)) {
|
||||||
|
var i = getFocusedItemIndex() - 1;
|
||||||
|
removeItem(document.activeElement.parentNode);
|
||||||
|
items.childNodes[i].childNodes[0].focus();
|
||||||
|
}
|
||||||
|
} else if (event.keyCode == KEYCODE_UP) {
|
||||||
|
var j = getFocusedItemIndex() - 1;
|
||||||
|
if (j >= 0 && j < items.childNodes.length) {
|
||||||
|
if (document.activeElement.className == "name") {
|
||||||
|
items.childNodes[j].childNodes[0].focus();
|
||||||
|
} else {
|
||||||
|
items.childNodes[j].childNodes[2].focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (event.keyCode == KEYCODE_DOWN) {
|
||||||
|
var k = getFocusedItemIndex() + 1;
|
||||||
|
if (k > 0 && k < items.childNodes.length) {
|
||||||
|
if (document.activeElement.className == "name") {
|
||||||
|
items.childNodes[k].childNodes[0].focus();
|
||||||
|
} else {
|
||||||
|
items.childNodes[k].childNodes[2].focus();
|
||||||
|
}
|
||||||
|
} else if (k >= items.childNodes.length) {
|
||||||
|
addItem().childNodes[0].focus();
|
||||||
|
}
|
||||||
|
} else if (event.keyCode == KEYCODE_LEFT) {
|
||||||
|
if (document.activeElement.className == "price" &&
|
||||||
|
document.activeElement.selectionStart === 0) {
|
||||||
|
document.activeElement.parentNode.childNodes[0].focus();
|
||||||
|
}
|
||||||
|
} else if (event.keyCode == KEYCODE_RIGHT) {
|
||||||
|
if (document.activeElement.className == "name" &&
|
||||||
|
document.activeElement.selectionStart == document.activeElement.value.length) {
|
||||||
|
document.activeElement.parentNode.childNodes[2].focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getFocusedItemIndex() {
|
||||||
|
var items = document.getElementById("items");
|
||||||
|
var i = 0;
|
||||||
|
while (items.childNodes[i] != document.activeElement.parentNode) i++;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
function focusItem(item) {
|
||||||
|
var items = document.getElementById("items");
|
||||||
|
for (var i in items.childNodes) {
|
||||||
|
items.childNodes[i].className = "item";
|
||||||
|
}
|
||||||
|
item.className += " item-focused";
|
||||||
|
}
|
||||||
|
|
||||||
|
function hide(item) {
|
||||||
|
item.style.display = "none";
|
||||||
|
}
|
||||||
|
|
||||||
|
function show(item) {
|
||||||
|
item.style.display = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function moneyBoxKeyListener(event) {
|
||||||
|
return !(event.keyCode > 31 && (event.keyCode < 48 || event.keyCode > 57)) || (event.keyCode == 190);
|
||||||
|
}
|
||||||
|
|
||||||
|
function createCheckbox(item, name) {
|
||||||
|
var label = document.createElement("label");
|
||||||
|
var checkbox = document.createElement("input");
|
||||||
|
checkbox.setAttribute("type", "checkbox");
|
||||||
|
checkbox.setAttribute("checked", "checked");
|
||||||
|
checkbox.tabIndex = "-1";
|
||||||
|
checkbox.className = name;
|
||||||
|
checkbox.addEventListener("focus", function() { item.className += " item-focused"; }, false);
|
||||||
|
checkbox.addEventListener("blur", function() { item.className = "item"; }, false);
|
||||||
|
label.appendChild(checkbox);
|
||||||
|
label.innerHTML += name;
|
||||||
|
item.appendChild(label);
|
||||||
|
return checkbox;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createDebtList() {
|
||||||
|
for (var i in shopperNames) {
|
||||||
|
var li = document.createElement("li");
|
||||||
|
li.className = shopperNames[i];
|
||||||
|
li.innerHTML = shopperNames[i] + ' needs to pay $<span class="">0.00</span>.';
|
||||||
|
debts.appendChild(li);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function addTax(price, taxRate) {
|
||||||
|
return price * (1 + taxRate / 100.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAllItems() {
|
||||||
|
return document.getElementById("items").childNodes;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTotal() {
|
||||||
|
var total = 0.0;
|
||||||
|
var items = getAllItems();
|
||||||
|
for (var i in items) {
|
||||||
|
total += getPrice(items[i]);
|
||||||
|
}
|
||||||
|
total = addTax(total, getTaxFromInput());
|
||||||
|
document.getElementById("total").innerHTML = total.toFixed(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPrice(item) {
|
||||||
|
try {
|
||||||
|
var price = parseFloat(item.childNodes[2].value);
|
||||||
|
return isNaN(price) ? 0 : price;
|
||||||
|
} catch (ex) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTaxFromInput() {
|
||||||
|
return document.getElementById("tax").value;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getNumberOfShoppers(item) {
|
||||||
|
var count = 0;
|
||||||
|
for (var i in item.childNodes) {
|
||||||
|
if (item.childNodes[i].tagName == "LABEL") {
|
||||||
|
var label = item.childNodes[i];
|
||||||
|
for (var j in label.childNodes) {
|
||||||
|
if (label.childNodes[j].checked) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDebt(name) {
|
||||||
|
var items = document.getElementById("items");
|
||||||
|
var debt = 0;
|
||||||
|
for (var i in items.childNodes) {
|
||||||
|
var item = items.childNodes[i];
|
||||||
|
if (hasToPayForItem(name, item)) {
|
||||||
|
var subDebt = getPrice(item) / getNumberOfShoppers(item);
|
||||||
|
debt += addTax(subDebt, getTaxFromInput());
|
||||||
|
console.log(item + getNumberOfShoppers(item));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(name + ": " + debt);
|
||||||
|
return debt;
|
||||||
|
}
|
||||||
|
|
||||||
|
function hasToPayForItem(name, item) {
|
||||||
|
for (var i in item.childNodes) {
|
||||||
|
if (item.childNodes[i].tagName == "LABEL") {
|
||||||
|
var label = item.childNodes[i];
|
||||||
|
for (var j in label.childNodes) {
|
||||||
|
if (label.childNodes[j].className == name) {
|
||||||
|
return label.childNodes[j].checked;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDebts() {
|
||||||
|
var debts = document.getElementById("debts");
|
||||||
|
for (var i in shopperNames) {
|
||||||
|
var name = shopperNames[i];
|
||||||
|
for (var j in debts.childNodes) {
|
||||||
|
if (debts.childNodes[j].className == name) {
|
||||||
|
debts.childNodes[j].childNodes[1].innerText = getDebt(name).toFixed(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateCalculations() {
|
||||||
|
getTotal();
|
||||||
|
getDebts();
|
||||||
|
}
|
||||||
|
|
||||||
|
function setEventListeners() {
|
||||||
|
document.getElementById("add").addEventListener("click", addItem, false);
|
||||||
|
document.body.addEventListener("keyup", updateCalculations, false);
|
||||||
|
document.body.addEventListener("click", updateCalculations, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
createDebtList();
|
||||||
|
setEventListeners();
|
||||||
|
addItem();
|
||||||
Loading…
x
Reference in New Issue
Block a user