Skip to content
Open
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 91 additions & 0 deletions collection.js
Original file line number Diff line number Diff line change
@@ -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, 3);
}

/**
* Добавляет в коллекцию объект
*
* @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));
4 changes: 4 additions & 0 deletions current-event.json
Original file line number Diff line number Diff line change
@@ -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":"Взять бумагу и ручку, не брать бук!"}
]
6 changes: 6 additions & 0 deletions datepicker.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Modernizr.load({
test: Modernizr.inputtypes.date,
nope: function () {
$("input[type='date']").datepicker();
}
});
234 changes: 234 additions & 0 deletions documentAction.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,234 @@
$(function (exports) {
"use strict";

var ListOfEvents = new Events(),
sortedList = new Events(),
filterOption = "all",
sortOption = "without";

$(document.body).on('load', initialise());
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

У тебя тут произойдет следющее: функция initialise() будет вызвана, а результат ее выполнения будет передан в функцию .on() те фактически:

var result = initialise();
$(document.body).on('load', result); // смысла нет

Скорее всего это просто невнимательность :)

Вобще лучше использовать событие DOMContentLoaded вместо onload

$(document).ready(initialise);

или сокращенно

$(initialise);

Разница между DOMContentLoaded и onload в следующем: load срабатывает когда все ресурсы страницы загрузились DOMContentLoaded - когда загрузился только документ. На страницце может быть много картинок и в случае с onload она "оживет" только когда они все загрузяться.

http://stackoverflow.com/questions/3698200/window-onload-vs-document-ready


/**
* Загружает свое состояние с сервера
* при отсутствии соединения/страницы на сервере пытается подключиться через 5 минут снова
*
*/
function initialise() {

$.ajax({
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Так получится немного короче

$.getJSON('/dz-7-jquery/current-event.json')
$.getJSON("example.json")
.success(function() { alert("success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });

http://api.jquery.com/jQuery.getJSON/

Старайся использовать относительные пути /dz-7-jquery/current-event.json, на практике часто бывает, что скрипт нужно запускать на разных доменах.

dataType: 'json',
url: 'http://yunnii.github.com/dz-7-jquery/current-event.json',
success: function (jqXHR) {
var i, newEvent;

for (i = 0; i < jqXHR.length; i++) {
newEvent = new Event(jqXHR[i]).validate();
ListOfEvents = ListOfEvents.add(newEvent);
}
changeDocument("sort");
addListener();
},
error: function () {
$('#notifyError').show();
return;
}
})
.always(function () {
$("#notify").hide();
});
}
/**
* Добавляет новое событие в список. Если установлены опции фильтрации и сортировки
* - то располагает элементы на странице, в с-ии с ними
*
*/
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);

$.ajax({
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Аналогично

$.post('/dz-7-jquery/current-event.json', result.serialise())
    .success(function() { alert("success"); })
    .error(function() { alert("error"); })
    .complete(function() { alert("complete"); });

http://api.jquery.com/jQuery.post/

type: 'POST',
url: 'http://yunnii.github.com/dz-7-jquery/current-event.json',
data: result.serialise(),
error: function () {
/*if (error === "error") {
alert("Не могу подключиться к северу. Попробуйте позже");
return;
}*/
}
})
.always(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(listEvents) {
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 = $('<ul />')
.addClass("events");

var fragment = document.createDocumentFragment();

if (changeType === "sort") {
sortedList = sortEvents(ListOfEvents);
}
var filterList = filterEvents(sortedList),
length = filterList.length(),
i;

for (i = 0; i < length; i++)
{
var element = filterList.items[i];
var $el = addLiElement(element);
$el.appendTo($addList);
}

var $parent = $(".collection");
$addList.appendTo(fragment);
$parent.append(fragment);
}

/**
* Создает DOM-элемент типа li, заполняется полями из объекта
*
* @param {Event} element - объект типа Element
*
* @return Возвращает созданный дом-элемент типа li
*/

function addLiElement (element) {
var $el = $('<li />')
.addClass("event_item"),

$name = $('<div />', {
text: "Название: " + element.name
}).appendTo($el),

$start = $('<div />', {
text: "Начало: " + element.start
}).appendTo($el),

$end = $('<div />', {
text: "Окончание: " + element.end
}).appendTo($el),

$location = $('<div />', {
text: "Местоположение: " + element.location
}).appendTo($el),

$remindTime = $('<div />', {
text: "Напомнить за: " + element.remindTime + "минут"
}).appendTo($el),

$description = $('<div />', {
text: "Описание: " + element.description
}).appendTo($el),

$raiting = $('<div />', {
text: "Рейтинг: " + element.raiting
}).appendTo($el);

return $el;
};

/**
* Навешивает обработчики событий на страницу
*/
function addListener() {
var $name = $("#title");
var $start = $("#from");
var $remindTime = $("#remindTime");
var $filters = $('.filter');
var $sort = $('.sort');
var $button = $("#addButton");

$name.on('blur', function($event) {
var cur = $event.currentTarget;
validateTitle(cur.value, $('#title_help'));
});

$start.on('blur', function ($event) {
var cur = $event.currentTarget;
validateDate(cur.value, $('#from_help'));
});

$remindTime.on('blur', function ($event) {
var cur = $event.currentTarget;
validateNumber(remindTime.value, $('#remindTime_help'));
});

$filters.each(function(index) {
$(this).on('change', function ($event) {
filterOption = $('input[name="filter"]:checked').val();
changeDocument("filter");
})});

$sort.each(function(index) {
$(this).on('change', function ($event) {
sortOption = $('input[name="sort"]:checked').val();
changeDocument("sort");
})});


$button.on('click', preventDefault);
}

}(window));
Loading