Skip to content

Третье ДЗ. #11

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 4 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 "dz-2-basics"]
path = dz-2-basics
url = [email protected]:turboDi/dz-2-basics.git
1 change: 1 addition & 0 deletions dz-2-basics
Submodule dz-2-basics added at 178377
23 changes: 23 additions & 0 deletions event-collection.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>EVents test</title>
</head>

<body>

<div class="container">

<input type="button" onclick="console.dir(thisWeekEvents(futureEvents(events)));" value = "будущие события недели"/>
<input type="button" onclick="console.dir(sortByStartDate(partyEvents(futureEvents(events))));" value = "будущие пьянки, отсортированные по дате"/>
<input type="button" onclick="console.dir(sortByNextHappenDate(nightAlarms(thisWeekEvents(futureEvents(events)))));" value = "события, которые меня разбудят на этой неделе"/>

</div>

<script src="dz-2-basics/event.js"></script>
<script src="event-random.js"></script>
<script src="event-collection.js"></script>

</body>
</html>
231 changes: 231 additions & 0 deletions event-collection.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,231 @@
/**
* Добавляет к дате кол-во лет, месяцев, дней и т.д определенных в параметре
* Параметр добавления даты должен иметь формат + dd.MM.YY hh:mm
* @param {Number|Date} date Дата
* @param {String} dateTimeStr Строка в формате '+ dd.MM.YY hh:mm'
*
* @return {Date}
*/
function addDateTime(date, dateTimeStr) {
'use strict';
var result, splitted, sign, addDate, dd, mm, yy, addTime, hh, min;
splitted = checkAddTime(dateTimeStr);
result = new Date(date.getTime());
if (splitted) {
if (splitted[1] === '-') {
sign = -1;
} else {
sign = 1;
}
addDate = splitted[2].split('.');
addTime = splitted[3].split(':');
result.setDate(result.getDate() + sign * addDate[0]);
result.setMonth(result.getMonth() + sign * addDate[1]);
result.setYear(result.getYear() + sign * addDate[2]);
result.setHours(result.getHours() + sign * addTime[0]);
result.setMinutes(result.getMinutes() + sign * addTime[1]);
} else {
console.log("Add time in 'addDateTime' function must have format '+ dd.MM.YY hh:mm'");
}
return result;
}

/**
* Вычисляет когда в следующий раз случится периодическое событие
*
* @param {Event} event Событие
*
* @return {Date}
*/
function getNextHappenDate(event) {
'use strict';
var nhd, today;
if (!event.nextHappenDate) {
today = new Date();
nhd = event.startDate;
while (nhd < today) {
nhd = addDateTime(nhd, event.repeat.value);
}
event.nextHappenDate = nhd;
}
return event.nextHappenDate;
}

/**
* Вычисляет следующее время напоминания для периодических событий
*
* @param {Event} event Событие
*
* @return {Date}
*/
function getNextAlarmTime(event) {
'use strict';
var nhd = getNextHappenDate(event);
return addDateTime(nhd, event.alert.value);
}

/**
* Функция проверяет, нужно ли напомнить о событии
*
* @param {Event} event Событие
*
* @return {Boolean}
*/
function isAlertTime(event) {
'use strict';
var today, diff;
today = new Date();
diff = today - getNextAlarmTime(event);
return diff > -500 && diff < 500;
}

/**
* Вычисляет дату начала недели
*
* @param {Date} [date="new Date()"] Дата
*
* @return {Date}
*/
function getWeekStartDate(date) {
'use strict';
var startOfWeek;
date = date || new Date();
startOfWeek = new Date(date.getTime());
startOfWeek.setDate(date.getDate() - date.getDay() + 1);
startOfWeek.setHours(0);
startOfWeek.setMinutes(0);
return startOfWeek;
}

/**
* Вычисляет дату конца недели
*
* @param {Date} [date="new Date()"] Дата
*
* @return {Date}
*/
function getWeekEndDate(date) {
'use strict';
var startOfWeek, endOfWeek;
startOfWeek = getWeekStartDate(date);
endOfWeek = new Date(startOfWeek.getTime());
endOfWeek.setDate(startOfWeek.getDate() + 7);
return endOfWeek;
}

/**
* Фабрика фильтрации массива
*
* @param {function} selector Функция фильтрации
*
* @return {Array}
*/
function filterFactory(selector) {
'use strict';
return function (array) {
return array.filter(selector);
};
}

/**
* Фабрика сортировки массива
*
* @param {function} selector Функция сортировки
*
* @return {Array}
*/
function sortFactory(selector) {
'use strict';
return function (array) {
return array.sort(selector);
};
}

/**
* Функция получения коллекции случайных событий
*
* @param {Number} size Размер массива
*
* @return {Array}
*/
function getEventsCollection(size) {
'use strict';
var i, events;
events = [];
for (i = 0; i < size; i++) {
events.push(getRandomEvent());
}
return events;
}

var events = getEventsCollection(20);

var pastEvents = filterFactory(function (event) {
'use strict';
return event.endDate < new Date();
});

var futureEvents = filterFactory(function (event) {
'use strict';
return event.startDate > new Date();
});

var thisWeekEvents = filterFactory(function (event) {
'use strict';
return event.startDate > getWeekStartDate() && event.startDate < getWeekEndDate();
});

var partyEvents = filterFactory(function (event) {
'use strict';
return event.title === 'Drunken feast';
});

var nightAlarms = filterFactory(function (event) {
'use strict';
var alarm = getNextAlarmTime(event);
return alarm.getHours() > 0 && alarm.getHours() < 8;
});

var sortByStartDateInt = sortFactory(function (a, b) {
'use strict';
return b.startDate - a.startDate;
});

var sortByNextHappenDateInt = sortFactory(function (a, b) {
'use strict';
return getNextHappenDate(b) - getNextHappenDate(a);
});

/**
* Функция сортировки массива событий по дате начала
*
* @param {Array} events Массив событий
* @param {Boolean} [asc = null] Сортировка по возрастанию/убыванию
*
* @return {Array}
*/
function sortByStartDate(events, asc) {
'use strict';
var sorted = sortByStartDateInt(events);
if (!asc) {
sorted.reverse();
}
return sorted;
}

/**
* Функция сортировки массива событий по дате их следующего раза
*
* @param {Array} events Массив событий
* @param {Boolean} [asc = null] Сортировка по возрастанию/убыванию
*
* @return {Array}
*/
function sortByNextHappenDate(events, asc) {
'use strict';
var sorted = sortByNextHappenDateInt(events);
if (!asc) {
sorted.reverse();
}
return sorted;
}
113 changes: 113 additions & 0 deletions event-random.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
/*jslint plusplus: true*/
var activities = ["Studying", "Drunken feast", "Karaoke singing", "Hanging around"];
var locations = ["My home", "My work", "My friend's house", "1905 Sq.", "UrFU", "Unknown"];

/**
* Возвращает случайное число в интервале [min, max]
*
* @param {Number} min нижний предел
* @param {Number} max верхний предел
*
* @return {Number}
*/
function getRandomInt(min, max) {
'use strict';
return Math.floor(Math.random() * (max - min + 1)) + min;
}

/**
* Возвращает случайный элемент массива
*
* @param {Array} arr массив
*
* @return {Object}
*/
function getRandomElement(arr) {
'use strict';
return arr[getRandomInt(0, arr.length - 1)];
}

/**
* Возвращает сгенерированную строку из случайных символов
*
* @return {String}
*/
function getRandomString() {
'use strict';
var chars, length, str, i;
chars = "01234 56789 ABCDE FGHIJ KLMNO PQRST UVWXT Zabcd efghi klmno pqrst uvwxy z";
chars = chars.split('');
length = getRandomInt(4, chars.length);
str = '';
for (i = 0; i < length; i++) {
str += getRandomElement(chars);
}
return str;
}

/**
* Возвращает случайное собственное свойство объекта
*
* @param {Object} obj объект
*
* @return {Object}
*/
function getRandomPropertyVal(obj) {
'use strict';
var keys, prop;
keys = [];
for (prop in obj) {
if (obj.hasOwnProperty(prop)) {
keys.push(prop);
}
}
return obj[getRandomElement(keys)];
}

/**
* Возвращает сгенерированную дату начала события
* Вычисляется как текущая дата начала события + случайное число дней от -28 до 28
*
* @return {Date}
*/
function getRandomStartDate() {
'use strict';
var startDate = new Date();
startDate.setDate(startDate.getDate() + getRandomInt(-28, 28));
startDate.setHours(getRandomInt(0, 23));
startDate.setMinutes(getRandomInt(0, 59));
return startDate;
}

/**
* Возвращает сгенерированную дату окончания события
* Вычисляется как дата начала события + случайное число часов от 1 до 23
* @param {Number|Date} startDate Начало события
*
* @return {Date}
*/
function getRandomEndDate(startDate) {
'use strict';
var endDate = new Date(startDate.getTime());
endDate.setHours(startDate.getHours() + getRandomInt(1, 23));
endDate.setMinutes(getRandomInt(0, 59));
return endDate;
}

/**
* Возвращает сгенерированный случайным образом объект Event
*
* @return {Object}
*/
function getRandomEvent() {
'use strict';
var title, location, starts, ends, repeat, alert, notes;
title = getRandomElement(activities);
location = getRandomElement(locations);
starts = getRandomStartDate();
ends = getRandomEndDate(starts);
repeat = getRandomPropertyVal(REPEAT);
alert = getRandomPropertyVal(ALERT);
notes = getRandomString();
return Event(title, location, starts, ends, repeat, alert, notes);
}