// Alle markieren / Markierungen aufheben
function switchCheckboxes(formname, status)
{
  var x = document.forms[formname].elements;
  for (var i=0; i<x.length; i++)
  {
    x[i].checked = status;
  }
}

function calculate(secs, num1, num2) {
  s = ((Math.floor(secs/num1))%num2).toString();
  if (s.length < 2) {
  s = "0" + s; }
  return s;
}

function formatTime(msec, name)
{
  var sec = Math.floor(msec/1000);
  var $e = $('#'+name);
  var sDay = calculate(sec, 86400, 100000);
  var sHour = calculate(sec, 3600, 24);
  var sMinute = calculate(sec, 60, 60);
  var sSec = calculate(sec, 1, 60);

  if (sDay != '00') { time = sDay+'d&nbsp;'+sHour+'h'; }
  else if(sHour != '00') { time = sHour+'h&nbsp;'+sMinute+'m'; }
  else { time = sMinute+'m&nbsp;'+sSec+'s'; }

  if (msec > 0)
  {
    $e.html(time);
  }
  else
  {
    $e.html('-');
  }
}

function countdown2(msec, name)
{
  formatTime(msec, name);
  if (msec>0)
  {
    setTimeout("countdown2(" + (msec-1000) + ", '" + name + "')", 1000);
  }
  else
  {
    location.reload(true);
  }
}

function showLang()
{
  if ($('#selectLang:hidden')) {
    $('#selectLang').slideDown(700);
  }
  else {
    $('#selectLang').slideUp();
  }

  return false;
}


function slide(element, type)
{
  var $e = $('#' + element);
	if(type == 'down' && $('#' + element + ':hidden'))
	{
	  $('#' + element).slideDown();
		return true;
	}
	if(type == 'up' && $('#' + element + ':visible'))
	{
	  $('#' + element).slideUp();
		return true;
	}
	return false;
}

function isNumber(val) {
  return /^-?((\d+\.?\d?)|(\.\d+))$/.test(val);
}

function validateBuyFactor(iValue)
{
  iValue = parseInt(iValue, 10);
  if (isNumber(iValue) && iValue > 0 && iValue <= 1000) {
    return true; }

  return false;
}

/* imported: adds commas and points to a number returning a formatted string */
function addCommas(nStr)
{
  nStr += '';
  x = nStr.split('.');
  x1 = x[0];
  x2 = x.length > 1 ? ',' + x[1] : '';
  var rgx = /(\d+)(\d{3})/;
  while (rgx.test(x1)) {
    x1 = x1.replace(rgx, '$1' + '.' + '$2');
  }
  return x1 + x2;
}

function changeBuyFactor(sWare, dx)
{
  var $buyFactor = $("#buy_factor_" + sWare);
  var $buyFactorDisplay = $("#buy_factor_display_" + sWare);

  var x = parseInt($buyFactor.val()) + parseInt(dx);
  if (isNaN(x) || x <= 0 || x > 1000) return false;

  $buyFactorDisplay.val(x);
  $buyFactor.val(x);

  return buyFactorTotals(sWare, x);
}

function adjustBuyFactor(sWare)
{
  var $buyFactor = $("#buy_factor_" + sWare);
  var $buyFactorDisplay = $("#buy_factor_display_" + sWare);

  var x = parseInt($buyFactorDisplay.val());
  if (isNaN(x) || x <= 0 || x > 1000) {
    $buyFactorDisplay.val($buyFactor.val());
    alert("Bitte nur Zahlen zwischen 1 und 1000 eingeben!");
    return false;
  }

  $buyFactor.val(x);
  $buyFactorDisplay.val(x);

  return buyFactorTotals(sWare, x);
}

function buyFactorTotals(sWare, x)
{
  // check if production is above the minimum
  var bc = parseInt($('#buy_costs_once_' + sWare).val());
  var pr = parseInt($('#production_' + sWare).val());

  var buyCosts = x * bc;
  var buyTotal = x * pr;

  buyCosts = buyTotal > buyMinWares ? buyCosts : bc;
  buyTotal = buyTotal > buyMinWares ? buyTotal : buyMinWares;

  $('#buy_costs_' + sWare).html(addCommas(buyCosts));
  $('#buy_total_' + sWare).html(addCommas(buyTotal));

  return true;
}

var ServerTime = (function() {
  var dt, $target, $meridienArt;

  function start(serverTime, target, meridienArt) {
    var serverTime = new Date(serverTime);
    if (isNaN(serverTime)) {
      throw "cannot parse serverTime";
    }

    if (meridienArt) {
      $meridienArt = true;
    }

    dt = new Date() - serverTime;

    $target = (typeof(target) == "string" ? $("#" + target) : target);
    if (!$target) {
      throw "no valid target";
    }

    display();
  }

  function schedule() {
    var serverTime = new Date(new Date() - dt);

    var timeout = 1000 * (60 - serverTime.getSeconds());
    window.setTimeout(function() { display(); }, timeout);
  }

  function simpleFormat(hours, minutes) {
    var hs = "00" + hours; 
    var ms = "00" + minutes;   
    return hs.substring(hs.length - 2) + ":" + ms.substring(ms.length - 2);
  }

  function display() {
    var serverTime = new Date(new Date() - dt);
    
    var hours = serverTime.getHours();
    if ($meridienArt && hours > 12) {          
          hours = hours - 12;
    }
    $target.html(simpleFormat(hours, serverTime.getMinutes()));

    schedule();
  }

  return {
    start: start
  };
})();


var Timers = (function() {
  var timers = [];

  function add(timerListener, milliseconds) {
    timers.push(window.setTimeout(timerListener, milliseconds));
    return this;
  }

  function clear() {
    for (var i = 0, n = timers.length; i < n; ++i) {
      window.clearTimeout(timers[i]);
    }
    timers = [];
    return this;
  }

  function toString() {
    return timers.join(", ");
  }

  return {
    add: add,
    clear: clear,
    toString: toString
  };
})();


var Countdowns = (function() {

  function Countdown($target, secLeft, callback) {
    this.init($target, secLeft, callback);
  }

  Countdown.prototype.init = function($target, secLeft, callback) {
    if (!$target || $target.length != 1 || isNaN(parseInt(secLeft)) || secLeft < 0) {
      // console.log("illegal arguments for Countdown.init(" + $target + ", " + secLeft + ")");
      return;
    }

    this.added = new Date();
    this.$target = $target;
    this.secStart = this.secLeft = secLeft;
    this.callback = ((jQuery.isFunction(callback)) ? callback : (function() { location.reload(); } ));

    this.display();
  };

  Countdown.prototype.display = function() {
    formatTime(this.$target, this.secLeft);
    this.$target.attr("duration", this.secLeft);
    this.schedule();
  };

  Countdown.prototype.schedule = function() {
    if (this.secLeft == 0 && this.callback) {
      this.callback();
      return;
    }

    this.secLeft -= 1;

    var ctx = this;
    this.timer = window.setTimeout(function() { ctx.display(); }, 1000);
  };

  Countdown.prototype.destroy = function() {
    this.timer && window.clearTimeout(this.timer);
    // delete this;
  };

  Countdown.prototype.toString = function() {
    return this.secLeft + "/" + this.secStart + " (@" + this.$target.get(0) + ")";
  };


  var countdowns = [];

  function init() {
    $("span.countdown").each(function() {
      add($(this), $(this).attr("duration"));
    });
  }

  function add($target, secLeft, callback) {
    countdowns.push(new Countdown($target, secLeft, callback));
    return this;
  }

  function clear() {
    for (var i = 0, n = countdowns.length; i < n; ++i) {
      countdowns[i].destroy();
    }
    countdowns = [];
  }

  function toString() {
    countdowns.sort(function(v1, v2) { return v1.secLeft - v2.secLeft; });

    var s = [];
    for (var i = 0, n = countdowns.length; i < n; ++i) {
      s.push(countdowns[i]);
    }

    return s.join(", ");
  }


  function calculate(secs, num1, num2) {
    var s = Math.floor(secs / num1) % num2;
    return (s < 10 ? "0" + s : s);
  };

  function formatTime($target, secLeft) {
    if (secLeft <= 0) {
      $target.html("00m&nbsp;00s");
      return;
    }

    var sDay = calculate(secLeft, 86400, 100000);
    var sHour = calculate(secLeft, 3600, 24);
    var sMinute = calculate(secLeft, 60, 60);
    var sSec = calculate(secLeft, 1, 60);

    var timeString;
    if (sDay != '00')
      timeString = sDay + 'd&nbsp;' + sHour + 'h';
    else if (sHour != '00')
      timeString = sHour + 'h&nbsp;' +sMinute + 'm';
    else
      timeString = sMinute + 'm&nbsp;' + sSec + 's';

    $target.html(timeString);
  };

  return {
    init: init,
    add: add,
    clear: clear,
    toString: toString,
    dump: countdowns
  };
})();
