var core = require('../core');
//var InteractiveData = require('../interaction/InteractiveData');
/**
* Holds all information related to an Interaction event
*
* @class
* @memberof PIXI.interaction
*/
function AccessibilityLayer(renderer)
{
var div = document.createElement('div');
div.style.width = 100 + 'px';
div.style.height = 100 + 'px';
// div.style.backgroundColor = '#FF0000'
div.style.position = 'absolute';
div.style.top = 0;
div.style.left = 0;
div.style.zIndex = 2;
this.pool = [];
this.renderId = 0;
this.div = div;
this.debug = false;
this.renderer = renderer;
this.children = [];
this._onKeyDown = this._onKeyDown.bind(this);
this._onMouseMove = this._onMouseMove.bind(this)
this.isActive = false;
window.addEventListener('keydown', this._onKeyDown, false);
}
AccessibilityLayer.prototype.constructor = AccessibilityLayer;
module.exports = AccessibilityLayer;
AccessibilityLayer.prototype.activate = function()
{
if(this.isActive)return;
this.isActive = true;
window.document.addEventListener('mousemove', this._onMouseMove, true);
window.removeEventListener('keydown', this._onKeyDown, false);
this.renderer.on('postrender', this.update, this);
document.body.appendChild(this.div);
}
AccessibilityLayer.prototype.deactivate = function()
{
if(!this.isActive)return;
this.isActive = false;
window.document.removeEventListener('mousemove', this._onMouseMove);
window.addEventListener('keydown', this._onKeyDown, false);
this.renderer.off('postrender', this.update);
document.body.removeChild(this.div);
}
AccessibilityLayer.prototype.updateAccessibleObjects = function(item)
{
if(!item.visible)return;
if(item.accessible)
{
if(!item.active)
{
this.addChild(item);
}
item.renderId = this.renderId;
}
var children = item.children;
for (var i = children.length - 1; i >= 0; i--) {
this.updateAccessibleObjects(children[i])
};
}
AccessibilityLayer.prototype.update = function()
{
// update children...
this.updateAccessibleObjects(this.renderer._lastObjectRendered);
var rect = this.renderer.view.getBoundingClientRect();
var sx = rect.width / this.renderer.width ;
var sy = rect.height / this.renderer.height ;
var div = this.div;
div.style.left = rect.left + 'px';
div.style.top = rect.top + 'px';
for (var i = 0; i < this.children.length; i++)
{
var child = this.children[i];
if(child.renderId != this.renderId)
{
child.active = false;
this.children.splice(i, 1);
this.div.removeChild( child.div );
this.pool.push(child.div);
child.div = null;
i--;
if(this.children.length === 0)
{
this.deactivate();
}
}
else
{
// map div to display..
var div = child.div;
var hitArea = child.hitArea
var wt = child.worldTransform;
if(child.hitArea)
{
div.style.left = ((wt.tx + (hitArea.x * wt.a)) * sx) + 'px';
div.style.top = ((wt.ty + (hitArea.y * wt.d)) * sy) + 'px';
div.style.width = (hitArea.width * wt.a * sx) + 'px';
div.style.height = (hitArea.height * wt.d * sy) + 'px';
}
else
{
hitArea = child.getBounds();
div.style.left = (hitArea.x * sx) + 'px';
div.style.top = (hitArea.y * sy) + 'px';
div.style.width = (hitArea.width * sx) + 'px';
div.style.height = (hitArea.height * sy) + 'px';
}
}
};
this.renderId++;
}
AccessibilityLayer.prototype.addChild = function(item)
{
// this.activate();
var div = this.pool.pop();
if(!div)
{
div = document.createElement('button');
div.style.width = 100 + 'px';
div.style.height = 100 + 'px';
div.style.backgroundColor = this.debug ? 'rgba(255,0,0,0.5)' : 'transparent'
div.style.position = 'absolute';
div.style.zIndex = 2;
div.style.borderStyle = 'none';
div.title = 'title' || 'item ' + this.tabIndex
div.addEventListener('click', this._onClick.bind(this))
div.addEventListener('focus', this._onFocus.bind(this))
div.addEventListener('focusout', this._onFocusOut.bind(this))
}
//
item.active = true;
item.div = div;
div.item = item;
this.children.push(item);
this.div.appendChild( item.div );
item.div.tabIndex = item.tabIndex;
}
core.WebGLRenderer.registerPlugin('accessibility', AccessibilityLayer);
core.CanvasRenderer.registerPlugin('accessibility', AccessibilityLayer);
AccessibilityLayer.prototype._onClick = function(e)
{
var interactionManager = this.renderer.plugins.interaction;
interactionManager.dispatchEvent(e.target.item, 'click', interactionManager.eventData);
}
AccessibilityLayer.prototype._onFocus = function(e)
{
var interactionManager = this.renderer.plugins.interaction;
interactionManager.dispatchEvent(e.target.item, 'mousedown', interactionManager.eventData);
}
AccessibilityLayer.prototype._onFocusOut = function(e)
{
var interactionManager = this.renderer.plugins.interaction;
interactionManager.dispatchEvent(e.target.item, 'mouseup', interactionManager.eventData);
}
AccessibilityLayer.prototype._onKeyDown = function(e)
{
if(e.keyCode !== 9)return;
this.activate();
}
AccessibilityLayer.prototype._onMouseMove = function()
{
this.deactivate();
}