var handler     = null;

var nextmsgid = null;

function getUrl () {

   var hostname = window.location.hostname.toString ();
   return "http://" + hostname + "/perl/mxmd/webchat";
}

function startSession (callback) {
   document.getElementById ('to_input').value        = "";
   document.getElementById ('text_textarea').value   = "";
   document.getElementById ('text_length').innerHTML = "";

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

   if (handler != null) {

      handler.callback = callback;
      handler.onreadystatechange = onResponse;
      handler.open ("POST", getUrl() + "/session", true);
      handler.setRequestHeader('Content-Type', 'text/xml');

      var str = "<session><task>startsession</task><sourceurl><![CDATA[" + window.location + "]]></sourceurl></session>";
      handler.send (str);

   } else {

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

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;
   }

   var task = findNodeValue (xml, 'task');
   switch (task) {

      case 'startsession':

         var session = findNode (xml, 'session');
         if (! session) {
            showMsg ('Unexpected error - 3. Please try again later');
            return;
         }

         if (! session) {
            showMsg ('Unexpected error - 4. Please try again later');
            return;
         }

         sessionid = findNodeValue (session, 'session_id');
         nextmsgid = findNodeValue (session, 'nextmsg_id');

         if (! sessionid || ! nextmsgid) {
            showMsg ('Unexpected error - 5. Please try again later');
            return;
         }

         if (handler.callback != null)
            handler.callback (sessionid, nextmsgid);

         break;
   }
}

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;
   }
}

