///////////////////////////////////
//         ajax im 3.41          //
//    AJAX Instant Messenger     //
//   Copyright (c) 2006-2008     //
//    http://www.ajaxim.com/     //
//   Do not remove this notice   //
///////////////////////////////////

/**
 * Handles session and most requests to the server
 *
 **/
var System = {
  installPassword: '',
  
  /**
   * Check the server to see if it is configured with a
   * valid database.  If not, show database dialog.
   *
   * @arguments
   *   u - username (if undefined, get from Login dialog)
   *   p - password (if undefined, get from Login dialog)
   * 
   * @author Joshua Gross
   * @update Benjamin Hutchins
   * @update Daniel Howard
   **/
  install: function(p) {
	this.installPassword = (p? p: $('install_password').value);
	
    var xhConn = new XHConn();
    xhConn.connect(pingTo, "POST", "call=checkinstall&password="+hex_md5(this.installPassword)+"&dbstatus=false",
      function(xh) {
				alert(xh.responseText);
        var response = xh.responseText.parseJSON();
        if (response.auth) {
 	      Dialogs.database();
 	    } else {
 	      var errmsg = Languages.get('incorrectInfo');
          $('install_error_msg').innerHTML = errmsg;
          $('install_error_msg').show();
          new Effect.Shake('modal');
 	    }
      }
    );
  },

  configureServer: function() {
    var password = this.installPassword;
    var newpassword = $('install_password2').value;
    var dropdb = true;
    var createdb = true;
    var listdb = false;
    var writephp = true;
    var sqlhost = $('dbhost').value;
    var sqluser = $('dbusername').value;
    var sqlpass = $('dbpassword').value;
    var sqldb = $('dbname').value;
    var sqlprefix = $('dbpre').value;
    var maxBuddyIconSize = $('maxsize').value;
    
    var xhConn = new XHConn();
    xhConn.connect(pingTo, "POST", "call=install&password="+hex_md5(password)+"&newpassword="+newpassword+"&dropdb="+dropdb+"&createdb="+createdb+"&listdb="+listdb+"&writephp="+writephp+"&sqlhost="+sqlhost+"&sqluser="+sqluser+"&sqlpass="+sqlpass+"&sqldb="+sqldb+"&sqlprefix="+sqlprefix+"&maxbuddyiconsize="+maxBuddyIconSize,
      function(xh) {
        var response = xh.responseText.parseJSON();
        alert(xh.responseText);
        if (response.error == '') {
          login();
        } else {
          var errmsg = response.info[response.info.length-1];
          errmsg = errmsg.substring(errmsg.indexOf('('));
	      $('database_error_msg').innerHTML = errmsg;
	      $('database_error_msg').show();
	      new Effect.Shake('modal');
        }
      }
    );
  },

  /**
   * Login the user.  If it fails, show an error dialog
   * box.
   *
   * @arguments
   *   u - username (if undefined, get from Login dialog)
   *   p - password (if undefined, get from Login dialog)
   * 
   * @author Joshua Gross
   * @update Benjamin Hutchins
   * @update Daniel Howard
   **/
  login: function(u, p) {
    var username = (u? u: $('username').value);
    var password = (p? p: $('password').value);
      
    var xhConn = new XHConn();
    xhConn.connect(pingTo, "POST", "call=login&username="+username+"&password="+hex_md5(password),
      function(xh) {
        installCheckComplete = true;
 	    Element.setStyle('checkDialog', {'display': 'none'});
        var response = xh.responseText.parseJSON();
    	var errmsg = '';
        if (response.error == 'invalid') {
          errmsg = Languages.get('incorrectInfo');
        } else if (response.error == 'banned') {
          errmsg = Languages.get('userBanned');
        }
        if (errmsg != '') {
          $('login_error_msg').innerHTML = errmsg;
          $('login_error_msg').show();
          new Effect.Shake('modal');
        } else {
          loggedIn = true;
          user = response.username; // server returns unique username for anonymous logins
          pass = hex_md5(password);
          document.title = document.title + ': ' + user;
          defaultTitle = document.title;
          $('languageList').hide();
          $('modal').hide();
          pingTimer = setInterval('System.ping()', pingFrequency);
          if (roomMode && (typeof(Roomlist) != 'undefined')) {
            Roomlist.create();
          }
          if (!roomMode && (typeof(Buddylist) != 'undefined')) {
            Buddylist.create();
            // get a list of buddies that are blocking this user
            if (response.blocked && (response.blocked.length > 0)) {
              var blockList = response.blocked.parseJSON();
              Buddylist.blocked = blockList;
            } else {
              Buddylist.blocked = {};
            }
            if (response.buddy && (response.buddy.length > 0)) {
              var budList = response.buddy.parseJSON();
              for (var group in budList) {
                if (!$(group.replace(/\s/, '_')+'_group') && (group != 'toJSONString')) {
            	  Buddylist.addGroup(group);
                }
                if (!Buddylist.list[group]) {
            	  Buddylist.list[group] = {};
                }
                for (i=0; i<budList[group].length; i++) {
                  var buddy = budList[group][i];
                  Buddylist.list[group][buddy.username] = {'username': buddy.username, 'blocked': (Buddylist.blocked.inArray(buddy.username) ? true : false), 'status': buddy.is_online, 'icon': buddy.icon}
                  if (typeof(Buddylist.listObjects[buddy.username]) == 'undefined') {
                	Buddylist.addBuddy(buddy.username, group, buddy.icon);
                  }
                  $(Buddylist.listObjects[buddy.username].obj).setStyle({display: 'block'});
                  if (!blockedBuddyStatus && Buddylist.list[group][buddy.username].blocked) {
                    Buddylist.moveBuddy(buddy.username, Languages.get('offline'));
                    $(Buddylist.listObjects[buddy.username].img).src = 'themes/' + theme + '/blocked.png';
                  } else {
                    if ((buddy.is_online == Status.offline) || (buddy.is_online == Status.invisible)) {
                      Buddylist.moveBuddy(buddy.username, Languages.get('offline'));
                      $(Buddylist.listObjects[buddy.username].img).src = 'themes/' + theme + '/offline.png';
                    } else if(buddy.is_online == Status.away) {
                      Buddylist.moveBuddy(buddy.username, group);
                      $(Buddylist.listObjects[buddy.username].img).src = 'themes/' + theme + '/away.png';            
                    } else {
                      Buddylist.moveBuddy(buddy.username, group);
                      $(Buddylist.listObjects[buddy.username].img).src = 'themes/' + theme + '/online.png';
                    }
                    if (Buddylist.list[group][buddy.username].blocked == true) {
                      $(Buddylist.listObjects[buddy.username].img).src = 'themes/' + theme + '/blocked.png';
                    }
                  }
                }
              }
            }
          }
          if (response.admin == 1) {
            var s = document.createElement('script');
            s.src = 'js/admin.js?' + (new Date()).getTime();
            s.type = 'text/javascript';
            document.getElementsByTagName('head').item(0).appendChild(s);
            $('blBottomToolbar').innerHTML += '<a id="admin-button" href="#" onclick="AdminWindows.userSearch();return false;" title="Admin"><img src="themes/' + theme + '/window/admin.png" alt="Admin" style="border:0;" /></a>';
            $('admin-button').setStyle({'position':'absolute', 'left': '0', 'top': '0'});
          }

          Event.observe(document, 'focus', function() { blinkerOn(false); });
          Event.observe(window, 'focus', function() { blinkerOn(false); });
          Event.observe(document, 'blur', function() { blinkerOn(true); });
          Event.observe(window, 'blur', function() { blinkerOn(true); });

          Event.observe(document, 'keypress',
            function(event) {
              event = event || window.event;
              if (Windows.focusedWindow.getId().indexOf('_im') != -1 && IM.sendBoxWithFocus == null) {
                var sB = $(Windows.focusedWindow.getId() + '_sendBox');
                sB.focus(); sB.value += String.fromCharCode(event.charCode);
              }
            }
          );

          Event.stopObserving(window, 'resize', recenterModal);
          Status.lastIM = new Date().getTime();
          System.ping();
          if (roomMode) {
            Chatroom.join('lobby', 'anonymous');
          }
        }
      }
    );
  },

  /**
   * Log out the user
   *
   * @author Joshua Gross
   **/
  logout: function() {
    if ((user == '') || (pass == '')) {
      return;
    }
    var xmlhttp=false; 
    /*@cc_on @*/ 
    /*@if (@_jscript_version >= 5) 
    try { 
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); 
    } catch (e) { 
      try { 
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
      } catch (E) { 
        xmlhttp = false; 
      } 
    } 
    @end @*/
    if (!xmlhttp && (typeof XMLHttpRequest!='undefined')) { 
      xmlhttp = new XMLHttpRequest(); 
    }
    xmlhttp.open('POST', pingTo, false);
    xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlhttp.send('call=logout&user='+user);
    clearTimeout(pingTimer);
    defaultTitle = document.title = document.title.replace(': ' + user, '');
    user = '';
    pass = '';
    loggedIn = false;
    if (typeof(Status) != 'undefined') {
      Status.state = Status.online;
      Status.awayMessage = '';
    }
    Element.stopObserving(window, 'resize', recenterModal);
    if (!roomMode && (typeof(Buddylist) != 'undefined')) {
      Buddylist.destroy();
    }
    for (var name in IM.windows) {
      if (typeof(IM.windows[name].getId) != 'undefined' && typeof($(IM.windows[name].getId())) != 'undefined') {
        try {
          if (IM.windows[name].detached) {
            IM.windows[name].popup.close();
          } else {
            IM.windows[name].destroy();
          }
        } catch(e) { }
      }
    }

    for (var name in Chatroom.windows) {
      if (typeof(Chatroom.windows[name].getId) != 'undefined' && typeof($(Chatroom.windows[name].getId())) != 'undefined') {
        try {
          Chatroom.windows[name].destroy();
        } catch(e) { }
      }
    }
    if ($('admin-userSearch')) {
      Windows.getWindow('admin-userSearch').destroy();
    }

    Dialog.alert('<span class="dialog_long_label">' + Languages.get('signedOff') + '</span>',
      { windowParameters: {className:'alert', width:alertWidth, height: 85}, 
        okLabel: Languages.get('reconnect'),
        ok: function(win) {
          try {
            window.location.reload();
          } catch(e) { }
        }
      }
    );
  },

   /**
    * Ping the server for new events and messages.
    * The heart of this script.
    *
    * @author Joshua Gross
    **/
   ping: function() {
     // set user to away after a period of inactivity
     if (idleTime > 0) {
	   var timeout = new Date().getTime() - (idleTime * 60 * 1000);
	   if ((typeof(Status) != 'undefined') && (Status.lastIM < timeout) && (Status.state == Status.online)) {
	     Status.set(Status.away, Languages.get('away'));
	     Status.wasSetAutoAway = true;
	   }
	 }

     // call 'ping' action
     var status = (typeof(Status) != 'undefined')? Status.state: 0;
     var xhConn = new XHConn();
     xhConn.connect(pingTo, "POST", "call=ping&status="+status,
       function(xh) {
         if (((typeof xh.status != 'undefined') && (xh.status != 200)) || (xh.responseText.substring(0, 13) == 'not_logged_in')) {
           System.logout();
           return;
         }
                   
         if (trim(xh.responseText).length == 0) {
           return;
         }

         var response = xh.responseText.parseJSON();

         var i;

         // decode the messages which in "call=ping" response
         var messageCount = (typeof(response.messages) !== 'undefined')? response.messages.length: 0;
         for (i=0; i < messageCount; i++) {
           var to = response.messages[i].to;
           var from = response.messages[i].from;
           var room = response.messages[i].room;
           var roomType = room.split(',', 2)[0];
           var roomName = room.split(',', 2)[1];
           var data = response.messages[i].message;
           //alert("message:" + data);

           var winId = null;
           var winObj = null;
           try {
             winObj = window[roomType].windows[roomName];
        	 winId = winObj.getId();
           } catch(e) { };
            
           if (!$(winId)) {
             window[roomType].create(roomName, roomName);
             winObj = window[roomType].windows[roomName];
        	 winId = winObj.getId();
           } else if (!winObj.detached && !winObj.isVisible()) {
             winObj.show();
             setTimeout("scrollToBottom('" + winId + "_rcvd')", 125);
           }
               
           var curIM = (!winObj.detached? $(winId+"_rcvd"): winObj.popup.$(winId+"_rcvd"));
               
           data = data.replace(/(\s|\n|>|^)(\w+:\/\/[^<\s\n]+)/, '$1<a href="$2" target="_blank">$2</a>');
           data = IM.emoteReplace(data, smilies);

           var alias = getAlias(from, roomName);
           var className = ((from == user) && (roomType == 'Chatroom'))? 'userA': 'userB';
           
           curIM.innerHTML += System.formatMessage(className, alias, data);
           curIM.scrollTop = curIM.scrollHeight - curIM.clientHeight + 6;
               
//         if(!initial) {
           if (curIM.innerHTML.toLowerCase().replace(/<\S[^>]*>/g, '').indexOf(user.toLowerCase()+': (' + Languages.get('autoreply').toLowerCase() + ')') == -1 && typeof(Status) != 'undefined' && Status.state == Status.away && roomName == from) {
             var fontName    = $(winId + '_setFont').innerHTML;
             var fontSize    = $(winId + '_setFontSize').innerHTML;
             var fontColor   = $(winId + '_setFontColorColor').style.backgroundColor;
             window[roomType].sendMessage(roomType + "," + from, '(' + Languages.get('autoreply') + ') ' + Status.awayMessage, false, false, fontName, fontSize, fontColor);
           }
                  
           if (Windows.getFocusedWindow().getId() != winId && pulsateTitles == true) {
             new Effect.Pulsate(winId + '_top');
           }
            
           if (titlebarBlinker == true && useBlinker == true) {
             clearTimeout(blinkerTimer);
             blinkerTimer = setTimeout("titlebarBlink('"+room+"', \""+data.replace(/\"/, '\"').replace(/<([^>]+)>/ig, '')+"\", 0)", blinkSpeed);
           }
//         }
           curIM = null;
         }
            
         if ((messageCount > 0) && audioNotify) {
           soundManager.play('msg_in');
         }
                   
         // decode the events which in "call=ping" response
         var eventCount = (typeof(response.events) !== 'undefined')? response.events.length: 0;
         for (i=0; i < eventCount; i++) {
           var from = response.events[i].from;
           var who = (response.events[i].to == user)? response.events[i].from: response.events[i].to;
           var event = response.events[i].event.split(',');
           //alert("event:" + event[0]);
           switch(event[0]) {
             case 'status':
               if (!roomMode && (typeof(Buddylist) != 'undefined')) {
                 var group = response.events[i].group;
                 if (group && !$(group.replace(/\s/, '_')+'_group') && group != 'toJSONString') {
                   Buddylist.addGroup(group);
                 }

                 if (typeof(Buddylist.listObjects[from]) == 'undefined') {
                   Buddylist.addBuddy(from, group, 'none');
                   Buddylist.list[group][from] = {'username': from, 'blocked': false, 'status': event[1]};
                   $(Buddylist.listObjects[from].obj).setStyle({display: 'block'});
                 } else if (group == null) {
                   group = Buddylist.listObjects[from].group;
                 }

                 Buddylist.list[group][from].status = event[1];

                 if (!blockedBuddyStatus && typeof(Buddylist.list[group][from]) !== 'undefined' && Buddylist.list[group][from].blocked) {
                   Buddylist.moveBuddy(from, Languages.get('offline'));
                   $(Buddylist.listObjects[from].img).src = 'themes/' + theme + '/blocked.png';
                 } else {
                   if ((event[1] == Status.offline) || (event[1] == Status.invisible)) {
                     Buddylist.moveBuddy(from, Languages.get('offline'));
                     IM.notifyUser(from, Languages.get('signedoff').replace('%1', from));
                     $(Buddylist.listObjects[from].img).src = (typeof(Buddylist.list[group][from]) !== 'undefined' && Buddylist.list[group][from].blocked ? 'themes/' + theme + '/blocked.png' : 'themes/' + theme + '/offline.png');
                   } else if(event[1] == Status.away) {
                     Buddylist.moveBuddy(from, group);
                     IM.notifyUser(from, Languages.get('wentaway').replace('%1', from));
                     $(Buddylist.listObjects[from].img).src = (typeof(Buddylist.list[group][from]) !== 'undefined' && Buddylist.list[group][from].blocked ? 'themes/' + theme + '/blocked.png' : 'themes/' + theme + '/away.png');
                   } else {
                     Buddylist.moveBuddy(from, group);
                     IM.notifyUser(from, Languages.get('cameback').replace('%1', from));
                     $(Buddylist.listObjects[from].img).src = (typeof(Buddylist.list[group][from]) !== 'undefined' && Buddylist.list[group][from].blocked ? 'themes/' + theme + '/blocked.png' : 'themes/' + theme + '/online.png');
                   }
                 }
               }
               break;
             case 'chat':
               var rcvdBox = $(Chatroom.windows[event[2]].getId()+"_rcvd");
               if (event[1] == 'join') {
                 if (!$(from+'_'+event[2]+'_chatUser') && typeof(Chatroom.windows[event[2]]) != 'undefined') {
                   Chatroom.windows[event[2]].addUser(from);
                 }
                 if (from != user) {
                   var aliasme = getAlias(user, event[2]);
                   System.changeAlias(event[2], aliasme);
                 }
                 rcvdBox.innerHTML = rcvdBox.innerHTML + "<b class=\"userB\">" + "<i>"+from+" " + Languages.get('hasJoined') + "</i></b><br>";
                 scrollToBottom(Chatroom.windows[event[2]].getId()+"_rcvd");
               } else if(event[1] == 'left') {
                 if (typeof(Chatroom.windows[event[2]]) != 'undefined') {
                   Chatroom.windows[event[2]].deleteUser(from);
                 }
                 rcvdBox.innerHTML = rcvdBox.innerHTML + "<b class=\"userB\">" + "<i>"+from+" " + Languages.get('hasLeft') + "</i></b><br>";
                 scrollToBottom(Chatroom.windows[event[2]].getId()+"_rcvd");
               }
               break;
             case 'alias':
               if (event[1] == 'change') {
                 Chatroom.windows[event[2]].changeAlias(who, event[3]);
               }
               break;
             case 'room':
               if (event[1] == 'add') {
                 Roomlist.addRoom(event[2]);
               } else if(event[1] == 'delete') {
                 var deleteRoom = true;
                 for (var i=0; i < predefRooms.length; i++) {
                   if (predefRooms[i] == event[2]) {
                     deleteRoom = false;
                   }
                 }
                 if (deleteRoom) {
                   Roomlist.deleteRoom(event[2]);
                 }
               }
               break;
           }
         }
       }
     );
     xhConn = null;
   },

   /**
    * Transform strings/commands into final output.
    *
    * @author Daniel Howard
    **/
   formatMessage: function(userclass, from, message) {
      var retVal = '';

      if (from == "GM") {
         if(message.replace(/<([^>]+)>/ig, '').indexOf('/say') == 0)
            retVal = from + " says, &ldquo;" + message.replace(/<([^>]+)>/ig, '').replace(/\/say\s/, '') + "&rdquo;<br>\n";
         else if(message.replace(/<([^>]+)>/ig, '').indexOf('/ooc') == 0)
            retVal = from + ":" + message.replace(/<([^>]+)>/ig, '').replace(/\/ooc/, '') + "<br>\n";
         else
            retVal = message.replace(/<([^>]+)>/ig, '') + "<br>\n";
      } else {
         if(message.replace(/<([^>]+)>/ig, '').indexOf('/me') == 0)
            retVal = "<b class=\"" + userclass + "\">" + from + "</b> " + message.replace(/<([^>]+)>/ig, '').replace(/\/me/, '') + "<br>\n";
         else if(message.replace(/<([^>]+)>/ig, '').indexOf('/ooc') == 0)
            retVal = "<b class=\"" + userclass + "\">" + from + "</b>:" + message.replace(/<([^>]+)>/ig, '').replace(/\/ooc/, '') + "<br>\n";
         else
            retVal = "<b class=\"" + userclass + "\">" + from + "</b> says, &ldquo;" + message + "&rdquo;<br>\n";
      }

      return retVal;
   },

   /**
    * Register user from Register dialog box.
    *
    * @author Joshua Gross
    **/
   register: function() {
      // if registration is disabled, don't do anything
      if (!allowNewUsers) {
         return;
      }

      var error = '';
      
      var registerButton = $('register_button');
      Event.stopObserving(registerButton, 'click', System.register);
      
      if(($('newpassword').value == $('newpassword2').value)) {
         if(!emailRequired || checkEmailAddr($('newemail').value)) {
            if($('newpassword').value.length >= 6 && $('newpassword').value.length <= 20) {
               if(checkUserName($('newusername').value)) {
                  var xhConn = new XHConn();
                  
                  var username = $('newusername').value;
                  var password = $('newpassword').value;
                  var email    = $('newemail').value;
                  xhConn.connect(pingTo, "POST", "call=register&username="+username+"&password="+password+"&email="+email,
                     function(xh) {
                        switch(xh.responseText) {
                           case 'user_registered':
                              Dialog.alert('<span class="dialog_long_label">' + Languages.get('registerSuccess') + '</span><div style="clear:both"></div>',
                                           {windowParameters: {className:'alert', width:alertWidth},
                                            ok:function(win) { clearInputs(); Dialog.closeInfo(); Dialogs.login(); }});
                              Event.observe(registerButton, 'click', System.register);
                              return;
                           case 'username_taken':
                              error = Languages.get('registerUsernameTaken');
                              break;
                           case 'username_bad':
                              error = Languages.get('registerUsernameBad');
                              break;
                           case 'password_bad_length':
                              error = Languages.get('registerPasswordShort');
                              break;
                           case 'invalid_email':
                              error = Languages.get('registerInvalidEmail');
                              break;
                           case 'email_already_used':
                              error = Languages.get('registerEmailTaken');
                              break;
                           default:
                              error = Languages.get('registerFailed');
                        }
                        
                        $('register_error_msg').innerHTML = error;
                        $('register_error_msg').setStyle({display: 'block'});
                        
                        new Effect.Shake('modal');
                        Event.observe(registerButton, 'click', System.register);
                     });
                     return;
               } else {
                  error = Languages.get('registerUsernameBad');
               }
            } else {
               error = Languages.get('registerPasswordShort');
            }
         } else {
            error = Languages.get('registerInvalidEmail');
         }
      } else {
         error = Languages.get('registerPasswordsMatch');
      }
      
      $('register_error_msg').innerHTML = error;
      $('register_error_msg').setStyle({display: 'block'});
      
      new Effect.Shake('modal');
      
      Event.observe(registerButton, 'click', System.register);
   },

   /**
    * Change a user's password
    *
    * @author Joshua Gross
    * @update Benjamin Hutchins
    **/
   changePass: function() {
      var currentPw = $('currentpw').value, newPw = $('newpw').value, error = '';

      if(hex_md5(currentPw) == pass) {
         if(newPw == $('confirmpw').value) {
            var xhConn = new XHConn();
            xhConn.connect(pingTo, "POST", "call=pwdchange&username="+user+"&password="+hex_md5(currentPw)+"&newpwd="+newPw,
               function(xh) {
                  if(xh.responseText == 'pw_changed') {
                     Dialog.closeInfo();
                     Dialog.alert('<span class="dialog_long_label lang-changeSuccess">' + Languages.get('changeSuccess') + '</span><div style="clear:both"></div>', {windowParameters: {className:'alert', width:alertWidth, height:85}, ok: function(win) { Dialog.closeInfo(); Windows.close('changePass'); setTimeout('System.logout();', 250); } });
                  } else if(xh.responseText == 'invalid_pw') {
                     error = Languages.get('currentPassInvalid');
                     $('currentpw').value = '';
                  } else if(xh.responseText == 'password_bad_length') {
                     error = Languages.get('changePasswordShort');
                     $('newpw').value = '';
                     $('confirmpw').value = '';
                  } else {
                     error = Languages.get('changeFailed');
                  }
                  if(error.length > 0) {
                     $('changepass_error_msg').innerHTML = error;
                  }
               }
            );
         } else {
            error = Languages.get('changeNoMatch');
         }
      } else {
         error = Languages.get('currentPassInvalid');
      }
      if(error.length > 0) {
         $('changepass_error_msg').innerHTML = error;
      }
   },

   /**
    * Reset a user's password to something new because they forgot it
    *
    * @author Joshua Gross
    * @update Benjamin Hutchins
    **/
   resetPass: function() {
      var xhConn = new XHConn();
      xhConn.connect(pingTo, "POST", "call=reset&email="+encodeURIComponent($('resetto').value),
         function(xh) {
            var error = '';
            if(xh.responseText == 'pw_reset') {
               Dialog.alert('<span class="dialog_long_label lang-newPasswordEmailed langinsert-clear">' + Languages.get('newPasswordEmailed').replace('%1', $('resetto').value) + '</span><div style="clear:both"></div>', {windowParameters: {className:'alert', width:alertWidth}, ok:function(win) { clearInputs(); Dialog.closeInfo(); Dialogs.login(); }});
            } else if(xh.responseText == 'no_email_on_record') {
               error = Languages.get('noEmailOnRecord');
            } else {
               error = Languages.get('problemResetting');
            }
            
            if (error.length > 0) {
               $('forgotpass_error_msg').innerHTML = error;
               $('forgotpass_error_msg').setStyle({display: 'block'});
               new Effect.Shake('modal');
            }
         }
      );
   },

  /**
   * Update a user's alias
   *
   * @author Daniel Howard
   **/
  changeAlias: function(room, alias) {
    var roomType = room.split(',', 2)[0];
    var roomName = room.split(',', 2)[1];
    room = roomName;
    var xhConn = new XHConn();
    xhConn.connect(pingTo, "POST", "call=changealias&room="+room+"&alias="+alias,
      function(xh) {
        if (xh.responseText == 'success') {
        } else {
          error = Languages.get('changeProfileFailed');
        }
      }
    );
  },

   /**
    * Update a user's budddy profile 
    *
    * @author Benjamin Hutchins
    **/
   changeProfile: function() {
      var profile = $('changeprofile_textarea').value, error = '';
      if(profile.replace(/\s/g, "") != "") {
         var xhConn = new XHConn();
         xhConn.connect(pingTo, "POST", "call=changeprofile&profile="+encodeURIComponent(profile),
            function(xh) {
               if(xh.responseText == 'success') {
                  Dialog.closeInfo();
                  Dialog.alert('<span class="dialog_long_label lang-changeProfileSuccess">' + Languages.get('changeProfileSuccess') + '</span><div style="clear:both"></div>',
                               {windowParameters: {className:'alert', width:alertWidth, height:85},
                                ok: function(win) { Dialog.closeInfo(); Windows.close('changeProfile'); } });
               } else {
                  error = Languages.get('changeProfileFailed');
               }

               if(error.length > 0) {
                  $('changeprofile_error_msg').innerHTML = error;
               }
            }
         );
      } else {
         error = Languages.get('changeProfileEmpty');
      }
      if(error.length > 0) {
         $('changeprofile_error_msg').innerHTML = error;
      }
   },

   /**
    * Update a users's buddy icon
    *
    * @author Benjamin Hutchins
    **/
   changeIcon: function() {
      // get the iframe as a variable
      var i = $('changeicon_iframe');
      if (i.contentDocument) {
         var d = i.contentDocument;
      } else if (i.contentWindow) {
         var d = i.contentWindow.document;
      } else {
         var d = window.frames['changeicon_iframe'].document;
      }

      // if the iframe was never processed, then return empty
      if (d.location.href == "about:blank") {
         return;
      }

      // handle returns from the server
      var error = '', response = d.body.innerHTML;
      if(response == 'success'){
         Dialog.closeInfo();
         Dialog.alert('<span class="dialog_long_label lang-changeBuddyiconSuccess">'+Languages.get('changeBuddyiconSuccess')+'</span><div style="clear:both"></div>',{windowParameters:{className:'alert',width:alertWidth,height:85},ok:function(win){Dialog.closeInfo();Windows.close('changeIcon');}});
      } else if (response == 'nofile') {
         error = Languages.get('changeIconSelectFile');
      } else if (response == 'size') {
         error = Languages.get('changeIconSize');
      } else if (response == 'bad_type') {
         error = Languages.get('changeIconBadType');
      } else if (response == 'bad_extension') {
         error = Languages.get('changeIconBadExtension');
      } else {
         error = Languages.get('changeIconFailed');
      }

      // if there was an error, show it
      if(error.length > 0) {
         $('changeicon_error_msg').innerHTML = error;
      }
   },

  /**
   * Simple 'onkeypress' event handler for text inputs
   * to invoke func() on Enter/Return key.
   *
   * @author Benjamin Hutchins
   **/
  keyHandler: function(event, func) {
    event = event || window.event;
    var asc = document.all? event.keyCode: event.which;
    if ((asc == 13) && (typeof func == 'function')) {
      func();
    }
    return asc != 13;
  }
};
