var pomelo = window.pomelo;
var username;
var users;
var rid;
var base = 1000;
var increase = 25;
var reg = /^[a-zA-Z0-9_\u4e00-\u9fa5]+$/;
var LOGIN_ERROR = "There is no server to log in, please wait.";
var LENGTH_ERROR = "Name/Channel is too long or too short. 20 character max.";
var NAME_ERROR = "Bad character in Name/Channel. Can only have letters, numbers, Chinese characters, and '_'";
var DUPLICATE_ERROR = "Please change your name to login.";
var reg_profile= /^profile(\d*)_(\d*)/;
Date.prototype.Format = function(fmt) {
var o = {
"M+" : this.getMonth() + 1,
"d+" : this.getDate(),
"h+" : this.getHours(),
"m+" : this.getMinutes(),
"s+" : this.getSeconds(),
"q+" : Math.floor((this.getMonth() + 3) / 3),
"S" : this.getMilliseconds()
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
util = {
urlRE: /https?:\/\/([-\w\.]+)+(:\d+)?(\/([^\s]*(\?\S+)?)?)?/g,
// html sanitizer
toStaticHTML: function(inputHtml) {
inputHtml = inputHtml.toString();
return inputHtml.replace(/&/g, "&").replace(//g, ">");
},
//pads n with zeros on the left,
//digits is minimum length of output
//zeroPad(3, 5); returns "005"
//zeroPad(2, 500); returns "500"
zeroPad: function(digits, n) {
n = n.toString();
while(n.length < digits)
n = '0' + n;
return n;
},
//it is almost 8 o'clock PM here
//timeString(new Date); returns "19:49"
timeString: function(date) {
var minutes = date.getMinutes().toString();
var hours = date.getHours().toString();
return this.zeroPad(2, hours) + ":" + this.zeroPad(2, minutes);
},
//does the argument only contain whitespace?
isBlank: function(text) {
var blank = /^\s*$/;
return(text.match(blank) !== null);
}
};
//always view the most recent message when it is added
function scrollDown(base) {
window.scrollTo(0, base);
$("#entry").focus();
};
// add message on board
function addMessage(from, target, text, time) {
var name = (target == '*' ? 'all' : target);
if(text === null) return;
if(time == null) {
// if the time is null or undefined, use the current time.
time = new Date().Format("MM-dd hh:mm:ss")
} else if((time instanceof Date) === false) {
// if it's a timestamp, interpret it
time = util.timeString(new Date(time));
}
//every message you see is actually a table with 3 cols:
// the time,
// the person who caused the event,
// and the content
var messageElement = $(document.createElement("table"));
messageElement.addClass("message");
// sanitize
text = util.toStaticHTML(text);
var content = '
' + ' ' + time + ' | ' + ' ' + util.toStaticHTML(from) + ' says to ' + name + ': ' + ' | ' + ' ' + text + ' | ' + '
';
messageElement.html(content);
//the log is the stream that we view
$("#chatHistory").append(messageElement);
base += increase;
scrollDown(base);
};
// show tip
function tip(type, name) {
var tip,title;
switch(type){
case 'online':
tip = name + ' is online now.';
title = 'Online Notify';
break;
case 'offline':
tip = name + ' is offline now.';
title = 'Offline Notify';
break;
case 'message':
tip = name + ' is saying now.'
title = 'Message Notify';
break;
}
var pop=new Pop(title, tip);
};
// init user list
function initUserList(data) {
users = data.users;
for(var i = 0; i < users.length; i++) {
var slElement = $(document.createElement("option"));
slElement.attr("value", users[i]);
slElement.text(users[i]);
$("#usersList").append(slElement);
}
};
// add user in user list
function addUser(user) {
var slElement = $(document.createElement("option"));
slElement.attr("value", user);
slElement.text(user);
$("#usersList").append(slElement);
};
// remove user from user list
function removeUser(user) {
$("#usersList option").each(
function() {
if($(this).val() === user) $(this).remove();
});
};
// set your name
function setName() {
$("#name").text(username);
};
// set your room
function setRoom() {
$("#room").text(rid);
};
// show error
function showError(content) {
$("#loginError").text(content);
$("#loginError").show();
};
// show login panel
function showLogin() {
$("#loginView").show();
$("#chatHistory").hide();
$("#toolbar").hide();
$("#loginError").hide();
$("#loginUser").focus();
};
// show chat panel
function showChat() {
$("#loginView").hide();
$("#loginError").hide();
$("#toolbar").show();
$("entry").focus();
scrollDown(base);
};
// query connector
function queryEntry(uid, callback) {
var route = 'gate.gateHandler.queryEntry';
pomelo.init({
host: window.location.hostname,
port: 3014,
log: true
}, function() {
pomelo.request(route, {
uid: uid
}, function(data) {
pomelo.disconnect();
if(data.code === 500) {
showError(LOGIN_ERROR);
return;
}
callback(data.host, data.port);
});
});
};
$(document).ready(function() {
//when first time into chat room.
showLogin();
//wait message from the server.
pomelo.on('onChat', function(data) {
// code by heliang
// console.log("onChat: " + data.msg);
if(reg_profile.test(data.msg)){
return
}
addMessage(data.from, data.target, data.msg);
$("#chatHistory").show();
if(data.from !== username)
tip('message', data.from);
});
//update user list
pomelo.on('onAdd', function(data) {
var user = data.user;
tip('online', user);
addUser(user);
});
//update user list
pomelo.on('onLeave', function(data) {
var user = data.user;
tip('offline', user);
removeUser(user);
});
//handle disconect message, occours when the client is disconnect with servers
pomelo.on('disconnect', function(reason) {
showLogin();
});
//deal with login button click.
$("#login").click(function() {
username = $("#loginUser").attr("value");
rid = $('#channelList').val();
if(username.length > 20 || username.length == 0 || rid.length > 20 || rid.length == 0) {
showError(LENGTH_ERROR);
return false;
}
if(!reg.test(username) || !reg.test(rid)) {
showError(NAME_ERROR);
return false;
}
//query entry of connection
queryEntry(username, function(host, port) {
pomelo.init({
host: host,
port: port,
log: true
}, function() {
var route = "connector.entryHandler.enter";
pomelo.request(route, {
username: username,
rid: rid
}, function(data) {
if(data.error) {
showError(DUPLICATE_ERROR);
return;
}
setName();
setRoom();
showChat();
initUserList(data);
});
});
});
});
//deal with chat mode.
$("#entry").keypress(function(e) {
var route = "chat.chatHandler.send";
var target = $("#usersList").val();
if(e.keyCode != 13 /* Return */ ) return;
var msg = $("#entry").attr("value").replace("\n", "");
cnt_pers = 1
duration = 1
msg_cnt = cnt_pers * duration
interval = 1000 / cnt_pers
// code by hl
if(reg_profile.test(msg)){
[temp, cnt_pers, duration, ...res] = reg_profile.exec(msg)
cnt_pers = cnt_pers ? Number(cnt_pers) : 1
duration = duration ? Number(duration) : 1
msg_cnt = cnt_pers * duration
interval = 1000 / cnt_pers
alert("start profile cnt_pers:" + cnt_pers + " duration: " + duration);
}
console.log("send msg cnt: " + msg_cnt);
for(var i=0;i