/*
 * Moving blocks - Dynamic block game
 *
 * Copyright (c) 2010 Boris Dinkevich (dinkevich.com)
 * Licensed under the GPL (GPL-LICENSE.txt) licenses.
 *
 * $Date: 2010-01-01 10:10:01 -0200 (Fri, 01 Jan 2010) $
 * $Rev: 0001 $
 */

var mouseX = 0;
var mouseY = 0;

var run_away = 0;
var hover = 0;

var target_floater;
var master_floater;

var done = 0;
var border = 5;
    
var max_reached = 0;

function Floater(elem, master) {
    this.x = parseInt(elem.css("left"));
    this.y = parseInt(elem.css("top"));
    this.w = parseInt(elem.css("width"));
    this.h = parseInt(elem.css("height"));

    /* Since the all other divs are relative to the master, put the master at 0,0 */
    if (typeof(master) != 'undefined')
    {
        this.h -= 2 * border;
        this.w -= 2 * border;
        this.x = 0;
        this.y = 0;
    }
}

var floaters = new Array();

function set_cords(item, x, y)
{
    item.css("left", x+"px").css("top", y+"px");
}

function update_cords()
{
    for (var i=floaters.length-1; i>=0; --i) 
    {
        var x = floaters[i].x;
        var y = floaters[i].y;
        set_cords($('#'+i), x, y);
    }
}

function init_all() 
{
    var count = 0;

    $(".floater").map(function() {
            $(this).attr("id", count);
            floaters[count] = new Floater($(this));
            count++;
            });

    target_floater = new Floater($("div.target_floater"));
    master_floater = new Floater($("div.master"), 1);

    update_cords();
}

function in_box(floater_a, floater_b)
{
    Mx = floater_a.x - border;
    My = floater_a.y - border;
    Nx = floater_a.x + floater_a.w + border;
    Ny = floater_a.y + floater_a.h + border;

    Ox = floater_b.x - border;
    Oy = floater_b.y - border;
    Px = floater_b.x + floater_b.w + border;
    Py = floater_b.y + floater_b.h + border;

    if (Mx<Ox && My<Oy && Px<Nx && Py<Ny)
        return 1;
    return 0;
}

function check_done()
{
    var total = 0;
    var inside = 0;

    $("div.link_floater").map(function() {
            total += 1;
            if (in_box(target_floater, floaters[parseInt($(this).attr("id"))]))
            {
                if (!$(this).hasClass("inside"))
                {
                    $(this).addClass("inside");
                }
                inside += 1;
            }
            else if ($(this).hasClass("inside"))
            {
                $(this).removeClass("inside");
            }
    });

    if (inside > max_reached)
    {
        max_reached = inside;
        pageTracker._trackEvent('Game', ''+inside);
        pageTracker._trackPageview('/order/'+inside);
    }

    if (total == inside)
    {
        done = 1;
        $("div.master").fadeTo(300, 0.2);
        $("div.success").fadeIn(600, function() {
                setTimeout(function() {
                        $("div.success").fadeOut(300);
                        $("div.master").fadeTo(300, 1);
                    }, 1000)});

        /* Google analytics page tracker */
        pageTracker._trackEvent('Game', 'Done', 'User finished it all');
        pageTracker._trackPageview('/order/done');
    }
}

function collision(floater_a, floater_b)
{
    Mx = floater_a.x - border;
    My = floater_a.y - border;
    Nx = floater_a.x + floater_a.w + border;
    Ny = floater_a.y + floater_a.h + border;

    Ox = floater_b.x - border;
    Oy = floater_b.y - border;
    Px = floater_b.x + floater_b.w + border;
    Py = floater_b.y + floater_b.h + border;

    if ((Mx>Px) || (Ox>Nx) || (My>Py) || (Oy>Ny))
        return 0;

    return 1;
}
function collisions(obj)
{
    for (var i=floaters.length-1; i>=0; --i)
    {
        if (i == obj)
        {
            continue;
        }

        if (collision(floaters[obj], floaters[i]))
        {
            return 1;
        }
    }

    return 0;
}    

function update_floaters()
{
      for (var i=floaters.length-1; i>=0; --i)
      {
          // If we hover over an object, it should stay put
          if (run_away && hover == i)
          {
              continue;
          }

          var floater = floaters[i]
          var speed = 100;
          var dir = 1;

          // When someone is being hovered, the rest 'run away'
          if (run_away)
          {
              dir = -1;
          }

          var x_dir = (floater.x - mouseX) / 50;
          var y_dir = (floater.y - mouseY) / 50;
              
          var new_x = floater.x - x_dir * dir;
          var new_y = floater.y - y_dir * dir;

          var temp_x = floater.x;
          var temp_y = floater.y;

          floaters[i].x = new_x;
          if (collisions(i) || !in_box(master_floater, floaters[i]))
          {
              floaters[i].x = temp_x;
          }
          
          floaters[i].y = new_y;
          if (collisions(i) || !in_box(master_floater, floaters[i]))
          {
              floaters[i].y = temp_y;
          }

      }

      update_cords();
      check_done();

      if (!done)
          setTimeout(update_floaters, 20);
}

$(document).ready( function() {
    $(document).mousemove(function handle_mouse(e) 
    {
    mouseX = e.clientX - 100;
    mouseY = e.clientY - 100;
    });

    $("div.floater").hover(
        function() {
            run_away = 1;
            hover = $(this).attr("id");
            },
        function() {
            run_away = 0;
        });
        
    init_all();
    setTimeout(update_floaters, 10);
});


