ball clock

by Bryson Murray

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="clockFrame">
  <div id="inputs">
    <div class="inputLine">
      <label>Number of Balls</label>
      <input id="ballCount">
      <button id="method1">Method 1</button>
    </div>
    <div class="inputLine">
      <label>Number of Min to Run Clock</label>
      <input id="runTime">
      <button id="method2">Method 2</button>
    </div>
  </div>
  <div id="output"></div>
  <div id="error"></div>
</div>

CSS

#clockFrame{
  width: 500px;
}

#inputs{
  width: 100%;
}

.inputLine{
  width: 100%;
  display: inline-block;
}

#error{
  color: red;
}

JavaScript

function Ball(number, type) {		
    this.number = number;    
    this.type = type;
}

function BallClock(ballCount) {		
    
    this.generateBallQueue = function(ballCount){
			var ballQueue = [];   
      for(var i = 0; i < ballCount; i++){
        ballQueue.push(new Ball(i+1,"regular"));
      }
      return ballQueue;
    }
    
    this.totalMinRun = 0;
    this.totalClockCyclesRun = 0;
    this.isBallOrderInStartingOrder = true;
    this.ballCount = ballCount;
    
    this.MaxMin = 4;
    this.MaxFiveMin = 11;
    this.MaxHour = 12;
    
    this.Min = [];
    this.FiveMin = [];
    this.Hour = [new Ball(-1,"fixed")];
    this.Main = this.generateBallQueue(ballCount);
    
    this.getNextBall = function(){
    	if(this.isBallOrderInStartingOrder){
    		this.isBallOrderInStartingOrder = false;
      }
			return this.Main.shift();
		};
    
    this.addBallToMin = function(curBall){
    	this.totalMinRun++;
      if(this.Min.length === this.MaxMin){
        for(var i = 0; i < this.MaxMin; i++){
          this.Main.push(this.Min.pop());
        }
        this.addBallToFiveMin(curBall);
      } 
      else{
        this.Min.push(curBall);  
      }
    };
    
    this.addBallToFiveMin = function(curBall){
      if(this.FiveMin.length === this.MaxFiveMin){
        for(var i = 0; i < this.MaxFiveMin; i++){
          this.Main.push(this.FiveMin.pop());
        }
        this.addBallToHour(curBall);
      } 
      else{
        this.FiveMin.push(curBall);  
      }
    }

    this.addBallToHour = function(curBall){
      if(this.Hour.length === this.MaxHour){  
        for(var i = 0; i < this.MaxHour-1; i++){
          this.Main.push(this.Hour.pop());
        }
        this.Main.push(curBall);
        this.totalClockCyclesRun++;
        this.isBallOrderBackToStartingOrder();        
      } 
      else{
        this.Hour.push(curBall);  
      }
    }
    
    this.isBallOrderBackToStartingOrder = function(){
    	if(this.totalClockCyclesRun > 28 &&...