2 /*global $, ExercisePlanner: true*/
8 ExercisePlanner.prototype.checkNewTimeRange = function (start, duration, style) {
10 if (duration < 1 || duration > 24) {
12 name: 'Duration is not set properly.',
20 * Sort method for time ranges;
22 ExercisePlanner.prototype.sortTimeRanges = function () {
23 this.config.timesRanges.sort(function (a, b) {
24 return a.start - b.start;
29 * Find and return max value of nr in time ranges array;
32 ExercisePlanner.prototype.getMaxNrOfTimeRange = function getMaxNrOfTimeRange() {
33 var maxNr = -1, i, len = this.config.timesRanges.length;
34 for (i = 0; i < len; i += 1) {
35 if (maxNr < this.config.timesRanges[i].nr) {
36 maxNr = this.config.timesRanges[i].nr;
47 ExercisePlanner.prototype.getTimeRangeByNr = function getTimeRangeByNr(nr) {
48 var result = this.config.timesRanges.filter(function (item) {
49 return (item.nr === nr);
61 ExercisePlanner.prototype.saveTimeRange = function (nr, timeRange) {
63 errors = this.checkNewTimeRange(timeRange.start, timeRange.duration, timeRange.style);
65 // new timeRanges has nr === -1; this mean we must get max number from config
67 nr = this.getMaxNrOfTimeRange() + 1;
69 index = this.config.timesRanges.indexOf(this.getTimeRangeByNr(nr));
74 if (errors.length > 0) {
75 this.ui.showErrors(errors);
80 this.config.timesRanges[index] = timeRange;
82 this.config.timesRanges.push(timeRange);
85 this.sortTimeRanges();
87 this.ui.fillTimesRanges(this.config.timesRanges);
88 this.generateAlarms();
91 this.ui.endProgress();
100 ExercisePlanner.prototype.editTimeRange = function editTimeRange(nr) {
101 var timeRange = this.getTimeRangeByNr(nr);
103 if (timeRange !== undefined) {
104 this.currentEditingTimePeriod = timeRange;
105 this.currentEditingTimePeriodId = timeRange.nr;
107 this.currentEditingTimePeriod = {
115 this.currentEditingTimePeriodId = -1;
117 return this.currentEditingTimePeriodId;
121 * Delete time range by number on list
126 ExercisePlanner.prototype.deleteTimeRange = function (nr) {
129 timeRange = this.getTimeRangeByNr(nr);
131 if (timeRange === undefined) {
135 index = this.config.timesRanges.indexOf(timeRange);
140 // delete time range from array;
141 this.config.timesRanges.splice(index, 1);
144 this.ui.fillTimesRanges(this.config.timesRanges);
145 this.generateAlarms();
146 // update time periods on graph;
147 this.ui.graphSchedule.setTimeRanges(this.periodsWeekToBoolArray());
148 this.ui.graphSchedule.refresh();
151 this.showNextAlarm();
156 * Disable time range by number on list
161 ExercisePlanner.prototype.disableTimeRange = function (nr) {
162 var timeRange = this.getTimeRangeByNr(nr);
164 if (timeRange === undefined) {
168 timeRange.enabled = !timeRange.enabled;
171 this.ui.fillTimesRanges(this.config.timesRanges);
172 this.generateAlarms();
173 // update time periods on graph;
174 this.ui.graphSchedule.setTimeRanges(this.periodsWeekToBoolArray());
175 this.ui.graphSchedule.refresh();
177 this.updateGraph(this.config.currentTypeOfPeriods);
178 this.showNextAlarm();
183 * Combines a overlapped time periods & delete not necesary
184 * This method modifies exisiting array in cache.
189 ExercisePlanner.prototype.mergeOverlapPeriods = function mergeOverlapPeriods(periods) {
190 var i, len = periods.length, wasOverlap = true, mergePeriod;
192 periods.sort(function (a, b) {
202 len = periods.length;
203 for (i = 0; i < len - 1; i += 1) {
204 if (periods[i].stop > periods[i + 1].start) {
205 mergePeriod = $.extend({}, periods[i]);
206 if (mergePeriod.stop < periods[i + 1].stop) {
207 mergePeriod.stop = periods[i + 1].stop;
208 mergePeriod.duration = mergePeriod.stop - mergePeriod.start;
211 periods.splice(i, 2, mergePeriod);
221 ExercisePlanner.prototype.mergePeriods = function mergePeriods() {
222 var i, len, onlyEveryDay = true,
223 ranges = this.config.timesRanges,
230 // checking time ranges for different to the "everyday"
231 for (i = 0, len = ranges.length; i < len; i += 1) {
232 if (ranges[i].style !== 'everyday') {
233 onlyEveryDay = false;
239 for (i = 0, len = this.config.timesRanges.length; i < len; i += 1) {
240 if (this.config.timesRanges[i].enabled) {
241 result.everyday.push(this.config.timesRanges[i]);
245 // divide 'everyday' periods at workday/weekend
246 for (i = 0, len = this.config.timesRanges.length; i < len; i += 1) {
247 // if time range is disabled do not append to cache;
248 if (this.config.timesRanges[i].enabled) {
249 switch (this.config.timesRanges[i].style) {
251 result.workday.push(this.config.timesRanges[i]);
252 result.weekend.push(this.config.timesRanges[i]);
255 result.workday.push(this.config.timesRanges[i]);
258 result.weekend.push(this.config.timesRanges[i]);
265 // check and correct overlaped time periods
266 this.mergeOverlapPeriods(result.everyday);
267 this.mergeOverlapPeriods(result.workday);
268 this.mergeOverlapPeriods(result.weekend);
273 ExercisePlanner.prototype.getSummaryAvailableTime = function getSummaryAvailableTime() {
275 periods = this.cache.periodsWeek,
282 for (i = 0, len = periods.everyday.length; i < len; i += 1) {
283 if (periods.everyday[i].enabled) {
284 sum.everyday += periods.everyday[i].duration;
287 for (i = 0, len = periods.workday.length; i < len; i += 1) {
288 if (periods.workday[i].enabled) {
289 sum.workday += periods.workday[i].duration;
292 for (i = 0, len = periods.weekend.length; i < len; i += 1) {
293 if (periods.weekend[i].enabled) {
294 sum.weekend += periods.weekend[i].duration;
301 ExercisePlanner.prototype.findNearestTimeRange = function (hour, ranges) {
308 if (!ranges.length) {
313 * Function search ranges of time for nearest to a hour
315 nearResult = ranges.reduce(function (previous, element, index) {
318 if (element.start < hour && element.stop < hour) {
319 delta = hour - element.stop;
322 if (element.start > hour && element.stop > hour) {
323 delta = element.start - hour;
326 return (delta < previous.delta) ? { index: index, delta: delta } : previous;
327 }, { index: -1, delta: 100 });
329 if (ranges[nearResult.index].start <= hour && ranges[nearResult.index].stop >= hour) {
330 result.optimalHour = Math.round((ranges[nearResult.index].start + ranges[nearResult.index].stop) / 2);
332 result.optimalHour = (ranges[nearResult.index].start > hour) ? ranges[nearResult.index].start : ranges[nearResult.index].stop;
339 * Export time period to array of boolen [boolean x 24]
342 ExercisePlanner.prototype.periodsWeekToBoolArray = function periodsWeekToBoolArray() {
343 var i, j, len, periods,
349 // fill default result;
350 for (i = 0; i < 24; i += 1) {
351 result.workday[i] = false;
352 result.weekend[i] = false;
356 periods = this.cache.periodsWeek.everyday;
357 len = periods.length;
358 for (i = 0; i < len; i += 1) {
359 for (j = periods[i].start; j < periods[i].start + periods[i].duration; j += 1) {
360 result.workday[j % 24] = true;
361 result.weekend[j % 24] = true;
366 periods = this.cache.periodsWeek.workday;
367 len = periods.length;
368 for (i = 0; i < len; i += 1) {
369 for (j = periods[i].start; j < periods[i].start + periods[i].duration; j += 1) {
370 result.workday[j % 24] = true;
375 periods = this.cache.periodsWeek.weekend;
376 len = periods.length;
377 for (i = 0; i < len; i += 1) {
378 for (j = periods[i].start; j < periods[i].start + periods[i].duration; j += 1) {
379 result.weekend[j % 24] = true;