diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..13bbe5b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea/ + 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..63d384b --- /dev/null +++ b/current-event.json @@ -0,0 +1,56 @@ +[ + { + "name": "pewpew", + "start": "2012-11-07T04:18:00.000Z", + "end": "2012-11-07T04:18:00.000Z", + "location": "", + "remindTime": 0, + "description": "(отсутствует)", + "raiting": 0 + }, + { + "name": "Пара по веб-технологиям", + "start": "2012-11-20T06:50:00.000Z", + "end": "2012-11-20T06:50:00.000Z", + "location": "5 этаж", + "remindTime": 10, + "description": "Взять бумагу и ручку, не брать бук!", + "raiting": 0 + }, + { + "name": "Событие", + "start": "2012-11-28T18:00:00.000Z", + "end": "2012-11-28T18:00:00.000Z", + "location": "", + "remindTime": 0, + "description": "(отсутствует)", + "raiting": "0" + }, + { + "name": "Событие5", + "start": "2012-11-29T18:00:00.000Z", + "end": "2012-11-29T18:00:00.000Z", + "location": "", + "remindTime": 0, + "description": "(отсутствует)", + "raiting": "0" + }, + { + "name": "tretr", + "start": "2012-11-28T18:00:00.000Z", + "end": "2012-11-28T18:00:00.000Z", + "location": "", + "remindTime": 0, + "description": "(отсутствует)", + "raiting": "0" + }, + { + "name": "Событиеjnklk", + "start": "2012-11-29T18:00:00.000Z", + "end": "2012-11-29T18:00:00.000Z", + "location": "", + "remindTime": 0, + "description": "(отсутствует)", + "raiting": "0" + } +] \ No newline at end of file diff --git a/documentAction.js b/documentAction.js new file mode 100644 index 0000000..01dd672 --- /dev/null +++ b/documentAction.js @@ -0,0 +1,177 @@ +$(function (exports) { + "use strict"; + + var ListOfEvents = new Events(), + sortedList = new Events(), + queue = new Events, + filterOption = "all", + sortOption = "without"; + + var template = '
  • ' + + "
    Название: <%= name %>
    " + + "
    Начало: <%= start %>
    " + + "
    Окончание: <%= end %>
    " + + "
    Местоположение: <%= location %>
    " + + "
    Напомнить за: <%= remindTime %>
    " + + "
    Описание: <%= description %>
    " + + "
    Рейтинг: <%= raiting %>
  • "; + $(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().trim(), + start = $("#from").val(), + end = $("#to").val(), + location = $("#location").val().trim(), + raiting = $("#raiting").val(), + description = $("#description").val().trim(), + 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()) + .success(function () { + ListOfEvents = result; + changeDocument("sort"); + document.forms["form"].reset(); + //alert("Все события были успешно отправлены."); + }) + .error( function () { + alert("Отсутсвует подключение к серверу."); + }); + } + + 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(); + + if (changeType === "sort") { + sortedList = sortEvents(); + } + var filterList = filterEvents(sortedList), + length = filterList.length(), + i; + + var $box = $("