UNPKG

vpn.email

Version:
219 lines (173 loc) 6.82 kB
$.widget("metro.streamer", { version: "3.0.0", options: { scrollBar: false, meterStart: 9, meterStop: 19, meterInterval: 20, slideToTime: "default", slideSleep: 1000, slideSpeed: 1000, onClick: function(event){} }, _create: function(){ var that = this, element = this.element, o = this.options, streams = element.find(".stream"), events = element.find(".event"), events_container = element.find(".events"), events_area = element.find(".events-area"), groups = element.find(".event-group"), event_streams = element.find(".event-stream"); $.each(element.data(), function(key, value){ if (key in o) { try { o[key] = $.parseJSON(value); } catch (e) { o[key] = value; } } }); element.data('streamSelect', -1); var meter = $("<ul/>").addClass("meter"); var i, j, m, start = o.meterStart, stop = o.meterStop, interval = o.meterInterval; var _intervals = []; for (i = start; i<stop; i++) { for (j = 0; j < 60; j+=interval) { m = (i<10?"0"+i:i)+":"+(j<10?"0"+j:j); $("<li/>").addClass("js-interval-"+ m.replace(":", "-")).html("<em>"+m+"</em>").appendTo(meter); _intervals.push(m); } } element.data("intervals", _intervals); meter.insertBefore(element.find(".events-grid")); //console.log(element.data("intervals")); // Re-Calc all event-stream width and set background for time element.find(".event-stream").each(function(i, s){ var event_stream_width = 0; var events = $(s).find(".event"); events.each(function(i, el){ event_stream_width += $(el).outerWidth() + parseInt($(el).css('margin-left')); }); $(s).css({ width: (event_stream_width + ( (events.length-1) * 2 ) + 1) }); $(s).find(".time").css("background-color", $(streams[i]).css('background-color')); }); // Set scrollbar events_container.css({ 'overflow-x': (o.scrollBar ? 'scroll' : 'hidden') }); // Set streamer height element.css({ height: element.find(".streams").outerHeight() + (o.scrollBar ? 20 : 0) }); // Re-Calc events-area width var events_area_width = 0; groups.each(function(i, el){ events_area_width += $(el).outerWidth(); }); events_area_width += ( (groups.length-1) * 2 ) + 10; events_area.css('width', events_area_width); events.each(function(i, el){ addTouchEvents(el); }); element.mousewheel(function(event, delta){ var scroll_value = delta * 50; events_container.scrollLeft(events_container.scrollLeft() - scroll_value); return false; }); streams.each(function(i, s){ $(s).mousedown(function(e){ if (element.data('streamSelect') == i) { events.removeClass('event-disable'); element.data('streamSelect', -1); } else { element.data('streamSelect', i); events.addClass('event-disable'); $(event_streams[i]).find(".event").removeClass("event-disable"); } }); }); this._createEvents(); this.slideToTime(o.slideToTime, o.slideSleep, o.slideSpeed); element.data('streamer', this); }, _createEvents: function(){ var that = this, element = this.element, o = this.options; var events = element.find(".event"); events.on('click', function(e){ var event = $(this); if (e.ctrlKey) { $(this).toggleClass("selected"); } if (typeof o.onClick === 'function') { o.onClick(event); } else { if (typeof window[o.onClick] === 'function') { window[o.onClick](event); } else { var result = eval("(function(){"+o.onClick+"})"); result.call(event); } } e.preventDefault(); }); element.find(".js-go-previous-time").on('click', function(e){ var next_index = element.data("intervals").indexOf(element.data("current-time")); if (next_index == 0) { return; } next_index--; var new_time = element.data("intervals")[next_index]; that.slideToTime(new_time, 0, o.slideSpeed); }); element.find(".js-go-next-time").on('click', function(e){ var next_index = element.data("intervals").indexOf(element.data("current-time")); if (next_index == element.data("intervals").length - 1) { return; } next_index++; var new_time = element.data("intervals")[next_index]; that.slideToTime(new_time, 0, o.slideSpeed); }); element.find(".js-show-all-streams").on("click", function(e){ element.find(".event").removeClass("event-disable"); element.data('streamSelect', -1); e.preventDefault(); }); element.find(".js-schedule-mode").on("click", function(e){ $(this).toggleClass("active"); element.data("schedule-mode", $(this).hasClass("inverse")); e.preventDefault(); }); }, slideToTime: function(time, sleep, speed){ var that = this, element = this.element, interval, _time; if (time === 'default') { interval = element.find(".meter li")[0]; time = interval.className.replace("js-interval-", "").replace("-", ":"); } else { _time = time.split(":"); if (_time[0].length === 1) { time = '0' + time; } } interval = element.find(".meter li.js-interval-"+time.replace(":", "-"))[0]; setTimeout(function(){ element.find(".events").animate({ scrollLeft: (interval.offsetLeft - $('.streams').width()) }, speed, function(){ that._afterSlide(); }); }, sleep); element.data("current-time", time); }, _afterSlide: function(){ }, _destroy: function(){ }, _setOption: function(key, value){ this._super('_setOption', key, value); } });