	var cards = {

		maxCardsShown:		0,
		cardViewSequence:	[],
		allCards: 			[],
		
		init: function (maxCards) {
			this.maxCardsShown = maxCards;		
		},
		addNewCard: function (dataRow) {
			var newCard = new MTGCard(dataRow, this.allCards.length);
			this.allCards.push(newCard);
			return newCard;
		},
		insertIntoSequence: function (card) {
			if (this.cardViewSequence.length<this.maxCardsShown) {
				this.cardViewSequence.push(card);
			} else {
				this.cardViewSequence[0].hide();
				this.cardViewSequence.splice (0, 1);
				this.cardViewSequence.push(card);
			}
		},
		updateCartQtys: function (cartNum, edition, seq, lang, cond, foiled, qty) {
			for (var i=0; i<this.allCards.length; i++) {
				if (this.allCards[i]==undefined) continue;
				if (this.allCards[i].isTheSame (edition, seq)) {
					this.allCards[i].updateCartQtys(cartNum, lang, cond, foiled, qty);
				}
			}
		},
		removeFromCart: function (allCardsIndex, cartNo) {
			this.allCards[allCardsIndex].removeFromCart(cartNo);
		},
		addToCart: function (allCardsIndex, cartNo) {
			this.allCards[allCardsIndex].addToCart(cartNo);
		},
		showInfo: function (el, e, allCardsIndex) {
			this.allCards[allCardsIndex].showInfo(el, e);
		},
		choseVariant: function (allCardsIndex, vNo) {
			this.allCards[allCardsIndex].choseVariant(vNo);
		},
		hide: function (allCardsIndex) {
			var card = this.allCards[allCardsIndex];
			for (var i=0; i<this.cardViewSequence.length; i++) {
				if (this.cardViewSequence[i]==undefined) continue;
				if (this.cardViewSequence[i]==card) {
					this.cardViewSequence.splice(i, 1);
				}
			}
			card.hide();
		},
		reverseSticky: function (allCardsIndex) {
			var card = this.allCards[allCardsIndex];
			card.reverseSticky();
		},
		showHiddenCard: function (ed, seq, lang, print, cond, mousex, mousey) {
			for (var i=0; i<this.allCards.length; i++) {
				if (this.allCards[i]==undefined) continue;
				if (this.allCards[i].isTheSame (ed, seq)) {
					this.allCards[i].selectVariant (lang, print, cond);
					this.allCards[i].display(mousex, mousey);
					return true;
				}
			}
			return false;
		},
		showCard: function (e, ed, seq) {
			this.showCardExt (e, ed, seq, '', '', '');
		},
		showCardExt: function (e, ed, seq, lang, print, cond) {
			var mousePos = getMousePosition(e);
			if (!this.showHiddenCard(ed, seq, lang, print, cond, mousePos.x, mousePos.y)) {
				loadStr = 'ajax_showCard.php';
					params = 'edition='+ed+
							'&seq='+seq+
							'&lang='+lang+
							'&print='+print+
							'&cond='+cond+
							'&mousex='+tempX+
							'&mousey='+tempY;
				ax_getAjaxDoc(loadStr, params);	
			}
		}
	}
	
	MTGCard = function(xdataRow, xallCardsIndex) {
		var obj = {
			lang:			'',
			print:			'',
			cond:			'',
			dataRow:		[],
			allCardsIndex:	0,
			isVisible:		false,
			isFresh:		false,
			isDrawn:		false,
			code:			'',
			variantNo:		0,
			sticky:			true,
			lastAbsolute:	0,
			
			selectVariant: function (lang, print, cond) {
				if (this.lang!=lang || this.print!=print || this.cond!=cond) 
					this.isFresh = false;
				this.lang = lang;
				this.print = print;
				this.cond = cond;
				this.findVariantNo();
				if (this.isDrawn) this.refresh();
			},
			choseVariant: function (vNo) {
				this.variantNo = vNo;
				this.isFresh = false;
				this.refresh();
			},
			findVariantNo: function () {
				if (this.lang=='' && this.print=='' && this.cond=='') {
					this.variantNo = 0;
				} else {
					for (var i=0; i<this.dataRow.length; i++) {
						if (this.dataRow[i]==undefined) continue;
						if (this.lang==this.dataRow[i][10] && 
							this.print==this.dataRow[i][12] && 
							this.cond==this.dataRow[i][11]) {
							this.variantNo = i;
							break;
						}
					}
					if (i==this.dataRow.length) this.variantNo = 0;
				}
			},
			refresh: function () {
				if (!this.isFresh && this.isDrawn) {
					for (var i=0; i<this.dataRow.length; i++) {
						if (this.dataRow[i]==undefined) continue;
						$('cardVariant_'+this.allCardsIndex+'_'+i).className = 
							(i==this.variantNo) ? 'divCardVariant selectedVariant' :
							'divCardVariant';
					}
					if (userLogin!='') {
						$('cardCartQty_'+this.allCardsIndex+'_0').innerHTML = 
							this.dataRow[this.variantNo][14];
						$('cardCartQty_'+this.allCardsIndex+'_1').innerHTML = 
							this.dataRow[this.variantNo][15];
					}
					$('cartCardHeader_'+this.allCardsIndex).innerHTML = 
						((this.dataRow[this.variantNo][13]=='0') ? 
						'---' : this.dataRow[this.variantNo][16]+' zł/szt.');
					this.isFresh = true;
				}
			},
			addOrRemoveFromCart: function (cartNum, add) {
				loadStr = 'ajax_addOrRemoveFromCart.php';
				params = 'cartNum='+cartNum+
					'&edition='+this.dataRow[this.variantNo][1]+
					'&seq='+this.dataRow[this.variantNo][2]+
					'&lang='+this.dataRow[this.variantNo][10]+
					'&cond='+this.dataRow[this.variantNo][11]+
					'&foiled='+this.dataRow[this.variantNo][12]+
					'&qty='+((this.dataRow[this.variantNo][14+cartNum]-0)+add);
				ax_getAjaxDoc(loadStr, params);	
			},
			addToCart: function (cartNum) {
				if (cartNum==0 && 
					this.dataRow[this.variantNo][14]-0==this.dataRow[this.variantNo][13]-0) return;
				this.addOrRemoveFromCart (cartNum, 1);
			},
			removeFromCart: function (cartNum) {
				if (cartNum==0 && this.dataRow[this.variantNo][14]-0<1) return;
				this.addOrRemoveFromCart (cartNum, -1);
			},
			updateCartQtys: function (cartNum, lang, cond, print, qty) {
				if (userLogin=='') return;
				for (var i=0; i<this.dataRow.length; i++) {
					if (this.dataRow[i]==undefined) continue;
					if (this.dataRow[i][10]==lang &&
						this.dataRow[i][11]==cond &&
						this.dataRow[i][12]==print) {
						this.dataRow[i][14+cartNum] = qty;
						if (i==this.variantNo) {
							this.isFresh = false;
							this.refresh();
						}
					}	
				}
			},
			moveTo: function (x, y) {
				if (x!=-1) $('divCardMain_'+this.allCardsIndex).style.left = x-130+'px';
				if (y!=-1) $('divCardMain_'+this.allCardsIndex).style.top = y-100+'px';
			},
			display: function (mousex, mousey) {
				if (this.isVisible) {
					this.moveTo (mousex, mousey);
				} else {
					cards.insertIntoSequence (this);
					this.moveTo (mousex, mousey);
					this.isVisible = true;
					this.refresh();
					$('divCardMainFrame_'+this.allCardsIndex).style.display = 'block';
				}
			},
			showInfo: function (el, e) {
				return hoverlib (el, e, '<b>'+this.dataRow[0][0]+'</b><br/>'+
					'<i>'+this.dataRow[0][17]+'</i><br/><br/>'+
					'<b>Tekst karty:</b><br/>'+this.dataRow[0][19]+
					((this.dataRow[0][20]!='') 
						? '<br/><br/><i>'+this.dataRow[0][20]+'</i>'
						: ''
					), 200);
			},
			hide: function () {
				this.isVisible = false;
				$('divCardMainFrame_'+this.allCardsIndex).style.display = 'none';
				if (window.cardHasBeenHidden!=undefined) 
					cardHasBeenHidden(this.dataRow[0][1], this.dataRow[0][2]);
			},
			isTheSame:function (ed, seq) {
				return (ed==this.dataRow[0][1] && seq==this.dataRow[0][2]);
			},
			draw: function () {
				var inn = '<div class="divCardMainFrame" id="divCardMainFrame_'+
					this.allCardsIndex+'">';
				inn += '<div class="divCardMain" id="divCardMain_'+
					this.allCardsIndex+'">';
				inn += '<div class="divCard'+this.dataRow[0][18]+'BLeft"></div>';
				inn += '<div class="divCard'+this.dataRow[0][18]+'BTop"></div>';
				inn += '<div id="divCardCenter_'+this.allCardsIndex+'" class="divCard'+
					this.dataRow[0][18]+'BCenter" '+
					'onmousedown="dragStart(event, \'divCardMain_'+this.allCardsIndex+'\');">'+
					'<img onmouseout="nd();" onmousemove="return cards.showInfo(this, event, '+
					this.allCardsIndex+')" '+
					'src="http://www.mtgnet.pl/karty3/'+this.dataRow[0][1].toLowerCase()+
					'/'+this.dataRow[0][2]+'.jpg"'+
					' alt="" width="200" height="285" /></div>';
				inn += '<div class="divCard'+this.dataRow[0][18]+'BBottom"></div>';
				inn += '<div class="divCard'+this.dataRow[0][18]+'BRight"></div>';
				
				inn += '<div class="divCardVariants">';
				for (var i=0; i<this.dataRow.length; i++) {
					if (this.dataRow[i]==undefined) continue;
					if (this.dataRow[i][14]=='') 
						this.dataRow[i][14] = '0';
						
					if (this.dataRow[i][15]=='') 
						this.dataRow[i][15] = '0';
					
					inn += '<div id="cardVariant_'+this.allCardsIndex+'_'+i+
						'" onclick="cards.choseVariant('+
						this.allCardsIndex+', '+i+
						');" class="divCardVariant';
					if (i==this.variantNo) inn += ' selectedVariant';
					inn += '">';
					inn += this.dataRow[i][13]+'&nbsp;'+this.dataRow[i][11]+
						'&nbsp;['+this.dataRow[i][10]+']&nbsp;<i>'+
						(this.dataRow[i][12]!='' ? 'foil' : '')+'</i>&nbsp;';
					inn += '<div style="clear: both;"></div></div>';
				}
				inn += '</div>';
					
				inn += '<div class="cardCartMain">';

				inn += '<div class="cardCartHeader" id="cartCardHeader_'+this.allCardsIndex+'">'+
					((this.dataRow[this.variantNo][13]=='0') ? 
					'---' : this.dataRow[this.variantNo][16]+' zł/szt.')+'</div>';
					
				if (userLogin!='') {
					inn += '<div class="cartTDMain" style="height: 24px; padding: 4px 17px; _padding: 4px 13px; padding-top: 10px;">';
					inn += '<div class="dotMinus cartTDLeft" onclick="cards.removeFromCart('+
						this.allCardsIndex+', 0);"></div>';
					inn += '<div class="cartTDCenter" id="cardCartQty_'+this.allCardsIndex+'_0'+
						'">'+this.dataRow[this.variantNo][14]+'</div>';
					inn += '<div class="dotPlus cartTDRight" onclick="cards.addToCart('+
						this.allCardsIndex+', 0);"></div>';
					inn += '<div style="clear: both;"></div>';
					inn += '</div>';

					inn += '<div class="cartTDMain" style="height: 24px; padding: 4px 17px; _padding: 4px 13px;">';
					inn += '<div class="dotMinus cartTDLeft" onclick="cards.removeFromCart('+
						this.allCardsIndex+', 1);"></div>';
					inn += '<div class="cartTDCenter" id="cardCartQty_'+this.allCardsIndex+'_1'+
						'">'+this.dataRow[this.variantNo][15]+'</div>';
					inn += '<div class="dotPlus cartTDRight" onclick="cards.addToCart('+
						this.allCardsIndex+', 1);"></div>';
					inn += '<div style="clear: both;"></div>';
					inn += '</div>';
				} else {
					inn += '<div class="cartTDMain" style="height: 24px; padding: 4px 17px; _padding: 4px 13px; padding-top: 10px;">';
					inn += '<div class="dotCaution" style="margin-left: 24px;" '+
						'onmousemove="return hoverlib(this, event, \'Aby móc dodawać karty do koszyka '+
						'musisz się zalogować.\', 180);" onmouseout="nd();" '+
						'onclick="actionLogin();"></div>';				
					inn += '</div>';
						
					inn += '<div class="cartTDMain" style="height: 24px; padding: 4px 17px; _padding: 4px 13px; padding-top: 10px;">';
					inn += '<div class="dotCaution" style="margin-left: 24px;" '+
						'onmousemove="return hoverlib(this, event, \'Aby móc odkładać karty na później '+
						'musisz się zalogować.\', 180);" onmouseout="nd();" '+
						'onclick="actionLogin();"></div>';
					inn += '</div>';
				}

				inn += '</div>';
				
				
				
				inn += '<div class="dotClose divCardClose" onclick="cards.hide('+
					this.allCardsIndex+');"></div>';
				inn += '<div class="dotSticky divCardSticky" '+
					'onclick="cards.reverseSticky('+
					this.allCardsIndex+');" id="dotSticky_'+this.allCardsIndex+'"></div>';
				inn += '</div></div>';
				$('divCardView').innerHTML += inn;
				this.isDrawn = true;
			},
			reverseSticky: function () {
				var st = getScrollTop();
				var top = (getAbsPosition($('divCardMain_'+this.allCardsIndex)).y);
				this.sticky = !this.sticky;
				var fullTop = (this.sticky) ?
					// jest jeszcze fixed
					top+st :
					// jest absolute
					top;
				var newTop = (this.sticky) ?
					fullTop : 
					fullTop-st;
				$('divCardMain_'+this.allCardsIndex).style.position = 
					(this.sticky) ? 'absolute' : 'fixed';
				$('divCardMain_'+this.allCardsIndex).style.top = newTop + 'px';
				$('dotSticky_'+this.allCardsIndex).className = 
					(this.sticky) ? "dotSticky divCardSticky" : "dotFree divCardSticky";
			},
			init: function (dataRow, allCardsIndex) {
				this.dataRow = dataRow;
				this.allCardsIndex = allCardsIndex;
				this.draw();
				this.code = this.dataRow[0][1]+'_'+this.dataRow[0][2];
			}
		}
		obj.init(xdataRow, xallCardsIndex);
		return obj;
	}
