Alice
view release on metacpan or search on metacpan
share/static/alice.js view on Meta::CPAN
var alias = $('connections').down('.active').id.replace(/^menu_/, "");
if (alias && confirm("Are you sure you want to remove "+alias+"?")) {
$("menu_"+alias).remove();
$("setting_"+alias).remove();
$("connections").down("li").addClassName("active");
$("config_data").down("table").addClassName("active");
}
},
submit: function(form) {
var params = form.serialize(true);
form.select(".channelselect").each(function(select) {
params[select.name] = $A(select.options).map(function(opt){return opt.value});
});
new Ajax.Request('/save', {
method: 'post',
parameters: params,
onSuccess: function(){Alice.connections.remove()}
});
return false;
},
remove: function() {
alice.input.disabled = false;
$('servers').remove();
},
serverConnection: function(alias, action) {
alice.connection.sendMessage({
msg: '/' + action + ' ' + alias,
source: alice.activeWindow().id,
});
return false;
}
}
});
Element.addMethods({
redraw: function(element){
element = $(element);
var n = document.createTextNode(' ');
element.appendChild(n);
(function(){n.parentNode.removeChild(n)}).defer();
return element;
}
});
Alice.Application = Class.create({
initialize: function() {
this.options = {};
this.isFocused = true;
this.window_map = new Hash();
this.previousFocus = 0;
this.selectedSet = '';
this.tabs = $('tabs');
this.topic = $('topic');
this.nicklist = $('nicklist');
this.overlayVisible = false;
this.lastnotify = 0;
this.topic_height = "14px";
this.beep = new Audio("/static/beep.mp3");
this.oembeds = [];
this.jsonp_callbacks = {};
this.connection = window.WebSocket && !window.location.search.match(/&?stream=xhr/) ?
new Alice.Connection.WebSocket(this)
: new Alice.Connection.XHR(this);
this.tabs_width = $('tabs_container').getWidth();
this.tabs_layout = this.tabs.getLayout();
this.base_filters = this.baseFilters();
this.message_filters = [];
this.supportsTouch = 'createTouch' in document;
this.isPhone = window.navigator.userAgent.match(/(android|iphone|wosbrowser)/i) ? true : false;
this.isMobile = this.isPhone || Prototype.Browser.MobileSafari;
this.loadDelay = this.isMobile ? 3000 : 1000;
if (window.navigator.standalone || window.navigator.userAgent.match(/Fluid/)) this.loadDelay = 0;
this.keyboard = new Alice.Keyboard(this);
this.input = new Alice.Input(this, "msg");
this.submit = $("submit");
this.submit.observe("click", function (e) {
this.input.send(); e.stop()}.bind(this));
this.tabs.observe("webkitTransitionEnd", this.shiftEnd.bind(this));
this.tabs.observe("transitionend", this.shiftEnd.bind(this));
this.makeSortable();
this.setupTopic();
this.setupNicklist();
this.setupMenus();
},
getBacklog: function (win, max, limit) {
this.connection.requestChunk(win.id, limit, max);
},
fetchOembeds: function(cb) {
var req = new XMLHttpRequest();
req.open("GET", "https://noembed.com/providers");
req.onreadystatechange = function(){
if (req.readyState == 4) {
try {
var providers = req.responseText.evalJSON();
this.oembeds = providers.inject([], function(acc, site){
return acc.concat(site.patterns.map(function(pat){return new RegExp(pat)}));
});
} catch (e) {}
setTimeout(this.fetchOembeds.bind(this), 1000 * 60 * 5);
if (cb) cb();
}
}.bind(this);
share/static/alice.js view on Meta::CPAN
}
}.bind(this));
}.bind(this));
},
baseFilters: function() {
return [
function(li, win) {
Alice.makeLinksClickable(li.down("div.msg"));
},
function(li, win) {
if (li.hasClassName("avatar")) {
if (this.options.avatars == "show") {
var avatar = li.getAttribute("avatar");
if (avatar)
li.down("a.nick").insert('<img src="'+alice.options.image_prefix+avatar+'" />');
}
else {
li.removeClassName("avatar");
}
}
},
function(li, win) {
if (li.hasClassName("consecutive")) {
var prev = li.previous();
if (!prev) return;
if (prev && prev.hasClassName("avatar") && !prev.hasClassName("consecutive"))
prev.down('div.msg').setStyle({minHeight: '0px'});
if (prev && prev.hasClassName("monospaced"))
prev.down('div.msg').setStyle({paddingBottom: '0px'});
}
},
function(li, win) {
var stamp = li.down('.timestamp');
if (!stamp) return;
var remove = false;
var seconds = stamp.innerHTML.strip();
if (li.hasClassName("message")) {
var time = new Date(seconds * 1000);
var diff = (time - win.lasttimestamp) / 1000;
remove = !(diff >= 300 || (diff > 60 && time.getMinutes() % 5 == 0));
if (!remove) win.lasttimestamp = time;
}
if (remove) {
stamp.remove();
}
else {
stamp.update(Alice.epochToLocal(seconds, this.options.timeformat));
stamp.style.opacity = 1;
}
},
function(li, win) {
if (!this.overlayVisible || !li.hasClassName("avatar")) return;
var nick = li.down('span.nick');
if (nick) nick.style.opacity = 1;
},
function(li, win) {
if (win.bulk_insert) return;
if (li.hasClassName("message") && !win.active && win.title != "info") {
if (li.hasClassName("highlight") || win.type == "privmsg")
win.markUnread("highlight");
else if (!li.hasClassName("self"))
win.markUnread();
}
},
function(li, win) {
if (this.options.alerts != "show" && this.options.audio != "show") return;
if (this.isFocused || win.bulk_insert || li.hasClassName("self")) return;
if (li.hasClassName("highlight") || win.type == "privmsg") {
var prefix = "";
if (win.type != "privmsg")
prefix = li.down("span.nick").innerHTML.stripTags().unescapeHTML() + " in ";
var message = {
body: li.down(".msg").innerHTML.stripTags().unescapeHTML(),
subject: prefix + win.title.stripTags().unescapeHTML()
};
var time = (new Date()).getTime();
if (time - this.lastnotify > 5000) {
this.lastnotify = time;
if (this.options.alerts == "show")
Alice.growlNotify(message);
if (this.options.audio == "show") {
this.beep.currentTime = 0;
this.beep.play();
}
}
this.addMissed();
}
}
];
},
toggleOverlay: function () {
this.overlayVisible = !this.overlayVisible;
var opacity = this.overlayVisible ? 1 : 0;
$$("li.avatar span.nick").each(function(span){
span.style.opacity = opacity;
});
}
});
Alice.Connection = {
gotoLogin: function() {
window.location = "/login";
},
connect: function(cb) {
if (this.reconnect_count > 3) {
this.aborting = true;
this.changeStatus("ok");
if (this.type == "websocket") {
this.application.activeWindow().showAlert("WebSocket connection failed, falling back...");
this.application.connection = new Alice.Connection.XHR(this.application);
this.application.connection.connect();
return;
}
this.application.activeWindow().showAlert("Alice server is not responding (<a href='javascript:alice.connection.reconnect()'>reconnect</a>)");
return;
}
this.pings = [];
this.closeConnection();
this.len = 0;
this.reconnect_count++;
this.changeStatus("loading");
this._connect(cb);
},
changeStatus: function(classname) {
$('connection_status').className = classname;
},
reconnect: function () {
this.reconnecting = true;
this.reconnect_count = 0;
this.connect();
},
handleException: function(request, exception) {
this.application.log("encountered an error with stream.");
this.application.log(exception);
this.connected = false;
if (!this.aborting)
setTimeout(this.connect.bind(this), 2000);
else
this.changeStatus("ok");
},
handleComplete: function(transport) {
this.application.log("connection was closed cleanly.");
this.connected = false;
if (!this.aborting)
share/static/alice.js view on Meta::CPAN
clearMessages: function() {
clearTimeout(this.scrollListener);
this.messages.update("");
this.lastNick = "";
},
updateTabLayout: function() {
this.tab_layout = this.tab.getLayout();
},
getTabPosition: function() {
var shift = this.application.tabShift();
var tabs_width = this.application.tabsWidth();
var tab_width = this.tab_layout.get("width");
var offset_left = this.tab_layout.get("left") + shift;
var offset_right = tabs_width - (offset_left + tab_width);
var overflow_right = Math.abs(Math.min(0, offset_right));
var overflow_left = Math.abs(Math.min(0, offset_left));
return {
right: overflow_right,
left: overflow_left
};
},
shiftTab: function() {
var left = null
, time = 0
, pos = this.getTabPosition();
if (pos.left) {
this.application.shiftTabs(pos.left);
}
else if (pos.right) {
this.application.shiftTabs(-pos.right);
}
},
unFocus: function() {
this.lastScrollPosition = this.captureScrollPosition();
this.active = false;
this.element.removeClassName('active');
this.tab.removeClassName('active');
clearTimeout(this.scrollListener);
this.addFold();
},
addFold: function() {
this.messages.select("li.fold").invoke("removeClassName", "fold");
var last = this.messages.childElements().last();
if (last) last.addClassName("fold");
},
showNick: function (e) {
var li = e.findElement("li.message");
if (li && li.hasClassName("avatar")) {
if (this.application.overlayVisible || li == this.visibleNick) return;
clearTimeout(this.visibleNickTimeout);
this.visibleNick = li;
var nick;
if (li.hasClassName("consecutive")) {
var stem = li.previous("li:not(.consecutive)");
if (!stem) return;
nick = stem.down("span.nick");
} else {
nick = li.down("span.nick");
}
if (nick) {
this.visibleNickTimeout = setTimeout(function(nick) {
if (nick) nick.style.opacity = 1;
setTimeout(function(){
if (this.application.overlayVisible) return;
if (nick) nick.style.opacity = 0;
}.bind(this, nick) , 1000);
}.bind(this, nick), 500);
}
}
else {
this.visibleNick = "";
clearTimeout(this.visibleNickTimeout);
}
},
focus: function(event) {
if (!this.application.currentSetContains(this)) return;
this.application.previousFocus = this.application.activeWindow();
if (this != this.application.previousFocus)
this.application.previousFocus.unFocus();
this.element.addClassName('active');
this.tab.addClassName('active');
if (!this.active) {
this.active = true;
setTimeout(function(){
this.scrollToPosition(this.lastScrollPosition);
if (!this.scrollBackEmpty) this.checkScrollBack();
}.bind(this), 0);
}
this.application.setSource(this.id);
this.application.displayNicks(this.nicks);
this.markRead();
this.setWindowHash();
this.shiftTab();
var last = this.messages.childElements().last();
if (last && last.hasClassName("fold"))
last.removeClassName("fold");
this.application.displayTopic(this.topic);
document.title = this.title;
return this;
},
setWindowHash: function () {
var new_hash = "#" + this.application.selectedSet + this.hashtag;
if (new_hash != window.location.hash) {
window.location.hash = encodeURI(new_hash);
window.location = window.location.toString();
}
},
markRead: function () {
this.tab.removeClassName("unread");
this.tab.removeClassName("highlight");
this.statuses = [];
this.application.unHighlightChannelSelect(this.id);
},
( run in 1.336 second using v1.01-cache-2.11-cpan-39bf76dae61 )