var PeriodicalExecuter = Class.create({
  initialize: function(callback, frequency) {
    this.callback = callback;
    this.currentlyExecuting = false;

    this._setFrequency(frequency);
  },

  execute: function() {
    this.callback(this);
  },

  _setFrequency: function(frequency){
    if(this.timer || frequency != this.frequency){
      clearInterval(this.timer);
      this.timer = null;
    }

    if(frequency > 0){
      this.timer = setInterval(this.onTimerEvent.bind(this), frequency * 1000);
      this.frequency = frequency;
    }
  },

  stop: function() {
    this._setFrequency(0);
  },

  start: function(frequency){
    if(Object.isUndefined(frequency)) frequency = this.frequency;
    this._setFrequency(frequency);
  },

  toggle: function(){
	if (this.timer == null){
		this.start();
		return true;
	} else {
		this.stop();
		return false;
	}
  },

  isActive: function(){
	if (this.timer == null){
		return false;
	} else {
		return true;
	}
  },

  restart: function(){ //really bad function — ignores the 'frequency check', only use with the custom start/stop functions.
	this._setFrequency(0);
	frequency = this.frequency;
	    this._setFrequency(frequency);
  },

  onTimerEvent: function() {
    if (!this.currentlyExecuting) {
      try {
        this.currentlyExecuting = true;
        this.execute();
      } finally {
        this.currentlyExecuting = false;
      }
    }
  }
});