var Functions = (function() {

  /** Prüft auf Integer */
  function isInt(x)
  {
    var y = parseInt(x);
    if (isNaN(y)) return false;

    return (x == y);
  }

  /** macht grosse Zahlen lesbar */
  function formatNumber(val)
  {
    val = val.toString();

    var rv = "";
    for (var pos = val.length - 3; pos >= 1; pos -= 3)
    {
      rv = "." + val.substr(pos, 3) + rv;
    }

    rv = val.substring(0, pos + 3) + rv;

    return rv;
  }

  function pad(x)
  {
    return (x < 10 ? "0" + x : "" + x);
  }

  function formatTime(sec)
  {
    var secLeft = parseInt(sec);
    if (isNaN(secLeft) || secLeft < 0) {
      return "&mdash;";
    }

    var d = Math.floor(secLeft / 86400);
    var h = Math.floor(secLeft % 86400 / 3600);
    var m = Math.floor(secLeft % 3600 / 60);
    var s = secLeft % 60;

    if (d > 0) {
      return pad(d) + "d " + pad(h) + "h";
    } else if (h > 0) {
      return pad(h) + "h " + pad(m) + "m";
    } else {
      return pad(m) + "m " + pad(s) + "s";
    }
  }

  /** multipliziert zwei Zahlen und schreibt das Ergebnis in eine id */
  function multiply (x, y, $id)
  {
    if (!$id.length || !isInt(x) || !isInt(y)) return;

    $id.text(formatNumber(x * y));
  }

  /** Default Slider
   * @param scroll id vom "ziehelement"
   * @param track id vom Element, welches scroll umschliesst
   * @param contents id`s der Bewegungs-Elemente [id1, id2, ...]
   */
  function getSlider(scroll, track, contents)
  {
    var $scroll = $("#" + scroll);
    var $track = $("#" + track);

    if (!$scroll.length || !$track.length) return;

    var $contents = $.map(contents, function(v) {
      var $content = $("#" + v);
      return ($content.length ? $content : null);
    });

    if (!$contents.length) return;

    var trackMax = $track.height() - $scroll.height();

    $scroll.draggable({
      addClasses: false,
      axis: "y",
      containment: $track.get(0),
      drag: function(_, ui) {
        for (var i = 0, n = $contents.length; i < n; ++i) {
          var $content = $contents[i];
          var contentMax = $content.get(0).scrollHeight - $content.height();
          $content.scrollTop(contentMax * ui.position.top / trackMax);
        }
      }
    });
  }

  /** alte Alternative zum Slider */
  function slideX(id, dir, num, width)
  {
    var $target = $("#" + id);

    var pos = $target.stop(true, true).position().left / width;
    var nextPos = (dir == "left" ? (pos - (num - 1)) % num : (pos - 1) % num);

    $target.animate({left: nextPos * width}, 500);

    return false;
  }

  function showPopup(file, windowname, features)
  {
    var MyWindow = window.open(file, windowname, features);
    MyWindow.focus();
    return true;
  }

  // profile
  function showTownDistrict(townID)
  {
    if (!townID) return false;

    var $showLink = $("#showLink" + townID);
    var $showTownDistrict = $("#showTownDistrict" + townID);

    if ($showTownDistrict.filter(":visible").length)
    {
      $showLink.html(Game.i18n.detailsOn);
      $showTownDistrict.hide();
    }
    else
    {
      $showLink.html(Game.i18n.hideDetails);
      $showTownDistrict.show();
    }

    return true;
  }


  // family/group
  function showID(id)
  {
    var $showLink = $("#showLink" + id);
    var $showID = $("#showID" + id);

    if (!$showLink.length || !$showID.length) return false;

    if ($showLink.html() == Game.i18n.hideDetails)
    {
      $showLink.html(Game.i18n.detailsOn);
      $showID.hide();
    }
    else
    {
      $showLink.html(Game.i18n.hideDetails);
      $showID.show();
    }

    return false;
  }


  return {
    isInt: isInt,
    formatNumber: formatNumber,
    formatTime: formatTime,
    multiply: multiply,
    getSlider: getSlider,
    slideX: slideX,
    showPopup: showPopup,
    showTownDistrict: showTownDistrict,
    showID: showID
  };

})();
