Scripting con MSN Plus! Actualizando el mensaje personal con Twitter

Hoy Vargas me comentaba que algunos de sus contactos de Messenger utilizaban el mensaje personal de estado como si fuera Twitter, cambiándolo cada poco tiempo. Así que he decidido echar un rato, para ver si hacía un script que utilizara Twitter para modificar el mensaje de estado del Live Messenger, utilizando para ello MSN Plus!.

Aquí está el resultado:

var originalMessage = null;
var lastTwitt = null;
// we assume that the user has 
// the same id in twitter & messenger
var twitterServiceUrl = 
     "http://twitter.com/statuses/user_timeline/"+ 
     Messenger.MyEmail.split("@")[0] +".json";

function OnEvent_Initialize(MessengerStart) {
     originalMessage = Messenger.MyPersonalMessage;	
     // first twitt
     get_twitt();	
}

function OnEvent_Uninitialize(MessengerExit) {
     // recover the original message
     // before running the script
     if (originalMessage != null) {
          Messenger.MyPersonalMessage = originalMessage;
     }
}

function get_twitt() {
     var request = new ActiveXObject("Microsoft.XMLHTTP");
     if (request) {
          request.onreadystatechange = function() {
               if  (request.readyState == 4) {
	       var x = eval(request.responseText);
                    if (x.length > 0 && lastTwitt != x[0].id) {
                         lastTweet = x[0].id;
                         Messenger.MyPersonalMessage = x[0].text;					
                         }
                    }			
               };
          request.open("GET", twitterServiceUrl, true);
          request.send(null);
     }
     MsgPlus.AddTimer("twittTimer", 1000 * 60);
}

function OnEvent_Timer(id) {
     if (id == "twittTimer") {
          get_twitt();
          MsgPlus.AddTimer("twittTimer", 1000 * 60);	
      }
}

Espero que os guste.

Modificando un textarea desde javascript

Para modificar en Javascript el contenido de un textarea, podemos usar las propiedades selectionStart y selectionEnd que tenemos disponibles en Firefox y Opera.
Sin embargo, éstas no están disponibles en IE, por lo que debemos utilizar un feo truco para añadirlas.
Ahí va el código:

function UglyFixForSelectionStartAndSelectionEndForIE(id) {
    var element = $get(id);
    if(document.selection) {
        // The current selection 
        var range = document.selection.createRange();
        // We'll use this as a 'dummy'
        var stored_range = range.duplicate();
        // Select all text 
        stored_range.moveToElementText( element );
        // Now move 'dummy' end point to end point of original range 
        stored_range.setEndPoint('EndToEnd', range );
        // Now we can calculate start and end points 
        element.selectionStart = stored_range.text.length - range.text.length;
        element.selectionEnd = element.selectionStart + range.text.length;
    }
}

Y si estamos usando el ASP.NET Ajax Control Toolkit, bastará con utilizar:

        var element = this.get_element();
        if (Sys.Browser.agent === Sys.Browser.InternetExplorer)
            UglyFixForSelectionStartAndSelectionEndForIE(element.id);
        var start = element.selectionStart;
        var end = element.selectionEnd;
        var length = element.textLength;

La función es original de Stickblog