vpn.email
Version:
vpn.email client
219 lines (173 loc) • 6.82 kB
JavaScript
$.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);
}
});