// Generated by CoffeeScript 1.4.0 var content, derby, get, helpers, moment, ready, schema, scoring, 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')); moment = require('moment'); content = require('./content'); scoring = require('./scoring'); schema = require('./schema'); helpers = require('./helpers'); helpers.viewHelpers(view); _ = require('underscore'); get('/:uid?', function(page, model, _arg, next) { var req, sess, uid; uid = _arg.uid; if (uid) { if (require('derby-auth/node_modules/guid').isGuid(uid)) { return page.redirect('/users/' + uid); } else { return next(); } } req = page._res.req; if (req.headers['x-forwarded-proto'] !== 'https' && process.env.NODE_ENV === 'production') { return page.redirect('https://' + req.headers.host + req.url); } sess = model.session; if (sess.loggedIn) { model.set('_loggedIn', true); } model.set('_userId', sess.userId); return model.subscribe("users." + sess.userId, function(err, user) { model.ref('_user', user); user.setNull('balance', 2); 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.refList("_habitList", "_user.tasks", "_user.habitIds"); model.refList("_dailyList", "_user.tasks", "_user.dailyIds"); model.refList("_todoList", "_user.tasks", "_user.todoIds"); model.refList("_completedList", "_user.tasks", "_user.completedIds"); model.refList("_rewardList", "_user.tasks", "_user.rewardIds"); _.each(['habitIds', 'dailyIds', 'todoIds', 'rewardIds'], function(path) { return user.set(path, _.uniq(user.get(path), true)); }); model.fn('_user._tnl', '_user.stats.lvl', function(lvl) { return (lvl * 100) / 5; }); return page.render(); }); }); ready(function(model) { var setupSortable, step, tour, type, _i, _j, _len, _len1, _ref1, _ref2; scoring.setModel(model); $('[rel=tooltip]').tooltip(); $('[rel=popover]').popover(); model.on('set', '*', function() { $('[rel=tooltip]').tooltip(); return $('[rel=popover]').popover(); }); if (!(model.get('_mobileDevice') === true)) { 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(); model.on('set', '_user.tasks.*.completed', function(i, completed, previous, isLocal, passed) { var direction, from, fromIds, task, to, toIds, _ref3, _ref4; if ((passed != null) && passed.cron) { return; } direction = function() { if (completed === true && previous === false) { return 'up'; } if (completed === false && previous === true) { return 'down'; } throw new Error("Direction neither 'up' nor 'down' on checkbox set."); }; task = model.at("_user.tasks." + i); scoring.score(i, direction()); if (task.get('type') === 'todo') { _ref3 = direction() === 'up' ? ['todo', 'completed'] : ['completed', 'todo'], from = _ref3[0], to = _ref3[1]; _ref4 = ["_user." + from + "Ids", "_user." + to + "Ids"], from = _ref4[0], to = _ref4[1]; fromIds = model.get(from); fromIds.splice(fromIds.indexOf(i), 1); model.set(from, fromIds); toIds = model.get(to); toIds.push(i); return model.set(to, toIds); } }); 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': return list.push({ type: type, text: text, notes: '', value: 0, repeat: { su: true, m: true, t: true, w: true, th: true, f: true, s: true }, completed: false }); case 'todo': return list.push({ type: type, text: text, notes: '', value: 0, completed: false }); } }; exports.del = function(e, el) { var history, result, task; task = model.at(e.target); history = task.get('history'); if (history && history.length > 2) { if (task.get('value') < 0) { result = confirm("Are you sure? Deleting this task will hurt you (to prevent deleting, then re-creating red tasks)."); if (result !== true) { return; } else { task.set('type', 'habit'); scoring.score(task.get('id'), { direction: 'down' }); } } else { result = confirm("Are you sure you want to delete this task?"); if (result !== true) { return; } } } $('[rel=tooltip]').tooltip('hide'); model.del('_user.tasks.' + task.get('id')); return task.remove(); }; exports.clearCompleted = function(e, el) { return _.each(model.get('_completedList'), function(task) { model.del('_user.tasks.' + task.id); return model.set('_user.completedIds', []); }); }; exports.toggleDay = function(e, el) { var task; task = model.at(e.target); if (/active/.test($(el).attr('class'))) { return task.set('repeat.' + $(el).attr('data-day'), false); } else { return task.set('repeat.' + $(el).attr('data-day'), true); } }; exports.toggleTaskEdit = function(e, el) { var hideId, toggleId; hideId = $(el).attr('data-hide-id'); toggleId = $(el).attr('data-toggle-id'); $(document.getElementById(hideId)).hide(); return $(document.getElementById(toggleId)).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-id'); chartSelector = $(el).attr('data-toggle-id'); 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 = moment(date).format('MM/DD'); 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, user, value, _ref3; 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); } }; exports.score = function(e, el, next) { var direction, task; direction = $(el).attr('data-direction'); if (direction === 'true/') { direction = 'up'; } if (direction === 'false/') { direction = 'down'; } task = model.at($(el).parents('li')[0]); return scoring.score(task.get('id'), direction); }; exports.revive = function(e, el) { var stats; stats = model.at('_user.stats'); stats.set('hp', 50); stats.set('lvl', 1); stats.set('exp', 0); stats.set('money', 0); model.set('_user.items.armor', 0); model.set('_user.items.weapon', 0); model.set('_items.armor', content.items.armor[1]); model.set('_items.weapon', content.items.weapon[1]); return model.set('_user.balance', model.get('_user.balance') - 0.50); }; exports.reset = function(e, el) { model.set('_user.tasks', {}); _.each(['habit', 'daily', 'todo', 'completed', 'reward'], function(type) { model.set("_user." + type + "Ids", []); return model.refList("_" + type + "List", "_user.tasks", "_user." + type + "Ids"); }); model.set('_user.stats.hp', 50); model.set('_user.stats.money', 0); model.set('_user.stats.exp', 0); return model.set('_user.stats.lvl', 1); }; setTimeout(scoring.cron, 1); setInterval(scoring.cron, 3600000); return require('../server/private').app(exports, model); });