function Josephus(position_in_line, prisoner_count, skip_number) {
	
	if(0 == prisoner_count) {
		throw new Error("Need to have at least one prisoner");
	}

	if(0 > prisoner_count) {
		prisoner_count *= -1;
	}
	
	if(0 > skip_number) {
		skip_number *= -1;
	}
	
	if(0 > position_in_line) {
		position_in_line *= -1;
	}
		
	if(position_in_line > prisoner_count) {
		throw new Error("Need to stand -in- the Q");
	}
	
	this._skip = skip_number;
	this._position = position_in_line;
	
	this._prisoners = new Array(prisoner_count);
	for(var ii=0;ii<prisoner_count;ii++) {
		this._prisoners[ii] = 1;
	}
};

Josephus.prototype.hitList = function() {
	return this._hitList;
}

Josephus.prototype.startShooting = function() {
	var bullets_used = 0;
	var current_skip = 0;
	var bullet_limit = this._prisoners.length-1;
	this._hitList = new Array(bullet_limit); //we kill all but the last
	
	while(bullets_used < bullet_limit) {
		for(var ii=0;ii<bullet_limit+1;ii++) {
			if(this._prisoners[ii] == 0){ //ignore dead prisoners
				continue;
			} 
			if(++current_skip<this._skip) { //don't shoot this one
				continue;
			}
			
			this._prisoners[ii] = 0;
			this._hitList[bullets_used++] = ii+1;
			current_skip = 0;
		}
	}
	return true;
}
Josephus.prototype.survivor = function() {
	var bHit = false;
	for(var ii=0;ii<this._prisoners.length;ii++) {
		bHit = false;
		for(var jj=0;jj<this._hitList.length;jj++) {
			if(this._hitList[jj] == ii+1) {
				bHit = true;
				break;
			}
		}
		if(!bHit) {
			return ii+1;
		}
	}
	return -1;
}
Josephus.prototype.fatalBullet = function(new_position) {
	if(null != new_position) {
		this._position = new_position;
	}
	for(var ii=0;ii<this._hitList.length;ii++) {
		if(this._hitList[ii] == this._position) {
			return ii+1;
		}
	}
	return 0;
}
			
Josephus.prototype.prisoners = function() {
  return this._prisoners.length;
};

Josephus.prototype.skip = function() {
  return this._skip;
};

Josephus.prototype.position = function() {
  return this._position;
};
