Skip to content

Task 5 #7

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all 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
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "qunit"]
path = qunit
url = git://github.com/jquery/qunit.git
224 changes: 224 additions & 0 deletions Task/Scripts/BaseEvent.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,224 @@
/*global Collection: true*/
(function (toExport) {
"use strict";
/**
* Создает оболочку над массивом событий, предоставляющую "sql" подобные операции
*
* @class Оболочка над массивом событий.
* @augments Collection
*/
var BaseEvent = function BaseEvent(events) {
"use strict";
Collection.call(this, events);
}

toExport.BaseEvent = BaseEvent;

BaseEvent.prototype = Object.create(Collection.prototype, {
constructor: {
value: BaseEvent,
enumerable: false,
writable: true,
configurable: true
}
});
/**
*
*@field {BaseEvent} - ссылка на "родной" конструктор
*/
BaseEvent.prototype.constructor = BaseEvent;
/**
*@function Возвращает новую оболочку, но уже только с прошедшими событиями
*
*@return {BaseEvent}
*/
BaseEvent.prototype.pastEventBase = function () {
var currentDate = new Date();
return this.filter(function (event) {
return event.end.getTime() < currentDate.getTime();
});
};
/**
* @function Возвращает новую оболочку, но уже только с ненаступившими событиями
*
* @return {BaseEvent}
*/
BaseEvent.prototype.nextEventBase = function () {
var currentDate = new Date();
return this.filter(function (event) {
return event.start.getTime() > currentDate.getTime();
});
};
/**
* @function Возвращает новую оболочку, но уже с событиями, которые идут в данный момент
*
* @return
*/
BaseEvent.prototype.nowEventBase = function () {
var currentDate = new Date();
return this.filter(function (event) {
return (event.start.getTime() <= currentDate.getTime() && event.end.getTime() >= currentDate.getTime());
});
};

/**
* @function Возвращает новую оболочку, но уже с событиями, в которых участвует определенный человек
*
* @return
*/
BaseEvent.prototype.withFriend = function (myFriend) {
return this.filter(function (event) {
return event.parties.some(function (party) {
return party.name === myFriend.name;
});
});
};
/**
* @function Увеличивает дату на день
* @private
*
* @field {Date} currentDate дата, которую будем увеличивать
*
* @return {Date}
*/
var addDay = function (currentDate) {
return new Date(new Date().getTime() + 24 * 60 * 60 * 1000);
}

/**
* @function Возвращает новую оболочку, но уже с событиями, которые будут через день
*
* @return {BaseEvent}
*/
BaseEvent.prototype.getEventAfterDay = function () {
var currentDate = addDay(new Date());
return this.filter(function (event) {
return event.start.getTime() > currentDate.getTime();
});
};

/**
* @function Увеличивает дату на неделю
* @private
*
* @field {Date} currentDate дата, которую будем увеличивать
*
* @return {Date}
*/
var addWeek = function (currentDate) {
return new Date(currentDate.getTime() + 7 * 24 * 60 * 60 * 1000);
}

/**
* @function Возвращает новую оболочку, но уже с событиями, которые будут через неделю
*
* @return {BaseEvent}
*/
BaseEvent.prototype.getEventAfterWeek = function () {
var currentDate = addWeek(new Date());
return this.filter(function (event) {
return event.start.getTime() > currentDate.getTime();
});
};

/**
* @function Увеличивает дату на месяц
* @private
*
* @field {Date} currentDate дата, которую будем увеличивать
*
* @return {Date}
*/
var addMonth = function (currentDate) {
if (currentDate.getMonth() === 11) {
currentDate = new Date(currentDate.getFullYear() + 1, 0, currentDate.getDay());
} else {
currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, currentDate.getDay());
}
return currentDate;
}

/**
* @function Возвращает новую оболочку, но уже с событиями, которые будут через месяц
*
* @return {BaseEvent}
*/
BaseEvent.prototype.getEventAfterMonth = function () {
var currentDate = addMonth(new Date());
return this.filter(function (event) {
return event.start.getTime() > currentDate.getTime();
});
};

/**
* @function Возвращает новую оболочку, но уже с событиями, которые будут в определенный период
*
* @param {Date} fromDate - начала периода
* @param {Date} toDate - конец периода
*
* @return
*/
BaseEvent.prototype.getEventFromPeriod = function (fromDate, toDate) {
return this.filter(function (event) {
return (event.start.getTime() > fromDate.getTime() && event.end.getTime() < toDate.getTime());
});
};

/**
* @function Компаратор рейтинга по убыванию
* @private
*
* @field {Date} a
* @field {Date} b
*
* @return {Numeric}
*/
var starsComparer = function compare(a, b) {
if (a.stars > b.stars) {
return -1;
}
if (a.stars < b.stars) {
return 1;
}
return 0;
};

/**
* @function Возвращает новую оболочку c теми же событиями, но отсортированными по уменьшению количества звезд
*
* @return {BaseEvent}
*/
BaseEvent.prototype.sortByStars = function (ascending) {

return this.sortBy(starsComparer, ascending);
};

/**
* @function Компаратор дат по возрастанию
* @private
*
* @field {Date} a
* @field {Date} b
*
* @return {Numeric}
*/
var dateComparer = function (a, b) {
if (a.start.getTime() < b.start.getTime()) {
return -1;
}
if (a.start.getTime() > b.start.getTime()) {
return 1;
}
return 0;
};

/**
* @function Возвращает новую оболочку c теми же событиями, но отсортированными по дате
*
* @return {BaseEvent}
*/
BaseEvent.prototype.sortByDate = function (ascending) {

return this.sortBy(dateComparer, ascending);
};
}(window));
71 changes: 71 additions & 0 deletions Task/Scripts/CalendaryErrorManager.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
(function (toExport) {
/**
* @class Класс содержит обработчики ошибок при изменении элементов DOM связанных с календорем
* @augments DOMErrorManager
*/

var CalendaryErrorManager = function (errorClassName) {
DOMErrorManager.call(this, errorClassName);
}

toExport.CalendaryErrorManager = CalendaryErrorManager;

CalendaryErrorManager.prototype = Object.create(DOMErrorManager.prototype, {
constructor: {
value: Event,
enumerable: false,
writable: true,
configurable: true
}
});

/**
* @function Обработчик ошибок объекта, содержащий начальное и конечное время
*
* @param {DOMdivElement} хранилище, содержащее таймер.
*/
CalendaryErrorManager.prototype.changeTime = function (timer) {
var textError = DOMValidator.isTimeInterval(timer);
this.changeTextError(timer, textError);
}

/**
* @function Обработчик ошибок объекта, содержащий координаты
*
* @param {DOMdivElement} хранилище, содержащее координаты.
*/
CalendaryErrorManager.prototype.changeCoordinate = function (coordinates) {
var textError = DOMValidator.isCoordinate(coordinates);
this.changeTextError(coordinates, textError);
}

/**
* @function Обработчик ошибок объекта, содержащий важныее данные
*
* @param {DOMdivElement} хранилище, содержащее важное поле.
*/
CalendaryErrorManager.prototype.changeImportantStringField = function (importantStringField) {
var textError = DOMValidator.isImportantStringField(importantStringField, 5, 20);
this.changeTextError(importantStringField, textError);
}

/**
* @function Обработчик ошибок объекта, содержащий поле с положительным числом
*
* @param {DOMdivElement} хранилище, содержащее поле с положительным числом.
*/
CalendaryErrorManager.prototype.changePositiveNumber = function (positiveNumber) {
var textError = DOMValidator.isPositiveNumber(positiveNumber);
this.changeTextError(positiveNumber, textError);
}

/**
* @function Обработчик ошибок объекта, содержащий поле с рейтингом
*
* @param {DOMdivElement} хранилище, содержащее поле с положительным числом.
*/
CalendaryErrorManager.prototype.changeStars = function (stars) {
var textError = DOMValidator.isStars(stars);
this.changeTextError(stars, textError);
}
}(window));
71 changes: 71 additions & 0 deletions Task/Scripts/Collection.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*global Collection: true*/
(function(toExport) {
"use strict";
/**
* Создает оболочка для хранения массива объектов с операциями по извлечению более конкретных элементов
* @class Оболочка для храения массива объектов
*
* @param {Array} элементы коллекции
*/
var Collection = function (otherItems) {
"use strict";
var item;
this.items = [];
for (item in otherItems) {
if (otherItems.hasOwnProperty(item)) {
this.items.push(otherItems[item]);
}
}
};
toExport.Collection = Collection;
/**
* @field {Collection} хранит ссылку на родной конструктор
*/
Collection.prototype.constructor = Collection
/**
* @function создает новую коллекцию элементов с теме же элементами + с новым элементом obj
*
* @return {instanceof this.constructor}
*/
Collection.prototype.add = function (obj) {
var newEvents = this.items.concat([obj]);
return new this.constructor(newEvents);
};
/**
* @function создает новую коллекцию элементов с отфильтрованными элементами
*
* @param {Function} - делегат
*
* @return {instanceof this.constructor}
*/
Collection.prototype.filter = function (selector) {
var newItems = this.items.filter(selector);
return new this.constructor(newItems);
};
/**
* @function создает новую коллекцию элементов с теме же элементами + с новым элементом obj
*
* @param {Function} - компаратор
* @param {Function} - инвертировать, ли результат
*
* @return {instanceof this.constructor}
*/
Collection.prototype.sortBy = function (comparator, isInvert) {
var newItems = [].concat(this.items);
if (newItems.length === 0) {
return [];
}
if (comparator) {
if (isInvert) {
newItems.sort(function (a, b) {
return -1 * comparator(a, b);
});
} else {
newItems.sort(comparator);
}
} else {
newItems.sort();
}
return new this.constructor(newItems);
};
}(window));
Loading