/****************************************
Music Object Extension - Dynamic - Version 1.0.0
written by Chris van Rensburg					  

	REQUIRES:
	- music-object.js (3.1.0 or higher)

© Copyright 1996-1999 Beatnik, Inc.
All  Rights Reserved
***************************************/

function mo_random (rangeLimitA,rangeLimitB) {
	if (typeof (rangeLimitB) == 'undefined') {
		return Math.round (Math.random () * (rangeLimitA - 1)) + 1;
	} else if (rangeLimitB == null) {
		return rangeLimitA;
	} else {
		return rangeLimitA + Math.round (Math.random () * (rangeLimitB - rangeLimitA));
	}
}

function mo_Shuffler_reset () {
	for (var flagNo = 0; flagNo < this.range; flagNo++) this.flags [flagNo] = false;
	this.flagsSelected = 0;
}

function mo_Shuffler_next () {
	with (this) {
		var
			flagsFound = 0,
			randomFlag = mo_random (range - flagsSelected)
		;
		for (var flagNo = 0; flagNo < range; flagNo++) {
			if (!this.flags [flagNo]) {
				flagsFound++;
				if (flagsFound == randomFlag) {
					flags [flagNo] = true;
					break;
				}
			}
		}
		flagsSelected++;
		if (flagsSelected == range) reset ();
		return flagNo + 1;
	}
}

function mo_Shuffler (range) {
	/*** Constructor Properties ***/
	this.range = range;

	/*** Instance State Variables ***/
	this.flags = new Array ();

	/*** Exposed Methods ***/
	this.next = mo_Shuffler_next;
	this.reset = mo_Shuffler_reset;

	/*** Initialization ***/
	this.reset ();
}

function mo_randomFromList () {
	var args = mo_randomFromList.arguments;
	if (args.length == 1 && typeof (args [0]) == 'object') args = args [0];
	return (args.length == 0) ? '' : args [mo_random (args.length) - 1];
}

function mo_playRandomNote (channelNo,bankNo,programNo,noteMin,noteMax,velocityMin,velocityMax,durationMin,durationMax,volumeMin,volumeMax,panA,panB) {
	with (this) {
		if (typeof (volumeMin) == 'integer') setController (channelNo,7,mo_random (volumeMin,volumeMax));
		if (typeof (panB) == 'integer') setController (channelNo,10,mo_random (panA,panB));
		playNote (
			channelNo,
			bankNo,
			programNo,
			mo_random (
				(typeof (noteMin) == 'string') ? Music.getNoteNumber (noteMin) : noteMin,
				(typeof (noteMax) == 'string') ? Music.getNoteNumber (noteMax) : noteMax
			),
			mo_random (velocityMin,velocityMax),
			mo_random (durationMin,durationMax)
		);
	}
}

function mo_randomGroovoid (groupPrefix) {
	if (typeof (groupPrefix) == 'undefined' || groupPrefix == null || groupPrefix == '') {
		return mo_randomFromList (Music.groovoids);
	} else {
		var
			matches = new Array (),
			totalMatches = 0
		;
		for (var itemNo = 0; itemNo < Music.groovoids.length; itemNo++) {
			if (Music.groovoids [itemNo].indexOf (groupPrefix) == 0) {
				matches [totalMatches] = itemNo;
				totalMatches++;
			}
		}
		return (totalMatches == 0) ? '' : Music.groovoids [matches [mo_random (totalMatches) - 1]];
	}
}

if (typeof (Music) != 'undefined') {
	/*** Static Properties ***/
	Music.groovoids = new Array ('UI-BeepClick1','UI-Chimes','UI-Choice1','UI-Click1','UI-Click2','UI-Click3','UI-Click4','UI-Click5','UI-Click6','UI-Click7','UI-Click8','UI-Click9','UI-Click10','UI-Click11','UI-Click12','UI-Click13','UI-Click14','UI-Click15','UI-Click16','UI-Click17','UI-Click18','UI-CarriageReturn','UI-FunnyBeep','UI-Load1','UI-MouseOver1','UI-MouseOver2','UI-MouseOverDrone1','UI-Notification1','UI-Notification2','UI-Notification3','UI-OpenOrClose1','UI-OpenOrClose2','UI-OpenOrClose3','UI-Question','UI-SimpleClick1','UI-SimpleClick2','UI-SystemBeep','UI-TeletypeBurst2','UI-TypeOneKey','Hits-BlastOff','Hits-Kicker1','Hits-Kicker2','Hits-Kicker5','Hits-LudwigVan','Hits-Magic','Hits-MysteryChime','Hits-SportsOrganCharge','Hits-ZoomAndHit','Fanfare-Arrival','Fanfare-Cascade','Fanfare-CorpSting1','Fanfare-Finished','Fanfare-Horserace','Fanfare-Mars','Fanfare-Majesty','Fanfare-Presenting','Fanfare-Sports','Background-Beeps','Background-Clock','Background-Dubby','Background-Funky','Background-Groove2','Background-InfoPulse','Background-Latin','Background-News','Background-Piano','Background-SimpleTyping','Background-Smooth','Background-StillWaiting','Background-Teletype','Misc-CashRegister','Misc-ThruPhoneRing');

	/*** Instance Methods ***/
	mo_addInstanceMethods ('playRandomNote');

	/*** Static Methods ***/
	mo_addStaticMethods ('random','randomFromList','randomGroovoid','Shuffler');
}
