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();
99 ExercisePlanner.prototype.editTimeRange = function editTimeRange(nr) {
100 var timeRange = this.getTimeRangeByNr(nr);
102 if (timeRange !== undefined) {
103 this.currentEditingTimePeriod = timeRange;
104 this.currentEditingTimePeriodId = timeRange.nr;
106 this.currentEditingTimePeriod = {
114 this.currentEditingTimePeriodId = -1;
116 return this.currentEditingTimePeriodId;
120 * Delete time range by number on list
125 ExercisePlanner.prototype.deleteTimeRange = function (nr) {
128 timeRange = this.getTimeRangeByNr(nr);
130 if (timeRange === undefined) {
134 index = this.config.timesRanges.indexOf(timeRange);
139 // delete time range from array;
140 this.config.timesRanges.splice(index, 1);
143 this.ui.fillTimesRanges(this.config.timesRanges);
144 this.generateAlarms();
145 // update time periods on graph;
146 this.ui.graphSchedule.setTimeRanges(this.periodsWeekToBoolArray());
147 this.ui.graphSchedule.refresh();
150 this.showNextAlarm();
155 * Disable time range by number on list
160 ExercisePlanner.prototype.disableTimeRange = function (nr) {
161 var timeRange = this.getTimeRangeByNr(nr);
163 if (timeRange === undefined) {
167 timeRange.enabled = !timeRange.enabled;
170 this.ui.fillTimesRanges(this.config.timesRanges);
171 this.generateAlarms();
172 // update time periods on graph;
173 this.ui.graphSchedule.setTimeRanges(this.periodsWeekToBoolArray());
174 this.ui.graphSchedule.refresh();
176 this.updateGraph(this.config.currentTypeOfPeriods);
177 this.showNextAlarm();
182 * Combines a overlapped time periods & delete not necesary
183 * This method modifies exisiting array in cache.
188 ExercisePlanner.prototype.mergeOverlapPeriods = function mergeOverlapPeriods(periods) {
189 var i, len = periods.length, wasOverlap = true, mergePeriod;
191 periods.sort(function (a, b) {
201 len = periods.length;
202 for (i = 0; i < len - 1; i += 1) {
203 if (periods[i].stop > periods[i + 1].start) {
204 mergePeriod = $.extend({}, periods[i]);
205 if (mergePeriod.stop < periods[i + 1].stop) {
206 mergePeriod.stop = periods[i + 1].stop;
207 mergePeriod.duration = mergePeriod.stop - mergePeriod.start;
210 periods.splice(i, 2, mergePeriod);
220 ExercisePlanner.prototype.mergePeriods = function mergePeriods() {
221 var i, len, onlyEveryDay = true,
222 ranges = this.config.timesRanges,
229 // checking time ranges for different to the "everyday"
230 for (i = 0, len = ranges.length; i < len; i += 1) {
231 if (ranges[i].style !== 'everyday') {
232 onlyEveryDay = false;
238 for (i = 0, len = this.config.timesRanges.length; i < len; i += 1) {
239 if (this.config.timesRanges[i].enabled) {
240 result.everyday.push(this.config.timesRanges[i]);
244 // divide 'everyday' periods at workday/weekend
245 for (i = 0, len = this.config.timesRanges.length; i < len; i += 1) {
246 // if time range is disabled do not append to cache;
247 if (this.config.timesRanges[i].enabled) {
248 switch (this.config.timesRanges[i].style) {
250 result.workday.push(this.config.timesRanges[i]);
251 result.weekend.push(this.config.timesRanges[i]);
254 result.workday.push(this.config.timesRanges[i]);
257 result.weekend.push(this.config.timesRanges[i]);
264 // check and correct overlaped time periods
265 this.mergeOverlapPeriods(result.everyday);
266 this.mergeOverlapPeriods(result.workday);
267 this.mergeOverlapPeriods(result.weekend);
272 ExercisePlanner.prototype.getSummaryAvailableTime = function getSummaryAvailableTime() {
274 periods = this.cache.periodsWeek,
281 for (i = 0, len = periods.everyday.length; i < len; i += 1) {
282 if (periods.everyday[i].enabled) {
283 sum.everyday += periods.everyday[i].duration;
286 for (i = 0, len = periods.workday.length; i < len; i += 1) {
287 if (periods.workday[i].enabled) {
288 sum.workday += periods.workday[i].duration;
291 for (i = 0, len = periods.weekend.length; i < len; i += 1) {
292 if (periods.weekend[i].enabled) {
293 sum.weekend += periods.weekend[i].duration;
300 ExercisePlanner.prototype.findNearestTimeRange = function (hour, ranges) {
307 if (!ranges.length) {
312 * Function search ranges of time for nearest to a hour
314 nearResult = ranges.reduce(function (previous, element, index) {
317 if (element.start < hour && element.stop < hour) {
318 delta = hour - element.stop;
321 if (element.start > hour && element.stop > hour) {
322 delta = element.start - hour;
325 return (delta < previous.delta) ? { index: index, delta: delta } : previous;
326 }, { index: -1, delta: 100 });
328 if (ranges[nearResult.index].start <= hour && ranges[nearResult.index].stop >= hour) {
329 result.optimalHour = Math.round((ranges[nearResult.index].start + ranges[nearResult.index].stop) / 2);
331 result.optimalHour = (ranges[nearResult.index].start > hour) ? ranges[nearResult.index].start : ranges[nearResult.index].stop;
338 * Export time period to array of boolen [boolean x 24]
341 ExercisePlanner.prototype.periodsWeekToBoolArray = function periodsWeekToBoolArray() {
342 var i, j, len, periods,
348 // fill default result;
349 for (i = 0; i < 24; i += 1) {
350 result.workday[i] = false;
351 result.weekend[i] = false;
355 periods = this.cache.periodsWeek.everyday;
356 len = periods.length;
357 for (i = 0; i < len; i += 1) {
358 for (j = periods[i].start; j < periods[i].start + periods[i].duration; j += 1) {
359 result.workday[j] = true;
360 result.weekend[j] = true;
365 periods = this.cache.periodsWeek.workday;
366 len = periods.length;
367 for (i = 0; i < len; i += 1) {
368 for (j = periods[i].start; j < periods[i].start + periods[i].duration; j += 1) {
369 result.workday[j] = true;
374 periods = this.cache.periodsWeek.weekend;
375 len = periods.length;
376 for (i = 0; i < len; i += 1) {
377 for (j = periods[i].start; j < periods[i].start + periods[i].duration; j += 1) {
378 result.weekend[j] = true;