Pastebin launched a little side project called VERYVIRAL.com, check it out ;-) Want more features on Pastebin? Sign Up, it's FREE!
Guest

Babbler - bblr.js 1.3.190_0

By: a guest on May 8th, 2013  |  syntax: JavaScript  |  size: 54.23 KB  |  views: 87  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. /**
  2.  *
  3.  * Babblr is a chat platform for Tumblr (R) users to communicate with each other.
  4.  * The Sole purpose of this chat system is to provide a service that allows
  5.  * said users to communicate. Babblr is in no way affiliated with Tumblr (R), and
  6.  * does not take ownership or responsibility of damage associated with user
  7.  * information and data.
  8.  *
  9.  * Babblr was created by
  10.  * Trevor Clarke
  11.  * January 2012 - May 2013
  12.  *
  13.  */
  14. (function(){
  15. "use strict";
  16.  
  17. var BBLR = angular.module('bblr', ['firebase'], function($compileProvider){});
  18. var bbDB = new Firebase('https://babblr.firebaseio.com/');
  19.  
  20. // BBLR.config(function($locationProvider, $routeProvider) {
  21. //      $locationProvider.html5Mode(false);
  22. //      $routeProvider.when('/', {
  23. //         controller: BblrCtrl
  24. //      });
  25. // });
  26.  
  27.  
  28. /**
  29.  * User - A service for all User functions
  30.  * @param  {string} will grab and update the user profile info
  31.  * @return {string}
  32.  */
  33. BBLR.factory('User',
  34.  
  35.         [ '$q', '$http', 'Notify',
  36.  
  37.         function($q, $http, Notify) {
  38.  
  39.                 var _followers = [],
  40.                         _groups = {},
  41.                         _me = {};
  42.  
  43.                 function errPresence () {
  44.                         Notify.alert("You are disconnected.", 3000);
  45.                 };
  46.  
  47.                 return {
  48.  
  49.                         get: function (blogID) {
  50.                                 var defer = $q.defer();
  51.                                
  52.                                 var blog = bbDB.child('users').child(blogID);
  53.                                
  54.                                 blog.once('value', function (data) {
  55.                                         _me = data.val();
  56.                                         defer.resolve(_me);
  57.                                 });
  58.                                
  59.                                 return defer.promise;
  60.                         },
  61.  
  62.                         getGroups: function (blogID) {
  63.                                 var defer = $q.defer();
  64.                                
  65.                                 var blog = bbDB.child('users').child(blogID).child('groups');
  66.                                
  67.                                 blog.once('value', function (data) {
  68.                                         _groups = data.val();
  69.                                         defer.resolve(_groups);
  70.                                 });
  71.                                
  72.                                 return defer.promise;
  73.                         },
  74.  
  75.                         blockFriendID: function (myBlogID, friendID) {
  76.                                 //
  77.                                 var defer = $q.defer();
  78.                                 var endThis = true;
  79.                                 var theList = bbDB.child('users').child(myBlogID);
  80.                                 var theFollowers = theList.child('followers');
  81.                                 var theFollowing = theList.child('following');
  82.  
  83.                                 //TODO: change this to use firebase .haschild()
  84.  
  85.                                 theFollowers.once('value', function(data){
  86.                                         var followersList = data.val();
  87.  
  88.                                         angular.forEach(followersList, function(follower){
  89.                                                 if (follower.name == friendID) {
  90.                                                         theFollowers.child(friendID).child('block').set(true);
  91.                                                         defer.resolve(endThis);
  92.                                                 }
  93.                                         });
  94.                                 });
  95.                                 theFollowing.once('value', function(data){
  96.                                         var followingList = data.val();
  97.  
  98.                                         angular.forEach(followingList, function(followee){
  99.                                                 if (followee.name == friendID) {
  100.                                                         theFollowing.child(friendID).child('block').set(true);
  101.                                                         defer.resolve(endThis);
  102.                                                 }
  103.                                         });
  104.                                 });
  105.                                 return defer.promise;
  106.                         },
  107.  
  108.                         getLocalSettings: function () {
  109.                                 var data = JSON.parse(localStorage.getItem('BBLR_ST'));
  110.                                 return data;
  111.                         },
  112.  
  113.                         setLocalSettings: function (blogInfo) {
  114.                                 localStorage.setItem('BBLR_ST', JSON.stringify(blogInfo));
  115.                         },
  116.  
  117.                         deleteSettings: function () {
  118.                                 localStorage.setItem('BBLR_ST', '');
  119.                         },
  120.  
  121.                         getLocalData: function () {
  122.                                 var data = JSON.parse(localStorage.getItem('BBLR'));
  123.                                 return data;
  124.                         },
  125.  
  126.                         setLocalData: function (blogInfo) {
  127.                                 localStorage.setItem('BBLR', JSON.stringify(blogInfo));
  128.                         },
  129.  
  130.                         updateLocalChatID: function (chatID) {
  131.                                 if (chatID != null){
  132.                                         var data = JSON.parse(localStorage.getItem('BBLR'));
  133.                                         data.currentChatID = chatID;
  134.                                         localStorage.setItem('BBLR', JSON.stringify(data));
  135.  
  136.                                         bbDB.child('users').child(data.name).child('currentChatID').set(chatID);
  137.                                 }
  138.                         },
  139.  
  140.                         getLastChatID: function (blogID) {
  141.                                 var defer = $q.defer();
  142.                                
  143.                                 var blog = bbDB.child('users').child(blogID).child('currentChatID');
  144.                                
  145.                                 blog.once('value', function (data) {
  146.                                         _lastID = data.val();
  147.                                         defer.resolve(_lastID);
  148.                                 });
  149.                                
  150.                                 return defer.promise;
  151.                         },
  152.  
  153.                         setActive: function (chatID, blogID, blogImg, bool) {
  154.                                 var activeBlog = bbDB.child('chat').child(chatID).child('meta');
  155.                                 var activeData = {
  156.                                         name: blogID,
  157.                                         blogImg: blogImg,
  158.                                         typing: bool
  159.                                 };
  160.  
  161.                                 activeBlog.update(activeData);
  162.                         },
  163.  
  164.                         setPresence: function (blogID) {
  165.                                 // sets either "Online" or "Offline"
  166.                                 var presence = bbDB.child('users').child(blogID).child('online');
  167.                                 presence.onDisconnect().set(false, errPresence());
  168.                                 presence.set(true);
  169.                         },
  170.  
  171.                         stopPresence: function (blogID) {
  172.                                 var stopRef = bbDB.child('users').child(blogID).child('online');
  173.                                 stopRef.set(false);
  174.                         },
  175.  
  176.                         getCookie: function (cID) {
  177.                                 var i,x,y,
  178.                                         pgCkis = document.cookie.split(";");
  179.  
  180.                                 for (i = 0; i < pgCkis.length; i++){
  181.                                         x = pgCkis[i].substr(0, pgCkis[i].indexOf("="));
  182.                                         y = pgCkis[i].substr(pgCkis[i].indexOf("=")+1);
  183.                                         x = x.replace(/^\s+|\s+$/g,"");
  184.                                         if (x == cID){
  185.                                                 return unescape(y);
  186.                                         }
  187.                                 }
  188.                         },
  189.  
  190.                         setCookie: function (cID, cData, cEXP) {
  191.                                 var _expires = new Date();
  192.                                 _expires.setDate(_expires.getDate() + cEXP);
  193.                                 var _cData = escape(cData) + ((cEXP==null) ? "" : "; expires=" + _expires.toUTCString());
  194.                                 document.cookie = cID + "=" + _cData;
  195.                         },
  196.  
  197.                         checkKeyCookie: function () {
  198.                                 var BBLR_KEY = this.getCookie("_kyblr");
  199.                                 var BBLR_USER = this.getCookie("_usblr");
  200.  
  201.                                 if (BBLR_KEY != null && BBLR_KEY != ""){
  202.                                         return this.getCookie("_kyblr");
  203.                                 } else {
  204.                                         return false;
  205.                                 }
  206.                         },
  207.  
  208.                         eraseCookie: function () {
  209.                                 this.setCookie("_kyblr", "", -1);
  210.                                 this.checkKeyCookie();
  211.                         },
  212.  
  213.                         newFbToken: function (use) {
  214.                                 //TODO: change this to open a popup quickly
  215.                                 var defer = $q.defer();
  216.                                 var token_url = "http://bblr.me/re-auth?token="+use.tkn+"&secret="+use.scrt+"&user_name="+use.user;    
  217.                                 // var _options = {'Access-Control-Allow-Origin'= *};
  218.  
  219.                                 $http.get(token_url).success(function(data){
  220.                                         defer.resolve(data.fb_token);
  221.                                 });
  222.  
  223.                                 return defer.promise;
  224.                         }//,
  225.  
  226.                         // appendBlocked: function (list) {
  227.  
  228.                         // }
  229.                 };
  230.   }]);
  231.  
  232. /**
  233.  * Chat - A service for handling chat functions for groups and individuals
  234.  * @param  {string} will handle all the meat of the chat conversation elements
  235.  * @return {string}
  236.  */
  237. BBLR.factory('Chat',
  238.  
  239.         [ '$q', 'Notify',
  240.  
  241.         function($q, Notify) {
  242.  
  243.                 var _active = {},
  244.                         _theChat = {},
  245.                         _type = "";
  246.  
  247.                 function generateChatID(s) {
  248.                         var n;
  249.                         if (typeof(s) == 'number' && s === parseInt(s, 10)){
  250.                                 s = Array(s + 1).join('x');
  251.                         }
  252.                         return s.replace(/x/g, function(){
  253.                                 var n = Math.round(Math.random() * 61) + 48;
  254.                                 n = n > 57 ? (n + 7 > 90 ? n + 13 : n + 7) : n;
  255.                                 return String.fromCharCode(n);
  256.                         });
  257.                 };
  258.  
  259.                 return {
  260.  
  261.                         create: function (me, type, data, flngType, flwType) {
  262.                                 var defer = $q.defer();
  263.                                 //setup new chat, create data, and send notification
  264.                                 var storeChat = bbDB.child('chat'),
  265.                                         updateUserMe = bbDB.child('users'),
  266.                                         newID = generateChatID(16),
  267.                                         myImg = me.blogImg,
  268.                                         myName = me.name,
  269.                                         theirImg = data.blogImg,
  270.                                         startChatData,
  271.                                         startUserData;
  272.  
  273.                                 if (type == "group"){
  274.                                         var startChatData = {
  275.                                                 meta: {
  276.                                                         admin: myName,
  277.                                                         title: data,
  278.                                                         type: "group",
  279.                                                         blogImg: myImg,
  280.                                                         name: myName,
  281.                                                 }
  282.                                         };
  283.                                         var startUserData = {
  284.                                                 ID: newID,
  285.                                                 admin: true,
  286.                                                 name: data
  287.                                         };
  288.                                 } else {
  289.                                         var startChatData = {
  290.                                                 meta: {
  291.                                                         type: type,
  292.                                                         user1: data.name,
  293.                                                         user2: me.name,
  294.                                                         user1Img: theirImg,
  295.                                                         user2Img: myImg
  296.                                                 }
  297.                                         };
  298.                                         var startUserDataMe = {
  299.                                                 ID: newID,
  300.                                                 name: data.name,
  301.                                                 blogImg: theirImg,
  302.                                                 url: data.url,
  303.                                                 approved: false,
  304.                                                 init: me.name
  305.                                         };
  306.                                         var startUserDataThem = {
  307.                                                 ID: newID,
  308.                                                 name: me.name,
  309.                                                 blogImg: myImg,
  310.                                                 url: me.url,
  311.                                                 approved: false,
  312.                                                 init: me.name
  313.                                         };
  314.                                 }
  315.  
  316.                                 storeChat.child(newID).set(startChatData);
  317.  
  318.                                 if (type == "group") {
  319.                                         updateUserMe.child(myName).child('groups').child(newID).set(startUserData);
  320.                                         storeChat.child(newID).child('members').child(myName).set(myName);
  321.                                         //limit amount of groups
  322.                                         Notify.groupLimitInc(myName);
  323.                                         defer.resolve(newID);
  324.                                         return defer.promise;
  325.                                 }
  326.                                 if (flngType === true) {
  327.                                         updateUserMe.child(myName).child("following").child(data.name).set(startUserDataMe);
  328.                                         updateUserMe.child(data.name).child("following").child(myName).set(startUserDataThem);
  329.                                 }
  330.                                 if (flwType === true) {
  331.                                         updateUserMe.child(myName).child("followers").child(data.name).set(startUserDataMe);
  332.                                         updateUserMe.child(data.name).child("followers").child(myName).set(startUserDataThem);
  333.                                 }
  334.                         },
  335.  
  336.                         get: function (chatID) {
  337.                                 var defer = $q.defer();
  338.                                
  339.                                 var theBlog = bbDB.child('chat').child(chatID);
  340.                                
  341.                                 theBlog.once('value', function(data) {
  342.                                         _theChat = data.val();
  343.                                         defer.resolve(_theChat);
  344.                                 });
  345.                                
  346.                                 return defer.promise;
  347.                         },
  348.  
  349.                         addToGroup: function (blogID, groupID, groupName) {
  350.                                 var groupData = {
  351.                                         ID: groupID,
  352.                                         admin: false,
  353.                                         name: groupName
  354.                                 }
  355.  
  356.                                 bbDB.child('users').child(blogID).child('groups').child(groupID).set(groupData);
  357.                                 bbDB.child('chat').child(groupID).child('members').child(blogID).set(blogID);
  358.                                 // increment 1 for new
  359.                                 Notify.incrUnread(blogID, "groups", groupID);
  360.                         },
  361.  
  362.                         deleteGroup: function (blogID, groupID, gAdmin) {
  363.                                 bbDB.child('users').child(blogID).child('groups').child(groupID).remove();
  364.  
  365.                                 function removeThisGroupMem (gId, memName) {
  366.                                         bbDB.child('users').child(memName).child('groups').child(gId).remove();
  367.                                 }
  368.  
  369.                                 if (gAdmin) {
  370.                                         var theGroups = bbDB.child('chat').child(groupID).child('members');
  371.                                         theGroups.once('value', function(data){
  372.                                                 var _mems = data.val();
  373.                                                 angular.forEach(_mems, function(mem){
  374.                                                         removeThisGroupMem(groupID, mem);
  375.                                                 });
  376.                                         });
  377.                                 } else {
  378.                                         bbDB.child('chat').child(groupID).child('members').child(blogID).remove();
  379.                                 }
  380.  
  381.                                 var defer = $q.defer();
  382.                                 var theGroups = bbDB.child('users').child(blogID).child('groups');
  383.  
  384.                                 theGroups.once('value', function(data){
  385.                                         var previous = data.val();
  386.                                         var lastID;
  387.  
  388.                                         angular.forEach(previous, function(prev){
  389.                                                 lastID = prev.ID;
  390.                                                 defer.resolve(lastID);
  391.                                         });
  392.                                 });
  393.                                 return defer.promise;
  394.                         },
  395.  
  396.                         //TODO: bind this in a one way angularfire
  397.                         getActive: function (chatID) {
  398.                                 var defer = $q.defer();
  399.                                
  400.                                 var theBlog = bbDB.child('chat').child(chatID).child('meta');
  401.                                
  402.                                 theBlog.once('value', function(data) {
  403.                                         _active = data.val();
  404.                                         defer.resolve(_active);
  405.                                 });
  406.                                
  407.                                 return defer.promise;
  408.                         },
  409.  
  410.                         getMembers: function (chatID) {
  411.                                 var defer = $q.defer();
  412.                                
  413.                                 var theMembers = bbDB.child('chat').child(chatID).child('members');
  414.                                
  415.                                 theMembers.once('value', function(data) {
  416.                                         var _allMembers = data.val();
  417.                                         defer.resolve(_allMembers);
  418.                                 });
  419.                                
  420.                                 return defer.promise;
  421.                         },
  422.  
  423.                         removeMember: function (chatID, memberID) {
  424.                                 bbDB.child('chat').child(chatID).child('members').child(memberID).remove();
  425.                         }
  426.  
  427.                 };
  428.   }]);
  429.  
  430. /**
  431.  * Notify - A service for sending and receiving notification updates
  432.  * @param  {string} will grab and update notifications in real-time
  433.  * @return {string}
  434.  */
  435. BBLR.factory('Notify',
  436.  
  437.         [ '$compile', '$q', '$timeout',
  438.  
  439.         function($compile, $q, $timeout) {
  440.  
  441.                 var _approval = "",
  442.                         _timer;
  443.        
  444.                 return {
  445.                         //change this to utilize a central alert system.
  446.                         alert: function (text, time) {
  447.                                 $timeout.cancel(_timer);
  448.                                 var $alertContainer = $('#alertThis');
  449.                                 var $mainContainer = $('#alertThis').parent();
  450.                                 var $text = "<p>"+text+"</p>";
  451.  
  452.                                 $alertContainer.css('display', 'block');
  453.                                 $mainContainer.removeClass('close');
  454.                                 $alertContainer.html($text);
  455.  
  456.                                 _timer = $timeout(function () {
  457.                     $alertContainer.css('display', 'none');
  458.                                         $mainContainer.addClass('close');
  459.                 }, time);
  460.                         },
  461.  
  462.                         // Sets status of friend convo
  463.                         setStatus: function (myBlogID, theirBlogID, type, val) {
  464.                                 bbDB.child('users').child(theirBlogID).child(type).child(myBlogID).child('approved').set(val);
  465.                                 bbDB.child('users').child(myBlogID).child(type).child(theirBlogID).child('approved').set(val);
  466.                         },
  467.  
  468.                         // Alerts status of friend convo
  469.                         alertStatus: function (val) {
  470.                                 if (val === false) {
  471.                                         this.alert("Waiting For Approval", 3000);
  472.                                 } else if (val === true) {
  473.                                         this.alert("Loading Chat...", 2000);
  474.                                         return true;
  475.                                 } else {
  476.                                         this.alert("User Denied Chat", 3000);
  477.                                         return false;
  478.                                 }
  479.                         },
  480.  
  481.                         // Gets status of friend convo
  482.                         getStatus: function (myBlogID, theirBlogID, type) {
  483.                                 var defer = $q.defer();
  484.                                
  485.                                 var theAppr = bbDB.child('users').child(myBlogID).child(type).child(theirBlogID).child('approved');
  486.                                
  487.                                 theAppr.once('value', function(data) {
  488.                                         _approval = data.val();
  489.                                         defer.resolve(_approval);
  490.                                 });
  491.                                
  492.                                 return defer.promise;
  493.                         },
  494.  
  495.                         //Increment total number of groups by 1
  496.                         groupLimitInc: function (myID) {
  497.                                 var _limitRef = bbDB.child('users').child(myID).child("groupsLimit");
  498.                                
  499.                                 _limitRef.transaction(function(limitVal) {
  500.                                         return limitVal + 1;
  501.                                 });
  502.                         },
  503.  
  504.                         //Increment total number of groups by 1
  505.                         groupLimitDec: function (myID) {
  506.                                 var _limitRef = bbDB.child('users').child(myID).child("groupsLimit");
  507.                                
  508.                                 _limitRef.transaction(function(limitVal) {
  509.                                         return limitVal - 1;
  510.                                 });
  511.                         },
  512.  
  513.                         //Add to the amount of unread if user is on another chat
  514.                         incrUnread: function (theirBlogID, type, fromBlogID) {
  515.                                 var _countRef = bbDB.child('users').child(theirBlogID).child(type).child(fromBlogID).child('unread');
  516.                                
  517.                                 _countRef.transaction(function(unreadVal) {
  518.                                         return unreadVal + 1;
  519.                                 });
  520.                         },
  521.  
  522.                         // Clear the amount of unread
  523.                         clearUnread: function (myBlogID, type, theChatId) {
  524.                                 // console.log(myBlogID, type, theChatId);
  525.  
  526.                                 function checkTypeOf (typeID) {
  527.                                         var _bool;
  528.                                         var flingType = bbDB.child('users').child(myBlogID).child(typeID);
  529.  
  530.                                         flingType.on('value', function(flingData) {
  531.                                                 var bool = flingData.hasChild(theChatId);
  532.                                                 if (bool == true) {
  533.                                                         bbDB.child('users').child(myBlogID).child(typeID).child(theChatId).child('unread').set(0);
  534.                                                 }
  535.                                         });
  536.                                 };
  537.  
  538.                                 if (type == 'groups') {
  539.                                         bbDB.child('users').child(myBlogID).child(type).child(theChatId).child('unread').set(0);
  540.                                 } else {
  541.                                         checkTypeOf("following");
  542.                                         checkTypeOf("following");
  543.                                 }
  544.                         },
  545.  
  546.                         // Get members of a group from chat ID
  547.                         getGroupMembers: function (theCurrentID) {
  548.                                 var defer = $q.defer();
  549.                                
  550.                                 var chatMembers = bbDB.child('chat').child(theCurrentID).child('members');
  551.  
  552.                                 chatMembers.once('value', function(data) {
  553.                                         var _members = data.val();
  554.                                         defer.resolve(_members);
  555.                                 });
  556.                                
  557.                                 return defer.promise;
  558.                         },
  559.  
  560.                         // Get members of a group from chat ID
  561.                         getMetaFriend: function (myBlogID, theCurrentID) {
  562.                                 var defer = $q.defer();
  563.                                
  564.                                 var chatMembers = bbDB.child('chat').child(theCurrentID).child('meta');
  565.  
  566.                                 chatMembers.once('value', function(data) {
  567.                                         var _meta = data.val();
  568.                                         defer.resolve(_meta);
  569.                                 });
  570.                                
  571.                                 return defer.promise;
  572.                         },
  573.  
  574.                         // Check if member has the same current chat ID
  575.                         checkIfCurrent: function (blogID, theCurrentID) {
  576.                                 var defer = $q.defer();
  577.                                
  578.                                 if (blogID !== undefined) {
  579.                                         var chatMember = bbDB.child('users').child(blogID).child('currentChatID');
  580.                                        
  581.                                         chatMember.once('value', function(data) {
  582.                                                 var _storedCurrChatID = data.val();
  583.  
  584.                                                 if (_storedCurrChatID == theCurrentID) {
  585.                                                         defer.resolve(true);
  586.                                                 } else {
  587.                                                         defer.resolve(false);
  588.                                                 }
  589.                                         });
  590.                                 }
  591.                                
  592.                                 return defer.promise;
  593.                         },
  594.  
  595.                         // if group member isnt on current chat, increment unread
  596.                         setMissedGroupNotification: function (theCurrentID) {
  597.                                 var defer = $q.defer();
  598.                                 var _this = this;
  599.  
  600.                                 //loop through the users associated with the chat
  601.                                 _this.getGroupMembers(theCurrentID).then(function(members){
  602.                                         angular.forEach(members, function(member){
  603.  
  604.                                                 //check if current chatID is the same, if not, increment
  605.                                                 _this.checkIfCurrent(member, theCurrentID).then(function(bool){
  606.                                                         if (bool === false) {
  607.                                                                 _this.incrUnread(member, "groups", theCurrentID);
  608.                                                         }
  609.                                                 });
  610.                                         });
  611.                                 });
  612.                         },
  613.  
  614.                         // if friend isnt on current chat, increment unread
  615.                         setMissedFriendNotification: function (myBlogID, theCurrentID, type) {
  616.                                 var defer = $q.defer();
  617.                                 var _this = this;
  618.  
  619.                                 _this.getMetaFriend(myBlogID, theCurrentID).then(function(friend){
  620.  
  621.                                         if (friend.user1 == myBlogID) {
  622.                                                 //check if current chatID is the same, if not, increment
  623.                                                 _this.checkIfCurrent(friend.user2, theCurrentID).then(function(bool){
  624.                                                        
  625.                                                         if (bool === false) {
  626.                                                                 _this.incrUnread(friend.user2, type, friend.user1);
  627.                                                         }
  628.                                                 });
  629.                                         } else {
  630.                                                 //check if current chatID is the same, if not, increment
  631.                                                 _this.checkIfCurrent(friend.user1, theCurrentID).then(function(bool){
  632.                                                        
  633.                                                         if (bool === false) {
  634.                                                                 _this.incrUnread(friend.user1, type, friend.user2);
  635.                                                         }
  636.                                                 });
  637.                                         }
  638.                                 });
  639.                         }
  640.  
  641.                 };
  642.   }]);
  643.  
  644. /*
  645.  * Setup the main controller for Babblr
  646.  */
  647. BBLR.controller('ListCtrl',
  648.  
  649.         ['$rootScope', '$scope', 'Chat', 'User', 'Notify', 'angularFireCollection', '$compile', '$timeout',
  650.  
  651.         function ($rootScope, $scope, Chat, User, Notify, angularFireCollection, $compile, $timeout) {
  652.  
  653.                 $rootScope.$on('refresh:groups', function () {
  654.                         if ($rootScope.loggedIn !== false) {
  655.                                 var _myBlogName = $rootScope.blog.name;
  656.                                 var _groupsData = 'https://babblr.firebaseio.com/users/'+_myBlogName+'/groups';
  657.  
  658.                                 $scope.groups = angularFireCollection(_groupsData);
  659.                         }
  660.                 });
  661.  
  662.                 $rootScope.$on('log:in', function (event, args) {
  663.                         if ($rootScope.loggedIn !== false){
  664.                                 var _myBlogName = args.ID + "";
  665.                                 var _flowData = 'https://babblr.firebaseio.com/users/'+_myBlogName+'/followers';
  666.                                 var _flingData = 'https://babblr.firebaseio.com/users/'+_myBlogName+'/following';
  667.                                 var _groupsData = 'https://babblr.firebaseio.com/users/'+_myBlogName+'/groups';
  668.  
  669.                                 $scope.followers = angularFireCollection(_flowData);
  670.                                 $scope.following = angularFireCollection(_flingData);
  671.                                 $scope.groups = angularFireCollection(_groupsData);
  672.                                
  673.                                 $scope.search = '';
  674.                         }
  675.                 });
  676.  
  677.                 $rootScope.$on('refresh:list', function () {
  678.                         if ($rootScope.loggedIn !== false) {
  679.                                 var _myBlogName = $rootScope.blog.name;
  680.                                 var _flowData = 'https://babblr.firebaseio.com/users/'+_myBlogName+'/followers';
  681.                                 var _flingData = 'https://babblr.firebaseio.com/users/'+_myBlogName+'/following';
  682.  
  683.                                 $scope.followers = angularFireCollection(_flowData);
  684.                                 $scope.following = angularFireCollection(_flingData);
  685.                         }
  686.                 });
  687.  
  688.                 $rootScope.$on('find:blocked', function () {
  689.                         function addBlocked (name, type) {
  690.                                 var _blergNerm = shortenBlock(name);
  691.                                 var _termpert = $compile('<li><span class="img" href="">' + _blergNerm + '</span><div b-unblk="' + _blergNerm + '" b-un-type="' + type + '" class="add unblock"><i class="icon icon-plus"></i></div></li>')($scope);
  692.  
  693.                                 $('.onlineFriends').find('#blocked').append(_termpert);
  694.                         };
  695.  
  696.                         function shortenBlock (_str) {
  697.                                 if(_str.length > 20) {
  698.                                         var _string = _str.substring(0,20) + "...";
  699.                                         return _string;
  700.                                 } else {
  701.                                         return _str;
  702.                                 }
  703.                         };
  704.  
  705.                         if ($rootScope.loggedIn !== false){
  706.                                 var _myBlogName = $rootScope.blog.name;
  707.                                 var _myBlockedUsers = $rootScope.blog;
  708.                                 var _theBlocked = [];
  709.  
  710.                                 angular.forEach($rootScope.blog.following, function(flowing){
  711.  
  712.                                         if (flowing.block !=undefined || flowing.block != null){
  713.                                                 _theBlocked.push(flowing.name);
  714.                                                 addBlocked(flowing.name, "following");
  715.                                         }
  716.                                 });
  717.                                 angular.forEach($rootScope.blog.followers, function(flowers){
  718.  
  719.                                         if (flowers.block != undefined || flowers.block != null){
  720.                                                 _theBlocked.push(flowers.name);
  721.                                                 addBlocked(flowers.name, "followers");
  722.                                         }
  723.                                 });
  724.                         }
  725.                 });
  726.  
  727. }]);
  728.  
  729. /**
  730.  * Group List Edit Directive
  731.  */
  732. BBLR.directive('bGroupList',
  733.        
  734.         [ '$rootScope', 'Chat', '$compile',
  735.        
  736.         function ($rootScope, Chat, $compile) {
  737.  
  738.                 return {
  739.                        
  740.                         link: function($scope, elem, attrs) {
  741.  
  742.                                 elem.click(function(e) {
  743.                     e.preventDefault();
  744.  
  745.                     var _template = "<ul class='list-group'></ul>";
  746.                                         var _chatId = attrs.bGroupList + "";
  747.                                         var _holdId = attrs.bGroupList + "";
  748.                                         var _isAdmin = attrs.bExt + "";
  749.                                         var $list = angular.element(elem);
  750.                                         var $container = $list.parent();
  751.  
  752.                                         if (_chatId !== "") {
  753.                                 Chat.getMembers(_chatId).then(function (members){
  754.                                         var _tmpl = $compile(_template)($scope);
  755.                                         $container.append(_tmpl);
  756.                                                        
  757.                                                         angular.forEach(members, function(member){
  758.  
  759.                                                                 var _member = member+"";
  760.                                                                 if(_member.length > 18) {
  761.                                                                         _member = _member.substring(0,18) + "...";
  762.                                                                 }
  763.  
  764.                                                                 if (_isAdmin == "true") {
  765.                                                                         var _frag = "<li>&#8227; <a href='http://"+_member+".tumblr.com' target='_blank'>" + _member + "</a><div class='delete' b-memb-rem=" + member + " b-id=" + _chatId + "><i class='icon icon-delete'></i></div></li>";
  766.                                                                 } else {
  767.                                                                         var _frag = "<li>&#8227; <a href='http://"+_member+".tumblr.com' target='_blank'>" + _member + "</a></li>";
  768.                                                                 }
  769.                                                                 var _tmpFrag = $compile(_frag)($scope);
  770.  
  771.                                                                 $container.find('.list-group').append(_tmpFrag);
  772.                                                         });
  773.  
  774.                                                         $container.css('height', 'auto');
  775.                                                         $list.children().css('background-position', '-55px -17px');
  776.                                                         attrs.bGroupList = "";
  777.                                                 });
  778.                             } else {
  779.                                 $list.children().css('background-position', '-55px 0px');
  780.                                 $container.find('.list-group').remove();
  781.                                 $container.css('height', '25px');
  782.                                 attrs.bGroupList = _holdId + "";
  783.                                 $rootScope.$emit('refresh:groups');
  784.                             }
  785.                 });
  786.                                
  787.                         }
  788.                 };
  789.         }
  790.        
  791. ]);
  792. /**
  793.  * Group List Edit Directive
  794.  */
  795. BBLR.directive('bMembRem',
  796.        
  797.         [ '$rootScope', 'Chat',
  798.        
  799.         function ($rootScope, Chat) {
  800.  
  801.                 return {
  802.                        
  803.                         link: function($scope, elem, attrs) {
  804.                                 elem.click(function(e) {
  805.                     e.preventDefault();
  806.  
  807.                     var _memberId = attrs.bMembRem + "";
  808.                     var _chatId = attrs.bId + "";
  809.  
  810.                     var yes = confirm("Are you sure you want to remove "+ _memberId +" from this group?");
  811.                                         if (yes) {
  812.                             Chat.removeMember(_chatId, _memberId);
  813.                                                 $rootScope.$emit('refresh:groups');
  814.                                         }
  815.                 });
  816.                         }
  817.  
  818.                 };
  819.         }
  820. ]);
  821.  
  822. /**
  823.  * Group List Edit Directive
  824.  */
  825. BBLR.directive('bUnblk',
  826.        
  827.         [ '$rootScope', 'Chat',
  828.        
  829.         function ($rootScope, Chat) {
  830.  
  831.                 return {
  832.                        
  833.                         link: function($scope, elem, attrs) {
  834.                                 var _unBlkNm = attrs.bUnblk+"";
  835.                                 var _unBlkTp = attrs.bUnType+"";
  836.  
  837.                                 elem.click(function(e) {
  838.  
  839.                     e.preventDefault();
  840.  
  841.                     bbDB.child('users').child($rootScope.blog.name).child(_unBlkTp).child(_unBlkNm).child('block').set(false);
  842.                 });
  843.                         }
  844.  
  845.                 };
  846.         }
  847. ]);
  848.  
  849.  
  850.  
  851. /*
  852.  * Setup the main controller for Babblr
  853.  */
  854. BBLR.controller('BblrCtrl',
  855.  
  856.         ['$rootScope', '$scope', 'Chat', 'User', 'Notify', '$location', '$route', '$compile', '$timeout', '$q', '$http',
  857.  
  858.         function ($rootScope, $scope, Chat, User, Notify, $location, $route, $compile, $timeout, $q, $http) {
  859.                 //fixes the babblr cloning issue
  860.                 $rootScope.$on('$locationChangeStart', function($event, args) {
  861.                         $event.preventDefault();
  862.                         var _bblrCount = $('.babblr').length;
  863.  
  864.                         if(_bblrCount > 1) {
  865.                                 $('body').find('.babblr').remove(); //.slice(1)
  866.                         }
  867.                 });
  868.                                 // $rootScope.$destroy();
  869.  
  870.                 //fix the go to top button
  871.                 $('.return_to_top_icon').bind('click', function(e){
  872.                         e.preventDefault();
  873.                         $('body').animate({scrollTop:0}, 'fast');
  874.                 });
  875.  
  876.                 //stop Babblr for post_buttons
  877.                 $('#post_buttons').children().bind('click', function(e){
  878.                         e.preventDefault();
  879.                         $('body').find('.babblr').remove();
  880.                         $rootScope.$destroy();
  881.                 });
  882.  
  883.                 //stop Babblr for post_controls
  884.                 $('.post_controls').children().bind('click', function(e){
  885.                         e.preventDefault();
  886.                         $('body').find('.babblr').remove();
  887.                         $rootScope.$destroy();
  888.                 });
  889.  
  890.                 //flags
  891.                 var blogInfo;
  892.                 $scope.blog = {};
  893.                 $scope.showLogin = true;
  894.                 $scope.navAdmin = false;
  895.                 $scope.addToThisGroup = false;
  896.                 $scope.showApproveMe = false;
  897.                 $scope.currentChatID = "";
  898.                 $scope.predicate = "-unread";
  899.                 $scope.stopScroll = false;
  900.                 $rootScope.isGroup = false;
  901.                 $rootScope.loggedIn = false;
  902.                 $rootScope.messagesLoading = false;
  903.                 $('.babblr').addClass('inactive');
  904.  
  905.                 //Remove from server view
  906.                 function hideUponAcctSetup () {
  907.                         $('.babblr').hide();
  908.                 };
  909.                 var urlVar = $location.absUrl();
  910.                 var urlCheck = urlVar.search('bblr');
  911.                 if (urlCheck > 0) {
  912.                         hideUponAcctSetup();
  913.                 }
  914.  
  915.                 //undefined active:
  916.                 $scope.getActiveBlog = {name:'Babblr', blogImg: "http://24.media.tumblr.com/avatar_9d58c9639257_30.png"};
  917.  
  918.                 //undefined CurrentChatID:
  919.                 $scope.messages = [{name: "babblred", text:"Nothing yet, create a group or select a friend and start babblin'!", blogImg: "http://24.media.tumblr.com/avatar_9d58c9639257_30.png"}];
  920.                 $scope.currentChatID = "babblrDefault";
  921.  
  922.                 var defaultChatData = {
  923.                         meta: {
  924.                                 admin: "babblr",
  925.                                 title: "Babblr",
  926.                                 type: "group",
  927.                                 blogImg: "http://24.media.tumblr.com/avatar_9d58c9639257_30.png",
  928.                                 name: "Babblr",
  929.                                 typing: false,
  930.                                 unread: 1
  931.                         }
  932.                 }
  933.  
  934.                 function authenticate (blgKey) {
  935.                         //Get Blog data from localStorage
  936.                         // $scope.messages = [];
  937.                         var blgInfo = JSON.parse(localStorage.getItem('BBLR'));
  938.                         var blogID = User.getCookie("_usblr");
  939.                         var _tkn = User.getCookie("_tblr");
  940.                         var _scrt = User.getCookie("_sblr");
  941.  
  942.                         if (blgKey != undefined || blgKey != "") {
  943.                                 $rootScope.blog = blgInfo;
  944.  
  945.                                 //Start the authentication!
  946.                                 bbDB.auth(blgKey, function(error) {
  947.                                         if(error) {
  948.                                                 //TODO: remove this before release
  949.                                                 console.log(error);
  950.                                                 User.setCookie("_kyblr", "", -1);
  951.                                                 User.setCookie("_usblr", "", -1);
  952.                                                 User.setCookie("_sblr", "", -1);
  953.                                                 User.setCookie("_tblr", "", -1);
  954.                                                 // startSetup();
  955.                                                 // reAuthUpdate(_tkn, _scrt, blogID);
  956.                                                 $rootScope.loggedIn = false;
  957.                                         } else {
  958.                                                 $scope.showLogin = false;
  959.                                                 $rootScope.loggedIn = true;
  960.                                                
  961.                                                 User.setPresence(blogID);
  962.                                                 $('.alertCenter').toggleClass('close');
  963.  
  964.                                                 var lastChatID = bbDB.child('users').child(blogID).child('currentChatID');
  965.                                                
  966.                                                 lastChatID.once('value', function (data) {
  967.                                                         var _lastID = data.val();
  968.                                                         if (_lastID === null){
  969.                                                                 $rootScope.$broadcast('load:conversation', {chatID: "babblrDefault", chatType: "followers", prevCID: $scope.currentChatID});
  970.                                                         } else {
  971.                                                                 $rootScope.$broadcast('load:conversation', {chatID: _lastID, chatType: "followers", prevCID: $scope.currentChatID});
  972.                                                         }
  973.  
  974.                                                         $rootScope.$broadcast('log:in', {ID: blogID});
  975.                                                         loadMyProfile(blogID);
  976.                                                         updateMessages();
  977.                                                 });
  978.                                         }
  979.                                 });
  980.                         } else {
  981.                                 //catch all
  982.                                 reAuthUpdate(_tkn, _scrt, blogID);
  983.                         }
  984.                 };
  985.  
  986.                 function startSetup () {
  987.                         window.location.href = "http://bblr.me/auth/tumblr";
  988.                 };
  989.  
  990.                 function reAuthUpdate (_tkn, _scrt, _userN) {
  991.                         var use = {
  992.                                 tkn: _tkn,
  993.                                 scrt: _scrt,
  994.                                 user: _userN
  995.                         };
  996.                         User.newFbToken(use).then(function(token){
  997.                                 User.setCookie("_kyblr", token, 365);
  998.                                 authenticate(token);
  999.                         });
  1000.                 };
  1001.  
  1002.                 //update incrementer
  1003.                 function updateMessages () {
  1004.                         if ($rootScope.isGroup === true) {
  1005.                                 var boopInc = 800;
  1006.                         } else {
  1007.                                 var boopInc = 300;
  1008.                         }
  1009.                         setInterval(function(){
  1010.                                 updateNav();
  1011.                                 $scope.$apply();
  1012.                         }, boopInc);
  1013.                 };
  1014.  
  1015.                 //Start Babblr
  1016.                 $scope.initialLoad = function () {
  1017.                         $scope.getActiveBlog.name = "Babblr";
  1018.                         $scope.messages = [];
  1019.                        
  1020.                         var blogKey = User.checkKeyCookie();
  1021.                        
  1022.                         if (blogKey == false || blogKey == 'undefined') {
  1023.                                 $rootScope.loggedIn = false;
  1024.                         } else {
  1025.                                 authenticate(blogKey);
  1026.                                 //TODO: change to utilize a spinner in top right
  1027.                                 // $scope.getActiveBlog.name = "Syncing...";
  1028.                         }
  1029.                 };
  1030.  
  1031.                 $scope.signMeIn = function () {
  1032.                         var blgKey = User.checkKeyCookie();
  1033.                         var _tkn = User.getCookie("_tblr");
  1034.                         var _scrt = User.getCookie("_sblr");
  1035.                         var _userN = User.getCookie("_usblr");
  1036.  
  1037.                         if (blgKey == false || blgKey == 'undefined') {
  1038.  
  1039.                                 if (_tkn != null && _tkn != 'undefined') {
  1040.                                         startSetup();
  1041.                                         // reAuthUpdate(_tkn, _scrt, _userN);
  1042.                                 } else {
  1043.                                         startSetup();
  1044.                                 }
  1045.                         } else {
  1046.                                 authenticate(blgKey);
  1047.                         }
  1048.                 };
  1049.                 $scope.signMeOut = function () {
  1050.                         bbDB.unauth();
  1051.                         User.stopPresence($rootScope.blog.name);
  1052.  
  1053.                         // $scope.loggedIn = false;
  1054.                         $rootScope.loggedIn = false;
  1055.                         $rootScope.isGroup = false;
  1056.                         $scope.addToThisGroup = false;
  1057.                         $scope.showStartGroup = false;
  1058.  
  1059.                         resetLoadedChatMsgs();
  1060.                         slideToggle();
  1061.                         $scope.showLogin = true;
  1062.                         $('.alertCenter').toggleClass('close');
  1063.                         $('.slideout').toggleClass('sidenull');
  1064.                 };
  1065.                 function signMeOut() {
  1066.                         bbDB.unauth();
  1067.  
  1068.                         // $scope.loggedIn = false;
  1069.                         $rootScope.loggedIn = false;
  1070.                         $rootScope.isGroup = false;
  1071.                         $scope.addToThisGroup = false;
  1072.                         $scope.showStartGroup = false;
  1073.  
  1074.                         resetLoadedChatMsgs();
  1075.                         slideToggle();
  1076.                         $scope.showLogin = true;
  1077.                         $('.alertCenter').toggleClass('close');
  1078.                         $('.slideout').toggleClass('sidenull');
  1079.                 };
  1080.                 $scope.updateAccount = function () {
  1081.                         startSetup();
  1082.                         //TODO: finish this on the server request
  1083.                         //send a post request with credentials
  1084.                 };
  1085.  
  1086.                 //Get my profile and store it!
  1087.                 function loadMyProfile (blogID) {
  1088.                         var _setng = User.getLocalSettings();
  1089.  
  1090.  
  1091.  
  1092.                         $scope.$apply(function () {
  1093.                                 User.get(blogID).then(function(blog_data){
  1094.                                         $rootScope.blog = blog_data;
  1095.  
  1096.                                         if (_setng != undefined || _setng != null) {
  1097.                                                 $scope.settings = User.getLocalSettings();
  1098.                                         } else {
  1099.                                                 $scope.settings = $rootScope.blog.settings;
  1100.                                                 User.setLocalSettings($scope.settings);
  1101.                                         }
  1102.                                 });
  1103.                         });
  1104.  
  1105.                         // $rootScope.$broadcast('start:suggest');
  1106.                 };
  1107.  
  1108.                 //Update localStorage according to live data on $scope
  1109.                 $rootScope.$watch('blog', function (blogData) {
  1110.                         if (blogData) {
  1111.                                 User.setLocalData(blogData);
  1112.                         }
  1113.                 }, true);
  1114.                 $scope.$watch('settings', function (settingsData) {
  1115.                         if (settingsData) {
  1116.                                 User.deleteSettings();
  1117.                                 User.setLocalSettings(settingsData);
  1118.                                 //
  1119.                                 if (settingsData.blocked == true){
  1120.                                         $rootScope.$broadcast('find:blocked');
  1121.                                 }
  1122.                         }
  1123.                 }, true);
  1124.                
  1125.                 //Play the Blip sound based on settings
  1126.                 var snd = new Audio("chrome-extension://kkocmgaoibklfmejhklahodlookklfjk/img/blip.mp3");
  1127.                 // var snd = new Audio("chrome-extension://lmpbkeblamfmjmjkldgkbogjoledmmpd/img/blip.mp3");
  1128.                 var playSound = function () {
  1129.                         if ($scope.settings != null) {
  1130.                                 var soundStg = $scope.settings.sound;
  1131.                                 if (soundStg == "true" || soundStg == true){
  1132.                                         snd.play();
  1133.                                 }
  1134.                         }
  1135.                 };
  1136.  
  1137.                 function getMsgTime(date) {
  1138.                         var hours = date.getHours();
  1139.                         var minutes = date.getMinutes();
  1140.                         var ap = hours >= 12 ? 'P' : 'A';
  1141.                         hours = hours % 12;
  1142.                         hours = hours ? hours : 12;
  1143.                         minutes = minutes < 10 ? '0'+minutes : minutes;
  1144.                         var strTime = hours + ':' + minutes;// + ap
  1145.  
  1146.                         return strTime;
  1147.                 }
  1148.  
  1149.                 //Update the nav based on chat type
  1150.                 function updateNav () {
  1151.                         var chatID = $scope.currentChatID;
  1152.  
  1153.                         if (chatID != 'babblrDefault') {
  1154.                                 Chat.getActive(chatID).then(function(meta){
  1155.                                         var types = meta.type;
  1156.  
  1157.                                         if (types == "group") {
  1158.                                                 $scope.getActiveBlog = meta;
  1159.                                                 $scope.actGroupName = meta.title;
  1160.                                                 $rootScope.isGroup = true;
  1161.  
  1162.                                                 if ($scope.getActiveBlog.admin === $rootScope.blog.name) {
  1163.                                                         $scope.navAdmin = true;
  1164.                                                 }
  1165.                                         } else {
  1166.                                                 $scope.actGroupName = "";
  1167.                                                 $rootScope.isGroup = false;
  1168.  
  1169.                                                 var me = $rootScope.blog.name,
  1170.                                                         who = meta.user1;
  1171.  
  1172.                                                 if (me == who) {
  1173.                                                         var userData = {
  1174.                                                                 name: meta.user2,
  1175.                                                                 blogImg: meta.user2Img
  1176.                                                         };
  1177.  
  1178.                                                         $scope.getActiveBlog = userData;
  1179.                                                 } else {
  1180.                                                         userData = {
  1181.                                                                 name: meta.user1,
  1182.                                                                 blogImg: meta.user1Img
  1183.                                                         };
  1184.  
  1185.                                                         $scope.getActiveBlog = userData;
  1186.                                                 }
  1187.                                         }
  1188.  
  1189.                                 });
  1190.                         } else {
  1191.                                 $scope.getActiveBlog = defaultChatData.meta;
  1192.                                 $scope.actGroupName = defaultChatData.meta.title;
  1193.                                 $rootScope.isGroup = false;
  1194.                         }
  1195.                 };
  1196.  
  1197.                 //The message stuffs
  1198.                 $('#myMsg').keypress(function (e) {
  1199.                         if (e.keyCode == 13) {
  1200.                                 var text = $('#myMsg').val();
  1201.  
  1202.                                 if ($scope.currentChatID == '' || $scope.currentChatID == 'babblrDefault'){
  1203.                                         alert("Select a chat to continue Babblin'");
  1204.                                 } else {
  1205.                                         if (text.length > 0){
  1206.                                                 sendMsg(text);
  1207.                                                 $('#myMsg').val('');
  1208.                                         }
  1209.                                 }
  1210.                         }
  1211.                 });
  1212.  
  1213.                 function sendMsg(text) {
  1214.                         var chatID = $scope.currentChatID;
  1215.                         var currentChat = bbDB.child('chat').child(chatID).child('messages');
  1216.                         var name = $rootScope.blog.name,
  1217.                                 profileUrl = $rootScope.blog.url,
  1218.                                 theBlogImg = $rootScope.blog.blogImg + '',
  1219.                                 time = getMsgTime(new Date()),
  1220.                                 val = 'true';
  1221.  
  1222.                         var msg = {
  1223.                                 name: name,
  1224.                                 text: text,
  1225.                                 time: time,
  1226.                                 url: profileUrl,
  1227.                                 blogImg: $rootScope.blog.blogImg
  1228.                         };
  1229.  
  1230.                         currentChat.push(msg);
  1231.                         User.setActive(chatID, name, theBlogImg, val);
  1232.  
  1233.                         if ($rootScope.isGroup === true) {
  1234.                                 Notify.setMissedGroupNotification(chatID);
  1235.                         } else {
  1236.                                 Notify.setMissedFriendNotification($rootScope.blog.name, chatID, $scope.currentChatType);
  1237.                         }
  1238.                 };
  1239.  
  1240.                 //loads the current chat messages in the scope
  1241.                 $rootScope.$on('load:conversation', function(event, args){
  1242.                         var _prevChatID = args.prevCID;
  1243.                         $scope.currentChatID = args.chatID;
  1244.                         $scope.currentChatType = args.chatType;
  1245.  
  1246.                         User.updateLocalChatID(args.chatID);
  1247.  
  1248.                         if (_prevChatID) {
  1249.                                 var previousChat = bbDB.child('chat').child(_prevChatID).child('messages');
  1250.                                 previousChat.off('value', loadTheChatMsgs());
  1251.                         }
  1252.  
  1253.                         if (args.chatType == "group") {
  1254.                                 $rootScope.isGroup = true;
  1255.                         } else {
  1256.                                 $rootScope.isGroup = false;
  1257.                         }
  1258.                 });
  1259.                 //function to pull in the selected chat
  1260.                 function loadTheChatMsgs () {
  1261.                         if (($scope.currentChatID != "" && $scope.currentChatID != "babblrDefault") || $scope.currentChatID === null) {
  1262.                                 var chatsID = $scope.currentChatID;
  1263.                                 var currentChat = bbDB.child('chat').child(chatsID).child('messages').endAt().limit(100);
  1264.                                 var _soundDelay = true;
  1265.                                 $rootScope.messagesLoading = true;
  1266.  
  1267.                                 setTimeout(function(){
  1268.                                         _soundDelay = false;
  1269.                                 }, 8000);
  1270.                                
  1271.                                 currentChat.on('value', function (data) {
  1272.                                         var loadedChat = data.val();
  1273.  
  1274.                                         if(loadedChat == null){
  1275.                                                 $scope.messages = [{name: "babblred", text:"Nothing yet, start babblin'!", blogImg: "http://24.media.tumblr.com/avatar_9d58c9639257_30.png"}];
  1276.                                                 $rootScope.messagesLoading = false;
  1277.                                         } else if ( ($rootScope.loggedIn == false) || ($rootScope.loggedIn == undefined)) {
  1278.                                                 $scope.messages = [];
  1279.                                                 $rootScope.messagesLoading = false;
  1280.                                         } else {
  1281.                                                 $scope.messages = loadedChat;
  1282.                                                 scrollAll();
  1283.                                                 $rootScope.messagesLoading = false;
  1284.  
  1285.                                                 var _currBlogName = loadedChat.name,
  1286.                                                         _myBlogID = $rootScope.blog.name;
  1287.                                                 if ($scope.settings != null){
  1288.                                                         var _soundSetting = $scope.settings.sound;
  1289.                                                 }
  1290.  
  1291.                                                 if ((_currBlogName != _myBlogID) && ($rootScope.loggedIn == true) && (_soundDelay != true) && (_soundSetting != 'false')) {
  1292.                                                         playSound();
  1293.                                                 }
  1294.                                         }
  1295.                                 });
  1296.                         } else if ($scope.currentChatID == 'babblrDefault') {
  1297.                                 $scope.messages = [{name: "babblred", text:"Nothing yet, create a group or select a friend and start babblin'! Need help? :bblrfaqs:", blogImg: "http://24.media.tumblr.com/avatar_9d58c9639257_30.png"}];
  1298.                                 $rootScope.messagesLoading = false;
  1299.                         } else {
  1300.                                 $scope.messages = [{name: "babblred", text:"Nothing yet, create a group or select a friend and start babblin'! Need help? :bblrfaqs:", blogImg: "http://24.media.tumblr.com/avatar_9d58c9639257_30.png"}];
  1301.                                 $rootScope.messagesLoading = false;
  1302.                         }
  1303.  
  1304.                 };
  1305.  
  1306.                 //reset the chat message area
  1307.                 function resetLoadedChatMsgs () {
  1308.                         $scope.messages = [];
  1309.                 };
  1310.  
  1311.                 /**
  1312.                  * switchChat() associates the messages with the blog, asks user for approval
  1313.                  */
  1314.                 $scope.switchChat = function (friend, type) {
  1315.                         var chatID = friend.ID,
  1316.                                 convoInit = friend.init,
  1317.                                 approved = friend.approved,
  1318.                                 _friendName = friend.name+"",
  1319.                                 _myFollowers = $rootScope.blog.followers,
  1320.                                 _myFollowing = $rootScope.blog.following;
  1321.  
  1322.                         $rootScope.blogOnDeck = {
  1323.                                 propID: friend.ID,
  1324.                                 me: $rootScope.blog.name,
  1325.                                 them: friend.name,
  1326.                                 type: type
  1327.                         };
  1328.  
  1329.                         //checks the status, if undefined creates new
  1330.                         function checkApprovalStatus (friendID, type) {
  1331.                                 //if approved == undefined getStatus
  1332.                                 if (approved === undefined) {
  1333.                                         Notify.getStatus($rootScope.blogOnDeck.me, $rootScope.blogOnDeck.them, $rootScope.blogOnDeck.type)
  1334.                                                 .then(function(convoStatus) {
  1335.                                                         if (convoStatus == true) {
  1336.                                                                 // approved, fire up the convo
  1337.                                                                 startUpChat(chatID);
  1338.                                                         } else {
  1339.                                                                 // not approved yet, alert user of update
  1340.                                                                 notifyOfWait(approved);
  1341.                                                         }
  1342.                                         });
  1343.  
  1344.                                 //if approved == true start chat
  1345.                                 } else if (approved === true) {
  1346.                                         startUpChat(chatID);
  1347.  
  1348.                                 //else nope and notify of waitng
  1349.                                 } else if (approved == "nope") {
  1350.                                         if (convoInit == $rootScope.blogOnDeck.me) {
  1351.                                                 Notify.alert("You blocked this chat", 3000);
  1352.                                         } else {
  1353.                                                 notifyOfWait(approved);
  1354.                                         }
  1355.  
  1356.                                 //else nope and notify of waitng
  1357.                                 } else {
  1358.                                         if (convoInit == $rootScope.blogOnDeck.me) {
  1359.                                                 notifyOfWait(approved);
  1360.                                         } else {
  1361.                                                 //ask for approval
  1362.                                                 $('.alertCenter').toggleClass('close');
  1363.                                                 $scope.showApproveMe = true;
  1364.                                         }
  1365.                                 }
  1366.                         };
  1367.  
  1368.                         function notifyOfWait (approved) {
  1369.                                 Notify.alertStatus(approved);
  1370.                                 $scope.showStartGroup = false;
  1371.                                 $scope.addToThisGroup = false;
  1372.                         };
  1373.  
  1374.                         function startUpChat (chatID) {
  1375.                                 if (chatID != $scope.currentChatID) {
  1376.                                         $rootScope.$broadcast('load:conversation', {chatID: chatID, chatType: type, prevCID: $scope.currentChatID});
  1377.                                         Notify.clearUnread($rootScope.blogOnDeck.me, type, $rootScope.blogOnDeck.them);
  1378.                                 }
  1379.                         };
  1380.  
  1381.                         //checks connections to see if need to combine convos
  1382.                         function checkTypeOf (blogName, type) {
  1383.                                 var defer = $q.defer();
  1384.                                 var _bool;
  1385.  
  1386.                                 var flingType = bbDB.child('users').child($rootScope.blog.name).child(type);
  1387.  
  1388.                                 flingType.on('value', function(flingData){
  1389.                                         var bool = flingData.hasChild(blogName);
  1390.                                         defer.resolve(bool);
  1391.                                 });
  1392.                                 return defer.promise;
  1393.                         };
  1394.  
  1395.                        
  1396.  
  1397.                         //Switch Chat logic
  1398.                         //if no chat yet, create one and wait for approval
  1399.                         if (chatID === undefined) {
  1400.                                 // setup for both types of friend IF
  1401.                                 checkTypeOf(_friendName, "following").then(function(bools) {
  1402.                                         $scope.flingType = bools;
  1403.                                 });
  1404.                                 checkTypeOf(_friendName, "followers").then(function(bools) {
  1405.                                         $scope.flowType = bools;
  1406.                                 });
  1407.                                 setTimeout(function(){
  1408.                                         Chat.create($rootScope.blog, type, friend, $scope.flingType, $scope.flowType);
  1409.  
  1410.                                         Notify.alert("Notified of New Chat", 3000);
  1411.                                         $scope.showStartGroup = false;
  1412.                                         $scope.addToThisGroup = false;
  1413.                                 },10);
  1414.                         } else {
  1415.                         //if there is a chat ID, see if its approved or needs approval
  1416.                                
  1417.                                 //if type "follweing" check if approved
  1418.                                 if (type == "following") {
  1419.                                         checkApprovalStatus($rootScope.blogOnDeck.them, type);
  1420.                                 }
  1421.  
  1422.                                 //if type "folower" check if approved
  1423.                                 if (type == "followers") {
  1424.                                         checkApprovalStatus($rootScope.blogOnDeck.them, type);
  1425.                                 }
  1426.                         }
  1427.  
  1428.                 };
  1429.                 $scope.switchGroup = function (chatID) {
  1430.                         if (chatID != $scope.currentChatID) {
  1431.                                 $rootScope.$broadcast('load:conversation', {chatID: chatID, chatType: "group", prevCID: $scope.currentChatID});
  1432.                                 Notify.clearUnread($rootScope.blog.name, "groups", chatID);
  1433.                         }
  1434.                 };
  1435.                 $scope.setApStatus = function (val) {
  1436.                         Notify.setStatus($rootScope.blogOnDeck.me, $rootScope.blogOnDeck.them, $rootScope.blogOnDeck.type, val);
  1437.                         $('.alertCenter').toggleClass('close');
  1438.                         $scope.showApproveMe = false;
  1439.  
  1440.                         if (val === true) {
  1441.                                 $rootScope.$broadcast('load:conversation', {chatID: $rootScope.blogOnDeck.propID, chatType: $rootScope.blogOnDeck.type, prevCID: $scope.currentChatID});
  1442.                         } else {
  1443.                                 Notify.alert("Blocked from Chat", 3000);
  1444.                         }
  1445.                 };
  1446.  
  1447.                 $scope.blockFriend = function (friendID) {
  1448.                         var yes = confirm("Are you sure you want to block "+ friendID +"?"),
  1449.                                 myName = $rootScope.blog.name;
  1450.                         if (yes) {
  1451.                                 User.blockFriendID(myName, friendID);
  1452.                         }
  1453.                 };
  1454.  
  1455.                 $scope.toggleNewGroup = function () {
  1456.                         window.clearTimeout(currentAlert);
  1457.                         $scope.showLogin = false;
  1458.                         $scope.showStartGroup = true;
  1459.                         $scope.addToThisGroup = false;
  1460.  
  1461.                         $('.alertCenter').toggleClass('close');
  1462.  
  1463.                         var currentAlert = setTimeout(function(){
  1464.                                 $('.alertCenter').addClass('close');
  1465.                         }, 16000);
  1466.                 };
  1467.                 $scope.startNewGroup = function () {
  1468.                         var groupName = newGroup.groupName.value;
  1469.  
  1470.                         if (groupName == '') {
  1471.                                 alert('Please Enter a Group Name!');
  1472.                         } else {
  1473.                                 Chat.create($rootScope.blog, "group", groupName).then(function(newID){
  1474.                                         $rootScope.$broadcast('load:conversation', {chatID: newID, chatType: "group", prevCID: $scope.currentChatID});
  1475.                                         $rootScope.$broadcast('refresh:groups');
  1476.                                 });
  1477.                                 $scope.showStartGroup = false;
  1478.                                 $('.alertCenter').toggleClass('close');
  1479.                                 newGroup.groupName.value = '';
  1480.  
  1481.                                 $scope.messages = [{name: "babblred", text:"Click the plus above to add friends to this group!", blogImg: "http://24.media.tumblr.com/avatar_9d58c9639257_30.png"}];
  1482.                         }
  1483.                 };
  1484.                 $scope.deleteGroup = function (groupID, gAdmin) {
  1485.                         var yes = confirm("Are you sure you want to delete this group?"),
  1486.                                 myName = $rootScope.blog.name;
  1487.                        
  1488.                         if (gAdmin) {
  1489.                                 Notify.groupLimitDec(myName);
  1490.                         }
  1491.  
  1492.                         if (yes) {
  1493.                                 Chat.deleteGroup(myName, groupID, gAdmin).then(function(newID){
  1494.                                         $rootScope.$broadcast('load:conversation', {chatID: newID, chatType: "group", prevCID: $scope.currentChatID});
  1495.                                 });
  1496.                         }
  1497.                 };
  1498.                 $scope.toggleAddToGroup = function () {
  1499.                         if ($rootScope.loggedIn == true) {
  1500.                                 $scope.showLogin = false;
  1501.                                 $scope.showStartGroup = false;
  1502.                                 $scope.addToThisGroup = true;
  1503.  
  1504.                                 $('.alertCenter').toggleClass('close');
  1505.                         } else {
  1506.                                 alert("Please login first.");
  1507.                         }
  1508.                 };
  1509.                 $scope.addToGroup = function () {
  1510.                         var newMember = toGroup.userName.value;
  1511.                        
  1512.                         if (newMember == '') {
  1513.                                 alert('Please Enter a Friend Name!');
  1514.                         } else {
  1515.                                 Chat.addToGroup(newMember, $scope.currentChatID, $scope.actGroupName);
  1516.                                 $scope.addToThisGroup = false;
  1517.                                 $('.alertCenter').toggleClass('close');
  1518.                                 toGroup.userName.value = '';
  1519.                         }
  1520.                 };
  1521.  
  1522.  
  1523.                 //Append the clicked Emoticon
  1524.                 $scope.addEmoticon = function (expression) {
  1525.                         var theExp = ':' + expression + ':';
  1526.                         myMsg.value += theExp;
  1527.                         $('.emwrap').toggleClass('invisible');
  1528.                 };
  1529.  
  1530.                 //Scroll positioning:
  1531.                 function scrollAll () {
  1532.                         if ($scope.stopScroll == false) {
  1533.                                 $("#messContainer").animate({ scrollTop: $('#messContainer').height() + 15000}, 420);
  1534.                         }
  1535.                 };
  1536.  
  1537.                 //Styling Functions
  1538.                 ////
  1539.                 ////
  1540.                 $scope.babblrToggle = function (){
  1541.                         $('.babblr').toggleClass('inactive');
  1542.  
  1543.                         if ($rootScope.loggedIn == true) {
  1544.                                 $('.slideout').toggleClass('sidenull');
  1545.                         }
  1546.                 };
  1547.  
  1548.                 //Sets chat message styling for my profile
  1549.                 $scope.myProfile = function(msg){
  1550.                         if ($rootScope.blog.name !== null){
  1551.                                 if (msg.name == $rootScope.blog.name){
  1552.                                         return true;
  1553.                                 } else {
  1554.                                         return false;
  1555.                                 }
  1556.                         }
  1557.                 };
  1558.  
  1559.                 $scope.messageTime = function (text) {
  1560.                         if (text.length > 40){
  1561.                                 return true;
  1562.                         }
  1563.                         return false;
  1564.                 };
  1565.  
  1566.                 //Toggles the side panel
  1567.                 $scope.slideToggle = function (){
  1568.                         $('.slideout').toggleClass('sideopen');
  1569.                         $('.iconArrow').toggleClass('arrowIn');
  1570.                 };
  1571.                 function slideToggle () {
  1572.                         $('.slideout').toggleClass('sideopen');
  1573.                         $('.slideout').removeClass('sidenull');
  1574.                         $('.iconArrow').toggleClass('arrowIn');
  1575.                 };
  1576.  
  1577.                 //Toggles alerts
  1578.                 $scope.alertToggle = function () {
  1579.                         $('.alertCenter').toggleClass('close');
  1580.                 };
  1581.                
  1582.                 //Switch Tabs for Online or Settings
  1583.                 $scope.onlineVisible = true;
  1584.                 $scope.settingsVisible = false;
  1585.                 $scope.tabShow = function (tab){
  1586.                         if (tab == 'online'){
  1587.                                 $scope.onlineVisible = true;
  1588.                                 $scope.settingsVisible = false;
  1589.                         } else if (tab == 'settings'){
  1590.                                 $scope.onlineVisible = false;
  1591.                                 $scope.settingsVisible = true;
  1592.                         }
  1593.                 };
  1594.  
  1595.                 //Toggles the side panel audience list
  1596.                 $scope.toggleList = function(type){
  1597.                         if(type == "groups"){
  1598.                                 $('#group').toggleClass('invisible');
  1599.                         } else if (type == "followers" && $rootScope.blog.settings.flow == true) {
  1600.                                 $('#flow').toggleClass('invisible');
  1601.                         } else if (type == "following" && $rootScope.blog.settings.fling == true) {
  1602.                                 $('#fling').toggleClass('invisible');
  1603.                         }
  1604.                 };
  1605.                
  1606.                 //scope for emoticons
  1607.                 $scope.emoticons = [
  1608.                         {expression: "angry", title: "Angry"},
  1609.                         {expression: "what", title: "What?!"},
  1610.                         {expression: "hi", title: "Hi"},
  1611.                         {expression: "heart", title: "Heart"},
  1612.                         {expression: "mad", title: "Mad"},
  1613.                         {expression: "yell", title: "Yell"},
  1614.                         {expression: "chew", title: "Chewing"},
  1615.                         {expression: "girly", title: "Girly"},
  1616.                         {expression: "bust", title: "Busted!"},
  1617.                         {expression: "scared", title: "Scared"},
  1618.                         {expression: "doh", title: "DOH!"},
  1619.                         {expression: "cheesy", title: "Cheesy Smile"},
  1620.                         {expression: "jawdrop", title: "Jaw Drop"},
  1621.                         {expression: "bruise", title: "Bruised"},
  1622.                         {expression: "confused", title: "Confused"},
  1623.                         {expression: "vampire", title: "Vampire"},
  1624.                         {expression: "delirium", title: "Delirium"},
  1625.                         {expression: "swag", title: "Swagger"},
  1626.                         {expression: "ouch", title: "OUCH!"},
  1627.                         {expression: "love", title: "Love"},
  1628.                         {expression: "posh", title: "Posh"},
  1629.                         {expression: "frustrated", title: "Frustrated"},
  1630.                         {expression: "sour", title: "Sour"},
  1631.                         {expression: "inspect", title: "Inspect"},
  1632.                         {expression: "yeah", title: "Yeah"},
  1633.                         {expression: "happy", title: "Happy"},
  1634.                         {expression: "peek", title: "Peeking"},
  1635.                         {expression: "makefun", title: "Making Fun"},
  1636.                         {expression: "cry", title: "Cry"},
  1637.                         {expression: "eat", title: "Eat"},
  1638.                         {expression: "pray", title: "Praying"},
  1639.                         {expression: "content", title: "Content"},
  1640.                         {expression: "warm", title: "Warm"},
  1641.                         {expression: "yawn", title: "Yawning"},
  1642.                         {expression: "shhh", title: "Shhh"},
  1643.                         {expression: "kiss", title: "Kissing"},
  1644.                         {expression: "shocked", title: "Shocked"},
  1645.                         {expression: "celebrate", title: "Celebrating"},
  1646.                         {expression: "fail", title: "Fail"},
  1647.                         {expression: "smile", title: "Smiling"}
  1648.                 ];
  1649.  
  1650.                 $scope.emoToggle = function (){
  1651.                         $('.emwrap').toggleClass('invisible');
  1652.  
  1653.                         setTimeout(function(){
  1654.                                 $('.emwrap').addClass('invisible');
  1655.                         }, 6000);
  1656.                 };
  1657.         }
  1658.  
  1659. ]);
  1660.  
  1661. //Filter the user name length
  1662. BBLR.filter('shorten', function(){
  1663.         return function(str){
  1664.                 var _str = str+"";
  1665.                 if(_str.length > 20) {
  1666.                         var _string = _str.substring(0,20) + "...";
  1667.                         return _string;
  1668.                 } else {
  1669.                         return _str;
  1670.                 }
  1671.         };
  1672. });
  1673. //Filter the user name length
  1674. BBLR.filter('chop', function(){
  1675.         return function(str){
  1676.                 var _str = str+"";
  1677.                 if(_str.length > 20) {
  1678.                         var _string = _str.substring(0,20);
  1679.                         return _string;
  1680.                 } else {
  1681.                         return _str;
  1682.                 }
  1683.         };
  1684. });
  1685.  
  1686.  
  1687. // Filter for Naughty words ;)
  1688. BBLR.filter('setCensor',
  1689.  
  1690. ['$rootScope',
  1691. function($rootScope) {
  1692.         return function(str) {
  1693.                 // if ($scope.settings.censor != false) {
  1694.                         return str
  1695.                                 //the Naughty Words list
  1696.                                 .replace( /penis/gi, 'pernifish')
  1697.                                 .replace( /vagina/gi, 'varnish')
  1698.                                 .replace( /bitch/gi, 'birch')
  1699.                                 .replace( /asshole/gi, 'ashyperp')
  1700.                                 .replace( /nipple/gi, 'narprosh')
  1701.                                 .replace( /shit/gi, 'schmeggs')
  1702.                                 .replace( /damn/gi, 'derrpledop')
  1703.                                 .replace( /ass /gi, 'ashes ').replace( / ass/gi, ' ashes')
  1704.                                 .replace( /cunt/gi, 'cuggleschmug ')
  1705.                                 .replace( /bitch/gi, 'birch')
  1706.                                 .replace( /hell/gi, 'hess').replace( /hesso/gi, 'hello')
  1707.                                 .replace( /twat /gi, 'tartar ').replace( / twat/gi, ' tartar')
  1708.                                 .replace( /dipshit/gi, 'derpshell')
  1709.                                 .replace( /douchebag/gi, 'dineberg')
  1710.                                 .replace( /queer/gi, 'querglershler')
  1711.                                 .replace( /faggot/gi, 'foamserple').replace( /fag/gi, 'foamserple')
  1712.                                 .replace( /butt /gi, 'bertpergersh ').replace( / butt /gi, ' bertpergersh')
  1713.                                 .replace( /dyke/gi, 'diamonkergle')
  1714.                                 .replace( /tranny/gi, 'trangerlerg')
  1715.                                 .replace( /nigger/gi, 'nigelpowerz')
  1716.                                 .replace( /cracker/gi, 'barrelglesh')
  1717.                                 .replace( /piss/gi, 'purslersh')
  1718.                                 .replace( /whore/gi, 'whatargler')
  1719.                                 .replace( /hoe /gi, 'hummuluuuv').replace( / hoe/gi, ' hummuluuuv')
  1720.                                 .replace( /dick/gi, 'derrlergerck')
  1721.                                 .replace( /pussy/gi, 'purrdlewerl')
  1722.                                 .replace( /slut/gi, 'slerpyslershle')
  1723.                                 .replace( /skank/gi, 'skittleluvvrr')
  1724.                                 .replace( /fluzy/gi, 'flutergerds')
  1725.                                 .replace( /sex/gi, 'sergglesh ')
  1726.                                 .replace( /porn/gi, 'porrglesnortz')
  1727.                                 .replace( /poontang/gi, 'perrlylurgsy')
  1728.                                 .replace( /bastard/gi, 'baluggers')
  1729.                                 .replace( /tit /gi, 'turtlegersh ').replace( / tit /gi, ' turtlegersh ').replace( /tits /gi, 'turtlegersh ')
  1730.                                 .replace( /blowjob/gi, 'blurr').replace( /blow job/gi, 'blurr')
  1731.                                 .replace( /chink/gi, 'chillergerdle')
  1732.                                 .replace( /chode/gi, 'churnnbugler')
  1733.                                 .replace( /cooter/gi, 'croccluuvvr')
  1734.                                 .replace( /flamer/gi, 'flerrmbertz')
  1735.                                 .replace( /jackoff/gi, 'joggfurgersh')
  1736.                                 .replace( /dyke/gi, 'kangarooshle')
  1737.                                 .replace( /schlong/gi, 'schmidsterlag')
  1738.                                 .replace( /fuck/gi, 'fudgesicle')
  1739.                                 .replace( /gay/gi, 'grayderysh')
  1740.                                 .replace( /cock/gi, 'croyans')
  1741.                                 .replace( /poop/gi, 'boop')
  1742.                                 .replace( /horny/gi, 'honeypot')
  1743.                                 .replace( /butthole/gi, 'brertersh')
  1744.                                 .replace( /scrotum/gi, 'sceilwerm')
  1745.                         // }
  1746.         };
  1747. }]);
  1748.  
  1749. //Filter for Links and Emoticons
  1750. BBLR.filter('autoFormat', function () {
  1751.         var linkHTTP, linkWWW, linkMAIL, linkHASHTAG;
  1752.        
  1753.         //URLs starting with http://, https://, or ftp://
  1754.         linkHTTP = /(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim;
  1755.  
  1756.         //URLs starting with "www."
  1757.         linkWWW = /(^|[^\/])(www\.[\S]+(\b|$))/gim;
  1758.  
  1759.         //Change email addresses to mailto:: links.
  1760.         linkMAIL = /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim;
  1761.  
  1762.         return function(str) {
  1763.                    
  1764.                 return str
  1765.                         //change link to clickable link
  1766.                         .replace(linkHTTP, '<a href="$1" target="_blank">$1</a>')
  1767.                         .replace(linkWWW, '$1<a href="http://$2" target="_blank">$2</a>')
  1768.                         .replace(linkMAIL, '<a href="mailto:$1">$1</a>')
  1769.  
  1770.                         //change it to a clickable hashtag
  1771.                         .replace(/(^|\s)#(\w+)/g, '$1#<a href="http://www.tumblr.com/tagged/$2">$2</a>')
  1772.  
  1773.                         //The Emoticons
  1774.                         .replace(/:bblrfaqs:/gi, '<a href="http://babblr.me/faqs" target="_blank">Read the Faq\'s here.</a>')
  1775.                         .replace(/:angry:/gi, '<i class="em em-angry" title="Angry"></i>')
  1776.                         .replace(/:what:/gi, '<i class="em em-what" title="What?!"></i>')
  1777.                         .replace(/:hi:/gi, '<i class="em em-hi" title="Hi"></i>')
  1778.                         .replace(/:heart:/gi, '<i class="em em-heart" title="Heart"></i>')
  1779.                         .replace(/:mad:/gi, '<i class="em em-mad" title="Mad"></i>')
  1780.                         .replace(/:yell:/gi, '<i class="em em-yell" title="Yell"></i>')
  1781.                         .replace(/:chew:/gi, '<i class="em em-chew" title="Chewing"></i>')
  1782.                         .replace(/:girly:/gi, '<i class="em em-girly" title="Girly"></i>')
  1783.                         .replace(/:bust:/gi, '<i class="em em-bust" title="Busted!"></i>')
  1784.                         .replace(/:scared:/gi, '<i class="em em-scared" title="Scared"></i>')
  1785.                         .replace(/:doh:/gi, '<i class="em em-doh" title="DOH!"></i>')
  1786.                         .replace(/:cheesy:/gi, '<i class="em em-cheesy" title="Cheesy Smile"></i>')
  1787.                         .replace(/:jawdrop:/gi, '<i class="em em-jawdrop" title="Jaw Drop"></i>')
  1788.                         .replace(/:bruise:/gi, '<i class="em em-bruise" title="Bruised"></i>')
  1789.                         .replace(/:confused:/gi, '<i class="em em-confused" title="Confused"></i>')
  1790.                         .replace(/:vampire:/gi, '<i class="em em-vampire" title="Vampire"></i>')
  1791.                         .replace(/:delirium:/gi, '<i class="em em-delirium" title="Delirium"></i>')
  1792.                         .replace(/:swag:/gi, '<i class="em em-swag" title="Swagger"></i>')
  1793.                         .replace(/:ouch:/gi, '<i class="em em-ouch" title="OUCH!"></i>')
  1794.                         .replace(/:love:/gi, '<i class="em em-love" title="Love"></i>')
  1795.                         .replace(/:posh:/gi, '<i class="em em-posh" title="Posh"></i>')
  1796.                         .replace(/:frustrated:/gi, '<i class="em em-frustrated" title="Frustrated"></i>')
  1797.                         .replace(/:sour:/gi, '<i class="em em-sour" title="Sour"></i>')
  1798.                         .replace(/:inspect:/gi, '<i class="em em-inspect" title="Inspect"></i>')
  1799.                         .replace(/:yeah:/gi, '<i class="em em-yeah" title="Yeah"></i>')
  1800.                         .replace(/:happy:/gi, '<i class="em em-happy" title="Happy"></i>')
  1801.                         .replace(/:peek:/gi, '<i class="em em-peek" title="Peeking"></i>')
  1802.                         .replace(/:makefun:/gi, '<i class="em em-makefun" title="Making Fun"></i>')
  1803.                         .replace(/:cry:/gi, '<i class="em em-cry" title="Cry"></i>')
  1804.                         .replace(/:eat:/gi, '<i class="em em-eat" title="Eat"></i>')
  1805.                         .replace(/:pray:/gi, '<i class="em em-pray" title="Praying"></i>')
  1806.                         .replace(/:content:/gi, '<i class="em em-content" title="Content"></i>')
  1807.                         .replace(/:warm:/gi, '<i class="em em-warm" title="Warm"></i>')
  1808.                         .replace(/:yawn:/gi, '<i class="em em-yawn" title="Yawning"></i>')
  1809.                         .replace(/:shhh:/gi, '<i class="em em-shhh" title="Shhh"></i>')
  1810.                         .replace(/:kiss:/gi, '<i class="em em-kiss" title="Kissing"></i>')
  1811.                         .replace(/:shocked:/gi, '<i class="em em-shocked" title="Shocked"></i>')
  1812.                         .replace(/:celebrate:/gi, '<i class="em em-celebrate" title="Celebrating"></i>')
  1813.                         .replace(/:fail:/gi, '<i class="em em-fail" title="Fail"></i>')
  1814.                         .replace(/:smile:/gi, '<i class="em em-smile" title="Smiling"></i>')
  1815.                         .replace(/:\)/gi, '<i class="em em-smile" title="Smiling"></i>')
  1816.                         .replace(/:D/gi, '<i class="em em-smile" title="Smiling"></i>')
  1817.                         .replace(/;\)/gi, '<i class="em em-celebrate" title="Wink Face"></i>')
  1818.                         .replace(/:\'\(/gi, '<i class="em em-cry" title="Crying"></i>')
  1819.                         .replace(/;\'\(/gi, '<i class="em em-cry" title="Crying"></i>')
  1820.                         .replace(/:\(/gi, '<i class="em em-scared" title="Sad"></i>')
  1821.                         .replace(/:\]/gi, '<i class="em em-girly" title="Girly Smile"></i>')
  1822.                         .replace(/;\]/gi, '<i class="em em-girly" title="Girly Smile"></i>')
  1823.                         .replace(/#luvvit/gi, '<a href="http://shmeme.com">#luvvit</a>')
  1824.                         .replace(/#ermagherd/gi, '#ermaghersh')
  1825.                         .replace(/:babblr_creator:/gi, '<a href="http://trevorclarke.tumblr.com" target="_blank" title="Trevor Clarke"><img src="http://24.media.tumblr.com/avatar_163f46b5523b_30.png" width="30" /></a>');
  1826.  
  1827.         };
  1828. });
  1829. //end babblr;
  1830. })();