Engine.UniformScaleGraphic = class extends Engine.Drawable
{

	constructor(width /*int*/, height /*int*/, allowUpScale /*float*/, graphicName)
	{
		super();

		if (width === undefined) width = 128;
		if (height === undefined) height = 128;
		if (allowUpScale === undefined) allowUpScale = 1;

		this.contents = new Engine.Drawable();
		this.origWidth = 128;
		this.origHeight = 128;
		this.rect = new PIXI.Rectangle();
		this.allowUpScale = 1;
		this._maxWidth = width;
		this._maxHeight = height;
		this.hasContents = false;
		this.frame = 0;
		this.debug = null;
		this.isUniformScaleGraphic = true;
		
		this.allowUpScale = allowUpScale;
		this.setSize(width, height, allowUpScale);

		this.contents.onGraphicLoaded.addListener(this, this.graphicLoaded);
		if (graphicName !== undefined)
		{
			this.setGraphicByName(graphicName);
		}
	}


	get maxWidth() { return this._maxWidth; }
	set maxWidth(value)
	{
		this.setSize(value, this._maxHeight);
	}

	get maxHeight() { return this._maxHeight; }
	set maxHeight(value)
	{
		this.setSize(this._maxWidth, value);
	}


	clear()
	{
		this.contents.clear();
		this.removeChild(this.contents);
		this.hasContents = false;
	}

	setGraphicByID(graphic_id /*int*/, frame /*int*/)
	{
		if (frame === undefined) frame = 1;

		this.frame = frame;
		var def = Engine.GraphicFactoryInstance.getGraphicDefByID(graphic_id);
		if (def)
		{
			this.setGraphicByName(def.name);
		}
	}

	setGraphicByName(graphicName /*string*/, frame /*int*/)
	{
		if (frame === undefined) frame = 1;

		this.clear();
		if (graphicName == null || graphicName == "") return;
		
		this.frame = frame;
		
		this.addChild(this.contents);
		this.contents.loadFromGraphicName(graphicName, this.maxWidth, this.maxHeight);
	}

	graphicLoaded(obj /*Drawable*/)
	{
		this.contents.gotoAndStop(this.frame);
		this.contentsUpdated();
		this.contents.graphicData.setTextureMode(PIXI.SCALE_MODES.LINEAR);
	}

	contentsUpdated()
	{
		this.contents.x = 0;
		this.contents.y = 0;
		this.contents.scale.x = this.contents.scale.y = 1;
		this.rect = this.contents.getLocalBounds();
		this.origWidth = Math.max(1, this.rect.width);
		this.origHeight = Math.max(1, this.rect.height);
		this.setSize(this.maxWidth, this.maxHeight, this.allowUpScale);
	}

	setSize(maxWidth /*int*/, maxHeight /*int*/, allowUpScale /*float*/, setUnrounded /*bool*/)
	{
		if (allowUpScale === undefined) allowUpScale = 1;
		if (setUnrounded === undefined) setUnrounded = false;

		this.allowUpScale = allowUpScale;
		
		this._maxWidth = maxWidth;
		this._maxHeight = maxHeight;
		
		this.contents.scale.x = 1;
		this.contents.scale.y = 1;
		
		var maxScale = 1;
		if (this.origWidth > maxWidth || this.origHeight > maxHeight)
		{
			maxScale = Math.min(maxWidth / this.origWidth, maxHeight / this.origHeight);
		}
		else if (allowUpScale > 1)
		{
			maxScale = Math.min(maxWidth / this.origWidth, maxHeight / this.origHeight);
			maxScale = Math.min(this.allowUpScale, maxScale);
		}
		
		this.contents.scale.x = maxScale;
		this.contents.scale.y = maxScale;
		
		//center graphic?
		this.contents.x = 0;
		this.contents.y = 0;

		var newWidth = this.origWidth * maxScale;
		var newHeight = this.origHeight * maxScale;
		
		var r = new PIXI.Rectangle(this.rect.x, this.rect.y, this.rect.width, this.rect.height);
		r.x *= maxScale;
		r.y *= maxScale;
		r.width *= maxScale;
		r.height *= maxScale;
		
		if(this.setUnrounded)
		{
			this.contents.setXYUnrounded(((maxWidth - r.width) / 2) - r.x, ((maxHeight - r.height) / 2) - r.y);
		}
		else
		{
			this.contents.x = ((maxWidth - r.width) / 2) - r.x;
			this.contents.y = ((maxHeight - r.height) / 2) - r.y;
		}

		this.hitArea = new PIXI.Rectangle(0, 0, maxWidth, maxHeight);
	}

	setWidth(width /*int*/, allowUpScale /*float*/, setXYUnrounded /*bool*/)
	{
		if (allowUpScale === undefined) allowUpScale = 1;
		if (setXYUnrounded === undefined) setXYUnrounded = false;

		this.contents.scale.x = contents.scale.y = 1;
		this.origWidth = Math.max(1, this.contents.width);
		this.origHeight = Math.max(1, this.contents.height);
		
		var ratio = this.contents.height / this.contents.width;
		var height = Math.floor(width * ratio);
		this.setSize(width, height, allowUpScale, setXYUnrounded);
	}

	setHeight(height /*int*/, allowUpScale /*float*/, setXYUnrounded /*bool*/)
	{
		if (allowUpScale === undefined) allowUpScale = 1;
		if (setXYUnrounded === undefined) setXYUnrounded = false;
		
		this.contents.scale.x = this.contents.scale.y = 1;
		this.origWidth = Math.max(1, this.contents.width);
		this.origHeight = Math.max(1, this.contents.height);
		
		var ratio = this.contents.width / this.contents.height;
		var width = Math.floor(height * ratio);
		this.setSize(width, height, allowUpScale, setXYUnrounded);
	}
}