'use strict';
module.exports = ProcessingInstruction;

var Node = require('./Node');
var CharacterData = require('./CharacterData');
var utils = require('./utils');

function ProcessingInstruction(doc, target, data) {
  CharacterData.call(this);
  this.nodeType = Node.PROCESSING_INSTRUCTION_NODE;
  this.ownerDocument = doc;
  this.target = target;
  this._data = data;
}

var nodeValue = {
  get: function () {
    return this._data;
  },
  set: function (v) {
    if (v === null || v === undefined) {
      v = '';
    } else {
      v = String(v);
    }
    this._data = utils.escapeText(v);
    if (this.rooted) this.ownerDocument.mutateValue(this);
  },
};

ProcessingInstruction.prototype = Object.create(CharacterData.prototype, {
  nodeName: {
    get: function () {
      return this.target;
    },
  },
  nodeValue: nodeValue,
  textContent: nodeValue,
  data: {
    get: nodeValue.get,
    set: function (v) {
      nodeValue.set.call(this, v === null ? '' : String(v));
    },
  },

  // Utility methods
  clone: {
    value: function clone() {
      return new ProcessingInstruction(this.ownerDocument, this.target, this._data);
    },
  },
  isEqual: {
    value: function isEqual(n) {
      return this.target === n.target && this._data === n._data;
    },
  },
});
