var grantedRoles;
var rowEl;

function updateRow(row, select, roles) {
  var rowElement = document.getElementById(row);
  while (rowElement.firstChild) {
    rowElement.removeChild(rowElement.firstChild);
  }
  removedCheckboxes = new Array();
  addRolesCheckboxes = new Array();
  rowElement.className="hidden";
  rowEl = rowElement;
  selectedValue = document.getElementById(select).value;
  for (grRole in roles) {
    if (roles[grRole].groupId == selectedValue) {
      grantedRoles = roles[grRole].roles;
      break;
    }
  }
  if (selectedValue == '') {
    createEmptyRow(rowElement);
    rowElement.className="visible_row";
    return;
  }
  DWRBridgeManager.getRolesForGroup(selectedValue, createRow);
}

String.prototype.escapeHTML = function () {
  return(
    this.replace(/&/g,'&amp;').
         replace(/>/g,'&gt;').
         replace(/</g,'&lt;').
         replace(/"/g,'&quot;')
      );
};

function createEmptyRow(rowElement) {
  var td1 = createElement("td");
  td1.className = 'modify_td';
  var table = createElement("table", td1);
  var tbody = createElement("tbody", table);
  var tr1 = createElement("tr", tbody);
  var td11 = createElement("td", tr1);
  td11.className='adminModule title';
  td11.innerHTML="Not Granted Roles";
  var td12 = createElement("td", tr1);
  td12.className='adminModule title';
  td12.innerHTML="Add";
  var td2 = createElement("td");
  td2.className = 'modify_td';
  var table2 = createElement("table", td2);
  var tbody2 = createElement("tbody", table2);
  var tr2 = createElement("tr", tbody2);
  var td21 = createElement("td", tr2);
  td21.className='adminModule title';
  td21.innerHTML="Granted Roles";
  var td22 = createElement("td", tr2);
  td22.className='adminModule title';
  td22.innerHTML="Remove";
  rowElement.appendChild(td1);
  rowElement.appendChild(td2);
}

var removedCheckboxes = new Array();
var addRolesCheckboxes = new Array();

function createRow(data) {
  if ((data == null) || (data.length == 0)) {
    createEmptyRow(rowEl);
    rowEl.className="visible_row";
    return;
  }
  var granted = 0;
  var notgranted = 0;
  var td1 = createElement("td");
  td1.className = 'modify_td';
  var table = createElement("table", td1);
  var tbody = createElement("tbody", table);
  var tr1 = createElement("tr", tbody);
  var td11 = createElement("td", tr1);
  td11.className='adminModule title';
  td11.innerHTML="Not Granted Roles";
  var td12 = createElement("td", tr1);
  td12.className='adminModule title';
  td12.innerHTML="Add";
  var td2 = createElement("td");
  td2.className = 'modify_td';
  var table2 = createElement("table", td2);
  var tbody2 = createElement("tbody", table2);
  var tr2 = createElement("tr", tbody2);
  var td21 = createElement("td", tr2);
  td21.className='adminModule title';
  td21.innerHTML="Granted Roles";
  var td22 = createElement("td", tr2);
  td22.className='adminModule title';
  td22.innerHTML="Remove";
  for (role in data) {
    var contains = false;
    for (grRole in grantedRoles) {
      if (grantedRoles[grRole] == data[role]) {
        contains = true;
        break;
      }
    }
    if (contains) {
      if (granted == 0) {
    	var trcheck1 = createElement("tr", tbody2);
    	var tdcheck1 = createElement("td", trcheck1);
    	tdcheck1.colSpan=2;
    	tdcheck1.className='right';
        var labelcheck1 = createElement("label", tdcheck1);
        labelcheck1.htmlFor = 'rol_rem_check_all';
        labelcheck1.innerHTML = 'Check All';
        labelcheck1.className = 'ital';
        var checkbox1_check = createElement("input");
        checkbox1_check.setAttribute("type","checkbox");
        checkbox1_check.setAttribute("id",'rol_rem_check_all');
        tdcheck1.appendChild(checkbox1_check);
        addEvent(checkbox1_check, "click", checkAddRoles);
      }
      var tr = createElement("tr", tbody2);
      var tdLabel = createElement("td", tr);
      tdLabel.className = 'adminModule';
      var label = createElement("label", tdLabel);
      label.htmlFor = data[role];
      label.innerHTML = data[role].escapeHTML();
      var tdCheckbox = createElement("td", tr);
      tdCheckbox.className = 'rightCheckboxTd';
      var checkbox_ = createElement("input");
      checkbox_.setAttribute("type","checkbox");
      checkbox_.setAttribute("name","remove");
      checkbox_.setAttribute("value", data[role]);
      checkbox_.setAttribute("id",data[role]);
      tdCheckbox.appendChild(checkbox_);
      removedCheckboxes[granted] = checkbox_;
      granted++;
    } else {
      if (notgranted == 0) {
      	var trcheck2 = createElement("tr", tbody);
       	var tdcheck2 = createElement("td", trcheck2);
       	tdcheck2.colSpan=2;
       	tdcheck2.className='right';
        var labelcheck2 = createElement("label", tdcheck2);
        labelcheck2.htmlFor = 'rol_add_check_all';
        labelcheck2.innerHTML = 'Check All';
        labelcheck2.className = 'ital';
        var checkbox2_check = createElement("input");
        checkbox2_check.setAttribute("type","checkbox");
        checkbox2_check.setAttribute("id",'rol_add_check_all');
        tdcheck2.appendChild(checkbox2_check);
        addEvent(checkbox2_check, "click", checkRemove);
      }
      var tr = createElement("tr", tbody);
      var tdLabel = createElement("td", tr);
      tdLabel.className = 'adminModule';
      var label = createElement("label", tdLabel);
      label.htmlFor = data[role];
      label.innerHTML = data[role].escapeHTML();
      var tdCheckbox = createElement("td", tr);
      tdCheckbox.className = 'rightCheckboxTd';
      var checkbox_ = createElement("input");
      checkbox_.setAttribute("type","checkbox");
      checkbox_.setAttribute("name","addRoles");
      checkbox_.setAttribute("value", data[role]);
      checkbox_.setAttribute("id",data[role]);
      tdCheckbox.appendChild(checkbox_);
      addRolesCheckboxes[notgranted] = checkbox_;
      notgranted++;
    }
  }
  rowEl.appendChild(td1);
  rowEl.appendChild(td2);
  rowEl.className="visible_row";
}

function GroupRole(groupId, roles) {
  this.groupId = groupId;
  this.roles = roles;
}

checkAddRoles = function(ev) {
  var targ;
  if (!ev) {
	var ev = window.event;
  }
  if (ev.target) {
	targ = ev.target;
  }	else if (ev.srcElement) {
	targ = ev.srcElement;
  }
  if (targ.nodeType == 3) {
	  // defeat Safari bug
  	 targ = targ.parentNode;
  }
  if (targ.type == 'checkbox') {
	  if (targ.checked) {
        for (var i=0; i < removedCheckboxes.length; i++) {
          removedCheckboxes[i].checked=true;
        }
	  } else {
	    for (var i=0; i < removedCheckboxes.length; i++) {
	      removedCheckboxes[i].checked=false;
	    }
	  }
  }
}

checkRemove = function(ev) {
  var targ;
  if (!ev) {
	var ev = window.event;
  }
  if (ev.target) {
	targ = ev.target;
  }	else if (ev.srcElement) {
	targ = ev.srcElement;
  }
  if (targ.nodeType == 3) {
	  // defeat Safari bug
  	 targ = targ.parentNode;
  }
  if (targ.type == 'checkbox') {
    if (targ.checked) {
      for (var i=0; i < addRolesCheckboxes.length; i++) {
        addRolesCheckboxes[i].checked=true;
      }
    } else {
      for (var i=0; i < addRolesCheckboxes.length; i++) {
        addRolesCheckboxes[i].checked=false;
      }
    }
  }
}

/* create element of the given type and add it to the parent object if exists */
createElement = function(type, parent) {
  var el = null;
  if (document.createElementNS) {
    // use the XHTML namespace; IE won't normally get here unless
    // _they_ "fix" the DOM2 implementation.
    el = document.createElementNS("http://www.w3.org/1999/xhtml", type);
  } else {
    el = document.createElement(type);
  }
  if (typeof parent != "undefined") {
    parent.appendChild(el);
  }
  return el;
};

/* Function which add event listener to the given element el (evname - event name, func - function which should be called when even occur) */
addEvent = function(el, evname, func) {
  if (el.attachEvent) { // IE
    el.attachEvent("on" + evname, func);
  } else if (el.addEventListener) { // Gecko / W3C
    el.addEventListener(evname, func, true);
  } else {
    el["on" + evname] = func;
  }
};