// Generated by CoffeeScript 1.3.3
var Guid, content, debug, derby, get, getRoom, ready, view, _ref;
derby = require('derby');
_ref = derby.createApp(module), get = _ref.get, view = _ref.view, ready = _ref.ready;
derby.use(require('derby-ui-boot'));
derby.use(require('../../ui'));
content = require('./content');
Guid = require('guid');
view.fn('taskClasses', function(type, completed, value, hideCompleted) {
var classes;
classes = type;
if (completed) {
classes += " completed";
}
if (type === 'todo') {
if ((hideCompleted && completed) || (!hideCompleted && !completed)) {
classes += " hide";
}
}
switch (false) {
case !(value < -8):
classes += ' color-worst';
break;
case !(value >= -8 && value < -5):
classes += ' color-worse';
break;
case !(value >= -5 && value < -1):
classes += ' color-bad';
break;
case !(value >= -1 && value < 1):
classes += ' color-neutral';
break;
case !(value >= 1 && value < 5):
classes += ' color-good';
break;
case !(value >= 5 && value < 10):
classes += ' color-better';
break;
case !(value >= 10):
classes += ' color-best';
}
return classes;
});
view.fn("percent", function(x, y) {
if (x === 0) {
x = 1;
}
return Math.round(x / y * 100);
});
view.fn("round", function(num) {
return Math.round(num);
});
view.fn("gold", function(num) {
if (num) {
return num.toFixed(1).split('.')[0];
} else {
return "0";
}
});
view.fn("silver", function(num) {
if (num) {
return num.toFixed(1).split('.')[1];
} else {
return "0";
}
});
debug = function(obj, message) {
return console.log(obj, "[debug] " + message);
};
get('/:userId?', function(page, model, _arg) {
var userId;
userId = _arg.userId;
return model.subscribe("users", function(err, users) {
var newUser;
userId = model.get('_userId');
debug(userId, 'model.get _userId');
if (model.get("users." + userId)) {
debug(userId, 'model.get userId');
return getRoom(page, model, userId);
} else {
newUser = {
tasks: {}
};
return users.set(userId, newUser, function(err, path, value) {
debug({
err: err,
path: path,
value: value
}, 'new user');
return getRoom(page, model, userId);
});
}
});
});
getRoom = function(page, model, userId) {
var user;
user = model.at("users." + userId);
model.ref('_user', user);
debug(user, 'user');
/* Set User Defaults
*/
user.setNull('stats', {
money: 0,
exp: 0,
lvl: 1,
hp: 50
});
user.setNull('items', {
itemsEnabled: false,
armor: 0,
weapon: 0
});
model.set('_items', {
armor: content.items.armor[parseInt(user.get('items.armor')) + 1],
weapon: content.items.weapon[parseInt(user.get('items.weapon')) + 1],
potion: content.items.potion,
reroll: content.items.reroll
});
model.fn('_tnl', '_user.stats.lvl', function(lvl) {
return 50 * Math.pow(lvl, 2) - 150 * lvl + 200;
});
model.refList("_habitList", "_user.tasks", "_user.habitIds");
model.refList("_dailyList", "_user.tasks", "_user.dailyIds");
model.refList("_todoList", "_user.tasks", "_user.todoIds");
model.refList("_rewardList", "_user.tasks", "_user.rewardIds");
if (!model.get('_user.tasks')) {
model.push('_habitList', {
type: 'habit',
text: '1h Productive Work',
notes: 'Habits: Constantly Track
For some habits, it only makes sense to gain points (like this one).',
value: 0,
up: true,
down: false
});
}
return page.render();
};
ready(function(model) {
var endOfDayTally, expModifier, hpModifier, poormanscron, setupSortable, step, tour, type, updateStats, _i, _j, _len, _len1, _ref1, _ref2;
model.set('_purl', window.location.origin + '/' + model.get('_user.id'));
$('[rel=popover]').popover();
model.on('set', '*', function() {
return $('[rel=popover]').popover();
});
model.set('_hideCompleted', true);
$('a[data-toggle="tab"]').on('shown', function(e) {
var hideCompleted;
hideCompleted = $(e.target).attr('href') === '#tab1' ? true : false;
return model.set('_hideCompleted', hideCompleted);
});
setupSortable = function(type) {
return $("ul." + type + "s").sortable({
dropOnEmpty: false,
cursor: "move",
items: "li",
opacity: 0.4,
scroll: true,
axis: 'y',
update: function(e, ui) {
var domId, id, item, to;
item = ui.item[0];
domId = item.id;
id = item.getAttribute('data-id');
to = $("ul." + type + "s").children().index(item);
return model.at("_" + type + "List").pass({
ignore: domId
}).move({
id: id
}, to);
}
});
};
_ref1 = ['habit', 'daily', 'todo', 'reward'];
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
type = _ref1[_i];
setupSortable(type);
}
tour = new Tour();
_ref2 = content.tourSteps;
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
step = _ref2[_j];
tour.addStep({
element: step.element,
title: step.title,
content: step.content,
placement: step.placement
});
}
tour.start();
exports.addTask = function(e, el, next) {
var list, newModel, text;
type = $(el).attr('data-task-type');
list = model.at("_" + type + "List");
newModel = model.at('_new' + type.charAt(0).toUpperCase() + type.slice(1));
if (!(text = view.escapeHtml(newModel.get()))) {
return;
}
newModel.set('');
switch (type) {
case 'habit':
return list.push({
type: type,
text: text,
notes: '',
value: 0,
up: true,
down: true
});
case 'reward':
return list.push({
type: type,
text: text,
notes: '',
value: 20
});
case 'daily':
case 'todo':
return list.push({
type: type,
text: text,
notes: '',
value: 0,
completed: false
});
}
};
exports.del = function(e, el) {
var task;
task = model.at(e.target);
model.del('_user.tasks.' + task.get('id'));
return task.remove();
};
exports.toggleTaskEdit = function(e, el) {
var task;
task = model.at($(el).parents('li')[0]);
$('#\\' + task.get('id') + '-chart').hide();
return $('#\\' + task.get('id') + '-edit').toggle();
};
exports.toggleChart = function(e, el) {
var chart, chartSelector, data, date, hideSelector, historyPath, matrix, obj, options, readableDate, _k, _len2, _ref3;
hideSelector = $(el).attr('data-hide-selector');
chartSelector = $(el).attr('data-chart-selector');
historyPath = $(el).attr('data-history-path');
$(document.getElementById(hideSelector)).hide();
$(document.getElementById(chartSelector)).toggle();
matrix = [['Date', 'Score']];
_ref3 = model.get(historyPath);
for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) {
obj = _ref3[_k];
date = new Date(obj.date);
readableDate = date.toISOString();
matrix.push([readableDate, obj.value]);
}
data = google.visualization.arrayToDataTable(matrix);
options = {
title: 'History',
backgroundColor: 'whiteSmoke'
};
chart = new google.visualization.LineChart(document.getElementById(chartSelector));
return chart.draw(data, options);
};
exports.buyItem = function(e, el, next) {
var hp, index, money, task, taskId, user, value, _ref3, _results;
user = model.at('_user');
money = user.get('stats.money');
_ref3 = [$(el).attr('data-type'), $(el).attr('data-value'), $(el).attr('data-index')], type = _ref3[0], value = _ref3[1], index = _ref3[2];
if (money < value) {
return;
}
user.set('stats.money', money - value);
if (type === 'armor') {
user.set('items.armor', index);
return model.set('_items.armor', content.items.armor[parseInt(index) + 1]);
} else if (type === 'weapon') {
user.set('items.weapon', index);
return model.set('_items.weapon', content.items.weapon[parseInt(index) + 1]);
} else if (type === 'potion') {
hp = user.get('stats.hp');
hp += 15;
if (hp > 50) {
hp = 50;
}
return user.set('stats.hp', hp);
} else if (type === 'reroll') {
_results = [];
for (taskId in user.get('tasks')) {
task = model.at('_user.tasks.' + taskId);
if (task.get('type') !== 'reward') {
_results.push(task.set('value', 0));
} else {
_results.push(void 0);
}
}
return _results;
}
};
exports.updateStats = updateStats = function(user, stats) {
var money, tnl;
if (stats.hp != null) {
if (stats.hp < 0) {
user.set('stats.lvl', 0);
} else {
user.set('stats.hp', stats.hp);
}
}
if (stats.exp != null) {
tnl = model.get('_tnl');
if (stats.exp >= tnl) {
stats.exp -= tnl;
user.set('stats.lvl', user.get('stats.lvl') + 1);
}
if (!user.get('items.itemsEnabled') && stats.exp >= 50) {
user.set('items.itemsEnabled', true);
$('ul.items').popover({
title: content.items.unlockedMessage.title,
placement: 'left',
trigger: 'manual',
html: true,
content: "
" + content.items.unlockedMessage.content + " [Close]