window.addEvent('domready', function() {
	$$('.card_frame').each(function(frame) {
		frame.selectedCard = null;
		frame.circular = false;
		frame.cards = [];
		var cardCollector = function(child) {
			if (!child.hasClass('.card_frame')) {
				if (child.hasClass('card')) {
					if (!child.hasClass('hidden')) {
						if (frame.selectedCard === null) {
							frame.selectedCard = child;
						} else {
							child.addClass('hidden');
						}
					}
					frame.cards.push(child);
				}
				child.getChildren().each(cardCollector);
			}
		};
		frame.getChildren().each(cardCollector);
		frame.nextCard = function() {
			if (this.cards.length > 0) {
				if (this.selectedCard !== null) {
					for (var i = 0; i < this.cards.length; i++) {
						if (this.selectedCard == this.cards[i]) {
							if (this.circular || this.cards.length > i + 1) {
								this.selectedCard.addClass('hidden');
								this.selectedCard.fireEvent('cardHide');
								this.selectedCard = this.cards[(i + 1) % this.cards.length];
								this.selectedCard.removeClass('hidden');
								this.selectedCard.fireEvent('cardShow');
							}
							return;
						}
					}
				} else {
					this.selectedCard = this.cards[0];
					this.selectedCard.removeClass('hidden');
					this.selectedCard.fireEvent('cardShow');
				}
				this.fireEvent('cardChange', this.selectedCard);
			}
		}.bind(frame);
		frame.previousCard = function() {
			if (this.cards.length > 0) {
				if (this.selectedCard !== null) {
					for (var i = 0; i < this.cards.length; i++) {
						if (this.selectedCard == this.cards[i]) {
							if (this.circular || i > 0) {
								this.selectedCard.addClass('hidden');
								this.selectedCard.fireEvent('cardHide');
								this.selectedCard = this.cards[(this.cards.length + i - 1) % this.cards.length];
								this.selectedCard.removeClass('hidden');
								this.selectedCard.fireEvent('cardShow');
							}
							return;
						}
					}
				} else {
					this.selectedCard = this.cards[0];
					this.selectedCard.removeClass('hidden');
				}
			}
		}.bind(frame);
		frame.removeCard = function(card) {
			if (this.selectedCard == card) {
				this.selectedCard = null;
			}
			var cardCountBefore = this.cards.length;
			this.cards.erase(card);
			if (cardCountBefore > this.cards.length) {
				this.fireEvent('cardRemoved', card);
			}
		}.bind(frame);
		frame.addCard = function(card) {
			var cardCountBefore = this.cards.length;
			this.cards.include(card);
			if (cardCountBefore < this.cards.length) {
				this.fireEvent('cardAdded', card);
			}
		}.bind(frame);
		frame.getNextCard = function(card) {
			if (this.cards.length > 0) {
				if (this.selectedCard !== null) {
					for (var i = 0; i < this.cards.length; i++) {
						if (this.selectedCard == this.cards[i]) {
							if (this.circular || this.cards.length > i + 1) {
								return this.cards[(i + 1) % this.cards.length];
							} else {
								return null;
							}
						}
					}
				} else {
					return this.cards[0];
				}
			}
			return null;
		}.bind(frame);
		frame.getCurrentCard = function(card) {
			return this.selectedCard;
		}.bind(frame);
		frame.getPreviousCard = function(card) {
			if (this.cards.length > 0) {
				if (this.selectedCard !== null) {
					for (var i = 0; i < this.cards.length; i++) {
						if (this.selectedCard == this.cards[i]) {
							if (this.circular || i > 0) {
							return this.cards[(this.cards.length + i - 1) % this.cards.length];
							} else {
								return null;
							}
						}
					}
				} else {
					return this.cards[0];
				}
			}
			return null;
		}.bind(frame);
		frame.getCardCount = function() {
			return this.cards.length;
		}.bind(frame);
	});
});