From 3b0f2ca45660c3c8488a30175a7f5b27ad20083f Mon Sep 17 00:00:00 2001 From: yunnii Date: Mon, 26 Nov 2012 12:51:04 +0600 Subject: [PATCH 1/7] initial commit --- collection.js | 91 +++++++++++++++++++ current-event.json | 4 + documentAction.js | 218 +++++++++++++++++++++++++++++++++++++++++++++ event.js | 93 +++++++++++++++++++ events.js | 151 +++++++++++++++++++++++++++++++ index.css | 28 ++++++ index.html | 78 ++++++++++++++++ model.js | 62 +++++++++++++ server.js | 4 + validation.js | 47 ++++++++++ 10 files changed, 776 insertions(+) create mode 100644 collection.js create mode 100644 current-event.json create mode 100644 documentAction.js create mode 100644 event.js create mode 100644 events.js create mode 100644 index.css create mode 100644 index.html create mode 100644 model.js create mode 100644 server.js create mode 100644 validation.js diff --git a/collection.js b/collection.js new file mode 100644 index 0000000..1705353 --- /dev/null +++ b/collection.js @@ -0,0 +1,91 @@ +(function (exports) { + "use strict"; + +var Collection = function (items) { + + this.items = []; + var key; + + for (key in items) { + if (items.hasOwnProperty(key)) { + this.items.push(items[key]); + } + } +}; + +exports.Collection = Collection; + +Collection.prototype.constructor = Collection; + +/** + * Сериализует коллекцию + * + * @return {JSON object} + * + */ +Collection.prototype.serialise = function () { + return JSON.stringify(this.items, null, ' '); +} + +/** + * Добавляет в коллекцию объект + * + * @param {object} model + * + * @return {Collection} * @example + * + */ +Collection.prototype.add = function (model) { + + var temp = new this.constructor(this.items); + temp.items.push(model); + return temp; +}; + +/** + * @param {Function} selector + * + * @see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filter + * + * @example + * new Collection().filter(function (item) { + * return item.get('attendee').indexOf("me") !== -1; + * }); + * @return {Collection} + */ +Collection.prototype.filter = function (selector) { + + if (typeof selector !== "function") { + throw new Error('Argument must be function'); + } + + return new this.constructor(this.items.filter(selector)); +}; + +/** + * Принимает функцию сортировки и сортирует на основе ее + * + * @param {function} selector + * + * @return {Collection} * @example + * + */ +Collection.prototype.sort = function (selector) { + + if (typeof selector !== "function") { + throw new Error('Argument must be function'); + } + + return new this.constructor(this.items.sort(selector)); +}; + +Collection.prototype.reverse = function () { + + return new this.constructor(this.items.reverse()); +}; + +Collection.prototype.length = function (selector) { + + return this.items.length; +}; +}(window)); \ No newline at end of file diff --git a/current-event.json b/current-event.json new file mode 100644 index 0000000..6610503 --- /dev/null +++ b/current-event.json @@ -0,0 +1,4 @@ +[ +{"name":"pewpew","start":"2012/11/07 10:18","end":"2012/11/07 10:18"}, +{"name":"Пара по веб-технологиям","start":"2012/11/20 12:50","end":"2012/11/20 12:50","location":"5 этаж","remindTime":10,"description":"Взять бумагу и ручку, не брать бук!"} +] \ No newline at end of file diff --git a/documentAction.js b/documentAction.js new file mode 100644 index 0000000..837f887 --- /dev/null +++ b/documentAction.js @@ -0,0 +1,218 @@ +$(function (exports) { + "use strict"; + + var ListOfEvents = new Events(), + sortedList = new Events(), + filterOption = "all", + sortOption = "without"; + + $(document).ready(initialise); + +/** + * Загружает свое состояние с сервера + * при отсутствии соединения/страницы на сервере пытается подключиться через 5 минут снова + * +*/ + function initialise() { + + $( '.date' ).datepicker(); + + $.getJSON('current-event.json') + .complete(function () { $("#notify").hide(); }) + .error(function () { $('#notifyError').show(); }) + .success(function (result) { + var i, newEvent; + + for (i = 0; i < result.length; i++) { + newEvent = new Event(result[i]).validate(); + ListOfEvents = ListOfEvents.add(newEvent); + } + changeDocument("sort"); + addListener(); + }); + } +/** + * Добавляет новое событие в список. Если установлены опции фильтрации и сортировки + * - то располагает элементы на странице, в с-ии с ними + * +*/ + function preventDefault() { + + var name = $("#title").val(), + start = $("#from").val(), + end = $("#to").val(), + location = $("#location").val(), + raiting = $("#raiting").val(), + description = $("#description").val(), + remindTime = $("#remindTime").val(); + + if (!validateTitle(name, $('#title_help'))) { alert("Событие не было добавлено. Ошибка"); return; } + if (!validateDate(start, $('#from_help'))) { alert("Событие не было добавлено. Ошибка"); return; } + if (!validateNumber(remindTime, $('#remindTime_help'))) { alert("Событие не было добавлено. Ошибка"); return; } + + var element = new Event({ + name: name, + start: start, + end: end, + location: location, + raiting: raiting, + description: description, + remindTime: remindTime + }).validate(); + + var result = ListOfEvents.add(element); + + $.post('current-event.json', result.serialise()) + .error( function () { + /*if (error === "error") { + alert("Не могу подключиться к северу. Попробуйте позже"); + return; + }*/ + }) + .complete(function () { + ListOfEvents = result; + changeDocument("sort"); + document.forms["form"].reset(); + }); + } + + function filterEvents(listEvents) { + switch (filterOption) { + case "future": + return listEvents.coming(); + case "past": + return listEvents.past(); + default: + return listEvents; + } + } + + function sortEvents() { + switch (sortOption) { + case "byName": + return ListOfEvents.sortByName(); + case "byStart": + return ListOfEvents.sortByTime(); + case "byRaiting": + return ListOfEvents.sortByRaiting(); + default: + return ListOfEvents; + } + } + +/** + * Сортирует и фильтрует события в соответствии с указанными опциями. + * + * @param {string} changeType - если указана строка "sort", то события также будут отсортированы, + * инчае - только отфильтрованы + * @return коллекция объектов типа event +*/ + + function changeDocument(changeType) { + var $removeList = $(".events"); + $removeList.remove(); + + var $addList = $('