Cześć. Miałem stworzyć mały skrypt, którego zadaniem jest wyświetlanie użytkownikowi dialogu z tabelką o nadchodzących wydarzeniach dla niego. Pierwszy dialog miał się wyświetlać raz per login i obejmować wydarzenia na nadchodzący dzień, a drugi dialog miał pokazywać wydażenia które odbędą się w < 15 minut. Oczywiście odstęp pomiędzy dialogami to minimalnei 15 min. tzn. nie spamuje nam to okienko co chwilę, tylko zbiorczo pokazuje na nadchodzace 15 minut (jezeli takie wydazenia sa oczywiscie). Po wylogowaniu wszystko się resetuje.
Oto kod, sama część JS, bo głownie na tej części mi zależy. Dziękuję bardzo za poświęcony czas :)
var upcomingEvents = {
init: function (options) {
this.bindHandlers();
var o = this.options = options;
this.checkForEventsCount(o.searchParams, this.displayDialog, o.makeDialogParams);
},
bindHandlers: function () {
$("[data-rack='logout']").click($.proxy(function () {
this.discardLocalStorageInfo();
}, this));
},
checkForEventsCount: function(search, callback, params) {
$.ajax({
type: "POST",
url: "/activity/index/get-upcoming-events-count",
data: search,
success: function(msg){
if(msg !== "0") {
callback.call(upcomingEvents, params);
}
}
});
},
displayDialog: function (params) {
if(typeof params === "undefined") params = arguments;
var obj = $('<a></a>'), search;
if (typeof params.rel !== "undefined") {
obj.attr("rel", params.rel);
}
if (typeof this.options.searchParams !== "undefined") {
search = JSON.stringify(this.options.searchParams);
obj.attr("data-params", search);
}
if(typeof params["data-close"] !== 'undefined')
obj.attr("data-close", params["data-close"]);
if (typeof params.url !== "undefined") {
obj.attr('data-href', params.url);
makeDialogGeneric(null, obj);
this.setLocalStorageInfo(this.options.dialogType, true);
this.setNextNotificationGap();
}
},
ifDisplayDialog: function() {
return this.getLocalStorageInfo().length === 0
},
ifDisplayDialogLastMinute: function() {
var ifRegularAlreadyDisplayed = this.getLocalStorageInfo().length === 2;
var ifGapHasPassed = this.getNotificationGap() < new Date().getTime();
return ifRegularAlreadyDisplayed && ifGapHasPassed;
},
getLocalStorageInfo: function () {
var patt = /upcoming_events/;
var keys = [];
for(var key in localStorage) {
if(localStorage.hasOwnProperty(key) && patt.test(key))
keys.push(key);
}
return keys;
},
setLocalStorageInfo: function (name, value) {
localStorage.setItem(name, value);
},
discardLocalStorageInfo: function () {
var patt = /upcoming_events/;
for(var key in localStorage) {
if(localStorage.hasOwnProperty(key) && patt.test(key))
localStorage.removeItem(key);
}
},
setNextNotificationGap: function(gap) {
gap = gap || new Date().getTime() + locale.time.FIFTEEN_MINUTES_IN_MILLISECONDS;
localStorage.setItem("upcoming_events_next", gap);
},
getNotificationGap: function() {
return localStorage.getItem("upcoming_events_next");
}
};
(function() {
var currentTime = new Date().getTime();
var endDate, dialogType;
if (upcomingEvents.ifDisplayDialog()) {
endDate = currentTime + locale.time.DAY_IN_MILLISECONDS;
dialogType = "upcoming_events"
} else if (upcomingEvents.ifDisplayDialogLastMinute()) {
endDate = currentTime + locale.time.FIFTEEN_MINUTES_IN_MILLISECONDS;
dialogType = "upcoming_events_last_minute"
}
if(typeof endDate !== "undefined") {
upcomingEvents.init({
searchParams: {
search: { // got to be nested object to access it by 'search' in controller
start_date: currentTime,
end_date: endDate
},
sort: "start_dateDes"
},
makeDialogParams: {
rel: "800, 400",
url: "/activity/index/upcoming-events/",
"data-close": true
},
dialogType: dialogType
});
} else {
$("[data-rack='logout']").click($.proxy(function () {
this.discardLocalStorageInfo();
}, upcomingEvents));
}
})();