//AUGMENT
var ITW = (function(itw){
  var width = 1024, height = 600;

  itw.DBoneFactory =  (function(){
    var public = Object.create(null);
    var enableClock = true;
    var armatures = [];
    var skelData = Object.create(null);

    var loop = function(dt){
      dragonBones.WorldClock.clock.advanceTime(dt * public.dtMultiplier);
    }

    public.dtMultiplier = 0.001;

    Object.defineProperty(public, "enableClock", {
      set: function(val){
        enableClock = val;
        if(enableClock && !ITW.UpdateMgr.hasFrameListener(loop)){
          ITW.UpdateMgr.addFrameListener( loop );
        }
        if(!enableClock && ITW.UpdateMgr.hasFrameListener(loop)){
          ITW.UpdateMgr.removeFrameListener( loop );
        }
      },
      get: function(){
        return enableClock;
      }
    });

    public.createArmature = function(name){
      var newArmature = public.PixiFactory.buildArmature(name);
      dragonBones.WorldClock.clock.add(newArmature);
      armatures.push(newArmature);
      return newArmature;
    }

    public.destroyArmature = function(armature){
      var index = armatures.indexOf(armature);
      if(index > -1){
        var arm = armatures.splice(index, 1)[0];
        dragonBones.WorldClock.clock.remove(arm);
        arm.dispose();
      }
    }

    public.destroyAllArmature = function(){
      while(armatures.length > 0){
        var arm = armatures.pop();
        dragonBones.WorldClock.clock.remove(arm);
        arm.dispose();
      }
    }

    /**
     * @param (STRING) imgID texture file(png)
     * @param (STRING) dataID string file(json)
     * @param (STRING) SkelID string file(json)
     */
    public.start = function(imgID, dataID, skelID){
      public.PixiFactory = new dragonBones.PixiFactory();
      public.addToFactory(imgID, dataID, skelID);

      public.enableClock = true;
    }

    public.addToFactory = function(imgID, dataID, skelID){
      var textureImg = EHDI.Assets.images[imgID].baseTexture.source;
      var textureData = EHDI.Assets.fetch(dataID);
      var skel = EHDI.Assets.fetch(skelID);

      public.PixiFactory.addTextureAtlas(new dragonBones.TextureAtlas(textureImg, textureData));
      public.PixiFactory.addDragonBonesData(dragonBones.DataParser.parseDragonBonesData(skel));
    }

    return public;
  }());

  return itw;
}(ITW || Object.create(null)));