function xor(id) {
    this.id = id;
    this.name = "#" + this.id;
    this.rep = add(80, 80, "green", "black", this.id, true);
    this.pin1 = new pin(0);
    this.pin2 = new pin(0);
    this.o = new pin(1);
    this.o.nei = this;
    //this.text = new text(this,"Or-gate");
    this.activation = function() {
        if (!(this.pin1.val && this.pin2.val) && (this.pin1.val || this.pin2.val)) {
            return true;
        }
        return false;
    }

    this.x = function() {
        let name = "#" + this.id;
        return parseFloat($(name).attr("x"));
    }

    this.y = function() {
        let name = "#" + this.id;
        //console.log("y"+parseFloat($(name).attr("y")));
        return parseFloat($(name).attr("y"));
    }

    //design
    let g = document.createElementNS('http://www.w3.org/2000/svg', 'g');
    $(g).attr({
        width: "100%",
        height: "100%"
    });
    let skin = $(document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject')).attr({
        x: "50",
        y: "50",
        id: (id + "-skin"),
        width: "80",
        height: "80"
    });
    let img = $(document.createElement('img')).attr({
        height: "80",
        width: "80",
        src: "textures/gates/xor.jpg"
    });
    let iDiv = document.createElement("div");
    $(iDiv).append(img);
    this.skin = skin;
    this.img = img;
    $(skin).append(iDiv);
    //noname(this);
    $(g).append(skin);
    let elem = document.getElementById("svg1");
    elem.appendChild(g);

    //updating
    this.update = function() {
        //the main object and his pins
        let x = this.x();
        let y = this.y();
        this.pin1.set(x - 20, y);
        this.pin2.set(x - 20, y + 60);
        this.o.set(x + 80, y + 30);

        //and the skin
        let name = "#" + this.id + "-skin";
        let skin = $(name);
        skin.attr("x", (parseFloat($((this.rep)).attr("x")) + 4).toString());
        skin.attr("y", (parseFloat($((this.rep)).attr("y")) + 4).toString());
    }
    pieces[pieces.length] = this;
    clk(this, [this.pin1, this.pin2, this.output]);
}