var uid;
var prefixToLang = {'C#':'cs','C++':'cpp','perl':'pl','PHP':'php','Python':'py','Ruby':'rb',
                    'VB':'vb'};

$(document).ready(function(){
  uid = readCookie('uid');
  if (!uid){
    uid = Math.random()*1E9;
    createCookie('uid',uid,1000);
  }
  var gforms = $('form[name^="g"]');
  var lang = prefixToLang[wgCanonicalNamespace] || 'java';
  $(document).data('lang',lang);
  var tlist =  $('div.tutlist>div[class!="fc"]');
  for (var i=0;i<tlist.length;i++){
    var t = $(tlist[i]);
    var pbid=wgPageName; //The one that is not a link is this one!
    if (t.find('a').length>0){
      pbid = unescape(t.find('a').attr('href').split(/\//).pop());
    }
    //Have to override bloody !important
    var progBar = $('<div class="progBar"/>').css({border:'1px solid black'});
    if (pbid){
      progBar.attr('id','progBar_'+pbid);
      progBar.data('name',pbid);
    }
    t.append(progBar);
  }
  var tutProg = $('.progBar').map(function(){return $(this).data('name');}).toArray().join(" ");
  $('form[name^="f"]').each(function(i,e){redoForm(this,i);});
  if (tutProg || gforms.length>0){
    $.ajax({url:'/getAttempts.cgi',dataType:'json','type':'post',cache:false,
        data:{
           lang:lang,progress:tutProg,
           page:wgPageName,uid:uid,wgUserName:wgUserName
        },
    success:function(d){
      var fforms = $('form[name^="f'+lang+'"]');
      var gforms = $('form[name^="g'+lang+'"]');
      for(var i=0;i<gforms.length;i++){
        var gfrm = $(gforms[i]);
        var quest = gfrm.find('input[name="quest"]').val();
        if (d[quest]){
          $('form[name="f'+lang+quest+'"] textarea[name="c"]')
             .val(d[quest].txt);
          if (d[quest].bst){
            var hs = Math.round(d[quest].bst);
            var hiscore = $('#hiscore'+lang+'_'+quest);
            hiscore.html(' High score: '+hs+'%');
            hiscore.data('highscore',hs);
            hiscore.show();
          }
        }
        $('form[name="f'+lang+quest+'"] textarea[name="c"]')
             .attr('readonly',false);
      }
      if (d.progress){
        $('.progBar').each(function(){
          var dx = d.progress[$(this).data('name')];
          if (dx){
            setProgBar($(this),dx.count,dx.max);
          }
        });
      }
    }});
  }
});

function setProgBar(t,numCorrect,numQuestions){
  var x = Math.min(24,Math.round(24*numCorrect/Math.max(1,numQuestions)));
  t.css({width:24-x,borderLeft:x,borderLeftStyle:'solid',borderTopColor:'black'});
  if (numCorrect && numQuestions)
    t.attr('title', numCorrect+' completed of '+numQuestions);
}

var pollTime = 2000; //Time between checking the queue
function goBaby(t,lang){
  var params = {
    };
  var gins = $('form[name="g'+lang+t+'"] input');
  var gpars = {};
  for (var i=0;i<gins.length;i++)
    gpars[$(gins[i]).attr('name')] = $(gins[i]).val();
  var fform = $('form[name="f'+lang+t+'"]');
  var shell = fform.find('input[name="shell"]').val();
  if (!shell)
    shell = unescape($('form[name="shell"] input').val());
  if (!shell || shell=='undefined') shell = 'QcQ';
  if (fform.find('input[name="answer"]').val())
    params['answer'] = repl(shell,{width:gpars.width,height:gpars.height,
                                 frag:fform.find('input[name="answer"]').val()});
  params['copy'] = gpars['copyFile'];
  params['file'] = gpars['className'];
  params['frag'] = fform.find('textarea[name="c"]').val();
  params['gimmeTicket'] = Math.random();
  params['imgOut'] = gpars['imgOut'];
  params['lang'] = gpars['lang'];
  params['prog'] = repl(shell,{width:gpars.width,height:gpars.height,
                               frag:fform.find('textarea[name="c"]').val()});
  if (fform.find('[id^="pre"]').length>0){
    var p = fform.find('[id^="pre"]').contents();
    var txt = 0;
    for(var i=0;i<p.length;i++){
      if (p[i].textContent)
        txt += p[i].textContent;
      else
        txt += $(p[i]).val();
    }
    params['prog'] = shell.replace(/QcQ/g,txt);
    params['frag'] = txt;
    //oParams.frag=(fForm.record)?fForm.record.value
    //                           :gForm.elements['prog'].value;
  }
  params['quest'] = gpars['quest'];
  params['switches'] = gpars['switches'];
  params['tut'] = wgPageName;
  params['tutSize'] = $('form[name^="f"]').length;
  params['uid'] = uid;
  params['version'] = wgCurRevisionId;
  params['wgUserName'] = wgUserName;
  $('#tgt_'+lang+t).show();
  var res = $('#tgtres_'+lang+t);
  res.empty();
  res.data('queue',{});
  $.ajax({url:'../r.cgi',data:params,dataType:'json',cache:false,'type':'post',
    success:function(d){
      if (d.ticket){
        var imRunning;
        for (var i=0;i<d.queue.length;i++)
          if (d.queue[i].ticket==d.ticket){
            imRunning = d.queue[i].isRunner;
            break;
          }
        informRunStatus(lang,t,imRunning);
        var waitFor = imRunning?0:pollTime;
        if (imRunning)
          keepAsking(d.ticket,lang,t);
        else{
          setTimeout(function(){keepAsking(d.ticket,lang,t);},waitFor);
          showQueue(lang,t,d);
        }
      }
    }});
}

function repl(text,subList){
  text = text.replace(/QcQ/g,subList.frag);
  text = text.replace(/QwidthQ/g,subList.width);
  text = text.replace(/QheightQ/g,subList.height);
  return text;
}

function redoForm(frm,i){
  //Replace Q( xxx )Q phrases
  var lang = $(document).data('lang');
  var s = 'form[name="g'+lang+(i+1)+'"] input[name="deftxt"]';
  s = $(s).val();
  var re =  /Q\(Q(.*?)Q\)Q/gim;
  var found = re.exec(s);
  if (!found) return;
  var lst = [];
  var prev = 0;
  while (found){
    lst.push(s.substring(prev,found.index));
    var inp = $('<input/>',{value:found[1],size:found[1].length+3
         ,style:'border-width:2px 2px 2px 2px;'
               +'border-color:black;background-color:white;padding:0px 8px'
           });
    lst.push(inp);
    prev = re.lastIndex;
    found = re.exec(s);
  }
  lst.push(s.substring(prev));
  var ne = $("<pre/>",{style:'background-color:rgb(200,200,230)',
                  id:'pre'+lang+i});
  for (var j=0;j<lst.length;j++)
    ne.append(lst[j]);
  $(frm).append(ne);
  $(frm).find('[name="c"]').css('display',  'none');
}

function informRunStatus(lang,q,isRunner){
  $('#tgtmsg_'+lang+q).html(isRunner?('Your program is running on '+isRunner)
                                    :'Your job is in a queue...');
}

function keepAsking(ticket,lang,q){
  //Request the result for ticket
  //If it is still being queued then ask again later
  var resId = 'tgtres_'+lang+q;
  var res = $('#'+resId);
  $.ajax({url:'../r.cgi','type':'post',data:{ticket:ticket},cache:false,dataType:'json',
   success:function(d){
    if (!d.queue){//Display the answer or error
        $('#tgtmsg_'+lang+q).empty();
        res.empty();
        if (d.score){
          var rscore = +Math.round(d.score);
          var score = $('<div class="score"/>').html('Your score is '+rscore+'%');
          res.append(score);
          res.show();
          var hisc = $('#hiscore'+lang+'_'+q);
          if (!hisc.data('highscore') || rscore>hisc.data('highscore')){
            $('#hiscore'+lang+'_'+q).html(' High score: '+rscore+'%');
            hisc.show();
            hisc.data('highscore',rscore);
            if (rscore==100){ //Recalculate progress bar if any
              var allQuestions = $('span[id^="hiscore"]');
              var rightQ = allQuestions.filter(function(i,e){return $(e).data('highscore')==100;});
              setProgBar($('#progBar_'+wgPageName),rightQ.length,allQuestions.length);
            }
          }
        }
        var usrTxt='';
        if (d.usrTxt)
          usrTxt = $('<pre style="border-style: solid; padding: 0.5em; height: 30em; overflow: auto;"/>').html(d.usrTxt);
        var ansTxt='';
        if (d.ansTxt)
          ansTxt = $('<pre style="border-style: solid; padding: 0.5em; height: 30em; overflow: auto;"/>').html(d.ansTxt);
        var usrImg='';
        if (d.usrImg){
          usrImg = $('<img/>');
          usrImg.attr('src',d.usrImg);
          usrImg.css('border','1px solid gray');
        }
        var ansImg='';
        if (d.ansImg){
          ansImg = $('<img/>',{src:d.ansImg,style:'border:1px solid gray'});
        }
        var usrGen = usrTxt;
        if (!usrGen) usrGen = usrImg;
        var ansGen = ansTxt;
        if (!ansGen) ansGen = ansImg;
        if (usrGen){
          var trh = $('<tr><th>Your answer</th></tr>');
          if (ansGen) trh.append($('<th>The right answer</th>'));
          var trr = $('<tr/>').append($('<td/>').append(usrGen));
          if (ansGen) trr.append($('<td/>').append(ansGen));
          var table = $('<table class="result"/>');table.append(trh);table.append(trr);
          res.append(table); 
        }
        if (d.error){
          var errMsg = $('<pre/>',{style:'border:medium solid gray;padding:0.5em'})
                          .html(d.errorMsg);
          res.append(errMsg);
        }
    }else{
      //Display queue then ask again in a couple of seconds
      if (showQueue(lang,q,d))
        setTimeout(function(){keepAsking(ticket,lang,q);},pollTime);
      else
        $('#tgtmsg_'+lang+q).html("You are no longer in the queue. Sorry.");
    }
  }});
}

function showQueue(lang,q,d){
  var amIstillInTheQueue;
  var tgt = $('#tgtres_'+lang+q);
  var marker = $('#queueMarker');
  if (marker.length==0){
    tgt.append($('<div style="height:80" id="queueMarker">|</div>'));
  }
  var prevQ = tgt.data('queue');
  if (!prevQ) prevQ = {};
  var thisQ = {};
  for (var i=0;i<d.queue.length;i++){
    var xpos = i*30+80;
    var item = {q:d.queue[i]};
    if (prevQ[item.q.ticket]){
      item.img = prevQ[item.q.ticket].img;
      item.img.animate({left:xpos},300);
    }else{
      item.img = $('<img/>',{src:item.q.uimg,css:{position:'absolute',left:xpos}});
      tgt.prepend(item.img);
    }
    item.img.css('border','solid medium '+(item.q.isRunner?'blue':'transparent'));
    thisQ[item.q.ticket] = item;
    if (item.q.ticket==d.ticket){
      amIstillInTheQueue = true;
      var me = $('#meInQueue');
      if (me.length==0)
        me = $('<img id="meInQueue" style="position:absolute" src="/youarehere.gif"/>',
               {css:{'position':'absolute',left:xpos}});
      tgt.append(me);
      me.animate({left:xpos});
    }
  }
  for (var t in prevQ){
    if (!thisQ[t])
      prevQ[t].img.remove();
  }
  tgt.data('queue',thisQ);
  return amIstillInTheQueue;
}

function flip(id){ //Show or hide hints
  $('#'+id).toggle('slow');
}

function flipSize(id){ // Change font in text area - useful for data projects
  $('form[name="'+id+'"] textarea').toggleClass('biggerTextarea');
}

function flipWhole(t,lang){//Show the whole program
  var swid = 'sw'+t+'_'+lang;
  var sw = $('#'+swid);
  var text = getProgText(t,lang);
  if (sw.length==0){
    sw = $('<textarea/>',{id:swid,val:text,'class':'sw',width:'90%',
                          rows:text.match(/\n/gi).length,readonly:'readonly'});
    $('#q'+t+' div.tgtC').before(sw);
  }else{
    sw.remove();
  }
}

function getProgText(t,lang){
  var shell = unescape($('form[name="shell"] input').val());
  var name = 'f'+lang+t;
  shell = shell.replace(/QcQ/,$('form[name="'+name+'"] textarea').val());
  return shell;
}

function resetForm(lang,q){
  var dt = $('form[name="g'+lang+q+'"] input[name="deftxt"]');
  if (dt.length>0)
    $('form[name="f'+lang+q+'"] textarea[name="c"]').val(dt.val());
}

function createCookie(name,value,days) {
if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
}
else var expires = "";
document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}

function sidebarDown(){
  $('#sidebarslidebox').toggle();
  $('#sidebarslidedown').html(
     $('#sidebarslidebox').is(':visible')?'Hide Sidebar':'Show Sidebar');
}

