﻿/*--
标题：牌类控件
设计：王集鹄
博客：http://blog.csdn.net/zswang
日期：2009年4月19日
--*/

if (!Common.scripts["Cards"]) {
	loadCss("/Scripts/Cards.css");
	Common.scripts["Cards"] = true;
}

var CardConsts = {
	classes: {
		"A":"SA", "B":"S2", "C":"S3", "D":"S4", "E":"S5", "F":"S6", "G":"S7", "H":"S8", "I":"S9", "J":"S10", "K":"SJ", "L":"SQ", "M":"SK" 
		,"a":"HA", "b":"H2", "c":"H3", "d":"H4", "e":"H5", "f":"H6", "g":"H7", "h":"H8", "i":"H9", "j":"H10", "k":"HJ", "l":"HQ", "m":"HK" 
		,"N":"CA", "O":"C2", "P":"C3", "Q":"C4", "R":"C5", "S":"C6", "T":"C7", "U":"C8", "V":"C9", "W":"C10", "X":"CJ", "Y":"CQ", "Z":"CK" 
		,"n":"DA", "o":"D2", "p":"D3", "q":"D4", "r":"D5", "s":"D6", "t":"D7", "u":"D8", "v":"D9", "w":"D10", "x":"DJ", "y":"DQ", "z":"DK" 
		,"0":"GL", "1":"GH", "*":"B1", "?":"B2", "#":"Pass", "-":"P1", "=":"P2", "+":"P3"
	}
	,chars: "ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz01"
	,cardHeight: 96
	,cardWidth: 71
	,cardSpace: 15
	,selectSpace: 16
};

function Cards(parent, left, top, chars, locking) {
	var self = this;
	this.parent = parent ? parent : document.body;
	this.div_cards = document.createElement("div");
	this.div_cards.className = "Cards";
	this.div_cards.style.left = left + "px";
	this.div_cards.style.top = top + "px";
	this.locking = !!locking;
	this.cards = [];
	this.setChars(chars);
	this.parent.appendChild(this.div_cards);
	this.onsort = function(card1, card2) {
		return CardConsts.chars.indexOf(card2.cchar, 0) - CardConsts.chars.indexOf(card1.cchar, 0);
	}
	var downSelected = false;

	this.cardsMousedown = function(e) {
		if (!self.locking) {
			var element = typeof event != "undefined" ? event.srcElement : e.target;
			if (element.card) downSelected = !element.card.selected;
		}
		addEventHandler(self.div_cards, "mouseup", self.cardsMouseup);
		addEventHandler(self.div_cards, "mousemove", self.cardsMousemove);
		addEventHandler(self.div_cards, "losecapture", self.cardsMouseup);
		if (self.div_cards.setCapture) self.div_cards.setCapture();
		addEventHandler(window, "blur", self.cardsMouseup);
	}
	this.cardsMousemove = function(e) {
		if (!self.locking) {
			var element = typeof event != "undefined" ? event.srcElement : e.target;
			if (element.card)
				element.card.setSelected(downSelected);
		}
		if (window.getSelection)
			getSelection().removeAllRanges();
		else if (document.selection && document.selection.empty)
			try { document.selection.empty(); } catch (ex) { }
	}
	this.cardsMouseup = function(e) {
		removeEventHandler(self.div_cards, "mousemove", self.cardsMousemove);
		removeEventHandler(self.div_cards, "mouseup", self.cardsMouseup);
		removeEventHandler(self.div_cards, "losecapture", self.cardsMouseup);
		if (self.div_cards.releaseCapture) self.div_cards.releaseCapture();
		removeEventHandler(window, "blur", self.cardsMouseup);
	}
	addEventHandler(this.div_cards, "mousedown", this.cardsMousedown);
}

Cards.prototype.move = function(left, top) {
	if (this.left == left && this.top == top) return;
	this.div_cards.style.left = left + "px";
	this.div_cards.style.top = top + "px";
}

Cards.prototype.setChars = function(chars) {
	this.chars = chars;
	this.clear();
	for (var i = 0; chars && i < chars.length; i++) {
		this.cards.push(new Card(this, i, chars.charAt(i)));
	}
}

Cards.prototype.setSelection = function(chars) {
	for (var i = 0; i < this.cards.length; i++) {
		var j = chars ? chars.indexOf(this.cards[i].cchar, 0) : -1;
		if (j >= 0) {
			this.cards[i].setSelected(true);
			chars = chars.substr(0, j) + chars.substr(j + 1, chars.length - j);
		} else this.cards[i].setSelected(false);
	}
}

Cards.prototype.getSelection = function() {
	chars = "";
	for (var i = 0; i < this.cards.length; i++) {
		if (this.cards[i].selected)
			chars += this.cards[i].cchar;
	}
	return chars;
}

Cards.prototype.alphaSort = function() {
	if (typeof this.onsort != "function") return;
	var cards = [];
	for (var i = 0; i < this.cards.length; i++) {
		cards.push({cchar: this.cards[i].cchar, selected: this.cards[i].selected});
	}
	cards.sort(this.onsort);
	this.update(cards);
}

Cards.prototype.deleteCards = function(chars) {
	var temp = "";
	for (var i = 0; i < this.cards.length; i++) {
		var j = chars ? chars.indexOf(this.cards[i].cchar, 0) : -1;
		if (j >= 0) {
			chars = chars.substr(0, j) + chars.substr(j + 1, chars.length - j);
		} else temp += this.cards[i].cchar;
	}
	this.setChars(temp);
}

Cards.prototype.clear = function() {
	for (var i = 0; i < this.cards.length; i++) {
		this.cards[i].dispose();
	}
	this.cards = [];
	this.selection = "";
}

Cards.prototype.getWidth = function() {
	return CardConsts.cardWidth + CardConsts.cardSpace * (this.cards.length - 1);
}

Cards.prototype.update = function(cards) {
	for (var i = 0; i < this.cards.length; i++) {
		this.cards[i].setChar(cards[i].cchar);
		this.cards[i].setSelected(cards[i].selected);
	}
}

Cards.prototype.setLocking = function(locking) {
	if (this.locking == locking) return;
	this.locking = locking
	for (var i = 0; i < this.cards.length; i++)
		this.cards[i].setLocking(locking);
}

function Card(cards, index, cchar) {
	var self = this;
	this.cards = cards;
	this.index = index;
	this.cchar = cchar;
	this.selected = false;
	this.a_card = document.createElement("a");
	this.a_card.card = this;
	this.a_card.onclick = function() {
		if (self.cards.locking) return;
		self.setSelected(!self.selected);
		if (typeof self.cards.onselectcard == "function")
			self.cards.onselectcard(self);
	}
	this.cards.div_cards.appendChild(this.a_card);
	this.doChange();
}

Card.prototype.setChar = function(cchar) {
	if (this.cchar == cchar) return;
	this.cchar = cchar;
	this.doChange();
}

Card.prototype.setLocking = function(locking) {
	if (this.locking == locking) return;
	this.locking = locking;
	this.doChange();
}

Card.prototype.setSelected = function(selected) {
	if (this.selected == selected) return;
	this.selected = selected;
	this.doChange();
}

Card.prototype.doChange = function() {
	this.a_card.className = "Card " + CardConsts.classes[this.cchar]
		+ (this.selected ? " Selected" : "")
		+ ((/\W/).test(this.cchar) || this.cards.locking ? " Locking" : "");
	this.a_card.style.left = this.index * 15 + "px";
}

Card.prototype.dispose = function() {
	this.disposed = true;
	for (var i in this) {
		if (this[i].disposed) continue;
		if (typeof this[i].dispose == "function") this[i].dispose();
		if (typeof this[i].parentNode == "object")
			this[i].parentNode.removeChild(this[i]);
		delete this[i];
	}
}