/* GENERAL */

//var servletURL = "http://localhost:8080/hswrl2";
var servletURL = "http://www.ida.liu.se/hswrl";

function hideAll() {

	var rules = document.getElementById('rulesinput');
	var settiings = document.getElementById('settings');

	rules.style.display = 'none';
	settings.style.display = 'none';
}

function show(cur) {

	hideAll();
	
	var div = document.getElementById(cur);

	div.style.display = 'inline';

}

function setProgramMessage(doc, tag, message, color) {

    var div = doc.getElementById(tag);

    var msg = document.createElement('p');
    //var msg = div;
    msg.style.color = color;
    msg.style.margin = "0px";
    var txt = document.createTextNode(message);

    msg.appendChild(txt);

    if (div.hasChildNodes()) {
	div.removeChild(div.firstChild);
    }
    
    div.appendChild(msg);    
}

/* QUERY PROGRAM FUNCTIONS */

function handleQueryResponse() {

  handleProgressBar();

  // answer ready
  if (http.readyState == 4) {
    
    /* set the status that we are done querying */
    queryingProcessing = false;

    var p = document.getElementById('outputpar');
    
    var resp = http.responseText;
    
    p.innerHTML = resp;    
    
    http.onreadystatechange = null;
  }
}

function handleProgressBar() {

  var process = document.getElementById('process');
  
  if ((http.readyState == 1) || (http.readyState == 3)) {
    process.style.display = 'block';
  }
  else if (http.readyState == 4) {
    process.style.display = 'none';
    http.onreadystatechange = null;
  }
}

var queryingProcessing = false;

function queryProgram(rules_tag, q_tag) {

    if (queryingProcessing != true) {

	/* remember that we are querying */
	queryingProcessing = true;

	var query = document.getElementById(q_tag);
	var rules = document.getElementById(rules_tag);
    
	sndReq(servletURL + '/HQuery?', 
	       'query=' + escape(query.value) + '&' +
	       'input=' + escape('Query') + '&' +
	       'rules=' + escape(rules.value),
	       handleQueryResponse);

	/* show process indicator */
	var process = document.getElementById('process');
	process.style.display = 'block';

    }

}


/* LOAD PROGRAM FUNCTIONS */

function createRequestObject() {
  var ro, browser = navigator.appName;
  
  if (browser == "Microsoft Internet Explorer") {
	ro = new ActiveXObject("Microsoft.XMLHTTP");
  } else {
	  ro = new XMLHttpRequest();
  }
  
  return ro;
}

var http = createRequestObject();



function handleCompileProgramResponse() {

  var div = document.getElementById('rules_comp');
  
  var resp = http.responseText;

  div.value = resp;

  setProgramMessage(document, msg_tag, 
		    'Program compiled.', 'darkblue');

}

function handleHttpResponse() {

  var div = document.getElementById('loadoutput');
  
  div.style.setProperty('border-left', '2px solid #000', null);

  var resp = http.responseText;

  div.innerHTML = resp;

}

function sndReq(q_url, q_str, q_handler) {
  
  /* idea: get address from 'action' parameter of the form element? */

  http.open('get', q_url + q_str, true);

  http.onreadystatechange = q_handler;
  http.send(null);
}


function compileProgram(rules, rules_comp, msg_tag) {

  // find rules
  var rules_textarea = document.getElementById(rules);
  rules_textarea.style.width = '49%';

  // find compiled rules textbox
  var rules_comp_textarea = document.getElementById(rules_comp);
  rules_comp_textarea.style.width = '50%';
  rules_comp_textarea.style.display = 'inline';

  // find 'hide compiled program' button
  var hide_compiled_program = document.getElementById('hide_compiled_program');
  hide_compiled_program.style.display = 'inline';

  ruleString = new String(rules_textarea.value);
  
  // replace '+' with its HTML code: &#43;
  ruleString = ruleString.replace("+","&#43;");

  sndReq(servletURL + '/HCompile?', 
  	 'rules=' + escape(ruleString),
  	 handleCompileProgramResponse);

  setProgramMessage(document, msg_tag, 
		    'Compiling program...', 'darkgreen');

}

function hideCompiledProgram(rules, rules_comp, msg_tag) {

  // find rules
  var rules_textarea = document.getElementById(rules);
  rules_textarea.style.width = '100%';

  // find compiled rules textbox
  var rules_comp_textarea = document.getElementById(rules_comp);
  rules_comp_textarea.style.display = 'none';

  // find 'hide compiled program' button
  var hide_compiled_program = document.getElementById('hide_compiled_program');
  hide_compiled_program.style.display = 'none';

  setProgramMessage(document, msg_tag, 
		    'Compiled programs hidden.', 'darkgreen');
}




/* TEXT AREA MODIFICATION NOTIFICATION */

function programModified(doc, tag) {

    setProgramMessage(doc, tag, 'Program modified?', 'darkred');
}


/* SETTINGS FUNCTIONS */

function loadSettings() {

  /* fetch the values to be saved */

  document.getElementById('dlurl').value = getDLUrl();
  document.getElementById('dlport').value = getDLPort();

  if (getOptEagerConj() == 'true')
	document.getElementById('opteagerconj').checked = true;
  else 
	document.getElementById('opteagerconj').checked = false;

  if (getOptEagerIrr() == 'true')
	document.getElementById('opteagerirr').checked = true;
  else
	document.getElementById('opteagerirr').checked = false;

  /* removed until implemented
  if (getOptEagerDisj() == 'true')
	document.getElementById('opteagerdisj').checked = true;
  else
	document.getElementById('opteagerdisj').checked = false;
  */
}

function saveSettings() {

  /* fetch the values to be saved */

  var dlUrl = document.getElementById('dlurl').value;
  var dlPort = document.getElementById('dlport').value;

  var optEagerConj = document.getElementById('opteagerconj').checked;
  var optEagerIrr = document.getElementById('opteagerirr').checked;

  /* removed until implemented
  var optEagerDisj = document.getElementById('opteagerdisj').checked;
  */

  /* save the settings in a cookie */
  
  createCookie('dlUrl', dlUrl, 100);
  createCookie('dlPort', dlPort, 100);
  createCookie('optEagerConj', optEagerConj, 100);
  createCookie('optEagerIrr', optEagerIrr, 100);

  /* removed until implemented
  createCookie('optEagerDisj', optEagerDisj, 100);
  */

  displaySuccess();

}

function displaySuccess() {

  var msgs = document.getElementById('setting-msgs');
  var msg = document.createElement('p');
  msg.style.color = "darkgreen";
  var txt = document.createTextNode("Settings saved");

  msg.appendChild(txt);

  if (msgs.hasChildNodes()) {
	msgs.removeChild(msgs.firstChild);
  }

  msgs.appendChild(msg);
}


function getDLUrl() {
  return readCookie('dlUrl', 'http://localhost');
}

function getDLPort() {
  return readCookie('dlPort', '8000');
}

function getOptEagerConj() {
  return readCookie('optEagerConj', false);
}

function getOptEagerIrr() {
  return readCookie('optEagerIrr', false);
}

function getOptEagerDisj() {
  return readCookie('optEagerDisj', false);
}


/* COOKIE FUNCTIONS */

function createCookie(name,value,days)
{
  if (days)
	{
	  var date = new Date();
	  date.setTime(date.getTime()+(days*24*60*60*1000));
	  var expires = "; expires="+date.toGMTString();
	}
  else var expires = "";
  document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name, default_value)
{
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0;i < ca.length;i++)
	{
	  var c = ca[i];
	  while (c.charAt(0)==' ') 
		c = c.substring(1,c.length);
	  if (c.indexOf(nameEQ) == 0) 
		return c.substring(nameEQ.length, c.length);
	}
  return default_value;
}

function eraseCookie(name)
{
  createCookie(name,"",-1);
}
