function Url (sessionid, callback) {

   var _cb;
   var _handler;
   var _sessionid;

   _cb = callback;
   _sessionid = sessionid;

   this.get = function (id) {

      if (! _handler) {
         if (window.XMLHttpRequest) _handler = new XMLHttpRequest ();
         else _handler = new ActiveXObject ("Microsoft.XMLHTTP");
      }

      if (_handler) {

         var hostname = window.location.hostname.toString ();

         _handler.open ("POST", "http://" + hostname + "/perl/mxmd/webchat/urlhandler", true);
         _handler.onreadystatechange = onresponse;
         _handler.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');

         _handler.send ("<urlhandler><task>get</task><sessionid>" + _sessionid + "</sessionid><id>" + id + "</id></urlhandler>");

      } else {

         showMsg ("An error occured. Please try again later");
      }
   }

   function onresponse () {

      if (_handler.readyState != 4 || _handler.status != 200)
         return;

      var xml = _handler.responseXML;
      if (xml == null) {
         showMsg ('Unexpected error, please try again later');
         return;
      }

      if (! findNode (xml, 'ok')) {
         showMsg ('Unexpected error, please try again later');
         return;
      }

      if (_cb)
        _cb ({'id': findNodeValue (xml, 'id'), 'url': findNodeValue (xml, 'url')});
   }

   function findNodeValue (node, tag) { try { return node.getElementsByTagName (tag)[0].firstChild.nodeValue; } catch (err) { return null; } }
   function findAttrValue (node, tag) { try { return node.attributes.getNamedItem (tag).value; } catch (err) { return null; } }
   function findNode (node, tag) { try { return node.getElementsByTagName (tag)[0]; } catch (err) { return null; } }
}

