HP_THM={
	high:[2,3,4,5,6,7,8,9,11,12,13,14,16],
	pair_add:10,
	suit_add:4,
	conn_add:[3,2,1], // gap: 0, 1, 2
	pos_middle_add:3,
	pos_late_add:5,
	limit_call:30,
	limit_raise:34,
	max_point:42
};

HP_OMHI={
	pair:[7,7,7,7,7,7,8,10,12,13,14,16,18],
	suit:[1,1,1,1,1,1,2,3,3,4,5,6,8],
	straight:[0,8,18,25],
	straight_gap_sub:2,
	straight_ace_sub:4,
	straight_wheel_card:6,
	three_rank_mul:0,
	three_suit_sub:2,
	limit_call:28,
	limit_raise:32,
	max_point:50 // ?
};

HP_OMHL={
	pair:[3,1,1,0,0,0,0,0,1,2,5,6,8],
	suit:[0,0,0,0,0,0,1,1,1,2,2,3,4],
	low:[20,17,13,10,15,12,0,11,0,8], // A2, A3, A4, A5, 23, 24, 25, 34, 35, 45
	low_kicker:[0,9,6,4,1,0,0,0,1,2,2,2,0],
	three_rank_mul:0.5,
	three_suit_mul:0.5,
	limit_call:20,
	limit_raise:30,
	max_point:45
};

MP_OMHL={
	kicker:[0,0,0,0,0,0,0,0,0,0,0,2,4],
	pair:[2,3,4,5,6,7,8,9,10,11,12,13,30],
	suit:[4,4,4,4,4,4,4,4,4,4,4,4,10],
	conn_add:[2,2,0], // gap: 0, 1, 2
	low:[20,15,10,5,10,5,5,5,5,5], // A2, A3, A4, A5, 23, 24, 25, 34, 35, 45
	limit_call:25,
	limit_raise:40,
	limit_reraise:50,
	limit_call_sb:10,
	max_point:72 // ?
};

function CountPoints(sys, c1, c2, c3, c4)
{
	var points=0;
	
	var ranks=[0,0,0,0,0,0,0,0,0,0,0,0,0];
	var suit_num=[0,0,0,0];
	var suit_high=[0,0,0,0];

	var c=[c1,c2,c3,c4];

	var colors="cdhs";
	var faces="23456789tjqka";

	var i,j;

	for (i=0;i<4;i++)
	{
		if (!c[i])
			continue;
		var suit=colors.indexOf(c[i].charAt(0));
		if (suit<0)
			return 0;
		var rank=faces.indexOf(c[i].charAt(1));
		if (rank<0)
			return 0;
		suit_num[suit]++;
		ranks[rank]++;
		if (suit_high[suit]<rank)
			suit_high[suit]=rank;
	}

	for (i=0;i<13;i++)
	{
		if (sys.high && ranks[i]>0)
			points+=sys.high[i];
		if (sys.kicker && ranks[i]==1)
			points+=sys.kicker[i];
		if (ranks[i]>=2)
		{
			if (sys.pair_add)
				points+=sys.pair_add;
			if (sys.pair)
			{
				var p=sys.pair[i];
				if (sys.three_rank_mul && ranks[i]>2)
					p*=sys.three_rank_mul;
				points+=p;
			}
		}
	}
	
	for (i=0;i<4;i++)
	{
		if (suit_num[i]<2)
			continue;
		if (sys.suit)
		{
			var p=sys.suit[suit_high[i]];
			if (suit_num[i]>2)
			{
				if (sys.three_suit_mul)
					p*=sys.three_suit_mul;
				if (sys.three_suit_sub)
					p-=sys.three_suit_sub;
			}
			points+=p;
		}
		if (sys.suit_add)
			points+=sys.suit_add;
	}

	if (sys.low)
	{
		var low=-1;

		var l1;
		var l2;

		for (l1=0;l1<4;l1++)
			if (ranks[l1]>0)
				break;

		if (l1<4)
		{
			if (ranks[12]>0)
			{
				l2=12;
				low=l1;
			}
			else if (l1<3)
			{
				for (l2=l1+1;l2<4;l2++)
				{
					if (ranks[l2]>0)
						break;
				}
				if (l2<4)
					low=[4,7,9][l1]+l2-l1-1;
			}
		}

		if (low>=0)
			points+=sys.low[low];

		if (sys.low_kicker)
			for (i=0;i<13;i++)
			{
				if ((low<0 || (i!=l1 && i!=l2)) && ranks[i]>0)
					points+=sys.low_kicker[i];
			}
	}

	if (sys.conn_add)
	{
		i=13;
		while (--i)
		{
			if (ranks[i]==0)
				continue;

			j=i;
			while (j--)
			{
				if (ranks[j]==0)
					continue;
				if (i-j<=3)
					points+=sys.conn_add[i-j-1];
			}
		}
	}

	if (sys.straight)
	{
		var num=0;
		var gap=0;
		var ace=0;
		var lastgap;
		i=13;
		while (i--)
		{
			if (ranks[i]>0)
			{
				if (!num && i==12)
					ace=1;
				num++;
				lastgap=0;
				if (i<4 && ranks[12]>0 && sys.straight_wheel_card)
					points+=sys.straight_wheel_card;
			}
			else if (num || i==0)
			{
				if (gap==3 || i==0)
				{
					if (num>1)
					{
						points+=sys.straight[num-1];
						if (sys.straight_gap_sub)
							points-=(gap-lastgap)*sys.straight_gap_sub;
						if (ace && sys.straight_ace_sub)
							points-=sys.straight_ace_sub;
					}
					num=1;
					ace=0;
					gap=lastgap;
				}
				gap++;
				lastgap++;
			}
		}
	}

	return points;
}
