/**
 * Obiektowy oklejacz na window.setInterval pozwalający na kontrolę - w szczególności
 * zmianę prędkości i pauzowanie.
 * @param callback (function)
 * @param frequency (float)
 * @param noApply (bool) [optional] ustaw na true jeśli nie chcesz żeby się od razu applynęło
 * @author ChanibaL
 */
function Interval(callback, frequency, noApply) {
	this.intervalId=undefined;
	this._T=undefined;
	this._callback=undefined;

	this.setCallback(callback, true);
	this.setFrequency(frequency, true)
	if(noApply != true)
		this.apply();
}

Interval.prototype=new Object();

/**
 * Ustawia czas wykonania (w ms)milisecs
 * @param milisecs (int)
 * @param noApply (bool) [optional] ustaw na true jeśli nie chcesz żeby się od razu applynęło
 * @return Interval (do chainowania)
 */
Interval.prototype.setPeriod=function(milisecs, noApply) {
	this._T=milisecs;
	if(noApply != true)
		this.apply();
	return this;
};

/**
 * Ustawia częstotliwość wykonywania (w Hz)
 * @param hertz (float)
 * @param noApply (bool) [optional] ustaw na true jeśli nie chcesz żeby się od razu applynęło
 * @return Interval (do chainowania)
 */
Interval.prototype.setFrequency=function(hertz, noApply) {
	this._T=1000.0/hertz;
	if(noApply != true)
		this.apply();
	return this;
};

/**
 * Ustawia callback
 * @param callback (function)
 * @param noApply (bool) [optional] ustaw na true jeśli nie chcesz żeby się od razu applynęło
 * @return Interval (do chainowania)
 */
Interval.prototype.setCallback=function(callback, noApply) {
	this._callback=callback;
	if(noApply != true)
		this.apply();
	return this;
}

/**
 * Zatrzymuje wywoływanie (nie ma błędu jeśli już zatrzymane)
 * @return Interval (do chainowania)
 */
Interval.prototype.stop=function() {
	if(this.intervalId != undefined) {
		window.clearInterval(this.intervalId);
		this.intervalId=undefined;
	}
	return this;
}

/**
 * Uruchamia wywoływanie (nic nie robi jeśli już uruchomione)
 * @return Interval (do chainowania)
 */
Interval.prototype.start=function() {
	if(this.intervalId == undefined) {
		this.intervalId=window.setInterval(this._callback, this._T);
	}
	return this;
}


/**
 * Zatwierdza zmiany w obiekcie uruchamiając interval
 * @return Interval (do chainowania)
 */
Interval.prototype.apply=function() {
	this.stop();
	this.start();
	return this;
}
