ld_game.winningPaylines      = new Array();
ld_game.paylineAnims        = new Array();
ld_game.paylineReelAnims    = new Array();
ld_game.jackpotAnims        = new Array();
ld_game.reelAnims           = new Array();
ld_game.animSlotSymbols     = new Array();
ld_game.animSlotLastFrame   = new Array();

ld_game.mediaUrlPrefix = function () {
    return (ld_game.isMacApp ? ''+ld_game.id+'/' : '');
};

ld_game.getImage = function (name) {
    if (ld_game.isMacApp) {
	return document.getElementById(ld_game.id+'_'+name);
    } else {
	return document.images[name];
    }
};

ld_game.setImageSrc = function (name, src) {
    //console.log('setting '+name+' to '+src);//TODO pajout delete
    if (ld_game.isMacApp) {
	document.getElementById(ld_game.id+'_'+name).src = src;
    } else {
	document.images[name].src = src;
    }
};

ld_game.hideWonPaylineSymbols = function () {
    var linecnt = (ld_game.isMacApp ? ld_game.betLines : getGameLineIndex() + 1);
    for (var p = 1; p <= ld_game.paylinesNumber; p++) {
	ld_game.setImageSrc('l'+p, ld_game.mediaUrlPrefix()+'gfx/'+(p<11?'b02_':'g03_')+(p<10?'0':'')+p+'_'+(p<=linecnt?'1':'0')+'.jpg');
    }
};

ld_game.redrawSlot = function () {
    var x, y, i;
    var t = getCurrentTime();
    ld_game.hideWonPaylineSymbols();
    for (y = 0; y < ld_game.gameRows; y++) {
        var symbolSet = (y == 1) ? '0' : '1';
        for (x = 0; x < ld_game.gameReels; x++) {
            var s = ld_game.slot[x + ld_game.gameReels * y];
	    ld_game.setImageSrc('s' + x + y, ld_game.mediaUrlPrefix()+'gfx/s' + s + symbolSet + '.gif');
        }
    }
    // enable/disable bet selectors
    if (ld_game.freeSpins == 0) {
	if (ld_game.isMacApp) {
	    ld_game.enableNode('bet_button_'+ld_game.id);
	    ld_game.enableNode('lines_button_'+ld_game.id);
	} else {
            enableGameForm();
	}
    } else {
	if (ld_game.isMacApp) {
	    ld_game.disableNode('bet_button_'+ld_game.id);
	    ld_game.disableNode('lines_button_'+ld_game.id);
	} else {
            disableGameForm();
	}
    }
    // play animation for bonus symbol decrease (flush)
    if (ld_game.bonus < ld_game.oldBonus) {
        createSequenceTiming(new Callback(ld_game.redrawBonusSymbolsCallback, ld_game.oldBonus, ld_game.oldBonus - ld_game.bonus + 1), t, ld_game.freeSpinsAnimDelay);
    } else {
        ld_game.redrawBonusSymbols(ld_game.bonus);
    }

    // play animation for free spins increase
    if (ld_game.freeSpins > ld_game.oldFreeSpins) {
        var imgs = new Array();
        for (i = 1; i <= ld_game.freeSpins; i++)
            imgs[i - 1] = ld_game.mediaUrlPrefix()+'gfx/a02_' + i + '.jpg';

        createSequenceTiming(new ImageSequence(ld_game.id+'_fspin', imgs), t, ld_game.freeSpinsAnimDelay);
    } else {
        ld_game.setImageSrc('fspin', ld_game.mediaUrlPrefix()+'gfx/a02_' + ld_game.freeSpins + '.jpg');
    }
}

ld_game.redrawBonusSymbolsCallback = function (startCount, frame, redraw) {
    ld_game.redrawBonusSymbols(startCount - frame);
}

ld_game.redrawBonusSymbols = function (count) {
    for (i = 0; i < ld_game.bonusSymbols; i++) {
        var s = (count < i) ? 0 : 2;
        if (count == i) s = 1;
        ld_game.setImageSrc('b'+i, ld_game.mediaUrlPrefix()+'gfx/a04_' + i + '_' + s + '.jpg');
    }
}

ld_game.adjustBet = function () {
    if (!ld_game.isMacApp) {
	var index = getGameBetIndex() + 1;
	if (index >= getGameBetCount())
	    index = 0;
	setGameBetIndex(index);
    }
    ld_game.redrawBet();
    return false;
}

ld_game.redrawBet = function () {
    var index = (ld_game.isMacApp ? ld_game.betIndex : getGameBetIndex());
    ld_game.setImageSrc('i_bet', ld_game.mediaUrlPrefix()+'gfx/d02_' + index + '.jpg');
}

ld_game.adjustLines = function (adjustment) {
    var index = getGameLineIndex() + adjustment;
    var count = getGameLineCount();
    if (index < 0)
        index = count - 1;
    else if (index >= count)
        index = 0;

    setGameLineIndex(index);
    ld_game.refreshPaylines();
    ld_game.refreshPaylineDisplay(0);
    return false;
}

ld_game.betSelectorChanged = function (field) {
    var form = field.form;
    if (field.name == 'bet')
        ld_game.redrawBet();
    else if (field.name == 'lines') {
        ld_game.refreshPaylines();
        ld_game.refreshPaylineDisplay(0);
    }
}

ld_game.refreshPaylineDisplay = function (noAnimation) {
    var selectedPayline = (ld_game.isMacApp ? ld_game.betLines : getGameBetValue());
    if (selectedPayline < 10)
        selectedPayline = '0' + selectedPayline;
    if (noAnimation) {
        ld_game.setImageSrc('i_pline', ld_game.mediaUrlPrefix()+'gfx/f02_' + selectedPayline + '.jpg');
    } else {
        ld_game.setImageSrc('i_pline', ld_game.mediaUrlPrefix()+'gfx/f02.jpg');
        setTimeout('ld_game.refreshPaylineDisplay(1);', 200);
    }
}

ld_game.refreshPaylines = function () {
    var selectedPayline = (ld_game.isMacApp ? ld_game.betLines : getGameBetValue());
    for (var i = 1; i <= ld_game.paylinesNumber; i++) {
        var act = (i <= selectedPayline) ? 1 : 0;
        if (ld_game.winningPaylines[i - 1])
            act = 2;
        var img = (i <= 10) ? 'b02_' : 'g03_';
        var num = (i < 10) ? '0' + i : i;
        ld_game.setImageSrc('l'+i, ld_game.mediaUrlPrefix()+'gfx/' + img + num + '_' + act + '.jpg');
    }
}

ld_game.setupAnimations = function () {
    //console.log('setupAnimations START');
    var i, j, k;
    var winCount = 0;
    // count winning paylines
    for (i = 0; i < ld_game.winningPaylines.length; i++)
        if (ld_game.winningPaylines[i])
            winCount++;

    var winNum = 0;
    var flashLength = 2 * ld_game.winPaylineCount * ld_game.winPaylineDelay;
    var totalLength = flashLength * winCount;
    var baseOffset = getCurrentTime() % totalLength;

    // pause the animations!
    pauseAnimations();

    for (i = 0; i < ld_game.winningPaylines.length; i++) {
	ld_game.paylineReelAnims[i] = [];
        if (!ld_game.winningPaylines[i]) {
            ld_game.paylineAnims[i] = null;
            continue;
        }

        var img = (i + 1 <= 10) ? 'b02_' : 'g03_';
        var num = (i + 1 < 10) ? '0' + (i + 1) : i + 1;
        var lineDef = ld_game.paylineYs[i];

        var imageSequence = new Array();
        var delaySequence = new Array();
        var reelImageSequence = new Array();
        for (k = 0; k < ld_game.gameReels; k++) {
            reelImageSequence[k] = new Array();
        }
        for (j = 0; j < ld_game.winPaylineCount; j++) {
            imageSequence.push(ld_game.mediaUrlPrefix()+'gfx/' + img + num + '_1.jpg');
            delaySequence.push(ld_game.winPaylineDelay);
            imageSequence.push(ld_game.mediaUrlPrefix()+'gfx/' + img + num + '_2.jpg');
            delaySequence.push(ld_game.winPaylineDelay);
            for (k = 0; k < ld_game.gameReels; k++) {
                // sXY
                var y = lineDef[k];
                var v = (y == 1) ? 0 : 1;
                var s = ld_game.getSlotSymbol(k, y, ld_game.slot);
                reelImageSequence[k].push(ld_game.mediaUrlPrefix()+'gfx/s' + s + '2' + '.gif');
                reelImageSequence[k].push(ld_game.mediaUrlPrefix()+'gfx/s' + s + v + '.gif');
            }
        }
        delaySequence.pop();
        delaySequence.push(totalLength - flashLength + ld_game.winPaylineDelay);
        var offset = (baseOffset + winNum * flashLength) % totalLength;
        ld_game.paylineAnims[i] = createIrregularLoopTiming(new ImageSequence((ld_game.isMacApp ? ld_game.id + '_' : '') + 'l' + (i + 1), imageSequence),
							 delaySequence,
							 offset);
        for (k = 0; k < ld_game.gameReels; k++) {
            // symbol image name: sXY
            var y = lineDef[k];
            ld_game.paylineReelAnims[i][k] = createIrregularLoopTiming(new ImageSequence((ld_game.isMacApp ? ld_game.id + '_' : '') + 's' + k + y, reelImageSequence[k]),
								    delaySequence,
								    offset);
        }
        winNum++;
    }

    if ((ld_game.winSum > 0) || (ld_game.freeSpins > 0)) {
        var texts = new Array();
        if (ld_game.winSum > 0) {
            texts.push('!you win!');
            if ((ld_game.bonusWin > 0) && (ld_game.oldBonus > 0))
                texts.push(ld_game.bonusText);
            texts.push(ld_game.winText);
        }
        if (ld_game.freeSpins > 0)
            texts.push('free spin');
        else
            texts.push('         ');    // divider ld_game.winSum - jackpot
        texts.push(ld_game.jackpot);

        var blur1 = ld_game.mediaUrlPrefix()+'gfx/j_blur0.jpg';
        var blur2 = ld_game.mediaUrlPrefix()+'gfx/j_blur1.jpg';
        var blur3 = ld_game.mediaUrlPrefix()+'gfx/j_blur2.jpg';

        var delaySequence = new Array();

        for (i = 0; i < texts.length; i++) {
            // six blurred frames
            for (j = 0; j < 6; j++)
                delaySequence.push(ld_game.jackpotBlurLength);
            // one letter frame
            delaySequence.push(ld_game.jackpotLetterLength);
        }

        // compute animation length
        totalLength = 0;
        for (i = 0; i < delaySequence.length; i++) {
            totalLength += delaySequence[i];
        }

        // synchronize animation start with curent time (starts in the middle of jackpot display)
        baseOffset = getCurrentTime() % totalLength;

        for (i = 0; i < ld_game.jackpot.length; i++) {
            var imageSequence = new Array();
            for (j = 0; j < texts.length; j++) {
                var img = texts[j].charAt(i);
                if (img == '$') img = '_dollar';
                if (img == '!') img = '_excl';
                if (img == '.') img = '_dot';
                if (img == '*') img = '_x';
                if (img == ' ') img = '_';
                imageSequence.push(blur1, blur2, blur3, blur1, blur2, blur3);
                imageSequence.push(ld_game.mediaUrlPrefix()+'gfx/j' + img + '.jpg');
            }
            var offset = (baseOffset + i * ld_game.jackpotAnimStep) % totalLength;
            ld_game.jackpotAnims[i] = createIrregularLoopTiming(new ImageSequence((ld_game.isMacApp ? ld_game.id + '_' : '') + 'j' + i, imageSequence),
                                                        delaySequence,
                                                        offset);
        }
    }

    // resume the animations!
    resumeAnimations();
    //console.log('setupAnimations END');
}

ld_game.spinStepCallback = function (reel, frame, redraw) {
    //console.log('spinStepCallback START '+reel+','+frame+','+redraw);
    //var i;
    // fetch computed frame number from spin animation
    //console.log('spinStepCallback animations '+animations);
    var lastFrame = animations[ld_game.reelAnims[reel]][4];
    // create new spin symbols buffer, if not initialized
    if (!ld_game.animSlotSymbols[reel]) {
        ld_game.animSlotSymbols[reel] = new Array(-1, -1, -1);
        ld_game.animSlotLastFrame[reel] = -1;
    }
    // current reel symbol animation buffer
    var symbols = ld_game.animSlotSymbols[reel];

    // move off symbols
    if (ld_game.animSlotLastFrame[reel] != -1) {
        var offset = frame - ld_game.animSlotLastFrame[reel];
        for (var i = ld_game.gameRows - 1 ; i >= 0; i--) {
            // copy the symbol, if in range, clear if it is out
            symbols[i] = ((i - offset) >= 0) ? symbols[i - offset] : -1;
        }
    }
    // update last animated frame
    ld_game.animSlotLastFrame[reel] = frame;

    /* TODO: sometimes symbols[2] is undefined, in sequence 3, 6, failed, 0, 2, 6, failed
    for (var i = 0; i < ld_game.gameRows; i++) {
	if (symbols[i] === undefined) console.log('0 symbols['+i+']: '+symbols[i]);
	}*/

    if (lastFrame - frame < ld_game.gameRows) {
        var offset = lastFrame - frame;
        for (var i = 0; i < ld_game.gameRows; i++) {
            // skip defined symbols
            if (symbols[i] != -1) continue;

            if (i + offset >= ld_game.gameRows)
                symbols[i] = ld_game.randomSymbol();
            else
                symbols[i] = ld_game.getSlotSymbol(reel, i + offset, ld_game.slot);
	    //if (symbols[i] === undefined) console.log('1 symbols['+i+']: '+symbols[i]);
        }
    }
    else if (frame < ld_game.gameRows) {
        for (var i = 0; i < ld_game.gameRows; i++) {
            // skip defined symbols
	    //if (symbols[i] === undefined) console.log('2 symbols['+i+']: '+symbols[i]);
            if (symbols[i] != -1) continue;

            if (i - frame < 0)
                symbols[i] = ld_game.randomSymbol();
	    else
                symbols[i] = ld_game.getSlotSymbol(reel, i - frame, ld_game.oldSlot);
	    //if (symbols[i] === undefined) console.log('3 symbols['+i+']: '+symbols[i]);
        }
    } else {
        for (var i = 0; i < ld_game.gameRows; i++) {
            // skip defined symbols
	    //if (symbols[i] === undefined) console.log('4 symbols['+i+']: '+symbols[i]);
            if (symbols[i] != -1) continue;

            symbols[i] = ld_game.randomSymbol();
	    //if (symbols[i] === undefined) console.log('5 symbols['+i+']: '+symbols[i]);
        }
    }

    for (var i = 0; i < ld_game.gameRows; i++) {
        var symbolSet = (i == 1) ? 0 : 1;
	//if (symbols[i] === undefined) console.log('6 symbols['+i+']: '+symbols[i]);
        ld_game.setImageSrc('s'+reel+i, ld_game.mediaUrlPrefix()+'gfx/s' + symbols[i] + symbolSet + '.gif');
    }
}

ld_game.randomSymbol = function () {
    return Math.floor(Math.random() * ld_game.symbolNumber);
}

/* getters, setters ********/

ld_game.getSlotSymbol = function (x, y, slot) {
    return slot[x + ld_game.gameReels * y];
};

ld_game.setSlotSymbols = function (elm, setOld) {
    var j;
    while (elm) {
	if (elm.nodeType == 1 && elm.tagName == 'symbol') {	// 1 is ELEMENT_NODE
	    j = ld_game.gameReels*(Number(elm.getAttribute('line'))-1) - 1 + Number(elm.getAttribute('reel'));
	    ld_game.slot[j] = Number(elm.firstChild.nodeValue);
	    if (setOld) ld_game.oldSlot[j] = ld_game.slot[j];
	}
	elm = elm.nextSibling;
    }
};

ld_game.setSerial = function (val) {
    ld_game.serial = Number(val);
    if (!ld_game.isMacApp) {
	document.bets.serial.value = ld_game.serial;
    }
};

ld_game.setBonus = function (val, setOld) {
    ld_game.bonus = Number(val);
    if (setOld) ld_game.oldBonus = val;
    ld_game.bonusText = '*'+ld_game.bonus;
    while (ld_game.bonusText.length < 4) ld_game.bonusText = ' '+ld_game.bonusText;
    ld_game.bonusText = 'bonus'+ld_game.bonusText;
};

ld_game.setFreeSpins = function (val, setOld) {
    ld_game.freeSpins = Number(val);
    if (setOld) ld_game.oldFreeSpins = val;
};

ld_game.setWin = function (val) {
    ld_game.winSum = val;
    ld_game.winText = '$' + ld_game.winSum;
    while (ld_game.winText.length < 9) ld_game.winText = ' ' + ld_game.winText;
};

ld_game.setBonusWin = function (elm) {
    if (elm === null || (elm.getAttribute('bonus_win') === null) || (elm.getAttribute('multiplier') === null)) {
	ld_game.bonusWin = 0;
	ld_game.bonusMultiplier = 0;
    } else {
	ld_game.bonusWin = elm.getAttribute('bonus_win');
	ld_game.bonusMultiplier = elm.getAttribute('multiplier');
    }
};

ld_game.stopJackpotAnims = function() {
    for (var i = 0; i < ld_game.jackpot.length; i++) {
	if (ld_game.jackpotAnims[i] !== undefined) {
	    clearAnimation(ld_game.jackpotAnims[i]);
	}
	ld_game.jackpotAnims[i] = undefined;
    }
};

ld_game.animateJackpotOnce = function() {
    for (var i = 0; i < ld_game.jackpot.length; i++) {
	var img = ld_game.jackpot.charAt(i);
	if (img == '$') img = '_dollar';
	if (img == '!') img = '_excl';
	if (img == '.') img = '_dot';
	if (img == '*') img = '_x';
	if (img == ' ') img = '_';
	ld_game.setImageSrc('j'+i, ld_game.mediaUrlPrefix()+'gfx/j'+img+'.jpg');
    }
};

ld_game.stopWonPaylinesAnims = function() {
    for (var i = 0; i < ld_game.paylinesNumber; i++) {
	if (ld_game.winningPaylines[i] > 0) {
	    clearAnimation(ld_game.paylineAnims[i]);
	    for (var j = 0; j < ld_game.gameReels; j++) {
		clearAnimation(ld_game.paylineReelAnims[i][j]);
	    }
	}
	ld_game.paylineAnims[i] = null;
	ld_game.paylineReelAnims[i] = [];
	ld_game.winningPaylines[i] = 0;
    }
    ld_game.hideWonPaylineSymbols();
    for (var i = 0; i < ld_game.gameReels; i++) {
	ld_game.animSlotSymbols[i] = new Array(-1, -1, -1);
	ld_game.animSlotLastFrame[i] = -1;
    }
};

ld_game.clearWinPaylines = function () {
    for (var i = 0; i < ld_game.winningPaylines.length; i++) {
	ld_game.winningPaylines[i] = 0;
    }
};

ld_game.setWinPaylines = function (elm) {
    while (elm) {
	if (elm.nodeType == 1 && elm.tagName == 'win') {	// 1 is ELEMENT_NODE
	    ld_game.winningPaylines[Number(elm.getAttribute('line'))-1] = elm.firstChild.nodeValue;
	}
	elm = elm.nextSibling;
    }
};

ld_game.setBalance = function (val) {
    if (ld_game.isMacApp) {
	mac.setPlayerCash(val);
    } else {
	document.getElementById('cash').innerHTML = val;
    }
};

ld_game.setJackpot = function (val) {
    ld_game.jackpot = '$'+sprintf('%08d',val);
};


/* ********** */


ld_game.endSpinCallback = function (pos, parameter) {
    // delay resutls display by spinTimeIncrement
    //console.log('endSpinCallback');
    setTimeout('ld_game.endSpin();', ld_game.spinTimeIncrement);
};

ld_game.endSpin = function () {
    //console.log('endSpin START');
    if (isAjax()) {
	ld_game.generateGameMessage();
	ld_game.spinEnabled = true;
    }
    ld_game.redrawSlot();
    if (ld_game.isMacApp) {
	if (mac.isLoggedIn()) {
	    mac.setPageHeader("page_" + ld_game.id, mac.getPlayerCash());
	    mac.setPageHeader("page_gamelist", mac.getPlayerCash());
	} else {
	    mac.setPageHeader("page_" + ld_game.id, ld_game.name);
	    mac.setPageHeader("page_gamelist", 'Slotland.com');
	}
    } else {
	showPanel();
    }
    ld_game.setupAnimations();
    //console.log('endSpin END');
}

ld_game.generateGameMessage = function () {
    var txt = '';
    var sep = '';
    if (ld_game.winSum > 0) {
	txt += sep + sprintf(ld_game.msg['you_won'], sprintf('$%.2f', ld_game.winSum));
	sep = ' ';
    }
    if (ld_game.freeSpins > 0) {
	txt += sep + ld_game.msg['bonus_spin'];
	sep = ' ';
    }
    if (ld_game.oldBonus < ld_game.bonus) {
	txt += sep + ld_game.msg['luckyducts_bonus_advance'];
	sep = ' ';
    }
    if (ld_game.bonusWin > 0) {
	txt += sep + sprintf(ld_game.msg['luckyducts_bonus_win'],ld_game.bonusMultiplier);
	sep = ' ';
    }
    if (ld_game.isMacApp) {
	mac.displayOverlayMessage(ld_game.id, txt, -1);//-1 disables disappearing after specified time in miliseconds
    } else {
	document.getElementById("message2").innerHTML = txt;
    }
}

ld_game.startSpin = function () {
    //console.log('startSpin START');
    if (ld_game.isMacApp) {
	mac.setGameWorking(ld_game.id, false);
    } else {
	hidePanel();
    }
    var t = getCurrentTime();
    var i;
    for (i = 0; i < ld_game.gameReels; i++) {
	//console.log('startSpin loop '+i);
        ld_game.reelAnims[i] = createSpinTiming(new Callback(ld_game.spinStepCallback, i),
                         1, 0, 0, t, ld_game.averageSpinDelay, ld_game.spinBaseTime + i * ld_game.spinTimeIncrement, 1);
	//console.log('startSpin reelAnims['+i+']:' + ld_game.reelAnims[i]);
    }

    // display results after last reel stops spinning
    setAnimationFinishCallback(ld_game.reelAnims[ld_game.gameReels - 1], ld_game.endSpinCallback, null);
    //console.log('startSpin END');
}

ld_game.checkResources = function () {
    if (parent && parent.i_cache) {
	var l = parent.i_cache.length;
	var cnt = 0;
	for (var i = 0; i < l; i++) {
	    parent.i_cache[i].height != undefined && cnt++;
	}
	if (l == 0 || cnt != l) {
	    setTimeout('ld_game.checkResources()',1000);
	} else {
	    document.getElementById("message1").innerHTML = "";
	}
    }
}

/* ====== AJAX API ====== */

ld_game.ajaxPOSTContent = function () {
    var ret = "";
    if (ld_game.isMacApp) {
	ret += 'serial='+ld_game.serial;
	ret += '&bet='  +ld_game.bet;
	ret += '&lines='+ld_game.betLines;
    } else {
	var sep = "";
	var objs = document.bets.getElementsByTagName("input");
	for (var i = 0; i < objs.length; i++) {
	    if (objs[i].getAttribute("name")) {
		ret = ret + sep + ajaxSerialize(objs[i].name, objs[i].value);
		sep = "&";
	    }
	}
	objs = document.bets.getElementsByTagName("select");
	for (var i = 0; i < objs.length; i++) {
	    if (objs[i].getAttribute("name") && objs[i].selectedIndex != -1) {
		ret = ret + sep + ajaxSerialize(objs[i].name, objs[i].options[objs[i].selectedIndex].value);
		sep = "&";
	    }
	}
    }
    //console.log(ret);
    return ret;
}

ld_game.ajaxUrl = function () {
    return (ld_game.isMacApp ? ld_game.nextUrl+'?u='+mac.loginHandle : document.bets.action.replace('luckyducts/','.luckyducts.xml_next'));
}

ld_game.ajaxOnSuccess = function (xml) {
//console.log('ajaxOnSuccess START');
    if (typeof xml == 'object') {
	//alert (ajaxSerializeNode(xml));
	if (xml.documentElement.tagName == 'nextState') {
//console.log('ajaxOnSuccess NEXTSTATE 1');
	    //serial
	    ld_game.setSerial(ajaxGetXMLElement(xml,['nextState','gameData','serial']).firstChild.nodeValue);
//console.log('ajaxOnSuccess NEXTSTATE 2');
	    //slot state
	    for (var i = 0; i < ld_game.slot.length; i++) {
		ld_game.oldSlot[i] = ld_game.slot[i];
	    }
	    ld_game.setSlotSymbols(ajaxGetXMLElement(xml,['nextState','gameData','state']).firstChild);
//console.log('ajaxOnSuccess NEXTSTATE 3');
	    //bonus
	    ld_game.oldBonus = ld_game.bonus;
	    ld_game.setBonus(ajaxGetXMLElement(xml,['nextState','gameData','bonus']).firstChild.nodeValue);
	    ld_game.setBonusWin(ajaxGetXMLElement(xml,['nextState','gameData','extra','win']));
//console.log('ajaxOnSuccess NEXTSTATE 4');
	    //free spins
	    ld_game.oldFreeSpins = ld_game.freeSpins;
	    ld_game.setFreeSpins(ajaxGetXMLElement(xml,['nextState','gameData','freeSpins']).firstChild.nodeValue);
//console.log('ajaxOnSuccess NEXTSTATE 5');
	    //wins
	    var winelm = ajaxGetXMLElement(xml,['nextState','gameData','wins']);
	    ld_game.setWin(winelm.getAttribute('total'));
//console.log('ajaxOnSuccess NEXTSTATE 6');
	    // stop winlines anims and define final winlines state
	    ld_game.stopWonPaylinesAnims();
	    ld_game.setWinPaylines(winelm.firstChild);
//console.log('ajaxOnSuccess NEXTSTATE 7');
	    // stop jackpot anims and define final jackpot state
	    ld_game.stopJackpotAnims();
	    ld_game.animateJackpotOnce();
//console.log('ajaxOnSuccess NEXTSTATE 8');
	    //balance
	    ld_game.setBalance(ajaxGetXMLElement(xml,['nextState','commonData','balance']).firstChild.nodeValue);
//console.log('ajaxOnSuccess NEXTSTATE 9');
	    //jackpot
	    ld_game.setJackpot(ajaxGetXMLElement(xml,['nextState','commonData','jackpot']).firstChild.nodeValue);
//console.log('ajaxOnSuccess NEXTSTATE 10');
	    //launch spin
	    ld_game.startSpin();
//console.log('ajaxOnSuccess NEXTSTATE 11');
            // finished successfuly
            return;

	} else if (ld_game.isMacApp) {
	    if (ld_game.ajaxOnUnexpectedResponse(xml)) return;
	} else if (xml.documentElement.tagName == 'error') {
	    //console.log('ajaxOnSuccess ERROR' + ajaxSerializeNode(xml, ''));
	    if (xml.documentElement.getAttribute('id') == 'err_acc_locked') {
		ajaxAccLockedError();
		return;
	    } else if ((xml.documentElement.getAttribute('id') == 'err_sync') ||
                (xml.documentElement.getAttribute('id') == 'err_nocash')) {
                // try to submit document and let the HTML variant handle the error
                if (document.bets) {
                    setTimeout('document.bets.submit()', 0);
                    // situation was handled
                    return;
                }
            }
	} else if (xml.documentElement.tagName == 'unauthorized') {
	    if ((xml.documentElement.getAttribute('id') == 'auth_timeout')) {
                // try to submit document and let the HTML variant handle the error
                if (document.bets) {
                    setTimeout('document.bets.submit()', 0);
                    // situation was handled
                    return;
                }
	    }
	}
    }
//console.log('ajaxOnSuccess GENERAL ERROR');
    // request was not processed, display error message
    ajaxGeneralError();
}

