var br_confs = new Array();
var br_actConf = null;
var br_actCreateConf = null;

function br_registerConf(conf) {
  conf.iconDestroy = '/images/reference/destroy.gif';
  conf.iconRemove = '/images/reference/remove.gif';
  br_confs[conf.uniqueID] = conf;
}

function br_generateEditor(conf) {
  var globDiv = document.getElementById('brgdiv_' + conf.uniqueID);
  if (globDiv == null) return;
  else while (globDiv.childNodes.length > 0) globDiv.removeChild(globDiv.childNodes[0]);
  
  var table = document.createElement("table");
  table.className = 'refEditor';
  var row, cell, info;
  
  for (var i = 0; i < conf.initValues.length; i++) {
    if (conf.initValues[i] <= 0) continue;
    
    info = br_getInfo(conf.initValues[i], conf.showProperties);
    row = table.insertRow(table.rows.length); 

    if (conf.showIcon) {
       cell = row.insertCell(row.cells.length);
       var url = globalContextPath + '/PersistentObjectAction.do' + globalActionPostfix + '?id=' + conf.initValues[i];
       if (linksDisabled) url = 'javascript:linkWarningMessage(\'' + url + '\');';
       cell.innerHTML = '<a title="' + conf.localTexts['persistent.reference.show'] + 
                        '" href="' + url + '"><img src="' + info.icon + '" style="width : 18px; height : 18px;"></a>';	   
    }
    
    if (conf.showIconDestroy) {
      cell = row.insertCell(row.cells.length);
      cell.innerHTML = '<a title="' + conf.localTexts['persistent.backreference.destroy'] +
                        '" href="javascript:br_removeFromDestroyReference(\'' + conf.uniqueID + '\', ' + conf.initValues[i] + ')">' +
                        '<img border="0" src="'+ globalContextPath + conf.iconDestroy + '"></a>';
    }
    
    if(conf.showIconRemove) {
      cell = row.insertCell(row.cells.length);
      cell.innerHTML = '<a title="' + conf.localTexts['persistent.reference.removefrom'] +
                        '" href="javascript:br_removeFromReference(\'' + conf.uniqueID + '\', ' + conf.initValues[i] + ')">' +
                        '<img border="0" src="'+ globalContextPath + conf.iconRemove + '"></a>';
    }
    
    if (conf.showDisplay) {
      cell = row.insertCell(row.cells.length);
      cell.innerHTML = info.display;
    }
    
    if (conf.showProperties != '') {
      var val = '';
      cell = row.insertCell(row.cells.length);
      
      for(var j = 0; j < info.properties.length; j++) val += info.properties[j] == '' ? '' : (', ' + info.properties[j]);  
      cell.innerHTML = val.substring(2);
    }
  }

  globDiv.appendChild(table);  
}

function br_getInfo(objID, props) {
  var responseXML = invokeRequest('PersistentObjectXMLInfo.do', 'id=' + objID + '&properties=' + props);
  
  var info = new Object();
  
  if(responseXML == null) return null;
  var errElements = responseXML.getElementsByTagName("errorMessage");
  if(errElements.length > 0) {
    info.icon = globalContextPath + "/images/persistent/object.gif";
    info.display = "# " + errElements[0].childNodes[0].nodeValue;
    info.objectDefName = "";
    info.objectDefNameTitle = "";
    return info;
  }
  
  info.icon = responseXML.getElementsByTagName("icon")[0].childNodes[0].nodeValue;
  if(responseXML.getElementsByTagName("display")[0].childNodes.length != 0)
    info.display = responseXML.getElementsByTagName("display")[0].childNodes[0].nodeValue;
  else info.display = '';
  
  var props = responseXML.getElementsByTagName("property");
  info.properties = new Array();
  for(var i = 0; i < props.length; i++)
    info.properties[i] = props[i].childNodes.length == 0  ? '' : props[i].childNodes[0].nodeValue;
  
  info.objectDefName = responseXML.getElementsByTagName("objectDefName")[0].childNodes[0].nodeValue;
  info.objectDefNameTitle = responseXML.getElementsByTagName("objectDefNameTitle")[0].childNodes[0].nodeValue;
  
  if (responseXML.getElementsByTagName("enabledToEdit") && 
      responseXML.getElementsByTagName("enabledToEdit").length > 0)
      info.enabledToEdit = responseXML.getElementsByTagName("enabledToEdit")[0].childNodes[0].nodeValue == 1;

  return info;
} 

function br_invoke(method, parameters) {
  var requester = getHTTPObject();
  var paramStr = '';
  for (var i = 0; i < parameters.length; i++) paramStr += '@' + parameters[i];
  
  var rString = globalContextPath + '/BackrefEditorUniversalActionXML.do' + globalActionPostfix + '?method=' + method + '&parameters=' + paramStr.substring(1);
  requester.open("GET", rString, false);
  requester.send(null);

  if (requester.responseXML.normalize) requester.responseXML.normalize();

  var err = requester.responseXML.getElementsByTagName('errorMessage');
  if (err != null && err.length > 0) {
    alert(err[0].childNodes[0].nodeValue);
    return null;
  }

  return requester.responseXML;
}

function br_removeFromDestroyReference(uniqueID, objID) {
  var conf = br_confs[uniqueID];
  if (conf == null) return;
  
  if (!confirm(conf.localTexts['persistent.backreference.destroyconfirm'])) return;
  var resp = br_invoke('removeFromDestroyReference', [objID, conf.targetObjectDefName, conf.targetPropertyName, conf.objectID, 1]);
  br_reloadEditorFromResponse(conf, resp);
}

function br_removeFromReference(uniqueID, objID) {
  var conf = br_confs[uniqueID];
  if (conf == null) return;
  
  var resp = br_invoke('removeFromReference', [objID, conf.targetObjectDefName, conf.targetPropertyName, conf.objectID, 1]);
  br_reloadEditorFromResponse(conf, resp);
}

function br_callback(result, resultDisplay) {
  if (result == null || result.length == 0 || br_actConf == null) return;
  
  var conf = br_confs[br_actConf];
  if (conf == null) return;
  
  var resp = br_invoke('addToReference', [result, conf.targetObjectDefName, conf.targetPropertyName, conf.objectID, 1]);
  br_reloadEditorFromResponse(conf, resp);
}

function br_reloadEditorFromResponse(conf, resp) {
  if (resp != null && resp.getElementsByTagName('ok') != null) {
    var vals = resp.getElementsByTagName('refObject');
    
    if (vals != null) {
      conf.initValues = new Array();
      
      for (var i = 0; i < vals.length; i++)
        if (vals[i].childNodes != null && vals[i].childNodes.length > 0)
          conf.initValues[conf.initValues.length] = vals[i].childNodes[0].nodeValue;
          
      br_generateEditor(conf);
    }
  }
}

function br_finishCreateAction(newObjID) {
  if (br_actCreateConf == null || newObjID == null || newObjID <= 0) return;

  var conf = br_confs[br_actCreateConf];
  br_invoke('saveDraft', [newObjID]);
  var resp = br_invoke('addToReference', [newObjID, conf.targetObjectDefName, conf.targetPropertyName, conf.objectID, 1]);
  br_reloadEditorFromResponse(conf, resp);
  
  br_actCreateConf = null;
}

function br_createNewObject(uniqueID, width, height, url) {
  br_actCreateConf = uniqueID;
  window.open(url, 'br_create', 'resizable=yes,width=' + width + ',height=' + height);
}

