/**
    Multiplication (Times) Table
    Author: Marcin Szpak
    All rights reserved
    */
/********************* GAME CONSTS*******************************/
var gameQuestionsNumber=30;
var numOfGames=5;
/********************* GAME CONSTS*******************************/
/********************* GUI **************************************/
function guiAboutMore(more)
{
    docEl("aboutMore").style.display=more?"block":"none";
}

function guiGameInfoMore(elem)
{
    domGetFirstRoot(elem,"description").className="description expanded";
}


function guiSettingsToggle()
{
    docEl("settings").style.display=(docEl("settings").style.display=="inline")?"none":"inline";
}

var guiSwitchGameHandler=null;
var guiGameButtons=["gameButton10","gameButton20","gameButton30","gameButton50","gameButton100"];

function guiSwitchGame(gameType)
{
    //Game Table
    guiGameOff();
   
    //Times Table
    docEl("ttable10").style.display="none";
    docEl("ttable20").style.display="none";
    docEl("ttable30").style.display="none";
    docEl("ttable50").style.display="none";
    docEl("ttable100").style.display="none";
    if (!guiTTInitDone[gameType])
        guiTTableInit(parseInt(gameType));
    docEl("ttable"+gameType).style.display="block";
    
    //Game Selection
    for (gb in guiGameButtons)
        docEl(guiGameButtons[gb]).className="";
    docEl("gameButton"+gameType).className="selected";    
    docEl("game10").style.display=((gameType=="10")?"block":"none");
    docEl("game20").style.display=((gameType=="20")?"block":"none");
    docEl("game30").style.display=((gameType=="30")?"block":"none");
    docEl("game50").style.display=((gameType=="50")?"block":"none");
    docEl("game100").style.display=((gameType=="100")?"block":"none");

    //High Score
    guiHSClear("last");
    guiHSClear("top");
    
    //Logic Handler
    if (guiSwitchGameHandler!=null) guiSwitchGameHandler(gameType);
}

var guiTTInitDone={10:false,20:false,30:false,50:false,100:false};
function guiTTableInit(maxCols)
{
    //innerHTML: Opera 4.5s.; FF 4.5s; IE 8.65 sek
    //DOM: Opera 1.64s.; FF 7.40s.; IE 27s. !!!
    docEl("ttable"+maxCols).style.display="none";
    var tb=docEl("ttable"+maxCols);
    var rtb=docEl("ttable"+maxCols).firstChild.tBodies[0];
    domRemoveAllChildren(rtb);

    var tbIH="<table>";
    tbIH+="<tr>";
    tbIH+="<th>&nbsp;</th>";
    for (var i=2;i<=maxCols;i++)
        tbIH+="<th><span>"+i+"</span></th>";
    tbIH+="<th>&nbsp;</th>";
    tbIH+="</tr>";
    
    for (var i=2;i<=maxCols;i++)
    {
        var iH="<tr id='mulRow"+textAdd0(i)+"'>";
        iH+="<th class='first'>"+i+"</th>";
		for (var j=2;j<=maxCols;j++)
		{
			var cls=""
            //odd/vertical odd/even/diag
			if (j%2==0 && j>i) cls="o"+((i%2==0)?"O":"E");
			else if (j%2==1 && j>i) cls="e"+((i%2==0)?"O":"E");
			else if (i%2==0 && j<i) cls="vo"+((j%2==0)?"O":"E");
			else if (i%2==1 && j<i) cls="ve"+((j%2==0)?"O":"E");
            iH+="<td class='"+(i==j?"d":cls)+"'>"+(i*j)+"</td>";
		}
        iH+="<th class='last'>"+i+"</th>";
        iH+="</tr>";
        tbIH+=iH;
    }	

    tbIH+="<tr>";
    tbIH+="<th>&nbsp;</th>";
    for (var i=2;i<=maxCols;i++)
        tbIH+="<th><span>"+i+"</span></th>";
    tbIH+="<th>&nbsp;</th>";
    tbIH+="</tr>";
          
    tb.innerHTML=tbIH+"</table>";
    
    guiTTInitDone[maxCols]=true;
}

var guiGameStartStopHandler=null;
var guiLabelState="start";
function guiGameStartStop()
{
    if (guiLabelState=="start") 
    {
        guiGameStart();
        if (guiGameStartStopHandler!=null) guiGameStartStopHandler(true);
    }
    else 
    {
        guiGameOff();
        if (guiGameStartStopHandler!=null) guiGameStartStopHandler(false);
        guiNoFocus();
    }
}

function guiLabelStart()
{
    guiLabelState="start";
    docEl("labelStart").style.display="block";
    docEl("labelStop").style.display="none";
}
function guiLabelStop()
{
    guiLabelState="stop";
    docEl("labelStart").style.display="none";
    docEl("labelStop").style.display="block";
}
//game table prepared to play
function guiGameStart()
{
    guiLabelStop();
    docEl("gamePlay").style.display="block";    
//TODO: remove from gui
    docEl("gameInput2").style.display=logicOptionShowNext?"block":"none";
        
    docEl("gameOver").style.display="none";
    docEl("game").style.display="block";
    var tb=docEl("gamePlayTable").tBodies[0];
    var cn=tb.childNodes;
        for (var i=cn.length-1;i>=0;i--)
            tb.removeChild(cn[i]);
    guiGameQuestionInd=1;
    guiGameAnswerInd=1;
    
    docEl("gameAnswerInput").focus();     
    documentGoToLocation("game");
}
//show over game table and fill the cells
//    guiGameOver(logicAnswers,logicTimeTotal/1000.0,"long total",errPenalty,"long penalty");
function guiGameOver(answers,timeTotal,timeTotalLong,timePenalty,timePenaltyLong)
{
    guiLabelStart();
    docEl("gamePlay").style.display="none";
    docEl("gameOver").style.display="block";
    docEl("game").style.display="block";
    var tb=docEl("gameOverTable").tBodies[0];
    var cn=tb.childNodes;
        for (var i=cn.length-1;i>=0;i--)
            tb.removeChild(cn[i]);
        
    for (a in answers)
    {
        var ans=answers[a];
        if (typeof ans[4] !='undefined')
            guiGameOverAnswer(ans[0],ans[1],ans[5],ans[6],ans[7],ans[2],ans[3],ans[4]);
        else
            guiGameOverAnswer(ans[0],ans[1],ans[5],ans[6],ans[7],ans[2],ans[3]);
    }
    
    docEl("gameTotalTimeLabel").innerHTML=timeTotal;
    docEl("gameTotalTimeLabel").setAttribute("title",timeTotalLong);
    if (typeof timePenalty !='undefined')
    {
        docEl("gamePenaltyTimeLabel").innerHTML=timePenalty;
        docEl("gamePenaltyTimeLabel").setAttribute("title",timePenaltyLong);
        docEl("gameSummaryFail").style.display="block";
    }
    else docEl("gameSummaryFail").style.display="none";
    
}
//hides game table
function guiGameOff()
{
    guiLabelStart();
    docEl("game").style.display="none";
    docEl("gamePlay").style.display="none";
    docEl("gameOver").style.display="none";
}
var guiGameQuestionInd=1;
function guiGameQuestion(a,b,a2,b2)
{
    docEl("gameCurrentNumber").innerHTML=guiGameQuestionInd+"/"+gameQuestionsNumber;
    docEl("gameQuestionLabel").innerHTML=a+"x"+b;
    docEl("gameAnswerInput").value="";
    
    if (a2)
    {
        docEl("gameCurrentNumber2").innerHTML=(guiGameQuestionInd+1)+"/"+gameQuestionsNumber;
        docEl("gameQuestionLabel2").innerHTML=a2+"x"+b2;
    }
    else docEl("gameInput2").style.display="none";

    
//TODO:blur -> TO -> focus : browser jump to input but Start/Stop goes on enter :/
//     without blur: browser doesnt jump to input
    docEl("gameAnswerInput").focus();    
//    docEl("gameAnswerInput").blur();
//    setTimeout("guiGameAnswerInputFocus()",50);
    guiGameQuestionInd++;
}

//function guiGameAnswerInputFocus()
//{    
//    docEl("gameAnswerInput").focus();    
//}

var guiGameAnswerInd=1;
//answerWrong is optional - string with oryginal answer passed by user
function guiGameAnswer(a,b,answer,answerLong,answerWrong)
{
    var tre=domCreateElement("tr","","","");
    domAppendChild(tre,"td","","",guiGameAnswerInd+++".");
    domAppendChild(tre,"td","","",a);
    domAppendChild(tre,"td","","","x");
    domAppendChild(tre,"td","","",b);
    domAppendChild(tre,"td","","","=");
    if (typeof answerWrong == 'undefined')
    {
        var tde=domCreateElement("td","","","");
        domAppendChild(tde,"div","","answer",answer);
        tde.setAttribute("title",answerLong);
        tre.appendChild(tde);
    }
    else
    {
        var tde=domCreateElement("td","","","");
        domAppendChild(tde,"div","","answerWrong","<span>"+answerWrong+"</span>");
        tde.setAttribute("title",answerLong);
        tre.appendChild(tde);
        tde=domCreateElement("td","","","");
        domAppendChild(tde,"div","","answerCorrect","<span>"+answer+"</span>");
        tre.appendChild(tde);
    }
    docEl("gamePlayTable").tBodies[0].appendChild(tre);
}

function guiGameOverAnswer(a,b,time,timeLong,timeBarLength,answer,answerLong,answerWrong)
{
    //span necessary for z-index (timeBar)
    var tre=domCreateElement("tr","","","");
    domAppendChild(tre,"td","","","<span>"+a+"</span>");
    domAppendChild(tre,"td","","","<span>x</span>");
    domAppendChild(tre,"td","","","<span>"+b+"</span>");
    domAppendChild(tre,"td","","","<span>=</span>");
    if (typeof answerWrong == 'undefined')
    {
        var tde=domCreateElement("td","","","<span>"+answer+"</span>");
        tde.setAttribute("title",answerLong);
        tre.appendChild(tde);
        domAppendChild(tre,"td","","","<span></span>");
    }
    else
    {
        var tde=domCreateElement("td","","","");
        domAppendChild(tde,"div","","answerWrong","<span>"+answerWrong+"</span>");
        tde.setAttribute("title",answerLong);
        tre.appendChild(tde);
        tde=domCreateElement("td","","","");
        domAppendChild(tde,"div","","answerCorrect","<span>"+answer+"</span>");
        tre.appendChild(tde);
    }
    //time Bar
    var timee=domCreateElement("td","","","");
    var timed=domCreateElement("div","","","");
    var times=domCreateElement("span","","timeVal",time);
    times.setAttribute("title",timeLong);
    timed.appendChild(times);
    var timeBar=domCreateElement("div","","timeBar","");
    timeBar.style.width=timeBarLength+'px';
    timed.appendChild(timeBar);
    timee.appendChild(timed);
    tre.appendChild(timee);

    docEl("gameOverTable").tBodies[0].appendChild(tre);
}

var guiAnswerInputHandler=null;
function guiAnswerKeypress(event,val) //keyup
{
	try{		
        var code=event.charCode || event.keyCode;
		if (isNaN(code)) return;// false;
//TODO:remove from gui
		if (logicOptionWaitForEnter)
        {
            if (parseInt(code)==13)
//            {	
//                if (guiAnswerInputHandler!=null)
                    guiAnswerInputHandler(val);
//            }
        }else 
        {
            if (!guiAnswerInputNoEnterHandler(val) || parseInt(event.keyCode)==13)
                guiAnswerInputHandler(val);
        }
	}catch(err)
	{}
}
//type = "last" | "top"
   // <div class="hsEntry">
       // <div class="hsNum">30.</div>
       // <div class="hsNick">Malina&nbsp;</div>
       // <div class="hsScrDt">
           // <div class="hsScore">&nbsp;34.12</div>
           // <div class="hsDate">&nbsp;07.16, 21:46</div>
       // </div>
       // <div class="hsMessage">&nbsp;Be Your Best Friend!Be Your Best Friend!Be Your Best Friend!&nbsp;</div>
   // </div>
function guiHSShow(type,hsArr)
{   
    guiHSClear(type);

    var hsEl=(type=="last")?docEl("highscoreLastData"):docEl("highscoreTopData");    
    var hsDEl=(type=="last")?docEl("highscoreLast"):docEl("highscoreTop");
    hsDEl.style.display="none";

    var ind=1;
    var hsBox=domCreateElement("div","","box box3","");
    
    for (var hs in hsArr)
    {        
        var hsE=domCreateElement("div","",(hsArr[hs][6])?"hsEntry userLine":"hsEntry","");
        domAppendChild(hsE,"div","","hsNum",ind+".");
        domAppendChild(hsE,"div","","hsNick",hsArr[hs][0]+"&nbsp;");
        var hsSD=domCreateElement("div","","hsScrDt","");
        domAppendChild(hsSD,"div","","hsScore","&nbsp;"+hsArr[hs][4],hsArr[hs][5]);
        domAppendChild(hsSD,"div","","hsDate","&nbsp;"+hsArr[hs][2],hsArr[hs][3]);
        hsE.appendChild(hsSD);
        domAppendChild(hsE,"div","","hsMessage","&nbsp;"+hsArr[hs][1]+"&nbsp;");
        hsBox.appendChild(hsE);
        if (ind==3 || ind==10 || ind==hsArr.length)
        {
            domAppendChild(hsBox,"div","","clearfloat","&nbsp;");
            hsEl.appendChild(hsBox);
            hsBox=domCreateElement("div","",ind==3?"box box10":"box box30","");            
        }
        ind++;
    }
    hsDEl.style.display="block";
}

function guiHSClear(type)
{
    var hsEl=(type=="last")?docEl("highscoreLastData"):docEl("highscoreTopData");
    domRemoveAllChildren(hsEl);
}

function guiHSToggleLong()
{
    guiHide();
    var valHSC=!domClassNameToggle(docEl('highScore'),'collapsed')+"";
    cookieSet("hsLong",valHSC,logicCookieHost,30);
    guiUnhide();
}

function guiHSHide()
{
    docEl("highscoreTop").style.display="none";
    docEl("highscoreLast").style.display="none";
}
function guiHSUnhide()
{
    docEl("highscoreTop").style.display="block";
    docEl("highscoreLast").style.display="block";
}

var guiSwitchUserHandler=null;
function guiSwitchUser()
{
    guiSignatureClear("Guest");
    guiChatSignatureSet("Guest");
    if (guiSwitchUserHandler!=null) guiSwitchUserHandler();
}

function guiSignatureSet(sign)
{
    docEl("userName").innerHTML=sign;
    docEl("userSwitch").style.visibility="visible";
}

function guiSignatureClear(sign)
{
    docEl("userName").innerHTML=sign;
    docEl("userSwitch").style.visibility="hidden";
}
/* Chat */
var guiChatSignatureMaxLength=20;
var guiChatSubmitHandler=null;
function guiChatSubmit()
{
//    if (!textNoEmptyAlert('chatMessage','Message cannot be empty','Enter your message here...'))
//        return false;
    
    var cm=textTrim(docEl("chatMessage").value);
    docEl("chatMessage").value="";
    var cs=textTrim(docEl("chatSignature").value);
    if (cs.length>guiChatSignatureMaxLength) cs=cs.substring(0,guiChatSignatureMaxLength)
    docEl("chatSignature").value=cs;

    guiChatPreviousHide();

    if (guiChatSubmitHandler!=null)
    {
        guiNoFocus();
        //hide form -> show in guiChatShow
        //TODO:show hourglass 
        docEl("chatForm").style.display="none";
        documentGoToLocation("chat");    
        return guiChatSubmitHandler(cm,cs);
    }    
}
//Chat Entries - Array in type: [sign,body,timeString]
function guiChatShow(chatEntries)
{
//    guiHide();
    if (docEl("chatForm").style.display=="none") //if was hidden - after submit
    {
        docEl("chatForm").style.display="block";
        docEl("chatMessage").focus();
    }
    else docEl("chatForm").style.display="block";
    var ces=docEl("chatEntries");
    var cn=ces.childNodes;
        for (var i=cn.length-1;i>=0;i--)
            ces.removeChild(cn[i]);
        
    var ced=domCreateElement("div","","chatEntry","");
    for (var e=0;e<chatEntries.length;e++)
    {
        var currentEntry=chatEntries[e];
        var nextEntry=null;
        var previousEntry=null;
        if (e<chatEntries.length-1) nextEntry=chatEntries[e+1];
        else nextEntry=currentEntry;
        if (e>0) previousEntry=chatEntries[e-1];
        else previousEntry=currentEntry;


        var showSign=false;
        if (currentEntry[0]!=previousEntry[0] || e==0) showSign=true;
        var showDate=false;
        if (currentEntry[2]!=previousEntry[2] || currentEntry[2]!=nextEntry[2] || e==0 || e==chatEntries.length-1) showDate=true;
            
        domAppendChild(ced,"div","","sign",(showSign?currentEntry[0]+", ":"")+(showDate?currentEntry[2]+" ":"")+currentEntry[3]);
        domAppendChild(ced,"div","","body",currentEntry[1]);

        if (e==chatEntries.length-1 || currentEntry[0]!=nextEntry[0])
        {
            ces.appendChild(ced);
            ced=domCreateElement("div","","chatEntry collapsed","");
        }
    }
//    guiUnhide();
}
function guiChatSignatureSet(sign)
{
    docEl("chatSignature").value=sign;
}

var guiChatPreviousHandler=null;
function guiChatPrevious()
{
    if (guiChatPreviousHandler!=null)
        guiChatPreviousHandler();
    guiChatPreviousHide();
    documentGoToLocation("chat");        
}
var guiChatNextHandler=null;
function guiChatNext()
{
    if (guiChatNextHandler!=null)
        guiChatNextHandler();
    docEl("chatPrevious").style.display="block";
    documentGoToLocation("chat");        
}
function guiChatPreviousHide()
{
    docEl("chatPrevious").style.display="none";
}
function guiChatHide()
{
    docEl("chat").style.display="none";
}
function guiChatUnhide()
{
    docEl("chat").style.display="block";
}
/* Chat */
/* User */
//regular/novice/guest
function guiUserSet(isRegular,value,valueLong,isGuest)
{
    if (isGuest)
    {
        docEl("userScore").style.display="none";
        return;
    }
    
    docEl("userScore").style.display="block";
    docEl("userNovice").style.display=isRegular?"none":"block";
    docEl("userRegular").style.display=isRegular?"block":"none";
    if (typeof value!='undefined' && value!=null)
    {        
        docEl("userTopScore").style.display="block";
        docEl("userNoScore").style.display="none";
        docEl("userScoreValue").innerHTML=""+value;
        docEl("userScoreValue").setAttribute("title",valueLong);
    }
    else
    {
        docEl("userTopScore").style.display="none";
        docEl("userNoScore").style.display="block";
    }
}
function guiUsersOnline(num)
{
    docEl("onlineInfo").style.display=(num>1)?"block":"none";
    docEl("onlineInfoNum").innerHTML=num;
}
/* User */
/* Settings */
function guiSettingsMusic(music,sounds)
{
    docEl("setMusic").className=music?"button selected":"button";
    docEl("setSounds").className=sounds?"button selected":"button";
}
function guiSettingsMusicShow()
{
    docEl("setMusic").style.display="block";
    docEl("setSounds").style.display="block";
}
var guiMusicToggleHandler=null;
function guiMusicToggle()
{
    if (guiMusicToggleHandler!=null) guiMusicToggleHandler();
}
var guiSoundsToggleHandler=null;
function guiSoundsToggle()
{
    if (guiSoundsToggleHandler!=null) guiSoundsToggleHandler();
}

function guiOptionsSet(setEnter,setNext)
{
    domClassNameSwitch(docEl("gOptEnter"),"selected",setEnter);
    domClassNameSwitch(docEl("gOptNext"),"selected",setNext);
}

var guiOptionsEnterToggleHandler=null;
function guiOptionsEnterToggle()
{
    if (guiOptionsEnterToggleHandler!=null) guiOptionsEnterToggleHandler();
}
var guiOptionsNextToggleHandler=null
function guiOptionsNextToggle()
{
    if (guiOptionsNextToggleHandler!=null) guiOptionsNextToggleHandler();
}
/* Settings */

function guiHide()
{
    guiHSHide();
    guiChatHide();
}
function guiUnhide()
{
//    setTimeout("guiUnhideTO()",200);
    guiUnhideTO();
}
function guiUnhideTO()
{
    guiHSUnhide();
    guiChatUnhide();
}
function guiNoKP(e)
{
    if (e.stopPropagation) e.stopPropagation();
    else e.cancelBubble=true;
    
    return e.returnValue=false;
}
function guiBodyKP(e)
{
	if (!e) e=event;
      
	try{        
        var code=e.charCode || e.keyCode;
        if (isNaN(code)) 
			return event.returnValue=true;

        var intCode=parseInt(code);
        
		if (intCode==0x53 || intCode==0x73) //sS - start/stop
        {
            guiGameStartStop();
            return event.returnValue=false;
        }
        
        return event.returnValue=true; //for browser functions
	}catch(err)
	{}
}
function guiNoFocus(elem)
{
    elem=elem || "emptyAnchor";
    docEl(elem).focus();
}
function guiInit()
{
    if (cookieGet("hsLong")=="true")
        guiHSToggleLong();
    
	document.body.onkeyup=guiBodyKP;
    document.body.focus();
    guiNoFocus();
}

/********************* GUI **************************************/
/********************* SUI ;-) **********************************/
    var suiMusic=false; //default false
    var suiSounds=true;
    var suiFlashLoaded=false;
//    var suiInited=false;
    var suiMovieObject=null;
    
    function suiSoundLoadDone(num)
    {
        suiFlashLoaded=true;
        if (typeof suiFlashLoadedHandler != 'undefined')
            suiFlashLoadedHandler();

        if (suiMovieObject==null) suiMovieObject=suiGetFlashMovieObject("PlaySoundBOTAS");
//        if (suiInited)
//        {
            suiMusicStartCookie();  
            guiSettingsMusicShow();
//        }
    }

    function suiGameStart()//music,sound)
    {
        if (!suiFlashLoaded) return;
        suiMovieObject.gameStart(suiMusic,suiSounds);
    }

    function suiGameStop()//music,sound)
    {
        if (!suiFlashLoaded) return;
        suiMovieObject.gameStop(suiMusic,suiSounds);
    }

    function suiGameBreak()
    {
        if (!suiFlashLoaded || !suiMusic) return;
        suiMovieObject.musicFadeIn();        
    }

/*    function suiSoundStop()
    {
        if (!suiFlashLoaded) return;
        suiMovieObject.soundStop();
    }
*/
    function suiPlayCorrect()
    {
        if (!suiFlashLoaded || !suiSounds) return;
        suiMovieObject.playCorrect();
    }
    function suiPlayWrong()
    {
        if (!suiFlashLoaded || !suiSounds) return;
        suiMovieObject.playWrong();
    }

/*
    function suiMusicStart(muted,position,fade)
    {
        if (!suiFlashLoaded) return;
        suiMovieObject.musicStart(muted,position,fade);
    }
*/
    function suiMusicStartCookie()
    {
        var c=cookieGet("musicPosition");
        var pos=0;
        var fade=0;
        if (c!="")
        {
            var cs=(c+"").split(";");
            pos=cs[0]*1.0; //parse float
            var t1=cs[1];
            fade=cs[2];
            var t2=new Date().getTime();
            if (t2-t1>10000) pos=0; //if > 10 seconds then reset
            else pos+=(t2-t1);        
        }
        if (!suiFlashLoaded) return;
        suiMovieObject.musicStart(true,pos,fade); //always muted 
        if (suiMusic) 
            suiMovieObject.musicFadeIn(); //fade in when music
    }
    function suiMusicPosition(position,fade)
    {
        var t=new Date().getTime();
        cookieSet("musicPosition",position+";"+t+";"+fade,logicCookieHost);
    }
    
    function suiMusicFadeIn()
    {
        if (!suiFlashLoaded) return;
        suiMusic=true;
        guiSettingsMusic(suiMusic,suiSounds);
        suiMovieObject.musicFadeIn();
    }
    
    function suiMusicFadeOut()
    {
        if (!suiFlashLoaded) return;
        suiMusic=false;
        guiSettingsMusic(suiMusic,suiSounds);        
        suiMovieObject.musicFadeOut();
    }
    
    function suiGetFlashMovieObject(movieName)
    {
      if (window.document[movieName]) return window.document[movieName];
      if (navigator.appName.indexOf("Microsoft Internet")==-1)
      {
        if (document.embeds && document.embeds[movieName]) return document.embeds[movieName]; 
      }
      else return document.getElementById(movieName);
    }

    function suiMusicToggleHandler()
    {
        if (!logicGameIsPlaying())
        {
            if (!suiMusic) suiMusicFadeIn();
            else suiMusicFadeOut();
        }
        else suiMusic=!suiMusic;
        guiSettingsMusic(suiMusic,suiSounds);
        cookieSet("musicSettings",suiMusic+"_"+suiSounds,logicCookieHost,30);
    }
    function suiSoundsToggleHandler()
    {
        suiSounds=!suiSounds;
        guiSettingsMusic(suiMusic,suiSounds);
        cookieSet("musicSettings",suiMusic+"_"+suiSounds,logicCookieHost,30);
    }
    function suiInitHandlers()
    {
        guiSoundsToggleHandler=suiSoundsToggleHandler;
        guiMusicToggleHandler=suiMusicToggleHandler;
    }
    function suiInit()
    {
        suiInitHandlers();
        var ms=cookieGet("musicSettings");
        if (ms!="")
        {
            var m=ms.split("_");
            if (m[0]=="true") suiMusic=true; //default false
            if (m[1]=="false") suiSounds=false;
        }
        guiSettingsMusic(suiMusic,suiSounds);
/*
        suiInited=true;
        
        if (suiFlashLoaded)
        {
            suiMusicStartCookie();
            guiSettingsMusicShow();
        }        
*/        
    }
/********************* SUI ;-) **********************************/
/********************* LOGIC ************************************/
var logicAppHost="besttimestable.com";
var logicCookieHost=logicAppHost;

/* description */
var logicDescription="";
var logicDescriptionDefault="...";
var logicDescriptionMaxLength=40;


function logicDescriptionGet()
{
	if (logicDescription==logicDescriptionDefault) logicDescription="";

    //jsi18n - defined in html (I18N)
	var msg=jsi18nLDGAlert1+logicDescriptionMaxLength+jsi18nLDGAlert2;
    //get from cookie
	var desc=cookieGet("desc"); 
    //get last used description
	if (logicDescription!=logicDescriptionDefault && logicDescription!="") desc = logicDescription;
    
	do{
		desc=desc.substring(0,logicDescriptionMaxLength);
		desc=prompt(msg,desc);
		if (typeof desc=='undefined' || desc==null || textTrim(desc)=="") desc=logicDescriptionDefault;
		else desc=textTrim(desc);
			msg="Description - MAX "+logicDescriptionMaxLength+" chars!";
	}while(desc.length>logicDescriptionMaxLength);
	logicDescription=desc;
    if (logicDescription!=logicDescriptionDefault)
        cookieSet("desc",logicDescription,logicCookieHost,30);

    guiNoFocus();
	return logicDescription;
}

/* Signature / description */
/* User */

//TODO:rename to user - change logic a bit (sth like sign in/out - not signature only)

var logicSignature="";
var logicSignatureDefault="Guest";
var logicSignatureMaxLength=20;
var logicSignatureGetHandler=null;

//jsi18n - defined in html (I18N)
var logicSignatureMessage=jsi18nLSMAlert1+logicSignatureMaxLength+jsi18nLSMAlert2;
var logicSignatureMessage2="Name - MAX "+logicSignatureMaxLength+" chars!";

var logicUserGameNum=0;
var logicUserGameTime=0;

function logicSignatureSet(sign)
{
    logicSignature=sign;
    
}
function logicSignatureIsGuest()
{
    if (logicSignature=="" || logicSignature==logicSignatureDefault) return true;
    else return false;
}
function logicSignatureGetStep1(returnHandler)
{
    logicSignatureGetHandler=returnHandler;
    if (logicSignature!="" && logicSignature!=logicSignatureDefault) //if already logged in
        logicSignatureGetHandler(logicSignature); 
    else
	{
        if (logicSignature==logicSignatureDefault) logicSignature="";
        //get from cookie
        var cookieSign=cookieGet("sign"); 
        if (cookieSign!=logicSignatureDefault && cookieSign!="") logicSignature=cookieSign;

        textSafePrompt(logicSignatureMessage,logicSignature,logicSignatureGetStep2,true,true,true);
	}
}
function logicSignatureGetStep2(sign)
{
    if (sign==null)
    {
        if (confirm("You've chosen not to save your last score. Are you sure?"))
        {
            logicSignature=logicSignatureDefault;//reset username
            logicSignatureGetHandler(null); //return with null
        }
        else //ask again
            textSafePrompt(logicSignatureMessage2,logicSignature,logicSignatureGetStep2,true); 
        guiNoFocus();
        return;
    }
    
    logicSignature=textTrim(sign);
    if (logicSignature.length>logicSignatureMaxLength)
    {
        logicSignature=logicSignature.substring(0,logicSignatureMaxLength);
        textSafePrompt(logicSignatureMessage2,logicSignature,logicSignatureGetStep2,true,true);
        return;
    }
    else if (logicSignature=="")
        logicSignature=logicSignatureDefault;

	if (logicSignature!=logicSignatureDefault) 
    {
        guiSignatureSet(sign);
        cookieSet("sign",logicSignature,logicCookieHost,30);
    }
    else guiSignatureClear(logicSignatureDefault)
    guiChatSignatureSet(logicSignature);
    
    
    logicSignatureGetHandler(logicSignature);
    guiNoFocus();
}

function logicSwitchUserHandler()
{
	logicSignature="Guest";
    logicUserExperienceLoad(logicGameType);
    cookieSet("sign","",logicCookieHost,0);
}

//TODO: wait for save (block gameType change - user can switch game type (or username) between testScore and saveScore)
//      same as in logicHSSaveScore
//var logicUserExperienceNoviceNum=1; //number of games
//var logicUserExperienceNoviceTime=9; //time of the game (15 minoots)
//var logicUserExperienceNoviceNum=15; //number of games
//var logicUserExperienceNoviceTime=900; //time of the game (15 minoots)
var logicUserExperienceNoviceNum=5; //number of games
var logicUserExperienceNoviceTime=300; //time of the game (5 minoots)
var logicUserExperienceGameTypeMapping={"10":0,"30":1,"100":2,"20":3,"50":4};

//TODO: global access to game type
function logicUserExperienceIsNovice()
{
    if (logicSignatureIsGuest()) return true;
    //get from cookie
    var exp=cookieGet("saveMTT"+escape(logicSignature));
    if (exp=="") return true;

    var os=textDeserializeObjects(exp);

    //position in cookie
    var gIdPos=logicUserExperienceGameTypeMapping[logicGameType];
    
    if (typeof os[gIdPos]=='undefined' || os[gIdPos]==null) return true;        
    else if (os[gIdPos]["total"]<logicUserExperienceNoviceNum || 
             os[gIdPos]["ttime"]<logicUserExperienceNoviceTime)
                return true;
  
    return false;
}
function logicUserExperienceLoad(gameType)
{
    if (logicSignatureIsGuest())
    {
        guiUserSet("","","",true);// set guest
        return;
    }
    //get from cookie
    var exp=cookieGet("saveMTT"+escape(logicSignature));
    if (exp=="")
    {
        guiUserSet(false); //novice       
        return;
    }
    var os=textDeserializeObjects(exp);

    //position in cookie
    var gIdPos=logicUserExperienceGameTypeMapping[gameType];

    if (typeof os[gIdPos]=='undefined' || os[gIdPos]==null)
        guiUserSet(false); //novice
    else if (os[gIdPos]["total"]<logicUserExperienceNoviceNum || 
             os[gIdPos]["ttime"]<logicUserExperienceNoviceTime)
        guiUserSet(false); //novice       
    else 
    {
        var score=os[gIdPos]["score"];
        var date=new Date(1.0*os[gIdPos]["time"]);
        guiUserSet(true,numberFormatPrecision(score,5),dateDateString(date,true)+" "+dateTimeString(date)+" "+score);
    }
}

//game type, time played, top score, date when user earned top score
//increase number of games, adds total time, and if necessary updates the score, and game time
function logicUserExperienceUpdate(gameType,gameTime,score,gameDate)
{
    if (logicSignatureIsGuest()) return;
    //get from cookie
    var exp=cookieGet("saveMTT"+escape(logicSignature));
    var os=textDeserializeObjects(exp);

    //set default (init saves - numOfGames games) 
    if (os.length==0)
        for (var i=0;i<numOfGames;i++) //fill with empty game savings
        {
            os[i]=new Array();
            os[i]["total"]=0; //Total number of games played
            os[i]["ttime"]=0; //Total time played
            os[i]["score"]=0;
            os[i]["time"]=0;
        }
        
    //position in cookie
    var gIdPos=logicUserExperienceGameTypeMapping[gameType];

    //save
    os[gIdPos]["total"]=1+1*os[gIdPos]["total"];
    os[gIdPos]["ttime"]=gameTime+1*os[gIdPos]["ttime"];

    if (os[gIdPos]["score"]<=0 || score<os[gIdPos]["score"]) //save top score/time
    {
        os[gIdPos]["score"]=score;
        os[gIdPos]["time"]=gameDate;
    }

    cookieSet("saveMTT"+escape(logicSignature),textSerializeObjects(os),logicCookieHost,30);
    
    logicUserExperienceLoad(gameType);
}

function logicUserInit()
{
    var sign=cookieGet("sign"); 
    if (sign!="") 
    {
        logicSignatureSet(sign);
        guiChatSignatureSet(sign);
        guiSignatureSet(sign);
        if (cookieGet("userInit")!="true")
            alert("Hello "+sign+". "+jsi18nLHAlert1+sign+".");
        guiNoFocus();
            
        cookieSet("userInit","true",logicCookieHost,10);
    }
}

/* User */
/* Game */

var logicGameType=10;

function logicSwitchGameHandler(type)
{
    cookieSet("gameType",""+type,logicCookieHost,30);
    logicGameType=type;
    logicHSLoad(type);
    logicUserExperienceLoad(logicGameType);
    suiGameBreak();
}

function logicGameStartStopHandler(start)
{
    if (start)
    {
        logicGameStart();
        suiGameStart();
    }
    else 
    {
        logicGamePlaying=false;
        suiGameBreak();
    }
}

function logicRandomQuestion(maxNum)
{
	var l1;
	var l2;
	switch (maxNum)
	{
        // 2..10   X   2..10
		case "10": 
			l1=Math.floor(Math.random()*9)+2;
			if (l1==10)		
				l2=Math.floor(Math.random()*8)+2; //No 10x10
			else l2=Math.floor(Math.random()*9)+2;
			break;
        // 2..10       2..10
        //         X   
        //11..20   X   11..20     
		case "20": //
			l1=Math.floor(Math.random()*19)+2;
			if (l1<=10)
				l2=Math.floor(Math.random()*10)+11; //No NxM (N,M<=10) 
			else if (l1<20)
				l2=Math.floor(Math.random()*19)+2;
			else
				l2=Math.floor(Math.random()*18)+2; //No 20x20
			break;
        //2..20        2..20
        //         X 
        //21..30   X  21..30
		case "30":
			l1=Math.floor(Math.random()*29)+2;
			if (l1<=20)
				l2=Math.floor(Math.random()*10)+21; //No NxMM (MM<=20)
			else if (l1<30)
				l2=Math.floor(Math.random()*29)+2;
			else
				l2=Math.floor(Math.random()*28)+2; //No 30x30
			break;
		case "50":
			l1=Math.floor(Math.random()*49)+2;
			if (l1<=30)
				l2=Math.floor(Math.random()*20)+31; 
			else if (l1<50)
				l2=Math.floor(Math.random()*49)+2;
			else
				l2=Math.floor(Math.random()*48)+2;
			break;
		case "100":
			l1=Math.floor(Math.random()*99)+2;
			if (l1<=50)
				l2=Math.floor(Math.random()*50)+51; 
			else if (l1<100)
				l2=Math.floor(Math.random()*99)+2;
			else
				l2=Math.floor(Math.random()*98)+2;
			break;
	}

	if (Math.random()>0.5) return [l2,l1];
	else return [l1,l2];
}


var logicQuestionA=0;
var logicQuestionB=0;
var logicQuestionNum=1;
//Array in format [0-A,1-B,2-Result(AxB),3-LongAnswer(hint),4-WrongAnswer(if wrong),5-AnswerTime,6-AnswerTimeLong,7-TimeBarLength]
var logicAnswers=new Array();
var logicTimeTotal=0;
var logicTimePenalty=0;
var logicTimeQuestionStart=0;
var logicTimeQuestionStop=0;
var logicScore=0;

var logicGameOverAlert="";
var logicGamePlaying=false;

function logicGameStart()
{   
    logicGamePlaying=true;
    logicQuestionNum=1;
    logicAnswers=new Array();
    logicTimeTotal=0;
    logicNextQuestion();   
}
function logicGameIsPlaying()
{
    return logicGamePlaying;
}
//calculate times/bars/errors/penalty
function logicGameOverStep1()
{
    logicGamePlaying=false;
    suiGameStop();

    //get Errors, get Max (for penalty)
    var errors=0;    
    var maxTime=0;
    for (var a in logicAnswers)
    {
        if (logicAnswers[a][6]>maxTime) maxTime=logicAnswers[a][6];
        if (typeof logicAnswers[a][4] !='undefined') errors++;
    }
    
    //normalize time bar
    for (var a in logicAnswers)
        logicAnswers[a][7]=Math.round(155.0*logicAnswers[a][6]/maxTime);

//    var alertMsg="Your time is "+numberFormatPrecision(logicTimeTotal,5,2)+" seconds";
    //jsi18n - defined in html (I18N)
    var alertMsg=jsi18nLGOAlert1+numberFormatPrecision(logicTimeTotal,5,2)+jsi18nLGOAlert2;
    
    
    logicTimePenalty=0;
    if (errors>0)
    {
        var errRatio=1.2;
        logicTimePenalty=maxTime*errRatio*(1-Math.pow(errRatio,errors))/(1-errRatio);
        if (errors==30)
            logicTimePenalty=30000.0;
//        alertMsg+=", but you made mistakes and you earned penalty time "+(Math.round(logicTimePenalty*100.0)/100.0)+" seconds";
        alertMsg+=jsi18nLGOAlert3+(Math.round(logicTimePenalty*100.0)/100.0)+jsi18nLGOAlert2;
		if (errors>15) alertMsg+=" :D";
    }

    if (errors>0) 
        guiGameOver(logicAnswers,numberFormatPrecision(logicTimeTotal,5,2),logicTimeTotal,numberFormatPrecision(logicTimePenalty,5,2),logicTimePenalty);
    else
        guiGameOver(logicAnswers,numberFormatPrecision(logicTimeTotal,5,2),logicTimeTotal);

    
    logicScore=logicTimeTotal+logicTimePenalty;

    logicGameOverAlert=alertMsg;
    
    logicGameOverStep2();
}
//get the sign - always because user goes into last players hs table
//test the score
function logicGameOverStep2()
{
    logicSignatureGetStep1(logicGameOverStep2A);//signature prompt
}
function logicGameOverStep2A(sign)
{
    if (sign==null) return; //return if user dont want to save the score

    //update top score in cookie
    if (!logicUserExperienceIsNovice() || logicTimePenalty==0) //no update for newbies when penalty (only correct games count)        
        logicUserExperienceUpdate(logicGameType,logicTimeTotal,logicScore,new Date().getTime());
        
	logicHSTestScore(sign,logicScore,logicGameOverStep4);  
    logicGameOverStep3();
}
//show game over alert
var logicGameOverStep3End=false;
function logicGameOverStep3()
{    
    logicGameOverStep3End=false;
    alert(logicGameOverAlert);    
    guiNoFocus();
    logicGameOverStep3End=true;
    //step 4 invoked in logicHTTestScoreResult
}

//get description
//save result
//invoked in logicGAmeOverStep2A -> logicHSTestScoreResult
function logicGameOverStep4(save)
{
    if (save)
        logicGameOverStep4A();
}
function logicGameOverStep4A()
{
    if (logicGameOverStep3End) 
    {
        if (logicHSSaveLast || !logicUserExperienceIsNovice())
            logicHSSaveScore(logicSignature,logicScore,logicDescriptionGet(),logicHSSaveLast,!logicUserExperienceIsNovice()?logicHSSaveTop:false);
        if (logicHSSaveTop && logicUserExperienceIsNovice())
            if (logicHSSaveLast)
                alert("You are still newly registered user, and unfortunately your score will not be saved in Top Players list, but it should be visible in Last Players list. Play a few more games to be regular one.");

                //Show alert only in SaveLast case. SaveTop case always occurs while user is newly registered (because there is no entry in Top Players)
                //            else alert("You are still newly registered user, and unfortunately your score will not be saved in Top Players list. Play a few more games to be regular one.");
        guiNoFocus();

    }
    else //wait for alert end to not show alert and description prompt at the same time
        setTimeout("logicGameOverStep4A()",50);
}

var logicNextQuestionRandom=null;
function logicNextQuestion()
{
    if (!logicGamePlaying) return;
    if (logicQuestionNum<=gameQuestionsNumber)
    {
        var q;
        if (logicQuestionNum>1) q=logicNextQuestionRandom;
        else q=logicRandomQuestion(logicGameType+"");
        logicNextQuestionRandom=logicRandomQuestion(logicGameType+"");
        
        logicQuestionA=q[0];
        logicQuestionB=q[1];
        if (logicQuestionNum==gameQuestionsNumber)
            guiGameQuestion(logicQuestionA,logicQuestionB);
        else
            guiGameQuestion(logicQuestionA,logicQuestionB,logicNextQuestionRandom[0],logicNextQuestionRandom[1]);
        logicTimeQuestionStart=new Date().getTime();
        logicQuestionNum++;
        logicAnswers[logicQuestionNum-1]=new Array();
        logicAnswers[logicQuestionNum-1][0]=logicQuestionA;
        logicAnswers[logicQuestionNum-1][1]=logicQuestionB;
        logicAnswers[logicQuestionNum-1][2]=logicQuestionA*logicQuestionB;
    }
    else
    {
        logicGameOverStep1();
    }
}

//return true if substring (but not result) of result
//       false if not substring (error)
function logicAnswerInputNoEnterHandler(value)
{
    if (!logicGamePlaying) return true;
	try{		
        var val=value+"";
        val=textLTrim(val.replace(new RegExp("\\D+","g"), ""),"0"); //remove chars, remove trailing "0" - to avoid interpretation as octal numbers
        if (parseInt(val)) val=parseInt(val)+"";
        val=val.substr(0,4); //max 4 chars;
        var valS=val+"";
        var resS=logicQuestionA*logicQuestionB+"";
        if (resS.substr(0,valS.length)!=valS || valS==resS) return false;
        return true;
    }catch(err){return false};
}

function logicAnswerInputHandler(value)
{
    if (!logicGamePlaying) return;
    logicTimeQuestionStop=new Date().getTime();
    var correct=false;
	try{		
        var val=value+"";
        val=textLTrim(val.replace(new RegExp("\\D+","g"), ""),"0"); //remove chars, remove trailing "0" - to avoid interpretation as octal numbers
        if (parseInt(val)) val=parseInt(val)+"";
        val=val.substr(0,4); //max 4 chars;

        logicAnswers[logicQuestionNum-1][3]=value;
        //answer long time
        logicAnswers[logicQuestionNum-1][6]=(logicTimeQuestionStop-logicTimeQuestionStart)/1000.0;
        //answer time with 2 decimal places
        logicAnswers[logicQuestionNum-1][5]=numberFormatPrecision(logicAnswers[logicQuestionNum-1][6],5,2);
//        Math.round(logicAnswers[logicQuestionNum-1][6]*100)/100.0;
        logicTimeTotal+=logicAnswers[logicQuestionNum-1][6];
        
        if (val==logicQuestionA*logicQuestionB)
        {
            guiGameAnswer(logicQuestionA,logicQuestionB,logicQuestionA*logicQuestionB,value);
            correct=true;
        }
        else
        {
            logicAnswers[logicQuestionNum-1][4]=val;
            guiGameAnswer(logicQuestionA,logicQuestionB,logicQuestionA*logicQuestionB,value,val);
        }
	}catch(err)
	{}
    
    if (logicQuestionNum<=gameQuestionsNumber)
    {
        if (correct) setTimeout("suiPlayCorrect()",20);
        else setTimeout("suiPlayWrong()",20);
    }
    
    logicNextQuestion();
}
/* Game */
/* High Score */
var logicHSHost="http://tdlhighscores.appspot.com/";
var logicHSMaxScores=30;
var logicHSMaxDays=30;
var logicHSDBIds={"10":["1","2"],"30":["3","4"],"100":["5","6"],"20":["7","8"],"50":["9","10"]};

//arrays in form [sign,desc,datetime,datetimeLong,score,scoreLong,userLine(for strong gui)]
var logicHSDataLast=new Array();
var logicHSDataTop=new Array();

function logicHSInit()
{
	if ((document.location+"").indexOf("praca/besttimestable.com")>=0 ||
        (document.location+"").indexOf("http://localhost")>=0 ||
        (document.location+"").indexOf("http://127.0.0")>=0)
		logicHSHost="http://localhost:9090";
}

function logicHSLoad(gameType)
{
    logicHSDataLast=new Array();
    logicHSDataTop=new Array();
	var scr=document.createElement("script");
	scr.src=logicHSHost+"/loadScores?lastHighScoreId="+logicHSDBIds[gameType][0]+"&topHighScoreId="+logicHSDBIds[gameType][1]+"&lastFunction=logicHSLoadLast&topFunction=logicHSLoadTop&order=-"+"&rand="+Math.random();
	document.body.appendChild(scr);
}
function logicHSLoadLast(score,sign,desc,time)
{
    var d=new Date(time*1000.0);
    var a=[textWordsLimit(sign),textWordsLimit(desc),"<nobr>"+dateDateString(d,false,".")+", "+dateTimeString(d)+"</nobr>",dateDateString(d,true)+" "+dateTimeString(d,true),numberFormatPrecision(score,5),score,(logicSignature==sign && Math.floor(100.0*score)==Math.floor(100.0*logicScore))?true:false];
    logicHSDataLast[logicHSDataLast.length]=a;
    if (logicUpdateHSHandler!=null) clearTimeout(logicUpdateHSHandler);
    logicUpdateHSHandler=setTimeout("logicUpdateHSTO()",200);
}

function logicHSLoadTop(score,sign,desc,time)
{
    var d=new Date(time*1000.0);
    var a=[textWordsLimit(sign),textWordsLimit(desc),"<nobr>"+dateDateString(d,false,".")+", "+dateTimeString(d)+"</nobr>",dateDateString(d,true)+" "+dateTimeString(d,true),numberFormatPrecision(score,5),score,(logicSignature==sign && Math.floor(100.0*score)==Math.floor(100.0*logicScore))?true:false];
    logicHSDataTop[logicHSDataTop.length]=a;
    if (logicUpdateHSHandler!=null) clearTimeout(logicUpdateHSHandler);
    logicUpdateHSHandler=setTimeout("logicUpdateHSTO()",200);
}
var logicUpdateHSHandler=null;
function logicUpdateHSTO()
{
    guiHSShow("last",logicHSDataLast);
    guiHSShow("top",logicHSDataTop);
}


//compId additional identification (for dynamic ip users - see TDLHighScore app)
function logicHSCompIdGet()
{
    var logicHSCompId=cookieGet("compId");
    if (logicHSCompId=="") 
    {
        logicHSCompId=""+Math.round(Math.random()*1000000);
        cookieSet("compId",logicHSCompId,logicCookieHost,30);
    }    
    return logicHSCompId;
}

var logicHSSaveLast=false;
var logicHSSaveTop=false;
var logicHSTestScoreSaveHandler=null;
function logicHSTestScore(sign,score,saveHandler)
{
    logicHSTestScoreSaveHandler=saveHandler;
    var lci=logicHSCompIdGet();
    
    try{
        logicHSSaveLast=false;
        logicHSSaveTop=false;
        var scr=document.createElement("script");
        scr.src=logicHSHost+"/testScore?compId="+lci+"&testFunction=logicHSTestScoreResult&lastHighScoreId="+logicHSDBIds[logicGameType][0]+"&topHighScoreId="+logicHSDBIds[logicGameType][1]+"&maxScores="+logicHSMaxScores+"&maxDays="+logicHSMaxDays+"&score="+score+"&signature="+textEscape(sign)+"&rand="+Math.floor(10000*Math.random());
        document.body.appendChild(scr);
    }catch(e){}
}

function logicHSTestScoreResult(lastTestUser,topTestUser,topTestTop)
{
	if (lastTestUser=="new" || lastTestUser=="less" || lastTestUser=="equal")
		logicHSSaveLast=true;
	if (topTestUser=="less" || topTestUser=="equal")
		logicHSSaveTop=true;
	if (topTestUser=="new" && (topTestTop=="new" || topTestTop=="less" || topTestTop=="inside"))
		logicHSSaveTop=true;
			
	if (logicHSSaveLast || logicHSSaveTop)
        logicHSTestScoreSaveHandler(true);
    else 
        logicHSTestScoreSaveHandler(false);
//		logicHSSaveScoreTOHandler();
}

/*
function logicHSSaveScoreTOHandler()
{
	if (logicAlertWait) logicHSSaveScoreTO=setTimeout("logicHSSaveScoreTOHandler()",50);
	else logicHSSaveScore(logicSignature,logicScore,logicDescriptionGet(),logicHSSaveLast,logicHSSaveTop);
}
*/

//TODO: wait for save (block gameType change - user can switch game type between testScore and saveScore)
function logicHSSaveScore(sign,score,desc,saveLast,saveTop)
{
    var lci=logicHSCompIdGet();
	var scr=document.createElement("script");
	scr.src=logicHSHost+"/saveScore?compId="+lci+"&"+(saveLast?"lastHighScoreId="+logicHSDBIds[logicGameType][0]+"&":"")+(saveTop?"topHighScoreId="+logicHSDBIds[logicGameType][1]+"&":"")+"saveFunction=logicHSSaveScoreResult&maxScores="+logicHSMaxScores+"&maxDays="+logicHSMaxDays+"&signature="+textEscape(sign)+"&description="+textEscape(desc)+"&score="+score+"&order=-"+"&rand="+Math.random();
	document.body.appendChild(scr);
}

function logicHSSaveScoreResult(resLast,resTop)
{
	logicHSLoad(logicGameType);
	setTimeout("documentGoToLocation('highscoreLast')",700);
    setTimeout("guiNoFocus('highscoreButton30')",800);
}

/* High Score */
/* Chat */
var logicChatHost="http://tdlchatsystem.appspot.com";
var logicChatId=1;
var logicChatLastTestUTC=0;

function logicChatInit()
{
	if ((document.location+"").indexOf("praca/besttimestable.com")>=0 ||
        (document.location+"").indexOf("http://localhost")>=0 ||
        (document.location+"").indexOf("http://127.0.0")>=0)
		logicChatHost="http://localhost:8080";    
    
    logicChatTestTO();    
}
var logicChatEntries=new Array();
var logicChatUTC=0;
function logicChatLoad(offset)
{
    if (typeof offset=='undefined') offset=0;
    logicChatEntries=new Array();
    logicChatUTC=0;
    var scr=document.createElement("script");
    scr.src=logicChatHost+"/load?finFun=logicChatLoadDone&entFun=logicChatLoadEntry&id="+logicChatId+"&offset="+offset+"&rand="+Math.random();
    document.body.appendChild(scr);
}
function logicChatLoadEntry(sign,body,time)
{
    var t=(0+time)*1000;
    if (t>logicChatUTC) logicChatUTC=t;
    var d=new Date(t);
    logicChatEntries[logicChatEntries.length]=[sign,body,dateDateString(d),dateTimeString(d,true)];
}

function logicChatLoadDone(ok)
{
    if (ok)
    {
        logicChatLastTestUTC=logicChatUTC+1000; //+1 second
        guiChatShow(logicChatEntries);
    }
}

var logicChatTestTOHandler=null;
var logicChatTestTOInt=25000;
//var logicChatTestTOInt=2000;
function logicChatTestTO()
{
    logicChatTestTOHandler=null;
    var scr=document.createElement("script");
    scr.src=logicChatHost+"/test?tstFun=logicChatTestReturn&lastUTC="+logicChatLastTestUTC+"&id="+logicChatId+"&onlineFun=logicChatUsersOnline&rand="+Math.random();
    document.body.appendChild(scr);
    logicChatTestTOStart(false);
}
function logicChatTestTOStop()
{
    if (logicChatTestTOHandler!=null)
        clearTimeout(logicChatTestTOHandler);
}
function logicChatTestTOStart(startNow)
{
    logicChatTestTOStop();
    if (startNow) logicChatTestTO();
    else logicChatTestTOHandler=setTimeout("logicChatTestTO()",logicChatTestTOInt);
}
function logicChatTestReturn(hasNewEntries)
{
    if (hasNewEntries)
        logicChatLoad();
}
function logicChatUsersOnline(usersOnline)
{
    guiUsersOnline(usersOnline);
}
function logicChatSubmitHandler(message,signature)
{
    logicChatSave(textEscape(message),textEscape(signature));
    logicChatPosition=0;
    return false;
}
function logicChatSave(body,sign)
{
    if (sign=="") sign=logicSignatureDefault;
    else
        cookieSet("sign",sign,logicCookieHost,30);

    var scr=document.createElement("script");
    scr.src=logicChatHost+"/save?retFun=logicChatSaveReturn&body="+body+"&sign="+sign+"&id="+logicChatId;
    document.body.appendChild(scr);    
}
function logicChatSaveReturn(ok)
{
    if (ok) logicChatLoad();
}

var logicChatPosition=0;
function logicChatNextHandler()
{
    logicChatPosition+=20;
    logicChatTestTOStop();
    logicChatLoad(logicChatPosition);
}
function logicChatPreviousHandler()
{
    logicChatPosition=0;
    logicChatTestTOStart(true);
}
/* Chat */
/* Settings - options */
var logicOptionWaitForEnter=false;
var logicOptionShowNext=false;

function logicOptionsEnterToggleHandler()
{
    logicOptionsSet(!logicOptionWaitForEnter,logicOptionShowNext)
}
function logicOptionsNextToggleHandler()
{
    logicOptionsSet(logicOptionWaitForEnter,!logicOptionShowNext)
}
function logicOptionsSet(setEnter,setNext)
{
    logicOptionWaitForEnter=setEnter;
    logicOptionShowNext=setNext;
    guiOptionsSet(logicOptionWaitForEnter,logicOptionShowNext);    
    cookieSet("gameOptions",(logicOptionWaitForEnter?"T":"F")+"_"+(logicOptionShowNext?"T":"F"),logicCookieHost,100);
}
function logicOptionsInit()
{
    var lo=cookieGet("gameOptions");
    if (lo)
    {
        var loa=lo.split("_");
        if (loa[0]!=undefined && loa[1]!=undefined)
            logicOptionsSet(loa[0]=="T",loa[1]=="T");
        else logicOptionsSet(false,false);         
    }
}
/* Settings - options */

/* Init */

function logicInitHandlers()
{
    guiGameStartStopHandler=logicGameStartStopHandler;
    guiSwitchGameHandler=logicSwitchGameHandler;
    guiAnswerInputHandler=logicAnswerInputHandler;
    guiAnswerInputNoEnterHandler=logicAnswerInputNoEnterHandler;
    guiSwitchUserHandler=logicSwitchUserHandler;
    
    guiChatSubmitHandler=logicChatSubmitHandler;
    guiChatPreviousHandler=logicChatPreviousHandler;
    guiChatNextHandler=logicChatNextHandler;
    
    guiOptionsEnterToggleHandler=logicOptionsEnterToggleHandler;
    guiOptionsNextToggleHandler=logicOptionsNextToggleHandler;
}
function logicInit()
{
  	if ((document.location+"").indexOf("praca/besttimestable.com")>=0 ||
        (document.location+"").indexOf("http://localhost")>=0 ||
        (document.location+"").indexOf("http://127.0.0")>=0)
    {
		logicAppHost="localhost";
        logicCookieHost="";
    }
    
    logicHSInit();
    logicChatInit();
    logicInitHandlers();
    logicUserInit();
    logicOptionsInit();
    var g=cookieGet("gameType");
    if (g!="")
        guiSwitchGame(g);
    else guiSwitchGame(10);
    
    setTimeout("translateTMP()",10000);
}
function translateTMP()
{
    var prob=cookieGet("translationPrompt");
    if (prob=="") prob=1;
    else prob=prob*1.0;
    if (Math.random()<prob)
    {
        var lang=langBrowserGet(true);
        var l="";
        if (lang=="DE") l="GERMAN";
//        if (lang=="ES") l="SPANISH";
        if (lang=="IT") l="ITALIAN";
        if (lang=="RU") l="RUSSIAN";
        if (lang=="PT") l="PORTUGAL";
        if (lang=="JA") l="JAPANESE";
        if (lang=="ZH") l="CHINESE";
        if (l!="")
        {
            var emil=prompt("Hi! Would you like to help me with TRANSLATION of BestTimesTable into "+l+". If so, input your email or write on contact@besttimestable.com");
            if (emil) 
            {
                scriptLoad("http://tdl.home.pl/sm.php?message=BTTTranslate:"+l+":"+emil);                
                if (emil.indexOf("@")>0)
                    alert("Thanks! I'll contact you soon.");
            }            
            prob*=0.5;
            guiNoFocus();            
        }
    }
    cookieSet("translationPrompt",prob,"",100);
}
/********************* LOGIC ************************************/

