

function EditMetadataDialog(metaData, targetRowElem) {
  this._metaDataUIs = [];
  this._metaData = metaData;
  
  this._MetadataUI = function(tr, key, value, project) {
      var self = this;
      
      if (key === "date") {
          return;
      }
      
      var td0 = tr.insertCell(0);
      
      var keyLable = $.i18n('core-index/'+key) || key;
      $(td0).text(keyLable);

      var td1 = tr.insertCell(1);
      $(td1).text((value !== null) ? value : "");

      var td2 = tr.insertCell(2);
      
      if(key==="tags"){
          $('<button class="button">').text($.i18n('core-index/edit')).appendTo(td2).click(function() {
              var oldTags = $(td1).text().replace("[","").replace("]","");
              oldTags = replaceAll(oldTags,"\"","");
              var newTags = window.prompt($.i18n('core-index/change-metadata-value')+" " + key, $(td1).text());
              newTags = newTags.replace("[","").replace("]","");
              newTags = replaceAll(newTags,"\"","");
              if (newTags !== null) {
                  $(td1).text(newTags);
                  metaData[key] = newTags;
                  Refine.postCSRF(
                      "command/core/set-project-tags",
                      {
                          "project" : project,
                          "old" : oldTags,
                          "new" : newTags
                      },
                      function(data) {},
                      "json"
                  );
              }
              
              Refine.OpenProjectUI.refreshProject(targetRowElem, metaData, project);
            });
      }
      
      if (key !== "created" && 
              key !== "modified" && 
              key !== "rowCount" && 
              key !== "importOptionMetadata" && 
              key !== "id" &&
              key !== "tags")  {
          $('<button class="button">').text($.i18n('core-index/edit')).appendTo(td2).click(function() {
            var newValue = window.prompt($.i18n('core-index/change-metadata-value')+" " + key, value);
            if (newValue !== null) {
              $(td1).text(newValue);
              metaData[key] = newValue;
              Refine.postCSRF(
                "command/core/set-project-metadata",
                {
                  project : project,
                  name : key,
                  value : newValue
                },
                function(o) {
                  if (o.code === "error") {
                    alert(o.message);
                  } 
                },
                "json"
              );
            }
            
            Refine.OpenProjectUI.refreshProject(targetRowElem, metaData, project);
          });
      }
  };
  
  this._createDialog();
}

EditMetadataDialog.prototype._createDialog = function() {
  var self = this;
  
  var frame = $(DOM.loadHTML("core", "scripts/project/edit-metadata-dialog.html"));
  this._elmts = DOM.bind(frame);  

  this._level = DialogSystem.showDialog(frame);
  this._elmts.closeButton.html($.i18n('core-buttons/close'));
  this._elmts.closeButton.click(function() { self._dismiss();Refine.OpenProjectUI.prototype._addTagFilter()});
  
  var body = $("#metadata-body");
    
  $('<h1>').text($.i18n('core-index/metaDatas')).appendTo(body);

  var metadataTable = $("<table>")
  .addClass("list-table")
  .addClass("preferences")
  .html('<tr><th>'+$.i18n('core-index/key')+'</th><th>'+$.i18n('core-index/value')+'</th><th></th></tr>')
  .appendTo(body)[0];

    var flattenObject = function(ob, key) {
        var toReturn = {};
        for ( var i in ob) {
            if (i !== key) {
                toReturn[i] = ob[i];
                continue;
            }
            for ( var x in ob[i]) {
                toReturn[ob[i][x].name] = ob[i][x].value;
            }
        }
        return toReturn;
    };
    
  var flatMetadata = flattenObject(this._metaData, "userMetadata");
      
  for (var k in flatMetadata) {
    var tr = metadataTable.insertRow(metadataTable.rows.length);
    var v;
    
    if (typeof flatMetadata[k] === 'string') {
        v = flatMetadata[k].replace(/\"/g, "");  
    } else {
        v = JSON.stringify(flatMetadata[k]);
    }
    
    this._metaDataUIs.push(new this._MetadataUI(tr, k, v, flatMetadata.id));
  }
  
  $(".dialog-container").css("top", Math.round(($(".dialog-overlay").height() - $(frame).height()) / 2) + "px");
};

EditMetadataDialog.prototype._dismiss = function() {
    DialogSystem.dismissUntil(this._level - 1);
};

function escapeRegExp(str) {
    return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
  }

function replaceAll(str, find, replace) {
    return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);
  }

