$(document).ready(function() {

  Cufon.replace('#score,#floating')('h1,h2,h3')('#scoreboard>div>*')('.button').now();

  var menuitems=$('<div>').id('menu').append(
    $('<a class="button" rel="newgame">New game</a>')
  ).append(
    $('<a class="button" rel="highscores">High scores</a>')
  ).append(
    $('<a class="button" rel="codecredits">About</a>')
  );

  /* */
  var menu=$.bubble({
    width:240
  }).id('menu').append(
    $('<h1><center>jQuery.samegame</center></h1><br/>').add(menuitems)
  ).find('a').click(function() {
    var op=$(this).attr('rel');
    $('#menu').fadeOut(function() {
      if (op=='newgame') {$.gameStart();}
      if (op=='highscores') {$.showScoreboard();}
      if (op=='codecredits') {$.showCodecredits();}
    });

  }).end().trigger('center').fadeIn();
  /* */

});

jQuery.bubble=function(options) {
  var b=$('<div>').addClass('bubble').appendTo($('body')).bind('center',function() {
    var p=parseInt($(this).css('paddingLeft'),10);
    $(this).css({
      marginLeft:'-'+($(this).width()+p*2)/2+'px',
      marginTop:'-'+($(this).height()+p*2)/2+'px'
    });
		Cufon.refresh();
  });

  if (options.width) {
    b.css({
      width:options.width,
    });
  }

  return b;
}

jQuery.clearBubbles=function(callback) {
  var b=$('.bubble');
  var total=b.length;
  var procd=0;
  b.fadeOut(250,function() {
    $(this).remove();
    procd++;
    if (procd==total && callback) callback.call();
  });
}

jQuery.gameStart=function() {

  $.build().each(function() {

    $('#wrapper').css({
      marginLeft:-$(this).outerWidth()/2,
      marginTop:-$(this).outerHeight()/2
    });

    Cufon.refresh();

  }).fadeIn(1000);
}

jQuery.submitScore=function() {
  $('#playername, #submitscore').unbind();
  var playername=$('#playername').val();
  var score=game.score;
  $.cookie(game.cookie_playername,playername);
  $.ajax({
    url:'score.php',
    type:'POST',
    data:{
      op:'set',
      playername:playername,
      score:score,
      colors:game.colors,
      moves:game.moves
    },
    success:function() {
      $('#playername').closest('.bubble').fadeOut(function() {
        $.showScoreboard();
        $(this).remove();
      });
    }
  });
}

jQuery.gameEnd=function() {
  $('#game').fadeOut(1000,function() {

		var c=$.cookie(game.cookie_playername);

    $.bubble({
      width:300
    }).html(
    	'<center><h1>Final score: '+game.score+'</h1><h2>Enter your name</h2>'
    	+'<input type="text" id="playername"/><br/><br/>'
    	+'<a class="button" id="submitscore">Submit score</a></center>'
    ).find('a.button').click($.submitScore).end()
    .find('input').keyup(function(event) {
      if (event.which==13) {$.submitScore();}
    }).val(c?c:'Anonymous')
    .end().trigger('center').fadeIn(function() {
    	$(this).find('input').focus().select()
    });

  });

}

jQuery.showScoreboard=function() {

  var b=$.bubble({
    width:300
  }).id('scoreboard').each(function() {
    $('<h1>Top scores</h1><div class="scorelist"></div>').add(

      $('<a rel="scores prev">prev</a><a rel="scores next">next</a>').click(function() {

        var rel=$(this).attr('rel').split(' ')[1];
        var currentpage=$('#scoreboard').data('page');
        var newpage=currentpage+(rel=='next'?1:-1);

        if (newpage>0 && newpage<=10) {
          $('#scoreboard').trigger('loadpage',[newpage]);
        }
      })

    ).add(
      $('<center>').append(
        $('<a class="button">Menu</a>').click(function() {
          $('#scoreboard').fadeOut(function() {
            $('#menu').fadeIn();
            $(this).remove();
          });
        })
      )
    ).appendTo($(this));

  }).bind('loadpage',function(event,page) {
    $.loadScorePage(page,game.scoreboard_size,function(data) {
      var $s=$('#scoreboard');
      var offs=(page-1)*game.scoreboard_size;

      $s.find('.scorelist').empty();
      var scorelist=document.createDocumentFragment();
      for (var i=0;i<game.scoreboard_size;i++) {
        var row=$('<div>').append(
          $('<u>'+(i+1+offs)+'</u>'+(i<data.length?'<b>'+data[i].playername+'</b><i>'+data[i].score+'</i>':''))
        );
        scorelist.appendChild(row[0]);
      }

      $s.find('.scorelist')[0].appendChild(scorelist);
      Cufon.refresh();
      $s.data('page',page).trigger('center').fadeIn();
    });
  }).trigger('loadpage',[1]);

}

jQuery.loadScorePage=function(page,limit,callback) {
  $.ajax({
    url:'score.php',
    type:'POST',
    data:{
      op:'get',
      page:page,
      count:limit
    },
    dataType:'json',
    success:callback
  });
}

jQuery.showCodecredits=function() {
  $.ajax({
    url:'about.html',
    dataType:'html',
    success:function(data) {
      $.bubble({
        width:240
      }).id('about').html(data).find('a.button').click(function() {
        $('#about').fadeOut(function() {
          $('#menu').fadeIn();
          $(this).remove();
        });
      }).end().find('a.em').attr('href','mailto:%6C%79%73%61%6E%64%65%72%67%72%61%79%40%67%6D%61%69%6C%2E%63%6F%6D')
      .end().trigger('center').fadeIn();
    }
  });
}