diff --git a/.idea/dz-7-jquery.iml b/.idea/dz-7-jquery.iml new file mode 100644 index 0000000..6b8184f --- /dev/null +++ b/.idea/dz-7-jquery.iml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..e206d70 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..f82faeb --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,11 @@ + + + + + + http://www.w3.org/1999/xhtml + + + + diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..455d32e --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..c80f219 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + 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 = $('