nick_rp1986yahoo.com / RPH Pings

// ==UserScript==
// @name       RPH Pings
// @namespace  https://openuserjs.org/scripts/nick_rp1986yahoo.com/RPH_Pings
// @version    0.2
// @description  Add pings back into rphaven. Update to allow a little more freedom in format of pings. Still requires comma delimiters but now trims spaces and new line characters.
// @match      http://chat.rphaven.com/
// @copyright  2012+, You
// @grant   none
// ==/UserScript==

var pingCookieData = getCookie('nb_pings');
var pings;
if(pingCookieData !== undefined){
    pings = pingCookieData.split(/ *, */);
}
else {
    pings = [];
}
var pingTool = {state: false};


$(function(){
    chatSocket.on('confirm-room-join', function(data){
       doRoomJoinSetup(data.room);
   });
    $('#top p.right').prepend('<a class="pings settings">Pings</a>|');
    $('body').append('<div id="pingBox" style="display: none; position: absolute; top: 35px; z-index: 9999999; border-radius: 10px; box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.7); right: 85px; background: url(&quot;http://www.rphaven.com/css/img/aero-bg.png&quot;) repeat scroll 0px 0px transparent; padding: 5px;" left="">\
                       <textarea name="pings" id="pings" style="background: rgb(255, 255, 255); border-radius: 5px 5px 0 0; height: 250px; width: 200px;"></textarea>\
                       <p style="background: rgb(51, 51, 51); width: 180px; padding: 10px; border-radius: 0px 0px 5px 5px; font-size: 0.8em;">Please split pings up with commas. e.g. Character Name, Name, John Smith</p>\
                    </div>');
    pingTool.box = $('#pingBox');
    pingTool.input = $('#pings');
    pingTool.button = $('#top a.pings');
    
    pingTool.input.html(pings.join(', '));
    
    pingTool.button.click(function(){
        pingTool.state = true;
        pingTool.box.show();
        pings = pingTool.input.val().replace('\n','').replace('\r','').split(/ *, */);
        setCookie('nb_pings',pings.join(', '),99999);
        pingTool.input.focus();
    });
    
    pingTool.input.blur(function(){
        pingTool.state = false;
        pingTool.box.hide();
        pings = pingTool.input.val().replace('\n','').replace('\r','').split(/ *, */);
        setCookie('nb_pings',pings.join(', '),99999);
    });
});

function setCookie(c_name,value,exdays) {
    var exdate=new Date();
    exdate.setDate(exdate.getDate() + exdays);
    var c_value=escape(value) + ((exdays===null) ? "" : ";     expires="+exdate.toUTCString());
    document.cookie=c_name + "=" + c_value;
}
function getCookie(c_name) {
    var i,x,y,ARRcookies=document.cookie.split(";");
    for (i=0;i<ARRcookies.length;i++) {
        x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
        y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
        x=x.replace(/^\s+|\s+$/g,"");
        if (x==c_name) {
            return unescape(y);
        }
    }
}

function doRoomJoinSetup(roomName){
	getRoom(roomName).onMessage = function (data){
		var thisRoom = this;
		if( account.ignores.indexOf(data.userid) !== -1 ){
			return;
		}
		//console.log('onMsg', data);
		var timestamp = makeTimestamp(data.time);
		var msg = parseMsg(data.msg);
		var classes = '';
		getUserById(data.userid, function(User){
			var $el = '';
			if( User.friendOf ){
				classes += 'friend ';
			}
			if( isOwnUser(User) ){
				classes += 'self ';
			}
			if( isOwnerOf(thisRoom, User) ){
				classes += 'owner ';
			} else if( isModOf(thisRoom, User) ){
				classes += 'mod ';
			}
			if( isInGroup(thisRoom, User) ){
				classes += 'group-member ';
			}
			
			var hasMatch = false;
			var testRegex;
			for(i = 0; i < pings.length; i++){
				testRegex = new RegExp(pings[i].trim(),'im');
				if(msg.match(testRegex)){
					msg = msg.replace(testRegex, '<span style="background: #FFA; color: #000; font-weight: bold;">' + msg.match(testRegex) + '</span>');
					hasMatch = true;
				}
			}
			
			if(hasMatch){
				var snd = new Audio("http://www.storiesinflight.com/html5/audio/flute_c_long_01.wav");
				snd.play();
			}
			
			if( msg.charAt(0) === '/' && msg.slice(1,3) === 'me'){
				classes += 'action ';
				msg = msg.slice(3);
				$el = thisRoom.appendMessage(
							'<span class="first">['+timestamp+']</span>\n\
							<span style="color:#'+User.props.color+'"><a class="name" title="['+timestamp+']" style="color:#'+User.props.color+'">'+User.props.name+'</a>'+msg+'</span>'
						).addClass(classes);
			} else {
				$el = thisRoom.appendMessage(
							'<span class="first">['+timestamp+']<a class="name" title="['+timestamp+']" style="color:#'+User.props.color+'">'+User.props.name+'<span class="colon">:</span></a></span>\n\
							<span style="color:#'+User.props.color+'">'+msg+'</span>'
						).addClass(classes);
			}
			$el.find('br:gt(7)').remove();
			/*var extra = 10; //add more if near the bottom
			if( thisRoom.$el[0].scrollHeight - thisRoom.$el.scrollTop() < 130 ){
				extra = 120;
			}
			thisRoom.$el.animate({scrollTop: '+='+($el.outerHeight()+extra)}, 120);*/
		});
	}
}