function trim(str) {
  str= str.replace( /^\s+/g, "" );// strip leading
  return str.replace( /\s+$/g, "" );// strip trailing
}

function rfc3339ToJSDate(rfcdate) {
    var dt = rfcdate.split("T");
    dt[0] = dt[0].split("-");
    var time, offset;
    if (dt[1].charAt(dt[1].length - 1) == "Z") {
        time = dt[1].substr(0, dt[1].length);
        offset = "+00:00";
    } else {
        time = dt[1].substr(0, dt[1].length - 6);
        offset = dt[1].substr(dt[1].length - 6, 6);
    }
    time = time.split(":");
    var h = parseInt(time[0]);
    var m = parseInt(time[1]);
    var s = parseFloat(time[2]);
    var ms = Date.UTC(dt[0][0], dt[0][1] - 1, dt[0][2], parseInt(time[0]), parseInt(time[1]), parseFloat(time[2]));
    var isPlus = offset.charAt(0) == "+";
    offset = offset.substring(1, offset.length);
    offset = offset.split(":");
    var offh, offm;
    offset[0].charAt(0) == "0" ? (offh = parseInt(offset[0].charAt(1))) : (offh = parseInt(offset[0]));
    offset[1].charAt(0) == "0" ? (offm = parseInt(offset[1].charAt(1))) : (offm = parseInt(offset[1]));
    var offms = (offh * 60 + offm) * 60 * 1000;
    if (isPlus) {
        return new Date(ms - offms);
    } else {
        return new Date(ms + offms);
    }
}

function formatTime(date)
{
  var time;
  var month = date.getMonth() + 1;

  time = date.getFullYear() + "/" ;
  time = time + ((month < 10) ? "0" + month : month) + "/";
  time = time + ((date.getDate() < 10) ? "0" + date.getDate() : date.getDate()) + " ";
  time = time + ((date.getHours() < 10) ? "0" + date.getHours() : date.getHours()) + ":";
  time = time + ((date.getMinutes() < 10) ? "0" + date.getMinutes() : date.getMinutes()) + ":";
  time = time + ((date.getSeconds() < 10) ? "0" + date.getSeconds() : date.getSeconds()) + ".";

  var ms = date.getMilliseconds();
  if (ms < 10)
  {
    time = time + "00";
  }
  else if (ms < 100)
  {
    time = time + "0";
  }
  time = time + ms;

  return time;
}

function getRequest()
{
  var xmlHttp = false;
  // Internet Explorer
  try {
	  xmlHttp  = new ActiveXObject("Msxml2.XMLHTTP");
  } catch(e) {
	  try {
		  xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");
	  } catch(e) {
		  xmlHttp  = false;
	  }
  }
  // Mozilla, Opera und Safari
  if (!xmlHttp  && typeof XMLHttpRequest != 'undefined') {
	  xmlHttp = new XMLHttpRequest();
  }

  return xmlHttp;
}

function _setRuleIds(selectElement, engine_url)
{
  var xmlHttp = getRequest();
  if (!xmlHttp) return;

  xmlHttp.open('GET', engine_url + '/rules', true);
  xmlHttp.onreadystatechange = function ()
  {
    if (xmlHttp.readyState == 4)
	{
      while (selectElement.options.length > 0)
      {
		selectElement.remove(0);
      }

      var ids = xmlHttp.responseText.split("\n");
      for (i=0; i < ids.length; i++)
      {
        var id = trim(ids[i]);
        if (id.length > 0)
        {
          var newId = document.createElement("option");
          newId.text = id;
          newId.value = id;
          var followingElement = null;
          if (document.all)
            followingElement = selectElement.length;
          selectElement.add(newId, followingElement);
        }
      }

      refreshRule(engine_url);
    }
  };
  xmlHttp.send(null);
}

function _insertRule(ruleId, element, engine_url)
{
  var xmlHttp = getRequest();
  if (!xmlHttp) return;

  xmlHttp.open('GET', engine_url + '/rules/' + ruleId, true);
  xmlHttp.onreadystatechange = function ()
  {
    if (xmlHttp.readyState == 4)
	{
      element.value = xmlHttp.responseText;
    }
  };
  xmlHttp.send(null);
}

function _deregisterRule(ruleId, engine_url)
{
  var xmlHttp = getRequest();
  if (!xmlHttp) return;

  xmlHttp.open('POST', engine_url + '/deregister', true);
  xmlHttp.onreadystatechange = function ()
  {
    if (xmlHttp.readyState == 4)
	{
	  refreshRuleIds(engine_url);
    }
  };
  xmlHttp.send("<deregister><subject>"+ruleId+"</subject></deregister>");
}

function _insertRuleTemplate(name, element, type)
{
  var xmlHttp = getRequest();
  if (!xmlHttp) return;

  xmlHttp.open('GET', mars_url + '/frontend/' + type + '-rules/' + name, true);
  xmlHttp.onreadystatechange = function ()
  {
    if (xmlHttp.readyState == 4)
	{
      element.value = xmlHttp.responseText;
    }
  };
  xmlHttp.send(null);
}

function _registerRule(rule, engine_url, busy_indicator)
{
  busy_indicator.style.visibility = "visible";

  var xmlHttp = getRequest();
  if (!xmlHttp) return;

  xmlHttp.open('POST', engine_url + '/register', true);
  xmlHttp.onreadystatechange = function ()
  {
    if (xmlHttp.readyState == 4)
	{
	  busy_indicator.style.visibility = "hidden";

	  var id = xmlHttp.responseText;

	  if (xmlHttp.status == 201)
	  {
        alert("rule registered with id " + id);
	  }
	  else
	  {
	    alert("status: " + xmlHttp.status + "\nmessage: " + xmlHttp.statusText);
	  }
    }
  };
  xmlHttp.send(rule);
}

function _insertEventTemplate(name, element)
{
  var xmlHttp = getRequest();
  if (!xmlHttp) return;

  xmlHttp.open('GET', mars_url + '/frontend/events/' + name, true);
  xmlHttp.onreadystatechange = function ()
  {
    if (xmlHttp.readyState == 4)
	{
      element.value = xmlHttp.responseText;
    }
  };
  xmlHttp.send(null);
}

function _sendEvent(event)
{
  var xmlHttp = getRequest();

  if (xmlHttp)
  {
	xmlHttp.open('POST', xml_eca_engine_url + '/incomingevents', true);
	xmlHttp.onreadystatechange = function ()
	{
		if (xmlHttp.readyState == 4)
		{
			// alert(xmlHttp.status);
		}
	};
	xmlHttp.send(event);
  }
}

function _insertProcessTemplate(name, element)
{
  var xmlHttp = getRequest();
  if (!xmlHttp) return;

  xmlHttp.open('GET', mars_url + '/frontend/processes/' + name, true);
  xmlHttp.onreadystatechange = function ()
  {
    if (xmlHttp.readyState == 4)
	{
      element.value = xmlHttp.responseText;
    }
  };
  xmlHttp.send(null);
}

function _runCCSProcess(process)
{
  var xmlHttp = getRequest();

  if (xmlHttp)
  {
	xmlHttp.open('POST', ccs_engine_url + '/execute', true);
	xmlHttp.onreadystatechange = function ()
	{
		if (xmlHttp.readyState == 4)
		{
			// alert(xmlHttp.status);
		}
	};
	xmlHttp.send(process);
  }
}

function _clearFrameworkLog()
{
  var xmlHttp = getRequest();

  if (xmlHttp)
  {
	xmlHttp.open('POST', mars_url + '/log/clear', true);
	xmlHttp.onreadystatechange = function ()
	{
		if (xmlHttp.readyState == 4)
		{
			refreshFrameworkLog();
		}
	};
	xmlHttp.send(null);
  }
}

function _insertFrameworkLog(minutes, element, busy_indicator)
{
  busy_indicator.style.visibility = "visible";

  var xmlHttp = getRequest();
  if (!xmlHttp) return;

  xmlHttp.open('GET', mars_url + '/log?minutes=' + minutes, true);
  xmlHttp.onreadystatechange = function ()
  {
    if (xmlHttp.readyState == 4)
	{
      var response = xmlHttp.responseXML.documentElement;
      var entries = response.getElementsByTagName('logentry');

      var log = "";

      for (i=0; i < entries.length; i++)
      {
        var entry = entries[i];

        var service = entry.getElementsByTagName('service')[0].firstChild.data;

        var timestamp = entry.getElementsByTagName('timestamp')[0].firstChild.data;
        var date = new Date();
        date.setTime(timestamp);

        var time = formatTime(date);

        var messageNode = entry.getElementsByTagName('message')[0].firstChild;
        var message = messageNode.data;
        while ((messageNode = messageNode.nextSibling) != null)
        {
           message += messageNode.data;
        }

        var line = "[" + time + "]";
        line = line + " [" + service + "]";
        line = line + " " + message;
        line = line + "\n\n";

        log = log + line;
      }
      element.value = log;
      busy_indicator.style.visibility = "hidden";
    }
  };
  xmlHttp.send(null);
}

function _clearActionLog()
{
  var xmlHttp = getRequest();

  if (xmlHttp)
  {
	xmlHttp.open('POST', mars_url + '/actionlog/clear', true);
	xmlHttp.onreadystatechange = function ()
	{
		if (xmlHttp.readyState == 4)
		{
			refreshActionLog();
		}
	};
	xmlHttp.send(null);
  }
}

function _insertActionLog(minutes, element, busy_indicator)
{
  busy_indicator.style.visibility = "visible";

  var xmlHttp = getRequest();
  if (!xmlHttp) return;

  xmlHttp.open('GET', mars_url + '/actionlog?minutes=' + minutes, true);
  xmlHttp.onreadystatechange = function ()
  {
    if (xmlHttp.readyState == 4)
	{
      var response = xmlHttp.responseXML.documentElement;
      var entries = response.getElementsByTagName('logentry');

      var log = "";

      for (i=0; i < entries.length; i++)
      {
        var entry = entries[i];

        var service = entry.getElementsByTagName('service')[0].firstChild.data;

        var timestamp = entry.getElementsByTagName('timestamp')[0].firstChild.data;
        var date = new Date();
        date.setTime(timestamp);

        var time = formatTime(date);

        var messageNode = entry.getElementsByTagName('message')[0].firstChild;
        var message = messageNode.data;
        while ((messageNode = messageNode.nextSibling) != null)
        {
           message += messageNode.data;
        }

        var line = "[" + time + "]";
        line = line + " [" + service + "]";
        line = line + " " + message;
        line = line + "\n\n";

        log = log + line;
      }
      element.value = log;
      busy_indicator.style.visibility = "hidden";
    }
  };
  xmlHttp.send(null);
}


/*
function _insertActionLog(from, element)
{
  var xmlHttp = getRequest();
  if (!xmlHttp) return;

  // xmlHttp.open('GET', xml_eca_engine_url + '/log?from=' + from, true);
  xmlHttp.open('GET', mars_url + '/actionlog?from=' + from, true);
  xmlHttp.onreadystatechange = function ()
  {
    if (xmlHttp.readyState == 4)
	{
      var response = xmlHttp.responseXML.documentElement;
      var entries = response.getElementsByTagName('entry');

      var log = "";

      for (i=0; i < entries.length; i++)
      {
        var entry = entries[i];

        var uri = entry.getElementsByTagName('title')[0].firstChild.data;

        var pubDate = entry.getElementsByTagName('published')[0].firstChild.data;
        var date = rfc3339ToJSDate(pubDate);

        var time = formatTime(date);

        var messageNode = entry.getElementsByTagName('summary')[0].firstChild;

        if (messageNode)
        {
          var message = messageNode.nodeValue;
          while ((messageNode = messageNode.nextSibling) != null)
          {
             message += messageNode.nodeValue;
          }

          var line = "[" + time + "] ";
          line = line + uri + "\n";
          line = line + message;
          line = line + "\n\n";

          log = log + line;
        }
      }
      element.value = log;
    }
  };
  xmlHttp.send(null);
}
*/

function _resetAll()
{
  var xmlHttp = getRequest();
  if (!xmlHttp) return;
  xmlHttp.open('POST', xml_eca_engine_url + '/reset', true);
  xmlHttp.send(null);
  var xmlHttp2 = getRequest();
  if (!xmlHttp2) return;
  xmlHttp2.open('GET',services_url + '/domain-broker/reset', true);
  xmlHttp2.send(null);
  _clearActionLog();
  _clearFrameworkLog();
}