
var pageSize = 5;
var MAX_COMMENT = 50;

var rules = null;
var showingFrom = 0;
var showingTo = 0;
var pages = 0;
var currentPage = 0;

function addForm()
{  
  document.getElementById("rest").style.display='none';
  document.getElementById("logform").style.display='none';
  document.getElementById("editform").style.display='none';
  document.getElementById("delform").style.display='none';
  document.getElementById("startform").style.display='none';

  document.getElementById("addform").style.display='block';
  document.forms['adf'].keyword.focus();
}

function editForm(id, name)
{  
  document.getElementById("rest").style.display='none';
  document.getElementById("logform").style.display='none';
  document.getElementById("addform").style.display='none';
  document.getElementById("delform").style.display='none';
  document.getElementById("startform").style.display='none';

  document.getElementById("editform").style.display='block';
  document.getElementById("editform1").style.display='none';
  document.getElementById("editform0").style.display='block';

  document.getElementById("editname").innerHTML=name;
  document.forms["edf"].eid.value=id;
  document.forms["edf"].epwd.focus();
}

function delForm(id, name)
{  
  document.getElementById("rest").style.display='none';
  document.getElementById("logform").style.display='none';
  document.getElementById("addform").style.display='none';
  document.getElementById("editform").style.display='none';
  document.getElementById("startform").style.display='none';

  document.getElementById("delform").style.display='block';
  document.getElementById("delname").innerHTML=name;
  document.forms["dlf"].did.value=id;
  document.forms["dlf"].dpwd.focus();
}

function logForm(id, name)
{  
  document.getElementById("rest").style.display='none';
  document.getElementById("delform").style.display='none';
  document.getElementById("addform").style.display='none';
  document.getElementById("editform").style.display='none';
  document.getElementById("startform").style.display='none';

  document.getElementById("logform").style.display='block';
  document.getElementById("logname").innerHTML=name;
  document.forms["lgf"].lid.value=id;
  document.forms["lgf"].lpwd.focus();
}

function startForm(id, act, name)
{  
  document.getElementById("rest").style.display='none';
  document.getElementById("logform").style.display='none';
  document.getElementById("addform").style.display='none';
  document.getElementById("editform").style.display='none';
  document.getElementById("delform").style.display='none';

  document.getElementById("startbutton").title=act+" service";

  document.getElementById("startform").style.display='block';

  document.getElementById("startact").innerHTML=act;
  document.getElementById("startname").innerHTML=name;
  document.forms["ssf"].sid.value=id;
  document.forms["ssf"].spwd.focus();
}


function closeForm(id)
{
  document.getElementById(id).style.display='none';
  document.getElementById("rest").style.display='block';
}

function help1()
{
  document.getElementById('rest1').style.display='block';
  document.getElementById('rest11').style.display='inline';

  document.getElementById('rest2').style.display='none';
  document.getElementById('rest21').style.display='none';
}

function help2()
{
  document.getElementById('rest1').style.display='none';
  document.getElementById('rest11').style.display='none';

  document.getElementById('rest2').style.display='block';
  document.getElementById('rest21').style.display='inline';
}

function refresh()
{
  var d = new Date();

  var uri="refresh.jsp";
  var query="id="+d.getTime();

  var beforeAction = function() 
  { document.getElementById("refreshindicator").style.display="inline"; };

  var afterAction = function() 
  { document.getElementById("refreshindicator").style.display="none"; };

  var errorFunction = function() 
  { alert("Could not get data. Something is wrong ..."); };

  noteAjaxEnginePost(uri, query, handlerFunction1, errorFunction, beforeAction, afterAction);      
}

function createService()
{
  var k = document.forms['adf'].keyword.value;
  var p1 = document.forms['adf'].pass1.value;
  var p2 = document.forms['adf'].pass2.value;
  var d = document.forms['adf'].comment.value;
  var r = document.forms['adf'].content.value;

  if (!k)
  {
    alert("Please, provide a keyword");
    return;
  }

  k=trimResponse(k);

  if (k.length==0)
  {
    alert("Please, provide a keyword");
    return;
  }

  if (!p1)
  {
    alert("Please, provide a password");
    return;
  }

  if (!p2)
  {
    alert("Please, retype a password");
    return;
  }

  if (p1!=p2)
  {
    alert("Passwords do not match");
    return;
  }

  p1=trimResponse(p1);

  if (p1.length==0)
  {
    alert("Please, provide a password");
    return;
  }

  if (!d)
  {
    alert("Please, provide a description");
    return;
  }

  d = trimResponse(d);

  if (d.length==0)
  {
    alert("Please, provide a description");
    return;
  }

  if (!r)
  {
    alert("Please, provide a response (content)");
    return;
  }

  d = trimResponse(d);

  if (r.length==0)
  {
    alert("Please, provide a response (content)");
    return;
  }


  var uri="addService.jsp";
  var query="k="+encodeURIComponent(k)+"&p="+encodeURIComponent(p1)+"&d="+encodeURIComponent(d)+"&r="+encodeURIComponent(r);

  var beforeAction = function() 
  { document.getElementById("addindicator").style.display="inline"; };

  var afterAction = function() 
  { document.getElementById("addindicator").style.display="none"; };

  var errorFunction = function() 
  { alert("Could not save data. Something is wrong ..."); };

  noteAjaxEnginePost(uri, query, handlerFunction0, errorFunction, beforeAction, afterAction);      
}

function deleteService()
{
  var p = document.forms['dlf'].dpwd.value;
  var id = document.forms['dlf'].did.value;

  if (!p)
  {
    alert("Please, provide a password");
    return;
  }

  p=trimResponse(p);

  if (p.length==0)
  {
    alert("Please, provide a password");
    return;
  }

  var uri="delService.jsp";
  var query="p="+encodeURIComponent(p)+"&id="+id;

  var beforeAction = function() 
  { document.getElementById("delindicator").style.display="inline"; };

  var afterAction = function() 
  { document.getElementById("delindicator").style.display="none"; };

  var errorFunction = function() 
  { alert("Could not delete data. Something is wrong ..."); };

  noteAjaxEnginePost(uri, query, handlerFunction2, errorFunction, beforeAction, afterAction);      
}

function logService()
{
  var p = document.forms['lgf'].lpwd.value;
  var id = document.forms['lgf'].lid.value;

  if (!p)
  {
    alert("Please, provide a password");
    return;
  }

  p=trimResponse(p);

  if (p.length==0)
  {
    alert("Please, provide a password");
    return;
  }

  var uri="statService.jsp";
  var query="p="+encodeURIComponent(p)+"&id="+id;

  var beforeAction = function() 
  { document.getElementById("logindicator").style.display="inline"; };

  var afterAction = function() 
  { document.getElementById("logindicator").style.display="none"; };

  var errorFunction = function() 
  { alert("Could not get access to data. Something is wrong ..."); };

  noteAjaxEnginePost(uri, query, handlerFunction6, errorFunction, beforeAction, afterAction);      
}

function subscribe()
{
  var p = document.forms['subs'].twitter.value;

  if (!p)
  {
    alert("Please, provide a name for your twitter account");
    return;
  }

  p=trimResponse(p);

  if (p.length==0)
  {
    alert("Please, provide a name for your twitter account");
    return;
  }

  var uri="subService.jsp";
  var query="p="+encodeURIComponent(p);

  var beforeAction = function() 
  { document.getElementById("subsindicator").style.display="inline"; };

  var afterAction = function() 
  { document.getElementById("subsindicator").style.display="none"; };

  var errorFunction = function() 
  { alert("Could not get access to data. Something is wrong ..."); };

  noteAjaxEnginePost(uri, query, handlerFunction7, errorFunction, beforeAction, afterAction);      
}

function subscribe1()
{
  var p = document.forms['subs1'].twitter.value;

  if (!p)
  {
    alert("Please, provide a name for your twitter account");
    return;
  }

  p=trimResponse(p);

  if (p.length==0)
  {
    alert("Please, provide a name for your twitter account");
    return;
  }

  var uri="subService.jsp";
  var query="p="+encodeURIComponent(p);

  var beforeAction = function() 
  { document.getElementById("subsindicator1").style.display="inline"; };

  var afterAction = function() 
  { document.getElementById("subsindicator1").style.display="none"; };

  var errorFunction = function() 
  { alert("Could not get access to data. Something is wrong ..."); };

  noteAjaxEnginePost(uri, query, handlerFunction8, errorFunction, beforeAction, afterAction);      
}

function subscribe2()
{
  var p = document.forms['subs2'].twitter.value;

  if (!p)
  {
    alert("Please, provide a name for your twitter account");
    return;
  }

  p=trimResponse(p);

  if (p.length==0)
  {
    alert("Please, provide a name for your twitter account");
    return;
  }

  var uri="subService.jsp";
  var query="p="+encodeURIComponent(p);

  var beforeAction = function() 
  { document.getElementById("subsindicator2").style.display="inline"; };

  var afterAction = function() 
  { document.getElementById("subsindicator2").style.display="none"; };

  var errorFunction = function() 
  { alert("Could not get access to data. Something is wrong ..."); };

  noteAjaxEnginePost(uri, query, handlerFunction9, errorFunction, beforeAction, afterAction);      
}

function editService()
{
  var p = document.forms['edf'].epwd.value;
  var id = document.forms['edf'].eid.value;

  if (!p)
  {
    alert("Please, provide a password");
    return;
  }

  p=trimResponse(p);

  if (p.length==0)
  {
    alert("Please, provide a password");
    return;
  }

  var uri="editService1.jsp";
  var query="p="+encodeURIComponent(p)+"&id="+id;

  var beforeAction = function() 
  { document.getElementById("editindicator").style.display="inline"; };

  var afterAction = function() 
  { document.getElementById("editindicator").style.display="none"; };

  var errorFunction = function() 
  { alert("Could not edit data. Something is wrong ..."); };

  noteAjaxEnginePost(uri, query, handlerFunction4, errorFunction, beforeAction, afterAction);      
}

function editService1()
{
  var p1 = document.forms['edf'].epass1.value;
  var p2 = document.forms['edf'].epass2.value;
  var p0 = document.forms['edf'].epwd.value;
  var id = document.forms['edf'].eid.value;

  var ecomment = document.forms['edf'].ecomment.value;
  var econtent = document.forms['edf'].econtent.value;

  if (!p1 && p2)
  {
    alert("Please, retype a password");
    return;
  }

  if (p1 && !p2)
  {
    alert("Please, retype a password");
    return;
  }

  p1 = trimResponse(p1);
  p2 = trimResponse(p2);

  if (p1.length!=0 && p2.length==0)
  {
    alert("Please, retype a password");
    return;
  }

  if (p2.length!=0 && p1.length==0)
  {
    alert("Please, retype a password");
    return;
  }

  if (p1.length!=0 && p2.length!=0)
   if (p1!=p2)
   {
     alert("Passwords do not match");
     return;
   }

  econtent = trimResponse(econtent);
  ecomment = trimResponse(ecomment);  

  var uri="editService2.jsp";

  var query="id="+id;

  query+="&p0="+encodeURIComponent(p0);

  if (p1.length!=0)
   query+="&p="+encodeURIComponent(p1);

  if (econtent.length!=0)
    query+="&c="+encodeURIComponent(econtent);  

  if (ecomment.length!=0)
    query+="&r="+encodeURIComponent(ecomment);  

  var beforeAction = function() 
  { document.getElementById("editindicator1").style.display="inline"; };

  var afterAction = function() 
  { document.getElementById("editindicator1").style.display="none"; };

  var errorFunction = function() 
  { alert("Could not edit data. Something is wrong ..."); };

  noteAjaxEnginePost(uri, query, handlerFunction5, errorFunction, beforeAction, afterAction);      
}


function startService()
{
  var p = document.forms['ssf'].spwd.value;
  var id = document.forms['ssf'].sid.value;
  var a = document.getElementById("startact").innerHTML;

  if (!p)
  {
    alert("Please, provide a password");
    return;
  }

  p=trimResponse(p);

  if (p.length==0)
  {
    alert("Please, provide a password");
    return;
  }

  var uri="startService.jsp";
  var query="p="+encodeURIComponent(p)+"&id="+id+"&a="+encodeURIComponent(a);

  var beforeAction = function() 
  { document.getElementById("startindicator").style.display="inline"; };

  var afterAction = function() 
  { document.getElementById("startindicator").style.display="none"; };

  var errorFunction = function() 
  { alert("Could not start/stop service. Something is wrong ..."); };

  noteAjaxEnginePost(uri, query, handlerFunction3, errorFunction, beforeAction, afterAction);      
}


function handlerFunction0(txt, xmlDoc)
{
  var res = eval("("+txt+")");
  var status = res.status;

  if ("0"==status) alert("Keyword is  already occupied");
  else
   if ("1"==status) alert("DB access error: could not create keyword");
   else
    if ("2"==status) alert("DB error: could not create keyword");
    else
    {
      closeForm('addform');
      rules[rules.length]=eval('('+res.data+')');
      showKeywords('last');
    }
}

function handlerFunction1(txt, xmlDoc)
{
  var res = eval("("+txt+")");
  var status = res.status;

  if ("0"==status) alert("Refresh: could not get new data");
  else
   {
      rules=eval('('+res.data+')');
      if (currentPage!=0) 
        showKeywords(''+currentPage);
      else
        showKeywords('1');
   }
}

function handlerFunction2(txt, xmlDoc)
{
  var res = eval("("+txt+")");
  var status = res.status;

  if ("0"==status) alert("Delete: could not delete the service");
  else
   {
      closeForm('delform');
      refresh();
   }
}

function handlerFunction3(txt, xmlDoc)
{
  var res = eval("("+txt+")");
  var status = res.status;

  if ("0"==status) alert("Start/stop: could not update the service");
  else
   {
      closeForm('startform');
      refresh();
   }
}

function handlerFunction4(txt, xmlDoc)
{
  var res = eval("("+txt+")");
  var status = res.status;

  if ("-1"==status) alert("Edit: could not edit the service");
  else
   {
      document.getElementById("editform0").style.display='none';
      document.getElementById("editform1").style.display='block';

      document.forms['edf'].epass1.value="";
      document.forms['edf'].epass2.value="";

      document.forms['edf'].ecomment.value=res.comment;
      document.forms['edf'].econtent.value=res.response;
   }
}

function handlerFunction5(txt, xmlDoc)
{
  var res = eval("("+txt+")");
  var status = res.status;

  if ("0"==status) alert("Edit: could not update the service");
  else
   {
      closeForm('editform');
      refresh();
   }
}

function handlerFunction6(txt, xmlDoc)
{
  var res = eval("("+txt+")");
  var status = res.status;

  if ("-1"==status) alert("Stat: could not get access");
  else
   {      
      document.forms['lgf'].submit();
      closeForm('logform');
   }
}


function showKeywords(p)
{
  if ('last'==p) // last page
  {
    pages = Math.round(rules.length/pageSize);
    if (pages==0) pages=1;
    else
     if (pages*pageSize<rules.length) pages++;

     showKeywords(''+pages);
  }
  else

   if ('first'==p) // first page
     showKeywords('1');

   else // page by number
   {
    pages = Math.round(rules.length/pageSize);
    if (pages==0) pages=1;
    else
     if (pages*pageSize<rules.length) pages++;

    currentPage = eval(p);
    if (currentPage<=0 || currentPage>pages) currentPage=1;

    showingFrom = (currentPage-1)*pageSize;
    showingTo = showingFrom;
    var i=1;
    while (i<=pageSize && showingTo<rules.length)
    {
       var r = rules[showingTo];
       drawLine(i,r);
       showingTo++;
       i++;  
    }

    while (i<=pageSize)
    {
      emptyLine(i);
      i++;
    }

    showingFrom++;
    if (showingTo<showingFrom) showingTo++;
   }  

  document.getElementById("showingwhat").innerHTML = showingFrom+" - "+showingTo;
  
  var sP = "";
  for (var i=1; i<=pages; i++)
  {
    if (i==currentPage) sP+="&nbsp;["+currentPage+"]";
    else
     sP+="&nbsp;<a href='javascript:void(0)' onClick=\"showKeywords('"+i+"')\" title='page "+i+"'>"+i+"</a>";
  }

  document.getElementById("pages").innerHTML = sP;  

  sP = "&nbsp;&nbsp;<a href='javascript:void(0)' onClick='refresh()' title='refresh data'>"+"Refresh"+"</a>";

  document.getElementById("refresh").innerHTML=sP;
}

function handlerFunction7(txt, xmlDoc)
{
  var res = eval("("+txt+")");
  var status = res.status;

  if ("0"==status) alert("Subscribe: "+res.msg);
  else
   {
      document.forms['subs'].twitter.value="done!";
   }
}

function handlerFunction8(txt, xmlDoc)
{
  var res = eval("("+txt+")");
  var status = res.status;

  if ("0"==status) alert("Subscribe: "+res.msg);
  else
   {
      document.forms['subs1'].twitter.value="done!";
   }
}

function handlerFunction9(txt, xmlDoc)
{
  var res = eval("("+txt+")");
  var status = res.status;

  var ans = "done!";

  if ("0"==status) ans="Error! "+res.msg;

  document.forms['subs2'].twitter.value=ans;
}


function emptyLine(n)
{
  document.getElementById("r"+n+"c1").innerHTML = '&nbsp;';
  document.getElementById("r"+n+"c2").innerHTML = '&nbsp;';
  document.getElementById("r"+n+"c3").innerHTML = '&nbsp;';
}

function drawLine(n,r)
{
  var s = r.comment;

  document.getElementById("r"+n+"c1").innerHTML = r.keyword;

  document.getElementById("r"+n+"c2").title = s;
  if (s.length>MAX_COMMENT) s=s.substr(0,MAX_COMMENT)+" ...";
  document.getElementById("r"+n+"c2").innerHTML = s;

  s="<a class='operlink' href='javascript:void(0)' title='edit service' onClick=\"editForm("+r.id+",'"+r.keyword+"')\">Edit</a>&nbsp;"
   +"<a class='operlink' href='javascript:void(0)' title='delete service' onClick=\"delForm("+r.id+",'"+r.keyword+"')\">Del</a>&nbsp;";

   if ('1'==r.status)
     s+="<a class='operlink' href='javascript:void(0)' title='temporarily stop service' onClick=\"startForm("+r.id+",'Stop','"+r.keyword+"')\">Stop</a>&nbsp;";
   else
     s+="<a class='operlink' href='javascript:void(0)' title='start service' onClick=\"startForm("+r.id+",'Start','"+r.keyword+"')\">Start</a>&nbsp;";

   s+="<a class='operlink' href='javascript:void(0)' title='Requests:"+r.count+". Show statistics' onClick=\"logForm("+r.id+",'"+r.keyword+"')\">Log</a>&nbsp;";

  document.getElementById("r"+n+"c3").innerHTML = s;
}

function noteAjaxEnginePost(uri, query, handlerFunction, errorFunction, beforeAction, afterAction)
{
    var contentType = "application/x-www-form-urlencoded; charset=UTF-8";

    if (handlerFunction==null)  handlerFunction = function() {};
    if (errorFunction==null)    errorFunction = function () {};
    if (beforeAction == null) beforeAction = function() {};
    if (afterAction == null) afterAction = function() {};  
    if (query==null) query="";
    var r = (window.ActiveXObject)?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();
    if (r) { r.onreadystatechange = function()
      {	if (r.readyState == 4)
        {afterAction();
         if (r.status == 200)
  	 { xmlDoc = r.responseXML; txt = r.responseText;
           handlerFunction(txt, xmlDoc);}
         else          errorFunction();
        } }

     beforeAction(); r.open("POST", uri, true);
     r.setRequestHeader("Content-Type", contentType);
     r.setRequestHeader("Content-length", query.length);
     r.setRequestHeader("Connection", "close");
     r.send(query); return true;
  } else { afterAction(); errorFunction(); return false; }}

function trimResponse(s0)
{ if (s0==null) return s0; s=s0;

  var s1 = ' ';
  while (s.length>0 && s1==' ')
  {
   s1 = s.substring(s.length-1); 
   if (s1==' ' || s1=='\r' || s1=='\n' || s1=='\t') { s=s.substring(0,s.length-1); s1=' '; }      
  }

  while (s.length>0)
  { s1=s.substring(0,1);
    if (s1==' ' || s1=='\r' || s1=='\n' || s1=='\t') s=s.substring(1);
    else  return s; }

  return '';}

