/**
* @module positioned
* @requires common
**/
'use strict';
const {assign} = Object;
const {isNumber} = require('./common');
module.exports = function(obj) {
let self = obj || new Function();
let position = {x: 0, y: 0, z: 0};
let canTriggerEvent = true;
assign(self, {
setPosition,
setPositionX,
setPositionY,
setPositionZ,
getPosition,
getPositionX,
getPositionY,
getPositionZ,
translate,
translateX,
translateY,
translateZ
});
function setPosition(position) {
let [x, y, z] = position;
canTriggerEvent = false;
setPositionX(x);
setPositionY(y);
setPositionZ(z);
canTriggerEvent = true;
self.trigger('move');
return self;
}
function setPositionX(x) {
if (!isNumber(x)) {return position.x;}
position.x = x;
if (canTriggerEvent) {self.trigger('move');}
}
function setPositionY(y) {
if (!isNumber(y)) {return position.y;}
position.y = y;
if (canTriggerEvent) {self.trigger('move');}
}
function setPositionZ(z) {
if (!isNumber(z)) {return position.z;}
position.z = z;
if (canTriggerEvent) {self.trigger('move');}
}
function getPosition() {
return position;
}
function getPositionX() {
return position.x;
}
function getPositionY() {
return position.y;
}
function getPositionZ() {
return position.z;
}
function translate(x, y, z) {
canTriggerEvent = false;
translateX(x);
translateY(y);
translateZ(z);
canTriggerEvent = true;
self.trigger('move');
return self;
}
function translateX(x) {
if (!isNumber(x)) {return position.x;}
return setPositionX(x + position.x);
}
function translateY(y) {
if (!isNumber(y)) {return position.y;}
return setPositionY(y + position.y);
}
function translateZ(z) {
if (!isNumber(z)) {return position.z;}
return setPositionZ(z + position.z);
}
return self;
};