﻿var QuekClient =
{
  queks: {},
  queksByName: {},
  names: [],
  gravity: false,
  events: [],
  scrollTop: 0,

  join: function(name)
  {
    if (!name)
    {
      var input = $('name');
      var name = input.get('value').substring(0, 15);
      input.erase('value');
    }
    if (name)
    {
      name = name.replace(/</g, "&lt;");
      $("buttons").style.display = "block";
      $(document.body).addClass("loggedin");

      var roomName = document.location.search.replace(/.*?room=(.*)/g, '$1');
      roomName = (roomName == document.location.search) ? 0 : roomName;
      Multiplayer.connect({ "name": name }, roomName);

      var id = "self";
      var quek = new Quek(id, name);

      QuekClient.queks[id] = quek;
      QuekClient.queksByName[name] = quek;
      QuekClient.names.push(name);
    }
  },
  // generic event handler for all events that we get back from the server
  handleEvent: function(id, name, value)
  {
    // store the event to postpone execution time
    QuekClient.events.push([id, name, value]);
  },
  // we added support for the Multiplayer library to notify us of the end of the events
  notifyEndOfEvents: function()
  {
    var l = QuekClient.events.length;
    if (l == 0) return;
    var milliSeconds = Multiplayer.interval * 0.8;
    var timeOutPerEvent = Math.floor(milliSeconds / l);
    for (var i = 0; i < l; i++)
    {
      var ev = QuekClient.events[i];
      var id = ev[0];
      var name = ev[1];
      var value = ev[2];
      // TODO: (Ben sez) this is mighty inconvenient. Rewrite to a proper function plz
      setTimeout("QuekClient.handleEventAfterDelay(\"" + id + "\", \"" + name + "\", \"" + value + "\");", i * timeOutPerEvent);
    }
    QuekClient.events = [];
  },
  handleEventAfterDelay: function(userId, name, value)
  {
    if (!QuekClient.queks[userId])
      QuekClient.queks[userId] = new Quek(userId);
    var quek = QuekClient.queks[userId];
    quek.handleEvent(name, value);

    if (name == "name")
    {
      if (!QuekClient.queksByName[value])
      {
        QuekClient.queksByName[value] = quek;
        QuekClient.names.push(value);
      }
    }

    if (name == "disconnect")
    {
      delete QuekClient.queks[userId];
      delete QuekClient.queksByName[quek.name];
      QuekClient.names.erase(quek.name);
    }
  },
  getTarget: function(text)
  {
    var target;

    var escape = function(s) { return s.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1') };
    var escapedNames = QuekClient.names.map(escape);

    var regExp = new RegExp("\\b(" + escapedNames.join("|") + ")\\b");
    var match = text.match(regExp);
    if (match)
    {
      var name = match[1];
      target = QuekClient.queksByName[name];
    }

    return target || null;
  },
  SetGravity: function(on)
  {
    var me = this.queks.self;
    if (on)
    {
      me.elements.quek.removeClass('gravity-off');
      me.elements.quek.addClass('gravity-on');
      me.dragger.options.gravity = { x: 0, y: 0.3 };
    }
    else
    {
      me.elements.quek.removeClass('gravity-on');
      me.elements.quek.addClass('gravity-off');
      me.dragger.options.gravity = false;
    }
  },
  go: function(keyCode)
  {
    if (!keyCode || keyCode == 13)
    {
      var me = this.queks.self;
      var url = me.elements.gotoUrl.value;
      if (!url.contains('http://'))
        url = 'http://' + url
      if (url && !url.contains('quek.nl'))
      {
        me.elements.gotoUrl.value = 'http://'
        me.sendUrl(url);
        me.setFollowedQuek(null);
      }
    }
  },
  // this wrapper is used as replacement on the Multiplayer object, to notify when the last event was given
  handleResponseWrapper: function(js)
  {
    Multiplayer.ori_handleResponse(js);
    QuekClient.notifyEndOfEvents();
  },

  //resets all the quek positions. Used when resizing windows and using the iframe
  repositionQueks: function()
  {
    $H(QuekClient.queks).each(function(quek)
    {
      var position = quek.elements.quek.getPosition();
      quek.setPosition(position.x, position.y);
    });
  },

  toggleGravity: function(hasGravity)
  {
    this.hasGravity = hasGravity === undefined ? !this.hasGravity : hasGravity;
    $H(this.queks).each(function(quek)
    {
      quek.toggleGravity(QuekClient.hasGravity);
    });
  }
};

window.addEvent('domready', function()
{
  var scrollTimeout = null;

  window.onresize = function()
  {
    if (QuekClient.queks.self)
      QuekClient.queks.self.updateDragLimit();

    QuekClient.repositionQueks();
  };

  $(document.body).addClass(Browser.Engine.name);

  if (Browser.Engine.trident)
  {
    $(document.body).addClass('ie');
    var ie = (navigator.appVersion.indexOf('MSIE 8.0') > -1) ? 'ie8' : 'ie7';
    $(document.body).addClass(ie);
  }

  window.onscroll = function()
  {
    if (scrollTimeout)
      clearTimeout(scrollTimeout);

    scrollTimeout = setTimeout(function()
    {
      QuekClient.scrollTop = $(window).getScrollTop();
    }, 300);
  }

  var hasReqestedVersion = DetectFlashVer(8, 0, 0);
  if (!hasReqestedVersion)
  {
    //html eruit, boodschap erin
    $("joinForm").setStyle("display", "none");

    var noFlashParagraph = new Element('p', {
      'class': 'noFlashParagraph',
      'html': 'Zonder flash kan je niet quekken, <a href="http://get.adobe.com/flashplayer/" target="_blank">haal het hier!</a>'
    });

    //$("joinForm").insertAfter($("joinForm").parent, noFlashParagraph);
    $("joinForm").parentNode.appendChild(noFlashParagraph);
  };
});


