var xmlHttp;

///////////////////////
// GENERAL FUNCTIONS //
///////////////////////
function GetXmlHttpObject()
{
  var xmlHttp=null;
  
  try {
    // Firefox, Opera 8.0+, Safari
    xmlHttp = new XMLHttpRequest();
  } catch(exception) {
    // Internet Explorer
    try
    {
      xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (exception)
    {
      xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
    
  return xmlHttp;
}

// Returns a HTML object (needed for browser compatibility)
function getObjectByName(o_name, o_type)
{
  var elem = document.getElementsByTagName(o_type);

  for(i=0;i<elem.length;i++){
    if(elem[i].getAttribute("name") == o_name) {
      return elem[i];
    }
  }
}

// Add an element dynamically inside a wanted tag in the HTML
// First parameter is the object within it is added, second one is the one
// handling count
function addElement(g_target, div_id ,g_name, html_code) {
  var ni = getObjectByName(g_target, "div");
  var newdiv = document.createElement('div');
  var divIdName = g_name;
  newdiv.setAttribute('name', divIdName);
  newdiv.setAttribute('id', div_id);
  newdiv.innerHTML = html_code;
  ni.appendChild(newdiv);
}

function removeElement(divFather, divName) {
  var d = getObjectByName(divFather, "div");
  var dc = getObjectByName(divName, "div");
  d.removeChild(dc);
}

/////////////////////////////
// HTML CREATION FUNCTIONS //
/////////////////////////////

// Creates a link that suggests the deletion of an item
function createItemLink(g_action, g_title)
{
  var html_code = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="javascript:;"><img src="/images/cross.gif" onClick="'+ g_action +
                  '"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'+g_title + "<br>&nbsp;";
                  
  return html_code;
}

// Creates a new group header under the old ones (Doesn't add members)
function createGroupHeader(g_id, g_title)
{
  var html_code = '<table border="0" width="280" height="*" cellpadding="5" cellspacing="0">' +
									'<tr><td width="*" valign="top"><div id="tablefontmedium">' + 
										g_title +
									'</div></td></tr><tr><td width="*" valign="top"><div id="handscontentfont">' +
									'Add User:' +
									'</div></td></tr><tr><td width="*" valign="top">' +
									'<input id="searchhistories" name="searchuser'+g_id+'" type="text" onKeyDown="clean_up('+"'searchuser_error"+g_id+"'"+ ');">' +
									'</td><td width="*"><div align="right"><a href="javascript:;"><img src="/images/submit.gif" onClick="javascript:addMember('+
									g_id +
									');"></a></div></td></tr></table><div align="center"><span id="group_error" name="searchuser_error'+g_id+'"></span></div>';
									
	return html_code;
}


///////////////////////////////////
// GROUP PAGE SPECIFIC FUNCTIONS //
///////////////////////////////////

function getGroupsHandler()
{
  if( xmlHttp.readyState == 4 ) {
    if( xmlHttp.status == 200 ) {
      var i = 0;
      var xmldoc = xmlHttp.responseXML.documentElement;

      // Get groups
      var o_groups = xmldoc.getElementsByTagName('group');

      // Nullify the current groups as this refreshes everything
      var l_groups = getObjectByName("groups", "div");
      l_groups.innerHTML = "";
      
      // This gets list of groups and prints out the links
      for(i=0;i<o_groups.length;i++){
        var g_id = o_groups[i].getAttribute("id");
        var g_title = o_groups[i].getAttribute("name");

        var html_code = createItemLink('deleteRequest('+ g_id+",'"+g_title+"')", g_title);
        addElement('groups', 'handscontentfont', 'group'+g_id, html_code);
      }
      
      // Nullify the current groups as this refreshes everything
      var l_groups = getObjectByName("my_groups", "div");
      l_groups.innerHTML = "";
      
      // Fetch groups with members
      for(i=0;i<o_groups.length;i++){
        var g_id = o_groups[i].getAttribute("id");
        var g_name = o_groups[i].getAttribute("name");
        
        var html_code = createGroupHeader(g_id, g_name);
        
        // TODO: Do this nicer - Static layout = badness <3
        if( i > 0 ) { html_code = "<br>\n" + html_code; }
        
        var new_name = 'egroup'+g_id;
        addElement('my_groups', 'tablefontmedium', new_name, html_code);

        if( o_groups[i].hasChildNodes() ) {
          elem = o_groups[i].getElementsByTagName('member');
          if( elem != null ) {
            var b = 0;
            for( b = 0; b < elem.length; b++ ) {
              var m_id = elem[b].getAttribute("id");
              var html_code = createItemLink('deleteMember('+ g_id + ','+m_id+');', elem[b].firstChild.nodeValue);
              addElement( new_name, 'handscontentfont', 'g'+g_id+'m'+m_id, html_code );
            }
          }
        }
      }
    }
   clean_up("message");
  }  
}

// This function is only called on full page reload - otherwise everything is modified dynamically
function getGroups()
{
  xmlHttp = GetXmlHttpObject();
 
  if (xmlHttp == null)
  {
    alert ("Your browser does not support AJAX!");
    return;
  }
 
  var g_url = "http://" + window.location.host + "/reviewer/groups_f.php";
  g_url = g_url + "?action=groups";

  // Send the request
  xmlHttp.open("GET", g_url, true);
  xmlHttp.onreadystatechange = getGroupsHandler;  // Assign handler
  xmlHttp.send(null);
}

function createGroupHandler()
{
  if( xmlHttp.readyState == 4 ) {
    var xmldoc = xmlHttp.responseXML.documentElement;
   
    var e_error = getObjectByName("create_group_error", "span");

    var o_result = xmldoc.getElementsByTagName('error');
       
    if( o_result[0] == null ) {
      // Clear the field after successful addition
      e_name = getObjectByName("create_group", "input");
      e_name.value = "";       
      
      // Refresh the list
      var o_new = xmldoc.getElementsByTagName('group');
      
      if( o_new[0] != null ) {
        var g_id = o_new[0].getAttribute("id");
        var g_title = o_new[0].firstChild.nodeValue;

        // Add the link for delete group
        var html_code = createItemLink('deleteRequest('+g_id+",'"+g_title+"')", g_title);
        addElement('groups', 'handscontentfont', 'group'+g_id, html_code);
        
        // Add the group to the member listings
        var html_code = createGroupHeader(g_id, g_title);
        var new_name = 'egroup'+g_id;
        addElement('my_groups', 'tablefontmedium', new_name, html_code);
      }      
    } else {
      e_error.innerHTML = o_result[0].firstChild.nodeValue; 
    }
  }
}



// Sends a group creation request
function createGroup()
{
  xmlHttp = GetXmlHttpObject();
  
  if (xmlHttp == null)
  {
    alert ("Your browser does not support AJAX!");
    return;
  }
 
  var e_name = getObjectByName("create_group", "input").value;
  var e_error = getObjectByName("create_group_error", "span");
  
  if( e_name == "" ) {
    e_error.innerHTML = "Error! Insert group name!"; 
  } else {
    // Clear the error message if it still exists
    e_error.innerHTML = "";
    
    // Make the sent group name safe
    var g_name = escape(e_name);

    // Create the group
    var g_url = "http://" + window.location.host + "/reviewer/groups_f.php";
    g_url = g_url + "?action=create";
    g_url = g_url + "&name=" + g_name;

    // Send the request    
    xmlHttp.open("GET", g_url, true);
    xmlHttp.onreadystatechange = createGroupHandler;  // Assign handler
    xmlHttp.send(null);
  }
}

function addMemberHandler()
{
  if( xmlHttp.readyState == 4 ) {
    var xmldoc = xmlHttp.responseXML.documentElement;
   
    var o_result = xmldoc.getElementsByTagName('error');
       
    if( o_result[0] == null ) {
      // Refresh the list
      var o_new = xmldoc.getElementsByTagName('member');
      
      if( o_new[0] != null ) {
        var g_id = o_new[0].getAttribute("group_id");
        var m_id = o_new[0].getAttribute("member_id");
        var g_title = o_new[0].firstChild.nodeValue;

        // Clear the field after successful addition
        e_name = getObjectByName("searchuser"+g_id, "input");
        e_name.value = "";

        // Add the link for delete member        
        var html_code = createItemLink('deleteMember('+ g_id + ','+m_id+');', g_title);
        addElement( 'egroup'+g_id, 'handscontentfont', 'g'+g_id+'m'+m_id, html_code );
      }      
    } else {
      var e_error = getObjectByName("searchuser_error"+o_result[0].getAttribute("group_id"), "span");
      e_error.innerHTML = o_result[0].firstChild.nodeValue; 
    }
  }  
}

function addMember(g_id)
{
  xmlHttp = GetXmlHttpObject();
  
  if (xmlHttp == null)
  {
    alert ("Your browser does not support AJAX!");
    return;
  }
 
  var e_name = getObjectByName("searchuser"+g_id, "input").value;
  var e_error = getObjectByName("searchuser_error"+g_id, "span");
  
  if( e_name == "" ) {
    e_error.innerHTML = "Error! Insert username!"; 
  } else {
    // Clear the error message if it still exists
    e_error.innerHTML = "";
    
    // Make the sent group name safe
    var g_name = escape(e_name);

    // Create the group
    var g_url = "http://" + window.location.host + "/reviewer/groups_f.php";
    g_url = g_url + "?action=add_member";
    g_url = g_url + "&username=" + g_name + "&g_id=" + g_id;

    // Send the request    
    xmlHttp.open("GET", g_url, true);
    xmlHttp.onreadystatechange = addMemberHandler;  // Assign handler
    xmlHttp.send(null);
  }
}

function deleteMemberHandler()
{
  if( xmlHttp.readyState == 4 ) {
    var xmldoc = xmlHttp.responseXML.documentElement;

    // Get groups
    var o_groups = xmldoc.getElementsByTagName('group');
    
    if( o_groups[0] != null ) {
      var g_id = o_groups[0].getAttribute("id");
      var m_id = o_groups[0].firstChild.nodeValue;
      
      removeElement("egroup"+g_id, "g"+g_id+"m"+m_id); 
    }
  }   
}

function deleteMember(g_id, m_id)
{
  xmlHttp = GetXmlHttpObject(); 
    
  if (xmlHttp == null)
  {
    alert ("Your browser does not support AJAX!");
    return;
  }
  
  var g_id_safe = g_id;
  var m_id_safe = m_id;
  
  // Create the group
  var g_url = "http://" + window.location.host + "/reviewer/groups_f.php";
  g_url = g_url + "?action=delete_member";
  g_url = g_url + "&gid=" + g_id_safe + "&mid="+ m_id_safe;

  // Send the request    
  xmlHttp.open("GET", g_url, true);
  xmlHttp.onreadystatechange = deleteMemberHandler;  // Assign handler  
  xmlHttp.send(null);
}


function deleteGroupHandler()
{
  if( xmlHttp.readyState == 4 ) {
    var e_query = getObjectByName("group_query", "span");
    e_query.innerHTML = "";
    
    var xmldoc = xmlHttp.responseXML.documentElement;

    // Get groups
    var o_groups = xmldoc.getElementsByTagName('group');
    
    if( o_groups[0] != null ) {
      removeElement("groups", "group"+o_groups[0].firstChild.nodeValue);
      removeElement("my_groups", "egroup"+o_groups[0].firstChild.nodeValue);
    }
  }   
}

function deleteGroup(g_id)
{
  xmlHttp = GetXmlHttpObject(); 
    
  if (xmlHttp == null)
  {
    alert ("Your browser does not support AJAX!");
    return;
  }
 
  var g_id_safe = g_id;
  
  if( g_id == -1 ) {
    var e_query = getObjectByName("group_query","span");
    e_query.innerHTML = "";
    return; 
  }
  
  // Create the group
  var g_url = "http://" + window.location.host + "/reviewer/groups_f.php";
  g_url = g_url + "?action=delete";
  g_url = g_url + "&id=" + g_id_safe;

  // Send the request    
  xmlHttp.open("GET", g_url, true);
  xmlHttp.onreadystatechange = deleteGroupHandler;  // Assign handler  
  xmlHttp.send(null);
}

function deleteRequest(g_id, g_title)
{
  var e_query = getObjectByName("group_query","span");
  e_query.innerHTML = "Do you wish to delete group " + g_title + '<br><input type=submit value=Yes onClick="deleteGroup('+g_id+')"> <input type=submit value=No onClick="deleteGroup(-1)">';
  
}

function clean_up(control_name)
{
  var control = getObjectByName(control_name, 'span');
  control.innerHTML = ""; 
}

// Timed cleaning function - not implemented yet
/*function clean(c_time)
{
  var c = window.setTimeout("clean("+c_time+")", c_time);
  
  // TODO: Clean errors (?)
}*/

window.onload=function() {
  getGroups();
  // clean(time)
}