
var sid, magic, score;
var images;
var curimg;

var pagenames = ['intro', 'gamediv', 'loading', 'error', 'result'];
var pages = {};
var curpage = null;

var script = '/pickperverts/pickpervs';

var ratings = [
               {low: 12, high: 15, txt: 'You must be psychic.'},
               {low: 9,  high: 11, txt: 'Lucky guess.'},
               {low: 6,  high: 8,  txt: 'You have a 50-50 chance, right?'},
               {low: 3,  high: 5,  txt: 'Nice try.'},
               {low: 0,  high: 2,  txt: 'You can\'t really tell, can you?'}];



var introdiv, gamediv, incorrectspan, correctspan, progress;
var imgcell, crimespan, leftbtn, resetbtn, rightbtn;
var errordiv, errorspan, name_input;

function report_error(txt) {
    setelemtext($('errortxt'), txt);
    pages.error.show();
}

function do_action(action, params, func, ensure) {
    var url = script + '?action=' + action;
    if (sid != null) {
        url += '&sid=' + sid + '&magic=' + magic;
    }
    url += params;
    return getjson(url, function(obj) {
            var exc = obj.exceptionType;
            if (exc) {
                report_error(exc + ': ' + obj.exceptionText)
            } else {
                try {
                    if (func)
                        func(obj);
                } catch (e) { report_error(e); }
            }
            if (ensure) ensure();
        }, function(r) {
            report_error('Server error: ' + r.status);
            if (ensure) ensure();
        });
}

function showresults() {
    ratings.each(function(r) { 
            if (score >= r.low && score <= r.high) 
                return r;
        }).elem.className = 'myrating';
    setelemtext($('finalscore'), score.toString() + ' ');
    endgame();
    pages.result.show();

}

function resetgame() {
    endgame();
    pages.intro.show();
}


function answerquestion(n, answer) {
    leftbtn.disabled = true;
    rightbtn.disabled = true;
    leftbtn.onclick = null;
    rightbtn.onclick = null;

    function oncontinue() {
        showquestion(n + 1);
    }

    do_action('answer', '&qid=' + n + '&answer=' + answer, function(obj) {
            
            var btxt, bfunc;

            var crime = obj.crime;
            var realans = obj.value;
            var remain = obj.remain;
            score = obj.numcorrect;

            setelemtext(crimespan, crime);
            (realans == answer ? correctspan : incorrectspan).style.display = 'inline';
            if (remain > 0) {
                btxt = 'Continue';
                bfunc = oncontinue;
            } else {
                btxt = 'Show results';
                bfunc = showresults;
            }
            setelemtext(leftbtn, btxt);
            setelemtext(rightbtn, btxt);
            leftbtn.onclick = bfunc;
            rightbtn.onclick = bfunc;
            leftbtn.disabled = false;
            rightbtn.disabled = false;
        });
    
}

function showquestion(n) {
    incorrectspan.style.display = 'none';
    correctspan.style.display = 'none';

    setelemtext(leftbtn, "Pervert");
    leftbtn.onclick = function() { answerquestion(n, 1); }

    setelemtext(rightbtn, "Junkie");
    rightbtn.onclick = function() { answerquestion(n, 0); }

    leftbtn.disabled = false;
    rightbtn.disabled = false;

    setelemtext(crimespan, '');
    setelemtext(progress, '' + (n + 1) + ' of 15');
    var img = images[n];
    curimg = img;
    clearelem(imgcell);
    if (img.loaded) {
        imgcell.appendChild(img.elem);
    } else {
        img.elem.onload = function() {
            if (img == curimg) {
                imgcell.appendChild(img.elem);
            }
        };
    }
}

function begingame() {
    pages.loading.show();
    ratings.each(function(r) { r.elem.className = '' });
    do_action('newgame', '&name=' + encodeURIComponent(name_input.value), 
              function(obj) {
                  sid = obj.sid;
                  magic = obj.magic;

                  images = new Array();
                  obj.images.each(function(name, qid) {
                          var elem = newelem('img');
                          var o =  {
                              name: name,
                              elem: elem,
                              loaded: false
                          };
                          elem.src ='http://s3.jspenguin.org/kasper/' + name + '.jpeg'; 
                          elem.height = 260;
                          elem.onload = function() {
                              o.loaded = true;
                          };
                          images[qid] = o;
                      });
                  clearelem(imgcell);
                  showquestion(0);
                  pages.gamediv.show();
              });
}

function endgame() {
    if (sid)
        do_action('clear', '');
    clearelem(imgcell);
    sid = null;
    score = null;
    delete images;
    images = null;
}

window.onload = function() {
    init_debug();

    pagenames.each(function(p) {
            pages[p] = {
                name: p, 
                elem: $(p), 
                show: function() {
                    if (curpage != null) {
                        curpage.elem.style.display = 'none';
                    }
                    this.elem.style.display = 'block';
                    curpage = this;
                }
            };
        });
    name_input = $('nameinput');
    incorrectspan = $('incorrect');
    correctspan = $('correct');
    progress = $('progress');
    imgcell = $('imgcell');
    crimespan = $('crime');
    leftbtn = $('leftbutton');
    rightbtn = $('rightbutton');

    curpage = pages.loading
    pages.intro.show();

    var ratingstbl = $('ratingstbl');
    clearelem(ratingstbl)
    ratings.each(function(r) {
            var tr = ratingstbl.insertRow(-1);
            r.elem = tr;
            tr.appendChild(newelem('td', null, '' + r.low + ' - ' + r.high));
            tr.appendChild(newelem('td', null, r.txt));
        });
    
}