2 /*global $, ExercisePlanner: true*/
8 ExercisePlanner.prototype.checkNewTimeRange = function (start, duration, style) {
9 console.log('ExercisePlanner_checkNewTimeRange', start, duration, style);
13 * deprecated if (start >= stop) { result.push({ name: 'Start time is greater or equal than
14 * stop time.', code: 1 }); }
19 name: 'Start time is not set.',
24 if (duration < 1 || duration > 24) {
26 name: 'Duration is not set properly.',
32 * deprecated if (!stop) { result.push({ name: 'Stop time is not set.', code: 3 }); }
38 * Sort method for time ranges;
40 ExercisePlanner.prototype.sortTimeRanges = function () {
41 console.log('ExercisePlanner_sortTimeRanges');
42 this.config.timesRanges.sort(function (a, b) {
43 return a.start - b.start;
48 * Find and return max value of nr in time ranges array;
51 ExercisePlanner.prototype.getMaxNrOfTimeRange = function getMaxNrOfTimeRange() {
52 var maxNr = -1, i, len = this.config.timesRanges.length;
53 for (i = 0; i < len; i += 1) {
54 if (maxNr < this.config.timesRanges[i].nr) {
55 maxNr = this.config.timesRanges[i].nr;
66 ExercisePlanner.prototype.getTimeRangeByNr = function getTimeRangeByNr(nr) {
67 var result = this.config.timesRanges.filter(function (item) {
68 return (item.nr === nr);
83 ExercisePlanner.prototype.saveTimeRange = function (nr, timeRange) {
84 console.log('ExercisePlanner_saveTimeRange', nr, timeRange);
86 errors = this.checkNewTimeRange(timeRange.start, timeRange.duration, timeRange.style);
89 // new timeRanges has nr === -1; this mean we must get max number from config
91 nr = this.getMaxNrOfTimeRange() + 1;
93 index = this.config.timesRanges.indexOf(this.getTimeRangeByNr(nr));
98 if (errors.length > 0) {
99 this.ui.showErrors(errors);
104 this.config.timesRanges[index] = timeRange;
106 this.config.timesRanges.push(timeRange);
109 this.sortTimeRanges();
111 this.ui.fillTimesRanges(this.config.timesRanges);
112 this.generateAlarms();
123 ExercisePlanner.prototype.editTimeRange = function editTimeRange(nr) {
124 var timeRange = this.getTimeRangeByNr(nr);
126 if (timeRange !== undefined) {
127 this.currentEditingTimePeriod = timeRange;
128 this.currentEditingTimePeriodId = timeRange.nr;
130 this.currentEditingTimePeriod = {
138 this.currentEditingTimePeriodId = -1;
140 return this.currentEditingTimePeriodId;
144 * Delete time range by number on list
149 ExercisePlanner.prototype.deleteTimeRange = function (nr) {
150 console.log('ExercisePlanner_deleteTimeRange', nr);
153 timeRange = this.getTimeRangeByNr(nr);
155 if (timeRange === undefined) {
159 index = this.config.timesRanges.indexOf(timeRange);
164 // delete time range from array;
165 this.config.timesRanges.splice(index, 1);
168 this.ui.fillTimesRanges(this.config.timesRanges);
169 this.generateAlarms();
170 // update time periods on graph;
171 this.ui.graphSchedule.setTimeRanges(this.periodsWeekToBoolArray());
172 this.ui.graphSchedule.refresh();
175 this.showNextAlarm();
180 * Disable time range by number on list
185 ExercisePlanner.prototype.disableTimeRange = function (nr) {
186 console.log('ExercisePlanner_disableTimeRange', nr);
187 var timeRange = this.getTimeRangeByNr(nr);
189 if (timeRange === undefined) {
193 timeRange.enabled = !timeRange.enabled;
196 this.ui.fillTimesRanges(this.config.timesRanges);
197 this.generateAlarms();
198 // update time periods on graph;
199 this.ui.graphSchedule.setTimeRanges(this.periodsWeekToBoolArray());
200 this.ui.graphSchedule.refresh();
202 this.updateGraph(this.config.currentTypeOfPeriods);
203 this.showNextAlarm();
208 * Combines a overlapped time periods & delete not necesary
209 * This method modifies exisiting array in cache.
214 ExercisePlanner.prototype.mergeOverlapPeriods = function mergeOverlapPeriods(periods) {
215 var i, len = periods.length, wasOverlap = true, mergePeriod;
217 periods.sort(function (a, b) {
227 len = periods.length;
228 for (i = 0; i < len - 1; i += 1) {
229 if (periods[i].stop > periods[i + 1].start) {
230 mergePeriod = $.extend({}, periods[i]);
231 if (mergePeriod.stop < periods[i + 1].stop) {
232 mergePeriod.stop = periods[i + 1].stop;
233 mergePeriod.duration = mergePeriod.stop - mergePeriod.start;
236 periods.splice(i, 2, mergePeriod);
246 ExercisePlanner.prototype.mergePeriods = function mergePeriods() {
247 console.log('ExercisePlanner_mergePeriods');
248 var i, len, onlyEveryDay = true,
249 ranges = this.config.timesRanges,
256 // checking time ranges for different to the "everyday"
257 for (i = 0, len = ranges.length; i < len; i += 1) {
258 if (ranges[i].style !== 'everyday') {
259 onlyEveryDay = false;
265 for (i = 0, len = this.config.timesRanges.length; i < len; i += 1) {
266 if (this.config.timesRanges[i].enabled) {
267 result.everyday.push(this.config.timesRanges[i]);
271 // divide 'everyday' periods at workday/weekend
272 for (i = 0, len = this.config.timesRanges.length; i < len; i += 1) {
273 // if time range is disabled do not append to cache;
274 if (this.config.timesRanges[i].enabled) {
275 switch (this.config.timesRanges[i].style) {
277 result.workday.push(this.config.timesRanges[i]);
278 result.weekend.push(this.config.timesRanges[i]);
281 result.workday.push(this.config.timesRanges[i]);
284 result.weekend.push(this.config.timesRanges[i]);
291 // check and correct overlaped time periods
292 this.mergeOverlapPeriods(result.everyday);
293 this.mergeOverlapPeriods(result.workday);
294 this.mergeOverlapPeriods(result.weekend);
299 ExercisePlanner.prototype.getSummaryAvailableTime = function getSummaryAvailableTime() {
300 console.log('ExercisePlanner_getSummaryAvailableTime');
302 periods = this.cache.periodsWeek,
309 for (i = 0, len = periods.everyday.length; i < len; i += 1) {
310 if (periods.everyday[i].enabled) {
311 sum.everyday += periods.everyday[i].duration;
314 for (i = 0, len = periods.workday.length; i < len; i += 1) {
315 if (periods.workday[i].enabled) {
316 sum.workday += periods.workday[i].duration;
319 for (i = 0, len = periods.weekend.length; i < len; i += 1) {
320 if (periods.weekend[i].enabled) {
321 sum.weekend += periods.weekend[i].duration;
328 ExercisePlanner.prototype.findNearestTimeRange = function (hour, ranges) {
329 console.log('ExercisePlanner_findNearestTimeRange', hour, ranges);
336 if (!ranges.length) {
341 * Function search ranges of time for nearest to a hour
343 nearResult = ranges.reduce(function (previous, element, index) {
346 if (element.start < hour && element.stop < hour) {
347 delta = hour - element.stop;
350 if (element.start > hour && element.stop > hour) {
351 delta = element.start - hour;
354 return (delta < previous.delta) ? { index: index, delta: delta } : previous;
355 }, { index: -1, delta: 100 });
357 if (ranges[nearResult.index].start <= hour && ranges[nearResult.index].stop >= hour) {
358 result.optimalHour = Math.round((ranges[nearResult.index].start + ranges[nearResult.index].stop) / 2);
360 result.optimalHour = (ranges[nearResult.index].start > hour) ? ranges[nearResult.index].start : ranges[nearResult.index].stop;
367 * Export time period to array of boolen [boolean x 24]
370 ExercisePlanner.prototype.periodsWeekToBoolArray = function periodsWeekToBoolArray() {
371 var i, j, len, periods,
377 // fill default result;
378 for (i = 0; i < 24; i += 1) {
379 result.workday[i] = false;
380 result.weekend[i] = false;
384 periods = this.cache.periodsWeek.everyday;
385 len = periods.length;
386 for (i = 0; i < len; i += 1) {
387 for (j = periods[i].start; j < periods[i].start + periods[i].duration; j += 1) {
388 result.workday[j] = true;
389 result.weekend[j] = true;
394 periods = this.cache.periodsWeek.workday;
395 len = periods.length;
396 for (i = 0; i < len; i += 1) {
397 for (j = periods[i].start; j < periods[i].start + periods[i].duration; j += 1) {
398 result.workday[j] = true;
403 periods = this.cache.periodsWeek.weekend;
404 len = periods.length;
405 for (i = 0; i < len; i += 1) {
406 for (j = periods[i].start; j < periods[i].start + periods[i].duration; j += 1) {
407 result.weekend[j] = true;