var SlopeBlockClass = function(ownerStage, args)
{
	SlopeBlockClass.base.apply(this, arguments);
	
	var colLH = args[1], colRH = args[2];
	
	this.collisionLeftHeight = colLH;		//左上から辺り判定領域までの高さ
	this.collisionRightHeight = colRH;		//右上から辺り判定領域までの高さ
	
	//デバッグ情報を画面に表示
	this.enableDebugMode = false;
	
	//デバッグ情報
	this.x1 = 0;
	this.x2 = 0;
	this.y2 = 0;
	
}.extend(BlockClass, {
	isOverlappedWith: function(x1, y1, x2, y2){
		// 1 - - +
		// |     |
		// |     |
		// + - - 2
		//オブジェクト本体部分に重なるかどうかを調べる
		//この関数がfalseを返した時の引数の範囲へはオブジェクトが移動できる。
		//trueかつisPhantom==falseの時は衝突する。
		
		//デバッグ情報
		this.x1 = x1;
		this.y2 = y2;
		this.x2 = x2;
		
		if(this.collisionLeftHeight != this.collisionRightHeight){
			return this.crossLineJudge(x1, y2 - 1, x2, y2 - 1,
										this.origin.x, this.origin.y + this.collisionLeftHeight,
										this.origin.x + this.size.x - 1, this.origin.y + this.collisionRightHeight);
		}
		//チェックする二つの線分が平行だと当たり判定に漏れるので、当たり判定が水平な場合は他の式を利用する。
		if(this.collisionLeftHeight >= this.size.y){
			return false;
		}
		return (x2 > (this.origin.x + this.collisionMargin.left)) &&
			(x1 <= (this.origin.x + this.size.x - this.collisionMargin.right)) &&
			(y2 > (this.origin.y + this.collisionMargin.top + this.collisionLeftHeight)) &&
			(y1 <= (this.origin.y + this.size.y - this.collisionMargin.bottom));
	},
	//座標 p1,p2 を結ぶ線分と座標 q1,q2 を結ぶ線分が交差しているかを調べる
	//ただし、線分が重なっている場合(3点,4点が一直線上にある)、「交差している」、と判定します。
	crossLineJudge: function(p1x, p1y, p2x, p2y, q1x, q1y, q2x, q2y){
		if(p1x >= p2x){
			if((p1x < q1x && p1x < q2x) || (p2x > q1x && p2x > q2x)){
				return false;
			}
		} else{
			if((p2x < q1x && p2x < q2x) || (p1x > q1x && p1x > q2x)){
				return false;
			}
		}
		if(p1y >= p2y){
			if((p1y < q1y && p1y < q2y) || (p2y > q1y && p2y > q2y)){
				return false;
			}
		} else{
			if((p2y < q1y && p2y < q2y) || (p1y > q1y && p1y > q2y)){
				return false;
			}
		}
		return !((((p1x - p2x)*(q1y-p1y)+(p1y-p2y)*(p1x-q1x))*((p1x-p2x)*(q2y-p1y)+(p1y-p2y)*(p1x-q2x))>0) ||
				 (((q1x - q2x)*(p1y-q1y)+(q1y-q2y)*(q1x-p1x))*((q1x-q2x)*(p2y-q1y)+(q1y-q2y)*(q1x-p2x))>0));
		//参考 http://www5d.biglobe.ne.jp/~tomoya03/shtml/algorithm/IntersectionEX.htm
	},
	draw : function(x, y){
		SlopeBlockClass.base.prototype.draw.apply(this, arguments);
		/*
		if(this.enableDebugMode)
		{
			var xz = this.origin.x - x;
			this.ownerStage.mainContext.save();
			this.ownerStage.mainContext.beginPath();
			this.ownerStage.mainContext.strokeStyle='#0000ff';
			this.ownerStage.mainContext.moveTo(x,y + this.collisionLeftHeight);
			this.ownerStage.mainContext.lineTo(x + this.size.x + 1,y + this.collisionRightHeight);
			this.ownerStage.mainContext.stroke();
			this.ownerStage.mainContext.beginPath();
			this.ownerStage.mainContext.strokeStyle='#ff0000';
			this.ownerStage.mainContext.moveTo(this.x1 - xz,this.y2);
			this.ownerStage.mainContext.lineTo(this.x2 - xz,this.y2);
			this.ownerStage.mainContext.stroke();
			this.ownerStage.mainContext.restore();
		}
		*/
	},
	debugDraw: function(x, y){
		var xz = this.origin.x - x;
		
		if(this.collisionLeftHeight < this.size.y && this.collisionRightHeight < this.size.y){
			this.ownerStage.collisionMapContext.beginPath();
			this.ownerStage.collisionMapContext.moveTo(x, y + this.collisionLeftHeight);
			this.ownerStage.collisionMapContext.lineTo(x + this.size.x, y + this.collisionRightHeight);
			this.ownerStage.collisionMapContext.lineTo(x + this.size.x, y + this.size.y);
			this.ownerStage.collisionMapContext.lineTo(x, y + this.size.y);
			this.ownerStage.collisionMapContext.closePath();
			this.ownerStage.collisionMapContext.stroke();
		} else{
			this.ownerStage.collisionMapContext.beginPath();
			this.ownerStage.collisionMapContext.moveTo(x, y + this.collisionLeftHeight);
			this.ownerStage.collisionMapContext.lineTo(x + this.size.x, y + this.collisionRightHeight);
			this.ownerStage.collisionMapContext.stroke();
		}
	}
});
//このクラスのインスタンスのtickを呼び出さないように設定（高速化）
SlopeBlockClass.tick = function(){return false;};
