﻿//////////////////////////////////////////////
//
// cardbase.js
// JScript code under mootools 1.2 base
// By Nat Chan, Summer 2008
//
//////////////////////////////////////////////

// Card class decarlation
var Card = new Class({
    initialize: function(cardid, cname, jpname, type, ban, text, jptext){
        this.cardid = cardid;
        this.cname = cname;
        this.jpname = jpname;
        this.type = type;
        this.ban = ban;
        this.text = text;
        this.jptext = jptext;
        this.qty = 1;
    },
    setMonster: function(level, atk, def, att, cat, sp){
        this.level = level;
        this.atk = atk;
        this.def = def;
        this.att = att;
        this.cat = cat;
		this.sp = sp;
    },
    addQty: function(){
        if(this.qty < 3) this.qty++;
    },
	minusQty: function(){
		if(this.qty > 0) this.qty--;
	},
	clone: function(){
		newCard = new Card(this.cardid, this.cname, this.jpname, this.type, this.ban, this.text, this.jptext);
		if(this.type < 29) newCard.setMonster(this.level, this.atk, this.def, this.att, this.cat, this.sp);
		newCard.qty = this.qty;
		return newCard;
	}
});

// Deck class decarlation
var Deck = new Class({
    initialize: function(dobjname){
        this.deckobj = new Array();
        this.deckcount = 0;
        this.arraycount = 0;
		this.objname = dobjname;
    },
    dcontain: function(dcardid){	// Return index of the card, -1 for not found
        var dfound = -1;
        this.deckobj.each(function(item, index){
            if(item.cardid == dcardid) dfound = index;
        });
        return dfound;
    },
	dQty: function(dcardid){		// Return number of same card in deck, 0 for not found
        var dfound = 0;
        this.deckobj.each(function(item, index){
            if(item.cardid == dcardid) dfound = item.qty;
        });
        return dfound;
    },		
    addCard: function(ncard){
        var dcardid = ncard.cardid;
		if(!checkVaildAdd(ncard)) return;
        var target = this.dcontain(dcardid);
        if(target >= 0){
            this.deckobj[target].addQty();
        } else {
            this.deckobj.include(ncard.clone());
        }
        this.updatelist();
    },
	plusCard: function(dcardid){	// For Adding Card Within Deck Only
        var target = this.dcontain(dcardid);
        if(target >= 0){
			if(!checkVaildAdd(this.deckobj[target])) return;
            this.deckobj[target].addQty();
        }
        this.updatelist();
    },
	minusCard: function(dcardid){	// For Minus Card Within Deck Only
        var target = this.dcontain(dcardid);
        if(target >= 0){
            this.deckobj[target].minusQty();
        }
		if(this.deckobj[target].qty <= 0) this.deckobj.erase(this.deckobj[target]);
        this.updatelist();
    },
    updatelist: function(){
		var cur = this;
		var i = 0;
		
		var highLvMon = 0;
		var monNum = 0;
		var spellNum = 0;
		var trapNum = 0;
		
		var monhtml = "";
		var spellhtml = "";
		var traphtml = "";
		
		var monList = new Array();
        this.deckobj.each(function(item){
            if(item.type < 29){
				monList.include(item);
			} else if(item.type < 39){
				spellNum += item.qty;
				spellhtml += cur.genBlock(item);
			} else {
				trapNum += item.qty;
				traphtml += cur.genBlock(item);
			}
        });
		
		// Sorting Monsters
		var sortMonList = new Array();
		var maxMon;
		while(monList.length > 0){
			maxMon = monList[0];
			monList.each(function(item){
				if(item.level > maxMon.level){
					maxMon = item;
				} else if(item.level == maxMon.level && item.atk > maxMon.atk){
					maxMon = item;
				}
			});
			if(maxMon.level > 4) highLvMon += maxMon.qty;
			monNum += maxMon.qty;
			sortMonList.include(maxMon);
			monList.erase(maxMon);
		}
		sortMonList.each(function(item) {
			monhtml += cur.genBlock(item);
		});	
		
		// Automatic Update HTML
		try{
			document.getElementById(this.objname+'MonList').innerHTML = monhtml;
			document.getElementById(this.objname+'MonNum').innerHTML = monNum + '(' + highLvMon + ')';
        } catch (e) {};
		try{
			document.getElementById(this.objname+'SpellList').innerHTML = spellhtml;
			document.getElementById(this.objname+'SpellNum').innerHTML = spellNum;
        } catch (e) {};
        try{
			document.getElementById(this.objname+'TrapList').innerHTML = traphtml;
			document.getElementById(this.objname+'TrapNum').innerHTML = trapNum;
        } catch (e) {};
        try{
			document.getElementById(this.objname+'List').innerHTML = monhtml + spellhtml + traphtml;
			document.getElementById(this.objname+'Num').innerHTML = monNum + spellNum + trapNum;
        } catch (e) {};
		try{
			updateDeckInfo();
		} catch (e) {};
    },
	genBlock: function(dcard){		// Generate the card block for display, input the object
		var outhtml = "";
		outhtml += '<div style="height:25px;" cardid=' + dcard.cardid + ' >\n';
		outhtml += '	<div style="width: 15px; height:20px; float:left; text-align:left">'+ dcard.qty +'</div>\n';
		outhtml += '	<div style="width: 200px; height:20px; vertical-align:middle; float:left; line-height: 25px;" id="card'+dcard.cardid +'" >'+dcard.cname+'</div>';
		outhtml += '	<div style="width: 30px; height:20px; float:right; text-align:center; font-size: 9pt; letter-spacing:0px;">';
		outhtml += '		<a href="#" onclick="'+this.objname+'.plusCard(' + dcard.cardid + ')">▲</a>';
		outhtml += '		<a href="#" onclick="'+this.objname+'.minusCard(' + dcard.cardid + ')">▼</a>';
		outhtml += '	</div>';
		outhtml += '</div>\n';
		return outhtml;
	}
});
	
function checkVaildAdd(dcard){
	var total = mainDeck.dQty(dcard.cardid) + sideDeck.dQty(dcard.cardid) + extraDeck.dQty(dcard.cardid);
	if(total < 3 && total < (3-dcard.ban)) return true;
	else return false;
}