// Default webM- URLs
	var basemidiURL		= "/SMSMathematica/NKM/sound.jsp?id=";
	var basemidicacheURL	= "/SMSMathematica/NKM/sound.jsp?id=";
	var blankmidiURL	= "/generate/blank.html?";
	var baseimageURL	= "/SMSMathematica/NKM/image.jsp?id=";
	var basedrawerURL	= "/SMSMathematica/NKM/drawer.jsp?id=";
	var baseevolutionURL	= "/SMSMathematica/NKM/evolution.jsp?id=";
	var baseadURL		= "/images/generatem6.gif?imgPath=http://";
	var baseadimageURL	= "/SMSMathematica/NKM/gif2jpg.do?fid=";
	var drawerImagesNumber	= 5;

	var count_accesses	= 0;

	var tonesad_clicks	= 5;
	var tonesad_clicks_now	= 0;

	var window_evolution;

	document.domain = 'wolfram.com';

// Default values for various parameters
	var id = new String();
	var default_vals = new Array();
	var heightMinMax = { min:5, max:25 };
	var pitchMinMax = { min:24, max:72 };
	var notesMinMax = { min:1, max:16 };
	var tempoMinMax = { min:4, max:208 };
	var durationMinMax = { min:0.2, max:300 };
	var seedMinMax = { min:33, max:67108863 };
	var scaleMinMax = { min:2048, max:4095 };
	var instrMinMax = { min:0, max:128 };
	var filterMinMax = { min:0, max:999 };
	var percussionMinMax = { min:0, max:999 };



function initVals() {

// Default values for various parameters
	id = new String(getQueryVariable('id'));

	if ((id.length > 0) && !(id.match(/^NKM\-/))) {
		document.getElementById('toneframe').src = blankmidiURL;
		document.getElementById('toneframe').src = basemidiURL + id;
		return('exit');
	}

	if (((!id) || (id == "")) && (count_accesses > 0)) {
		return('exit');
	}
	else if ((!id) || (id == "")) {
		default_vals['play_choice'] = 1;
		count_accesses = count_accesses + 1;
		return;
	}
	else {
		default_vals['play_choice'] = 0;
		default_vals['id'] = id;
	}

	var new_defaults = new Array();
	new_defaults = fromNKMID(default_vals['id']);

	if (new_defaults[0] != 'NKM') { default_vals['play_choice'] = 1; return; }

	default_vals['genre']		= new_defaults[2];
	default_vals['ruletype']	= new_defaults[3];
	default_vals['rule']		= new_defaults[4];
	default_vals['cyclic']		=	(new_defaults[5] == 0) ? 0 : 1;
	default_vals['init']		=	(new_defaults[6] < seedMinMax['min']) ? seedMinMax['min'] :
						(new_defaults[6] > seedMinMax['max']) ? seedMinMax['max'] : new_defaults[6];
		default_vals['height']	= (default_vals['init'] < 64) ? 5 : (default_vals['init'] < 128) ? 6 :
					  (default_vals['init'] < 256) ? 7 : (default_vals['init'] < 512) ? 8 :
					  (default_vals['init'] < 1024) ? 9 : (default_vals['init'] < 2048) ? 10 :
					  (default_vals['init'] < 4096) ? 11 : (default_vals['init'] < 8192) ? 12 :
					  (default_vals['init'] < 16384) ? 13 : (default_vals['init'] < 32768) ? 14 :
					  (default_vals['init'] < 65536) ? 15 : (default_vals['init'] < 131072) ? 16 :
					  (default_vals['init'] < 262144) ? 17 : (default_vals['init'] < 524288) ? 18 :
					  (default_vals['init'] < 1048576) ? 19 : (default_vals['init'] < 2097152) ? 20 :
					  (default_vals['init'] < 4194304) ? 21 : (default_vals['init'] < 8388608) ? 22 :
					  (default_vals['init'] < 16777216) ? 23 : (default_vals['init'] < 33554432) ? 24 : 25;
	default_vals['steps']		= new_defaults[7];
	default_vals['tempo']		=	(new_defaults[8] < tempoMinMax['min']) ? tempoMinMax['min'] :
						(new_defaults[8] > tempoMinMax['max']) ? tempoMinMax['max'] : new_defaults[8];
	default_vals['notesperbeat']	=	(new_defaults[9] < notesMinMax['min']) ? notesMinMax['min'] :
						(new_defaults[9] > notesMinMax['max']) ? notesMinMax['max'] : new_defaults[9];
	default_vals['scalevalue']	=	(new_defaults[10] < scaleMinMax['min']) ? scaleMinMax['min'] :
						(new_defaults[10] > scaleMinMax['max']) ? scaleMinMax['max'] : new_defaults[10];
	default_vals['pitch']		=	(new_defaults[11] < pitchMinMax['min']) ? pitchMinMax['min'] :
						(new_defaults[11] > pitchMinMax['max']) ? pitchMinMax['max'] : new_defaults[11];
	default_vals['instrument1']	=	(new_defaults[13] < instrMinMax['min']) ? instrMinMax['min'] :
						(new_defaults[13] > instrMinMax['max']) ? instrMinMax['max'] : new_defaults[13];
	default_vals['filter1']		=	(new_defaults[14] < filterMinMax['min']) ? filterMinMax['min'] :
						(new_defaults[14] > filterMinMax['max']) ? filterMinMax['max'] : new_defaults[14];
	default_vals['instrument2']	=	(new_defaults[15] < instrMinMax['min']) ? instrMinMax['min'] :
						(new_defaults[15] > instrMinMax['max']) ? instrMinMax['max'] : new_defaults[15];
	default_vals['filter2']		=	(new_defaults[16] < filterMinMax['min']) ? filterMinMax['min'] :
						(new_defaults[16] > filterMinMax['max']) ? filterMinMax['max'] : new_defaults[16];
	default_vals['instrument3']	=	(new_defaults[17] < instrMinMax['min']) ? instrMinMax['min'] :
						(new_defaults[17] > instrMinMax['max']) ? instrMinMax['max'] : new_defaults[17];
	default_vals['filter3']		=	(new_defaults[18] < filterMinMax['min']) ? filterMinMax['min'] :
						(new_defaults[18] > filterMinMax['max']) ? filterMinMax['max'] : new_defaults[18];
	default_vals['instrument4']	=	(new_defaults[19] < instrMinMax['min']) ? instrMinMax['min'] :
						(new_defaults[19] > instrMinMax['max']) ? instrMinMax['max'] : new_defaults[19];
	default_vals['filter4']		=	(new_defaults[20] < filterMinMax['min']) ? filterMinMax['min'] :
						(new_defaults[20] > filterMinMax['max']) ? filterMinMax['max'] : new_defaults[20];
	default_vals['instrument5']	=	(new_defaults[21] < instrMinMax['min']) ? instrMinMax['min'] :
						(new_defaults[21] > instrMinMax['max']) ? instrMinMax['max'] : new_defaults[21];
	default_vals['filter5']		=	(new_defaults[22] < filterMinMax['min']) ? filterMinMax['min'] :
						(new_defaults[22] > filterMinMax['max']) ? filterMinMax['max'] : new_defaults[22];
	default_vals['percussion']	=	(new_defaults[23] < percussionMinMax['min']) ? percussionMinMax['min'] :
						(new_defaults[23] > percussionMinMax['max']) ? percussionMinMax['max'] : new_defaults[23];
	default_vals['duration']	= Math.round(5 * (60 * default_vals['steps']) / (default_vals['tempo'] * default_vals['notesperbeat'])) / 5;
	default_vals['duration']	=	(default_vals['duration'] < durationMinMax['min']) ? durationMinMax['min'] :
						(default_vals['duration'] > durationMinMax['max']) ? durationMinMax['max'] : default_vals['duration'];
}



function playChoice(what, genre, drawer) {
	var nkmID = getQueryVariable('id');
	var add_args = '&special=' + what;

	if (what == 'ChoiceSelection') {
		add_args = add_args + '&colorscheme=' + getCookie('NKMColorScheme') + '&randomize=' + (100 * Math.random()) + '&genre=';
		var genre_value = getGenreValueByName(genre);
		if (genre_value > 1) {
			add_args = add_args + genre_value;
			if (document.getElementById('value_genre')) {
				var current_genre = getGenreNameByValue(document.getElementById('value_genre').value);
				document.getElementById('value_genre').value = genre;
				highlightButton(current_genre, 'off');
				highlightButton(genre, 'on');
			}
		}
		else {
			var random_genre = '' + getGenreRandomValue();
			add_args = add_args + random_genre;
		}
		if (drawer != 1) {
			document.getElementById('VariationsTable').style.display='none';
			document.getElementById('varframe').src = blankmidiURL;
		}
	}

	if (what == 'RuleType') {
		add_args = add_args + '&RuleType=';
		if (document.getElementById('value_ruletype_select')) {
			add_args = add_args + document.getElementById('value_ruletype_select').options[document.getElementById('value_ruletype_select').selectedIndex].value;
		}
	}

	if (what == 'Height') {
		add_args = add_args + '&Height=';
		if (document.getElementById('value_height')) {
			add_args = add_args + document.getElementById('value_height').value;
		}
	}

	if (what == 'QuickPick') {
		add_args = add_args + '&randomize=' + (100 * Math.random()) + '&genre=';
		if (document.getElementById('value_genre_select')) {
			add_args = add_args + document.getElementById('value_genre_select').options[document.getElementById('value_genre_select').selectedIndex].value;
		}
		else {
			add_args = add_args + '0';
		}
		add_args = add_args + '&phrase=';
		if (document.getElementById('quick_pick_phrase')) {
			add_args = add_args + escape(document.getElementById('quick_pick_phrase').value);
		}
	}

	if (drawer == 1) {
		add_args = add_args + '&number=' + drawerImagesNumber;
		var drawerURL = basedrawerURL + nkmID + add_args;
		document.getElementById('varframe').src = drawerURL;
	}
	else {
		var midiURL = basemidiURL;
		if (what == 'ChoiceSelection')	{ midiURL = basemidicacheURL + add_args; }
		else				{ midiURL = midiURL + nkmID + add_args; }
		document.getElementById('toneframe').src = blankmidiURL;
		document.getElementById('toneframe').src = midiURL;
	}
}



function playScale() {
	var nkmID = getQueryVariable('id');
	var midiURL = basemidiURL + nkmID + '&PlayScale=1';
	document.getElementById('toneframe').src = blankmidiURL;
	document.getElementById('toneframe').src = midiURL;
}



function loadImage(nkmID) {
	if (!nkmID) {
		nkmID = getNKMID();
	}
	if (!nkmID) { return; }

	var imageURL = baseimageURL + nkmID;
	var color = getCookie('NKMColorScheme');
	if (color) {
		imageURL = imageURL + '&colorscheme=' + color;
	}
	if (document.getElementById('NKM_image')) {
		document.getElementById('NKM_image').src = imageURL;
	}
	if (document.getElementById('NKMImageBorder')) {
		var nkmimg = document.getElementById('NKM_image').src;
		if ((color == 'Mixed') || (color == 'Black')) {
			document.getElementById('NKMImageBorder').style.border = '#dddddd 1px solid';
		}
		else {
			document.getElementById('NKMImageBorder').style.border = '#ffffff 1px solid';
		}
	}
}



function playTone() {
	var nkmID = getNKMID();

	if (!nkmID) { return; }

	var midiURL = basemidiURL + nkmID;

	modifyCookiesPrevious(nkmID);

	document.getElementById('toneframe').src = blankmidiURL;
	document.getElementById('toneframe').src = midiURL;
}



function stopTone() {
	document.getElementById('toneframe').src = blankmidiURL;
}

function goToJukebox(){
	parent.window.location.href='http://apps.facebook.com/wolframtones/?mode=save&id='+document.getElementById('id').value;
}

function deliverTone() {
	if (document.getElementById('id')) {
		var left = window.screen.availWidth - 520;
		var top = window.screen.availHeight/2 - 550/2;
		var nkmID = new String(document.getElementById('id').value);
		var location = 'http://' + document.location.host + '/deliver/?id=' + nkmID;
		nkmID = nkmID.replace(/\-/g, "");
		var features = 'scrollbars=yes,menubar=no,height=550,width=500,resizable=yes,toolbar=no,location=no,status=no';
		if (!window.opera) { features = features + ',screenX='+left+',left='+left+',screenY='+top+',top='+top; }
		window.open(location, 'Deliver'+nkmID, features);
	}
}



function showEvolution() {
	if (document.getElementById('id')) {
		var left = 0;
		var top = 0;
		var nkmID = new String(document.getElementById('id').value);
		var location = baseevolutionURL + nkmID;
		var features = 'scrollbars=no,menubar=no,height=250,width=250,resizable=no,toolbar=no,location=no,status=no';
		if (!window.opera) { features = features + ',screenX='+left+',left='+left+',screenY='+top+',top='+top; }
		window_evolution = window.open(location, 'ShowEvolution', features);
	}
}



function adjustNKMIDValue(nkmID) {
	if (nkmID) {
		document.getElementById('id').value = nkmID;
	}
	else {
		var id = getNKMID();
		if (id) {
			document.getElementById('id').value = id;
		}
	}

	if (no_reset_next_cookie == 0)	{ setCookie("", "Next"); }
	else				{ no_reset_next_cookie = 0; }
}



function getNKMID(nkmID) {
	var id = default_vals['id'];
	if (nkmID) {
		id = nkmID;
	}
	else if (document.getElementById('id').value) {
		id = document.getElementById('id').value;
	}

	if (!id) { return; }

	var params = new Array();

	params = fromNKMID(id);

	if (document.getElementById('value_ruletype')) {
		params[3] = document.getElementById('value_ruletype').value;
	}
	if (document.getElementById('value_rule')) {
		params[4] = document.getElementById('value_rule').value;
	}
	if (document.getElementById('value_cyclic')) {
		if (!document.getElementById('value_cyclic').checked)	{ params[5] = 0; }
		else							{ params[5] = 1; }
	}
	if (document.getElementById('value_init')) {
		params[6] = document.getElementById('value_init').value;
	}
	if (document.getElementById('value_steps')) {
		params[7] = document.getElementById('value_steps').value;
	}
	if (document.getElementById('value_tempo')) {
		params[8] = document.getElementById('value_tempo').value;
	}
	if (document.getElementById('value_notesperbeat')) {
		params[9] = document.getElementById('value_notesperbeat').value;
	}
	if (document.getElementById('value_scale')) {
		params[10] = document.getElementById('value_scale').value;
	}
	if (document.getElementById('value_pitch')) {
		params[11] = document.getElementById('value_pitch').value;
	}
	if ((document.getElementById('section_instrumentation')) && (document.getElementById('section_instrumentation').style.display == '')) {
		if (document.getElementById('value_instrument1')) {
			params[13] = document.getElementById('value_instrument1').options[document.getElementById('value_instrument1').selectedIndex].value;
		}
		if (document.getElementById('value_filter1')) {
			params[14] = document.getElementById('value_filter1').options[document.getElementById('value_filter1').selectedIndex].value;
		}
		if (document.getElementById('value_instrument2')) {
			params[15] = document.getElementById('value_instrument2').options[document.getElementById('value_instrument2').selectedIndex].value;
		}
		if (document.getElementById('value_filter2')) {
			params[16] = document.getElementById('value_filter2').options[document.getElementById('value_filter2').selectedIndex].value;
		}
		if (document.getElementById('value_instrument3')) {
			params[17] = document.getElementById('value_instrument3').options[document.getElementById('value_instrument3').selectedIndex].value;
		}
		if (document.getElementById('value_filter3')) {
			params[18] = document.getElementById('value_filter3').options[document.getElementById('value_filter3').selectedIndex].value;
		}
		if (document.getElementById('value_instrument4')) {
			params[19] = document.getElementById('value_instrument4').options[document.getElementById('value_instrument4').selectedIndex].value;
		}
		if (document.getElementById('value_filter4')) {
			params[20] = document.getElementById('value_filter4').options[document.getElementById('value_filter4').selectedIndex].value;
		}
		if (document.getElementById('value_instrument5')) {
			params[21] = document.getElementById('value_instrument5').options[document.getElementById('value_instrument5').selectedIndex].value;
		}
		if (document.getElementById('value_filter5')) {
			params[22] = document.getElementById('value_filter5').options[document.getElementById('value_filter5').selectedIndex].value;
		}
		if (document.getElementById('value_percussion')) {
			params[23] = document.getElementById('value_percussion').options[document.getElementById('value_percussion').selectedIndex].value;
		}
	}

	var nkmID = params.join("-");

	return nkmID;
}



function fromNKMID(nkmID) {
	var params = new Array();
	var str_obj = new String(nkmID);

	if (!str_obj.match(/^NKM\-G(\-\d+){22}$/i)) { return [0]; }

	params = str_obj.split("-");

	return params;
}



function getNKMStringFromIFrame(nkmID, nkmIDEncoded) {
	if (document.getElementById('id').value != nkmID) {
		no_play = 1;
		adjustNKMIDValue(nkmID);
		modifyCookiesPrevious(nkmID);
		init();
	}
	if (nkmIDEncoded) {
		document.getElementById('id_encoded').value = nkmIDEncoded;
		document.getElementById('perm_link').innerHTML = 'http://' + document.location.host + '/id/' + nkmIDEncoded;
	}
	loadImage(nkmID);
	tonesad_clicks_now++;
	if (tonesad_clicks_now > 4) { loadTonesAd(nkmID); }
	return;
}



function getNKMTimingFromIFrame(timing) {
	if (document.getElementById('NKMTiming')) {
		var host = new String();
		host = document.location.host;
		if (host.match(/devel/)) {
			document.getElementById('NKMTiming').innerHTML = "Generated in " + (Math.round(timing * 1000) / 1000) + " sec";
		}
	}
}



function getNKMTimingAllFromIFrame(timing) {
	if (document.getElementById('NKMTiming')) {
		var host = new String();
		host = document.location.host;
		if (host.match(/devel/)) {
			document.getElementById('NKMTiming').innerHTML = document.getElementById('NKMTiming').innerHTML + "<br>Specific times: " + timing;
		}
	}
}



function getNKMScaleLabelsFromIFrame(labels) {
	writeScaleNotes(labels);
	if (document.getElementById('value_scale')) {
		checkNotesFromScaleValue(document.getElementById('value_scale').value);
	}
}



function getNKMTitleFromIFrame(title) {
	if (document.getElementById('CompositionTitle')) {
		document.getElementById('CompositionTitle').innerHTML = title;
	}
	if (document.getElementById('value_composition_title')) {
		document.getElementById('value_composition_title').value = title;
	}
	writeEmailLink();
}



function getNKMFullScaleNameFromIFrame(scalename) {
	if (document.getElementById('FullScaleName')) {
		if ((scalename) && (scalename != '')) {
			document.getElementById('FullScaleName').innerHTML = scalename;
			document.getElementById('FullScaleName').style.display = '';
		}
		else {
			document.getElementById('FullScaleName').innerHTML = '';
			document.getElementById('FullScaleName').style.display = 'none';
		}
	}
}



function setCookie(nkmID, which) {
	var cookie_which = which || "Current";
	document.cookie = "NKMID" + cookie_which + "=" + nkmID + ";path=/";
}



function getCookie(which) {
	var name = which;
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	var to_return = "";
	for(var i = 0; i < ca.length; i++) {
		var c = ca[i];
		while (c.charAt(0) == ' ')	{ c = c.substring(1, c.length); }
		if (c.indexOf(nameEQ) == 0)	{ to_return = c.substring(nameEQ.length, c.length); }
	}
	if (to_return == 'undefined')	{ return undef; }
	else				{ return to_return; }
}



function modifyCookiesPrevious(nkmID) {
	if (getCookie("NKMIDCurrent") != nkmID) {
		if (getCookie("NKMIDCurrent")) {
			var previous = new String(getCookie("NKMIDPrevious"));
			var previous_array = new Array();
			if (previous != "") {
				previous_array = previous.split(":");
			}
			while (previous_array.length > 2) {
				previous_array.pop();
			}
			previous_array.unshift(getCookie("NKMIDCurrent"));
			setCookie(previous_array.join(":"), "Previous");
		}
		setCookie(nkmID, "Current");
	}
	if ((getCookie("NKMIDPrevious") == "") && (document.getElementById('PreviousButton'))) {
		document.getElementById('PreviousButton').src = '/images/spacer.gif';
		if (document.getElementById('PreviousNextSpacer')) {
			document.getElementById('PreviousNextSpacer').src = '/images/spacer.gif';
		}
	}
	else if (document.getElementById('PreviousButton')) {
		document.getElementById('PreviousButton').src = '/images/previous-over.gif';
		if ((document.getElementById('NextButton').src == '/images/next-over.gif') && (document.getElementById('PreviousNextSpacer'))) {
			document.getElementById('PreviousNextSpacer').src = '/images/divider-prevnext.gif';
		}
	}
	if ((getCookie("NKMIDNext") == "") && (document.getElementById('NextButton'))) {
		document.getElementById('NextButton').src = '/images/spacer.gif';
		if (document.getElementById('PreviousNextSpacer')) {
			document.getElementById('PreviousNextSpacer').src = '/images/spacer.gif';
		}
	}
	else if (document.getElementById('NextButton')) {
		document.getElementById('NextButton').src = '/images/next-over.gif';
		if ((document.getElementById('PreviousButton').src == '/images/previous-over.gif') && (document.getElementById('PreviousNextSpacer'))) {
			document.getElementById('PreviousNextSpacer').src = '/images/divider-prevnext.gif';
		}
	}
}



function doOnPreviousButton() {
	var previous = new String(getCookie("NKMIDPrevious"));
	if (previous != "") {
		var previous_array = previous.split(":");
		var new_nkmID = previous_array.shift();
		var current_cookie = previous_array.shift() || new_nkmID;

		var next = new String(getCookie("NKMIDNext"));
		var next_array = new Array();
		if (next != "") {
			next_array = next.split(":");
		}
		if (next_array[0] != getCookie("NKMIDCurrent")) {
			next_array.unshift(getCookie("NKMIDCurrent"));
		}
		setCookie(next_array.join(":"), "Next");

		setCookie(current_cookie, "Current");
		setCookie(previous_array.join(":"), "Previous");

		no_reset_next_cookie = 1;
		adjustNKMIDValue(new_nkmID);
		no_reset_next_cookie = 1;
		init();
	}
}



function doOnNextButton() {
	var next = new String(getCookie("NKMIDNext"));
	if (next != "") {
		var next_array = next.split(":");
		var new_nkmID = next_array.shift();
		setCookie(next_array.join(":"), "Next");

		no_reset_next_cookie = 1;
		adjustNKMIDValue(new_nkmID);
		no_reset_next_cookie = 1;
		init();
	}
}



function isElementChecked(element) {
	if (document.getElementById(element).checked)	{ return 1; }
	else						{ return 0; }
}



function getScaleValueFromNotes() {
	return	isElementChecked('check_note_1') * Math.pow(2, 0) +
		isElementChecked('check_note_2') * Math.pow(2, 1) +
		isElementChecked('check_note_3') * Math.pow(2, 2) +
		isElementChecked('check_note_4') * Math.pow(2, 3) +
		isElementChecked('check_note_5') * Math.pow(2, 4) +
		isElementChecked('check_note_6') * Math.pow(2, 5) +
		isElementChecked('check_note_7') * Math.pow(2, 6) +
		isElementChecked('check_note_8') * Math.pow(2, 7) +
		isElementChecked('check_note_9') * Math.pow(2, 8) +
		isElementChecked('check_note_10') * Math.pow(2, 9) +
		isElementChecked('check_note_11') * Math.pow(2, 10) +
		Math.pow(2, 11);
}



function checkNotesFromScaleValue(scaleValue) {
	if (document.getElementById('check_note_12')) {
		document.getElementById('check_note_12').checked = true;
		document.getElementById('check_note_11').checked = ((scaleValue & Math.pow(2, 10)) == Math.pow(2, 10)) ? true : false;
		document.getElementById('check_note_10').checked = ((scaleValue & Math.pow(2, 9)) == Math.pow(2, 9)) ? true : false;
		document.getElementById('check_note_9').checked = ((scaleValue & Math.pow(2, 8)) == Math.pow(2, 8)) ? true : false;
		document.getElementById('check_note_8').checked = ((scaleValue & Math.pow(2, 7)) == Math.pow(2, 7)) ? true : false;
		document.getElementById('check_note_7').checked = ((scaleValue & Math.pow(2, 6)) == Math.pow(2, 6)) ? true : false;
		document.getElementById('check_note_6').checked = ((scaleValue & Math.pow(2, 5)) == Math.pow(2, 5)) ? true : false;
		document.getElementById('check_note_5').checked = ((scaleValue & Math.pow(2, 4)) == Math.pow(2, 4)) ? true : false;
		document.getElementById('check_note_4').checked = ((scaleValue & Math.pow(2, 3)) == Math.pow(2, 3)) ? true : false;
		document.getElementById('check_note_3').checked = ((scaleValue & Math.pow(2, 2)) == Math.pow(2, 2)) ? true : false;
		document.getElementById('check_note_2').checked = ((scaleValue & Math.pow(2, 1)) == Math.pow(2, 1)) ? true : false;
		document.getElementById('check_note_1').checked = ((scaleValue & Math.pow(2, 0)) == Math.pow(2, 0)) ? true : false;
	}
}



function checkSeed() {
	if (document.getElementById('value_init')) {
		var seed = new String(document.getElementById('value_init').value);
		document.getElementById('value_init').value = seed.replace(/\D/g, "");
		if (document.getElementById('value_init').value < 33)			{ document.getElementById('value_init').value = 33; }
		else if (document.getElementById('value_init').value > 67108863)	{ document.getElementById('value_init').value = 67108863; }
	}
}



function checkRule() {
	if (document.getElementById('value_rule')) {
		var rule_number = new String(document.getElementById('value_rule').value);
		document.getElementById('value_rule').value = rule_number.replace(/\D/g, "");
		if (document.getElementById('value_rule').value < 1) {
			document.getElementById('value_rule').value = 1;
		}
		else if ((document.getElementById('value_rule').value > 255) && (document.getElementById('value_ruletype').value < 15)) {
			document.getElementById('value_rule').value = 255;
		}
		else if ((document.getElementById('value_rule').value > 4294967296) && (document.getElementById('value_ruletype').value < 685)) {
			document.getElementById('value_rule').value = 4294967295;
		}
	}
}



function writeEmailLink() {
	if ((document.getElementById('email_link')) && (document.getElementById('perm_link'))) {
		var subject_text = "WolframTones%20Composition";
		var body_text = "%0d%0a%0d%0a" + document.getElementById('perm_link').innerHTML + "%0d%0a%0d%0a";
		var text_to_write = '<a href="mailto:?Subject=' + subject_text + '&Body=' + body_text + '" onMouseOver="document.getElementById(\'EmailButton\').src=\'/generate/images/email-over.gif\';return true" onMouseOut="document.getElementById(\'EmailButton\').src=\'/generate/images/email.gif\';return true"><img src="/generate/images/email.gif" id="EmailButton" title="email composition" width="39" height="22" border="0" alt="email composition"></a><img src="/images/divider-prevnext.gif" alt="" width="1" height="22" hspace="7">';
		document.getElementById('email_link').innerHTML = text_to_write;
	}
}



function adjustToggleColor(action) {
	var toggle_hash = {
		'Color' : '/generate/images/toggle-fullcolor.gif',
		'Mixed' : '/generate/images/toggle-middlecolor.gif',
		'Black' : '/generate/images/toggle-bw.gif'
	};
	if (document.getElementById('ToggleColor')) {
		var current_color = getCookie('NKMColorScheme');
		if ((action) && (action == 'toggle')) {
			current_color = (current_color == 'Color') ? 'Mixed' :
					(current_color == 'Mixed') ? 'Black' : 'Color';
		}
		else {
			if ((current_color != 'Color') && (current_color != 'Mixed') && (current_color != 'Black')) {
				current_color = 'Color';
			}
		}
		document.getElementById('ToggleColor').src = toggle_hash[current_color];
		document.cookie = "NKMColorScheme=" + current_color + ";path=/";
		loadImage();
	}
}



function saveToCollection(nkmID) {
	if ((!nkmID) && (document.getElementById('id_encoded'))) {
		nkmID = document.getElementById('id_encoded').value;
	}
	if (nkmID) {
		window.location = 'http://' + document.location.host + '/mytones/?save=' + nkmID;
	}
}



function highlightButton(genre, state) {
	if (document.getElementById(genre)) {
		var this_src = new String();
		this_src = document.getElementById(genre).src;
		if (state == 'on') {
			if (!this_src.match(/\-on\.gif$/)) {
				document.getElementById(genre).src = this_src.replace(/\.gif$/, "-on.gif");
			}
		}
		else if (state == 'off') {
			var active_genre = new String();
			if (document.getElementById('value_genre')) {
				active_genre = getGenreNameByValue(document.getElementById('value_genre').value);
			}
			if ((active_genre != genre) && (this_src.match(/\-on\.gif$/))) {
				document.getElementById(genre).src = this_src.replace(/\-on\.gif$/, ".gif");
			}
		}
	}
}



function getQueryVariable(variable) {
	if ((document.getElementById('id')) && (document.getElementById('id').value != '')) {
		return document.getElementById('id').value;
	}
	var query = window.location.pathname;
	var match_res = query.match(/^\/\w{0,3}\/(.+)$/);
	if (match_res != null) {
		return match_res[1];
	}
	return getCookie("NKMIDCurrent");
}



function getDefaultVals() {
	return default_vals;
}



function setStatusLineHelp(flag) {
	if (flag) {
		window.status = "click for more information";
		return true;
	} else {
		window.status = "";
	}
}



function loadTonesAd(id) {
	if (document.getElementById('tonead')) {
		var flashURL = baseadURL + document.location.host + baseadimageURL + id;
		document.getElementById('tonead').innerHTML = '<a href="http://www.wolfram.com/" target="_blank"><img src="/images/generatem6.gif" height="92" width="300" border="0" alt="New--Mathematica Reinvented--Thousands of innovations--including built-in symbolic sound generation" title="New--Mathematica Reinvented--Thousands of innovations--including built-in symbolic sound generation"></a>';
	}
}



function unloadTonesAd() {
	if (document.getElementById('tonead')) {
		document.getElementById('tonead').innerHTML = '<img src="/common/images/spacer.gif" alt="" width="207" height="136" border="0">';
	}
}


