<!DOCTYPE html>
<html>

  <head>
    <script data-require="jquery@*" data-semver="3.0.0" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.js"></script>
    <link rel="stylesheet" href="style.css" />
  </head>

  <body>
  
  <!-- just for kicks -->
  <div style="height: 304px;"></div>
    
	<!-- wavesurfer -->
	<div id="waveform">
		<div id="verticalLine"></div>
	</div>    
    
    <script src="//cdnjs.cloudflare.com/ajax/libs/wavesurfer.js/1.0.52/wavesurfer.min.js"></script>
    <script src="https://cdn.rawgit.com/katspaugh/wavesurfer.js/master/dist/plugin/wavesurfer.regions.min.js"></script>
    <script src="script.js"></script>
  </body>

</html>
(function() {

	var REGIONS = {
		current: [],

		updateCurrent: function() {
			var arr = Object.keys(wavesurfer.regions.list);
			this.current = arr.slice();		
		},
		
		deleteExisting: function() {
			// remove any regions (removeall doesn't work well, IMO)
			var cR = REGIONS.current;
			for (let i = 0; i < cR.length; i++) {
				wavesurfer.regions.list[cR[i]].remove();
			}
			// get all existing regions (should only be 1) and update
			this.updateCurrent();
		},

		getRegion: function() {
			switch(this.current.length) {
				case 0:
					console.log('Why does the current array have nothing in it?');
					return;
				case 1:
					return this.current[0];
				default:
					console.log('Why does the current array have more than one item?');
					return;
			}
		},

		getStartTime: function() {
			return wavesurfer.regions.list[this.getRegion()].start
		}
	}

	var RESTART = {
		time : 0,
		queuePoint : -1,
		scrollOffset : 0,

		setTime : function(seconds) {
			this.time = seconds;
			this.setVerticalLine(seconds);
		},

		// deal with only the visual component
		setVerticalLine : function(seconds) {
			var progressRatio = seconds / wavesurfer.getDuration();
			var pos = (Math.round(wavesurfer.drawer.width) * progressRatio) / wavesurfer.params.pixelRatio;
			pos += 6; // necessary offset
			pos -= this.scrollOffset; // updated every scroll event
			$('#verticalLine').css('left', pos + 'px');
		},

		getTime : function() {
			return this.time;
		},

		setQueuePoints : function(seconds) {
			this.queuePoint = seconds;
		}
	}

	var SEEK = {
		rebound : false,
		needsUpdated : false,

		changeCursor : function() {
			var ratio = RESTART.queuePoint / wavesurfer.getDuration();
			setTimeout(function() {
				wavesurfer.seekTo(ratio);
			}, 10);
			RESTART.changeSeek = false;
			this.rebound = true;
		}
	}

	// bind spacebar	
	document.addEventListener("keydown", function(event) {
		if (event.keyCode === 32) {
			if (wavesurfer.isPlaying()) {
				wavesurfer.pause();
			} else {
				wavesurfer.play(RESTART.getTime());
			}
			event.preventDefault();
		}
	});

	// create wavefurfer
	var wavesurfer = WaveSurfer.create({
	    container: '#waveform',
	    scrollParent: true,
	    cursorWidth: 2,
	    barWidth: 1,
	    autoCenter: false // but jump after a few seconds
	});

	// load audio
  wavesurfer.load('https://dl.dropboxusercontent.com/u/67477162/cosmos.mp3');

	// on wavesurfer load
	wavesurfer.on('ready', function(){
	    wavesurfer.play();
		wavesurfer.enableDragSelection({
			drag: true,
			resize: true,
			loop: true,
		});

		// load my RESTART div
		var ctnr = wavesurfer.container;
		$('#verticalLine').css({
		    'top' : ctnr.offsetTop + 'px',
			'height' : ctnr.offsetHeight + 'px'
		});
	});

	wavesurfer.on('play', function() {

	})

	wavesurfer.on('seek', function(percentSeek) {
		if (!SEEK.rebound) { // not a rebound
			var seekTimeInSeconds = percentSeek * wavesurfer.getDuration();

			// determine if click or drag...
			if (SEEK.needsUpdated) { // drag
				// (delete existing regions--HANDLED ELSEWHERE)
				RESTART.setTime(RESTART.queuePoint); // set bar at saved queue point
				SEEK.changeCursor(); // set seek to beginning of drag window
				SEEK.rebound = true; // change rebound to true
				SEEK.needsUpdated = false;
			} else { // click
				REGIONS.deleteExisting(); // delete existing regions
				RESTART.setTime(seekTimeInSeconds); // set RESTART bar to seek location
			}
		} else {
			SEEK.rebound = false;
		}
	});

	// at the beginning of a region creation...
	wavesurfer.on('region-created', function() {
		REGIONS.deleteExisting();
	});

	// at the end of region creation
	wavesurfer.on('region-update-end', function() {
		REGIONS.updateCurrent();
		RESTART.setQueuePoints(REGIONS.getStartTime());
		SEEK.needsUpdated = true;
	});

	wavesurfer.on('finish', function() {
		// go back to time
		wavesurfer.play(RESTART.getTime());
	});

	wavesurfer.on('scroll', function(scrollObject) {
		RESTART.scrollOffset = scrollObject.path[0].scrollLeft; // update
	})

}())
#verticalLine {
    border-left: solid black;
    position: absolute;
    z-index: 1;
    left: 0px;
    top: 0px;
}