function customYUINav(ID) {
	globalY.log('nav to: ' + ID);
	
	if (ID.match(/^show_category-/)) {
		var thisCategory = ID.replace(/^show_category-/,'');
		gradeNav(thisCategory);
	}
	else if (ID.match(/^show_genre-/)) {
		var thisGenre = ID.replace(/^show_genre-/,'');
		genreNav(thisGenre);
	}
	else if (ID.match(/^show_composer-/)) {
		var thisComposer = ID.replace(/^show_composer-/,'');
		composerNav(thisComposer);
	}	
	else if (ID == "showall") {
		showAllNav();
	}	
}

document.observe("dom:loaded", function() {
	initDropDown("menublock"  , {

                reveal : Effect.BlindDown.bindAsEventListener(Effect, {
                                duration: .3,
                                transition: Effect.Transitions.sinoidal
                }),

                disappear : Effect.BlindUp.bindAsEventListener(Effect, {
                                duration: .3,
                                delay: 0,
                                transition: Effect.Transitions.sinoidal
                                }),

                                revealDelay: .2, // in seconds, defaults to .3 
                                clickEffect : Effect.Pulsate.bindAsEventListener(Effect, {
                                        duration: .5,
                                        pulses: 3,

                                        // callbacks: (could also specify 'beforeStart' below)
                                        // 'e' is the event obj, and 'e.element' is the clicked <a> node:
                                        afterFinish: function(e) {
                                                // whatever effect for removing current dropdown:
                                                e.element.up( '.wrapper').fade({
                                                        duration: .2
                                                });
                                              
												// whatever final function you want:
												window.location = e.element.href;
                                        }
                                        })
        });
	
	/* login/create account link */
	if ($('loginlink')) {
		$('loginlink').observe('mouseover', function() {
			cursorLink();
		});
		$('loginlink').observe('mouseout', function() {
			cursorClear();
		});
		$('loginlink').observe('click', function(e) {
			e.stop();
			Modalbox.show('/login/', { title:'Login/Create Account', width:700, overlayClose:false, afterLoad:function() {
				loginformObservers();
			}})
		});
	}
	else {
		// user logged in
		$('logoutlink').observe('mouseover', function() {
			cursorLink();
		});
		$('logoutlink').observe('mouseout', function() {
			cursorClear();
		});
		$('logoutlink').observe('click', function(e) {
			e.stop();
			Modalbox.show('/login/', { title:'Logout/Edit Account', width:700, overlayClose:false, afterLoad:function() {
				logoutformObservers();
			}})
		});
	}
	
	
	$('storesearch').observe('click', function() {
		$('storesearch').value = '';
	});
	$('storesearch').observe('change', function() {
		invokeSearch();
	});
	$('storesearch').observe('keypress', function(e) {
		var key = e.which || e.keyCode;
		if (key == Event.KEY_RETURN) {
			e.stop();
			invokeSearch();
		}
	});
	
	$$('#leftcolumn .grades').each(function(o) {
		o.observe('mouseover', function(e) {
			if (!o.hasClassName('active')) { 
				o.setOpacity(0.8);	
			}
		});
		o.observe('mouseout', function(e) {
			if (!o.hasClassName('active')) {
				o.setOpacity(1);				
			}
		});
		o.observe('click', function(e) {
			e.stop();
			o.setOpacity(1);
			var thisCategory = o.id.replace(/^grade/,'');			
			storefilter.set('show_category',thisCategory);
			storefilter.set('show_genre','');	
			
			if (o.hasClassName('active')) { return; }
			
			if ($('homeblurb')) {
				$('homeblurb').remove();
			}		
			
			if (!$('inventorydisplay')) {
				// not in home/store section of site, make adjustments
				var menuData = $('jsondata').innerHTML.evalJSON();
				document.body.className = 'nm_currentPage_store';
				document.title = menuData.nm_siteTitle + ': ' + menuData.nm_menuItems['store'].title;				
				$('nmstore').update('<div id="inventorydisplay"></div>');
			}
			
			gradeNav(thisCategory);
			
		});
	});
	
	$$('#rightcolumn .genres').each(function(o) {
		o.observe('mouseover', function(e) {
			if (!o.hasClassName('active')) {
				o.setOpacity(0.8);				
			}
		});
		o.observe('mouseout', function(e) {
			if (!o.hasClassName('active')) { 
				o.setOpacity(1);				
			}
		});
		o.observe('click', function(e) {
			e.stop();
			o.setOpacity(1);
			var thisGenre = o.id.replace(/^genre/,'');			
			storefilter.set('show_category','');
			storefilter.set('show_genre',thisGenre);
			
			if (o.hasClassName('active')) { return; }
			
			if ($('homeblurb')) {
				$('homeblurb').remove();
			}
			
			if (!$('inventorydisplay')) {
				// not in home/store section of site, make adjustments
				var menuData = $('jsondata').innerHTML.evalJSON();
				document.body.className = 'nm_currentPage_store';
				document.title = menuData.nm_siteTitle + ': ' + menuData.nm_menuItems['store'].title;				
				$('nmstore').update('<div id="inventorydisplay"></div>');
			}
			
			genreNav(thisGenre);
		});
	});
	
	$('showall').observe('mouseover', function() {
		if (!$('showall').hasClassName('active')) {
			$('showall').setOpacity(0.8);
		}
	});
	$('showall').observe('mouseout', function() {
		if (!$('showall').hasClassName('active')) {
			$('showall').setOpacity(1);
		}
	});
	$('showall').observe('click', function(e) {
		e.stop();
		storefilter.set('show_category','');
		storefilter.set('show_genre','');
		
		showAllNav();
		
	});
	
	$('advancedsearchlink').observe('click', function(e) {
		e.stop();
		new Effect.SlideDown('advancedsearchwrapper', {duration:0.5});
	});
	
	$('cancelsearch').observe('click', function(e) {
		e.stop();
		new Effect.SlideUp('advancedsearchwrapper', {duration:0.5});
	});
	
	$('search').observe('click', function() {
		$('searchfeedback').update(waitHTML);
		
		// undim all grades
		$$('#leftcolumn .grades').each(function(o) {
			o.removeClassName('active');
		});
		// undim all genres
		$$('#rightcolumn .genres').each(function(o) {
			o.removeClassName('active');
		});
		
		
		var ajaxParameters = 'act=advancedsearch&' + $('advancedsearchform').serialize();
		new Ajax.Updater('inventorydisplay', '/order.php', {
			method: 'get',
			parameters: ajaxParameters,
			onComplete:function() {
				customStoreObservers();
				$('searchfeedback').update('');
				new Effect.SlideUp('advancedsearchwrapper', {duration:0.5});
			}            
		});
	});
	
	/* welcome video */
	if ($('ctwelcome')) {
		/*
		var so = new SWFObject('/clovertone_banner.swf', 'ClovertoneWelcome', '205', '400', '7', '');
		so.addParam("loop", "false");
		so.write('ctwelcome');
		$('ctwelcometop').observe('mouseover', function() {
			cursorLink();
		});
		$('ctwelcometop').observe('mouseout', function() {
			cursorClear();
		});
		*/
		$('ctwelcome').observe('click', function(e) {
			e.stop();
			myLightWindow.activateWindow({
				href: '/welcomemovie.html',
				title: 'Welcome to Clovertone Music',
				type: 'page',
				width:480,
				height:376
			});
		});
	}
	
	if (document.body.className == "nm_currentPage_home" || document.body.className == "nm_currentPage_store") {
		// initial load
		customStoreObservers();
	}
	else {
		resizeMiddleCol();
	}
	
	var authcheck = $('jsondata').innerHTML.evalJSON();
	if (authcheck.auth == true) {
		// account authorization
		Modalbox.show('/login/', { title:'Success', params:'auth=true', width:700, overlayClose:false, afterLoad:function() {
			$('authokay').observe('click', function() {
				Modalbox.hide();
			});
		}});
	}
	else if (authcheck.pr) {
		// password reset
		Modalbox.show('/login/', { title:'Password reset', params:'passwordreset=' + authcheck.pr + '&ID=' + authcheck.ID, width:700, overlayClose:false, afterLoad:function() {
			$('resetcancel').observe('click', function() {
				Modalbox.hide();
			});
			
			if ($('invokepwreset')) {
				$('invokepwreset').observe('click', function() {
					invokePwReset();
				});

				$('passwordreset').observe('keypress', function(e) {
					var key = e.which || e.keyCode;
					if (key == Event.KEY_RETURN) {
						invokePwReset();
					}
				});
				$('passwordreset2').observe('keypress', function(e) {
					var key = e.which || e.keyCode;
					if (key == Event.KEY_RETURN) {
						invokePwReset();
					}
				});	
			}
		}});
	}
	
	/* form observers */
	if (document.body.className == "nm_currentPage_customization") {
		$('customsubmit').observe('click', function(e) {
			e.stop();
			if (!$('customrequest').getValue() || !$('customchart').getValue()) {
				$('customfeedback').update('ERROR: please indicate your chart and provide a customization request');
				return;
			}
			$('customizationform').submit();
		});	
	}
	else if (document.body.className == "nm_currentPage_commissions") {
		$('commissionsubmit').observe('click', function(e) {
			e.stop();
			if (!$('skilllevel').getValue()) {
				$('commissionfeedback').update('ERROR: please indicate the skill level of your band');
				return;
			}
			$('commissionform').submit();
		});	
	}
	
	if ($('emailus')) {
		$('emailus').observe('click', function(e) {
			e.stop();
			Modalbox.show('/about/contactusform/', { title:'Send email to Clovertone Music', overlayClose:false, width:700, afterLoad:function() {
				webkit.emailformObservers();
				}});		
			});
	}
	
});

var lastsearch;
function invokeSearch() {
	if ($('storesearch').getValue() == lastsearch) { return; }
	$('inventorydisplay').update(waitHTML);
    var ajaxParameters = 'act=returntoinventory&searchfor=' + $('storesearch').getValue();
	new Ajax.Updater('inventorydisplay', '/nm_webkit/templates/store_template_xhtml.php', {
		method: 'get',
		parameters: ajaxParameters,
		onComplete:function() {
			storeObservers();
			customStoreObservers();
			lastsearch = $('storesearch').getValue();
		}
	});
}

function invokePwReset() {
	if (validatePasswords('passwordreset', 'passwordreset2', 'passwordresetfeedback') == true) { 
		return;
	}

	var authcheck = $('jsondata').innerHTML.evalJSON();
	var ajaxParameters = 'invokepwreset=true&pr=' + authcheck.pr + '&ID=' + authcheck.ID + '&password=' + $('passwordreset').getValue();
	new Ajax.Request('/login/', {
		method:'get',
		parameters:ajaxParameters,
		onComplete:function() {
			Modalbox.hide();
		}
	});
}

function doLogin() {
	var ajaxParameters = 'login=true&username=' + $('username').getValue() + '&password=' + $('password').getValue();
	new Ajax.Updater('loginfeedback', '/login/', {
		method:'get',
		parameters:ajaxParameters,
		onComplete:function() {
			if (!$('loginfeedback').innerHTML.match(/[a-z]+/)) {
				// successful login
				Modalbox.hide();

				// swap login/logout button
				$('loginlink').replace('<a id="logoutlink" href="">Logout/Edit Account</a>');
				
				$('logoutlink').observe('mouseover', function() {
					cursorLink();
				});
				$('logoutlink').observe('mouseout', function() {
					cursorClear();
				});
				$('logoutlink').observe('click', function(e) {
					e.stop();
					Modalbox.show('/login/', { title:'Logout/Edit Account', width:700, overlayClose:false, afterLoad:function() {
						logoutformObservers();
					}})
				});
				
				if ($('store_revieworder')) {
					// reload checkout page
					checkout();
				}
				else if (document.body.className == "nm_currentPage_customization") {
					$('customization_nologin').setStyle({display:'none'});
					$('customization').setStyle({display:'block'});
					resizeMiddleCol();
				}
				else if (document.body.className == "nm_currentPage_commissions") {
					$('commissions_nologin').setStyle({display:'none'});
					$('commissions').setStyle({display:'block'});
					resizeMiddleCol();
				}
			}
		}
	});
}

function logoutformObservers() {
	// resize modalbox
	showEditAccount();
	
	$('logout').observe('click', function(e) {
		e.stop();
		new Ajax.Request('/login/', { 
			method:'get',
			parameters:'logout=true',
			onComplete:function() {
				Modalbox.hide();
				
				// swap login/logout button
				$('logoutlink').replace('<a id="loginlink" href="">Login/Create Account</a>');
				
				$('loginlink').observe('mouseover', function() {
					cursorLink();
				});
				$('loginlink').observe('mouseout', function() {
					cursorClear();
				});
				$('loginlink').observe('click', function(e) {
					e.stop();
					Modalbox.show('/login/', { title:'Login/Create Account', width:700, overlayClose:false, afterLoad:function() {
						loginformObservers();
					}})
				});
				
				if (document.body.className == "nm_currentPage_customization") {
					$('customization_nologin').setStyle({display:'block'});
					$('customization').setStyle({display:'none'});
					resizeMiddleCol();
				}
				else if (document.body.className == "nm_currentPage_commissions") {
					$('commissions_nologin').setStyle({display:'block'});
					$('commissions').setStyle({display:'none'});
					resizeMiddleCol();
				}
			}
		});
	});
	
	$('cancelaccount').observe('click', function() {
		Modalbox.hide();
	});
	
	$('privacy').observe('click', function(e) {
		e.stop();
		// define height for absolute positioned privacypolicy
		if ((document.body.getHeight() - 200) > $('privacypolicy').getHeight()) {
			// use privacypolicy height
			var contentHeight = $('privacypolicy').getHeight();
		}
		else {
			var contentHeight = document.body.getHeight() - 200;
		}
		
		// define visibility for createaccountblock so that we don't see text spilling over edge of modalbox
		$('privacypolicy').setStyle({visibility:'hidden'});
		// hide createaccountblock
		$('logoutform').setStyle({display:'none'});
			// show privacypolicy so that we can calculate resize
			$('privacypolicy').setStyle({display:'block'});
			Modalbox.resizeToContent({afterResize:function() {
				// Modalbox has been resized, set visiblity back to visible
				$('privacypolicy').setStyle({visibility:'visible'});
			}});
	});
	
	$('hideprivacy').observe('click', function(e) {
		e.stop();
		showEditAccount();
	});
	
	// set country radio buttons -> hidden form val
	$('country_can').observe('click', function() {
		$('country').value="Canada";
		$('province').value="";
		// show canadian provinces
		$('provinceswrapper').setStyle({display:'block'});
		$('stateswrapper').setStyle({display:'none'});
		$('otherwrapper').setStyle({display:'none'});				
	});
	$('country_us').observe('click', function() {
		$('country').value="USA";
		$('province').value="";		
		// show canadian provinces
		$('provinceswrapper').setStyle({display:'none'});
		$('stateswrapper').setStyle({display:'block'});
		$('otherwrapper').setStyle({display:'none'});				
	});
	$('country_other').observe('click', function() {
		$('country').value="Other";
		$('province').value="";		
		$('provinceswrapper').setStyle({display:'none'});
		$('stateswrapper').setStyle({display:'none'});
		$('otherwrapper').setStyle({display:'block'});
	});
	
	// set province
	$('province_can').observe('change', function() {
		$('province').value = $('province_can').getValue();
	});
	$('province_us').observe('change', function() {
		$('province').value = $('province_us').getValue();
	});
	$('province_other').observe('change', function() {
		$('province').value = $('province_other').getValue();
	});
	
	$('editbutton').observe('click', function(e) {
		var fields = new Array('firstname', 'lastname', 'school', 'city', 'country', 'province');
		if (missingFields(fields, 'editfeedback') || validatePasswords('passwordedit','passwordeditconfirm','passwordeditfeedback') || validateEmails('emailedit','emaileditconfirm','emailfeedback')) { return; }
		var ajaxParameters = 'editaccount=true&' + $('eaform').serialize(false);
		new Ajax.Updater('editaccountblock', '/login/', {
			method:'get',
			parameters:ajaxParameters,
			onComplete:function() {
				Modalbox.hide();
			}
		})
	});
	
	// preset form vals
	var accountinfo = $('accountinfo').innerHTML.evalJSON();
	// show correct state/province options
	
	$('country').value = accountinfo.country;
	$('province').value = accountinfo.province;
	if (accountinfo.country == "Canada") {
		$('provinceswrapper').setStyle({display:'block'});
		$('stateswrapper').setStyle({display:'none'});
		$('otherwrapper').setStyle({display:'none'});
	}
	else if (accountinfo.country == "USA") {
		$('provinceswrapper').setStyle({display:'none'});
		$('stateswrapper').setStyle({display:'block'});
		$('otherwrapper').setStyle({display:'none'});
	}
	else if (accountinfo.country == "Other") {
		$('provinceswrapper').setStyle({display:'none'});
		$('stateswrapper').setStyle({display:'none'});
		$('otherwrapper').setStyle({display:'block'});
	}
	
	$H(accountinfo).each(function(pair) {
		switch (pair.key) {
			case 'username':
			$('usernameedit').update(pair.value);
			break;
			
			case 'salutation':
			switch (pair.value) {
				case 'Mr.':
				$('salutation_mr').checked = true;
				break;
				
				case 'Mrs.':
				$('salutation_mrs').checked = true;
				break;
				
				case 'Ms.':
				$('salutation_ms').checked = true;
			}
			break;
			
			case 'province':
			if (accountinfo.country == "Canada") {
				$('province_can').value = accountinfo.province;
			}
			else if (accountinfo.country == "USA") {
				$('province_us').value = accountinfo.province;
			}
			if (accountinfo.country == "Other") {
				$('province_other').value = accountinfo.province;
			}
			break;
			
			case 'country':
			switch (pair.value) {
				case 'Canada':
				$('country_can').checked = true;
				break;
				
				case 'USA':
				$('country_us').checked = true;
				break;
				
				case 'Other':
				$('country_other').checked = true;
				break;
			}
			break;
			
			default:
			$(pair.key).value = pair.value;			
			break;
			
		}
	});
}

function loginformObservers() {
	$('username').focus();
	
	$('password').observe('keypress', function(e) {
		var key = e.which || e.keyCode;
		if (key == Event.KEY_RETURN) {
			doLogin();
		}
	});
	
	$('login').observe('click', function() {
		doLogin();
	});
	
	$('cancellogin').observe('click', function() {
		Modalbox.hide();
	});
	
	$('cancelaccount').observe('click', function() {
		Modalbox.hide();
	});
	
	$('privacy').observe('click', function(e) {
		e.stop();
		
		// define height for absolute positioned privacypolicy
		if ((document.body.getHeight() - 200) > $('privacypolicy').getHeight()) {
			// use privacypolicy height
			var contentHeight = $('privacypolicy').getHeight();
		}
		else {
			var contentHeight = document.body.getHeight() - 200;
		}
		
		// define visibility for createaccountblock so that we don't see text spilling over edge of modalbox
		$('privacypolicy').setStyle({visibility:'hidden'});
		// hide createaccountblock
		$('createaccountblock').setStyle({display:'none'});
			// show privacypolicy so that we can calculate resize
			$('privacypolicy').setStyle({display:'block'});
			Modalbox.resizeToContent({afterResize:function() {
				// Modalbox has been resized, set visiblity back to visible
				$('privacypolicy').setStyle({visibility:'visible'});
			}});
	});
	
	$('hideprivacy').observe('click', function(e) {
		e.stop();
		showCreateAccount();
	});
	
	$('createaccountlink').observe('click', function(e) {
		e.stop();
		showCreateAccount();		
	});
	
	/* account creation error checking */
	
	$('usernamecreate').observe('change', function() {
		validateUsername();
	})
	
	// make sure passwords match
	$('passwordcreate').observe('change', function() {
		validatePasswords('passwordcreate','passwordcreateconfirm','passwordfeedback');
	});
	$('passwordcreateconfirm').observe('change', function() {
		validatePasswords('passwordcreate','passwordcreateconfirm','passwordfeedback');
	});
	
	// make sure email addresses match
	$('email').observe('change', function() {
		validateEmails('email','emailconfirm','emailfeedback');
	});
	$('emailconfirm').observe('change', function() {
		validateEmails('email','emailconfirm','emailfeedback');
	});
	
	// set country radio buttons -> hidden form val
	$('country_can').observe('click', function() {
		// show canadian provinces
		$('provinceswrapper').setStyle({display:'block'});
		$('stateswrapper').setStyle({display:'none'});
		$('otherwrapper').setStyle({display:'none'});				
	});
	$('country_us').observe('click', function() {	
		// show canadian provinces
		$('provinceswrapper').setStyle({display:'none'});
		$('stateswrapper').setStyle({display:'block'});
		$('otherwrapper').setStyle({display:'none'});				
	});
	$('country_other').observe('click', function() {	
		$('provinceswrapper').setStyle({display:'none'});
		$('stateswrapper').setStyle({display:'none'});
		$('otherwrapper').setStyle({display:'block'});
	});
	
	$('createbutton').observe('click', function(e) {
		// move province and country values to hidden form var
		if ($('provinceswrapper').visible()) {
			$('province').value = $('province_can').getValue();
		}
		else if ($('stateswrapper').visible()) {
			$('province').value = $('province_us').getValue();
		}
		else if ($('otherwrapper').visible()) {
			$('province').value = $('province_other').getValue();
		}
		
		if ($('country_can').checked) {
			$('country').value = "Canada";
		}
		else if ($('country_us').checked) {
			$('country').value = "USA";
		}
		else if ($('country_other').checked) {
			$('country').value = "Other";
		}
		
		var fields = new Array('usernamecreate', 'passwordcreate', 'passwordcreateconfirm', 'firstname', 'lastname', 'school', 'city', 'country', 'province', 'email', 'emailconfirm');
		if (missingFields(fields,'createfeedback') || validatePasswords('passwordcreate','passwordcreateconfirm','passwordfeedback') || validateEmails('email','emailconfirm','emailfeedback') || usernameExists) { return; }
		var ajaxParameters = 'createaccount=true&' + $('caform').serialize(false);
		new Ajax.Updater('createaccountblock', '/login/', {
			method:'get',
			parameters:ajaxParameters,
			onComplete:function() {
				$('MB_caption').update('Success!');
				
				// define height for absolute positioned createaccontblock
				$('MB_content').setStyle({height:$('createaccountblock').getHeight() + 'px'});
				
				$('accountcreated').observe('click',function() {
					Modalbox.hide();
				});
				
				Modalbox.resizeToContent();
			}
		})
	});
	
	$('forgotpasswordlink').observe('click', function(e) {
		e.stop();
		$('loginblock').setStyle({display:'none'});
		$('forgotpasswordblock').setStyle({display:'block'});
		Modalbox.resizeToContent();
		
	});
	
	$('cancelpasswordreset').observe('click', function() {
		Modalbox.hide();
	});
	
	$('forgotemail').observe('keypress', function(e) {
		var key = e.which || e.keyCode;
		if (key == Event.KEY_RETURN) {
			passwordResetInit();
		}
	});
	
	$('passwordresetinit').observe('click', function() {
		passwordResetInit();
	});
}

function passwordResetInit() {
	var ajaxParameters = 'forgotpassword=true&forgotemail=' + $('forgotemail').getValue();
	new Ajax.Updater('forgotemailfeedback', '/login/', {
		method:'get',
		parameters:ajaxParameters,
		onComplete:function() {
			if (!$('forgotemailfeedback').innerHTML.match(/[a-z]+/)) {
				// email address found
				$('forgotpasswordblock').update('Password reset instructions have been sent to your email account<div class="loginbuttons"><input id="forgotpasswordclose" type="button" value="OK" /></div>');
				
				Modalbox.resizeToContent();
				
				$('forgotpasswordclose').observe('click', function() {
					Modalbox.hide();
				});
			}	
		}
	})
}

function showCreateAccount() {
	// hide privacy policy
	$('privacypolicy').setStyle({display:'none'});
	
	// define height for absolute positioned createaccontblock
	if ((document.viewport.getHeight() - 100) > $('createaccountblock').getHeight()) {
		// use createaccountblock height
		var contentHeight = $('createaccountblock').getHeight();
	}
	else {
		var contentHeight = document.viewport.getHeight() - 100;
	}
	
	$('MB_content').setStyle({height:contentHeight + 'px'});
	
	// define visibility for createaccountblock so that we don't see text spilling over edge of modalbox
	$('createaccountblock').setStyle({visibility:'hidden',display:'block'});
	
	// hide loginblock
	$('loginblock').setStyle({display:'none'});
		
	Modalbox.resizeToContent({afterResize:function() {
		// Modalbox has been resized, set visiblity back to visible
		$('createaccountblock').setStyle({visibility:'visible'});
	}});
}

function showEditAccount() {
	// hide privacy policy
	$('privacypolicy').setStyle({display:'none'});
	
	// define height for absolute positioned createaccontblock
	if ((document.viewport.getHeight() - 100) > $('logoutform').getHeight()) {
		// use editaccountblock height
		var contentHeight = $('logoutform').getHeight();
	}
	else {
		var contentHeight = document.viewport.getHeight() - 100;
	}
	
	$('MB_content').setStyle({height:contentHeight + 'px'});
	
	// define visibility for editaccountblock so that we don't see text spilling over edge of modalbox
	$('logoutform').setStyle({visibility:'hidden',display:'block'});
		
	Modalbox.resizeToContent({afterResize:function() {
		// Modalbox has been resized, set visiblity back to visible
		$('logoutform').setStyle({visibility:'visible'});
	}});
}

function customStoreObservers() {
	resizeMiddleCol();
	
	$$('#nmstore .soundclipicon a').each(function(o) {
		var thisID = o.id.replace(/^soundclip_/,'');
		o.stopObserving('click');
		o.observe('click',function(e) {
			e.stop();
			webkit_playsong(thisID,'mediaplayer_' + thisID);
		});
	});
	
	$$('#nmstore .showURLlink a').each(function(o) {
		o.observe('click', function(e) {
			e.stop();
			var prodID = o.id.replace(/^URLlink_/,'');
			o.remove();
			$('URL_' + prodID).setStyle({display:'block'});
			$('URLfield_' + prodID).select();
		})
	});
	
	$$('#nmstore .morelink a').each(function(o) {
		o.observe('click', function(e) {
			e.stop();
			var thisComposer = o.id.replace(/^more_/,'');
			
			storefilter.set('show_category','');
			storefilter.set('show_genre','');	
			
			if ($('homeblurb')) {
				$('homeblurb').remove();
			}		
			
			composerNav(thisComposer);
		});
	});
	
	$$('#nmstore .storepagenav a').each(function(o) {
		o.stopObserving('click');
		o.observe('click', function(e) {
			e.stop();
			var thisID = o.id.replace(/^page(top|bottom)_/,'');	
			if ($('pagetop_' + thisID + 'wrapper').hasClassName('thispage')) { return; }
			gotopage(thisID);
		})
	});	
}

function resizeMiddleCol() {
	// remove any preset height
	$('middlecolumn').setStyle({height:''});
	
	if ($('ctwelcome').getHeight() > 0) {
		// flash already loaded
		var targetHeight = $('rightcolumn').getHeight() - 4;	
	}
	else {
		var targetHeight = $('rightcolumn').getHeight() + 396;
	}
	if ($('middlecolumn').getHeight() < targetHeight) {
		$('middlecolumn').setStyle({height:targetHeight + 'px'});
	}
	else {
		// add padding back to genre5
		$('genre5').setStyle({paddingBottom:'7px'});
	}
}

// error checking

function missingFields(formFields,feedback) {
	var missing = false;
	formFields.each(function(o) {
		if (!$(o).getValue()) {
			$(o + '_title').setStyle({color:'red'});
			missing = true;
		}
		else {
			$(o + '_title').setStyle({color:'black'});
		}
	});
	if (missing) {
		$(feedback).update('ERROR: you are missing some required fields, marked red');
		return true;
	}
	else {
		$(feedback).update('');
	}
}

function validatePasswords(pass1, pass2, feedback) {
	if ($(pass1).getValue() && $(pass2).getValue()) {
		if ($(pass1).getValue() !== $(pass2).getValue()) {
			$(feedback).update('ERROR: your passwords do not match')
			return true;
		}
		else {
			$(feedback).update('');
		}
	}
	return false;
}

function validateEmails(email1, email2, feedback) {
	if ($(email1).getValue() && $(email2).getValue()) {
		if ($(email1).getValue() !== $(email2).getValue()) {
			$(feedback).update('ERROR: your email addresses do not match');
			return true;
		}
		else {
			$('emailfeedback').update('');
			
			// check that email addresses are valid
			if (!$(email1).getValue().match(/^.+?@.+?\..+$/)) {
				$(feedback).update('ERROR: you have entered an invalid email address');
				return true;
			}
		}
	}
	return false;
}

var usernameExists = false;
function validateUsername() {
	// make sure username doesn't already exist
	var username = $('usernamecreate').getValue();
	
	new Ajax.Updater('usernamecreatefeedback', '/login/', {
		method:'get',
		parameters:'checkusername=true&username=' + username,
		onComplete:function(transport) {
			if (transport.responseText.match(/[a-z]+/)) {
				usernameExists = true;				
			}
			else {
				usernameExists = false;
			}
		}
	});
}

function playsong_precallback(playerID) {
	var clipID = playerID.replace(/^mediaplayer_/,'');
	// hide all other mediaplayers before making the selected one visible
	$$('.soundclips').each(function(o) {
		if (o.visible()) { o.setStyle({display:'none'}); }
	});
	$(playerID).setStyle({display:'block'});
	// show all listen icons before hiding the one corresponding to selected clip
	$$('.soundclipicon a').each(function(o) {
		if (!o.visible()) { o.setStyle({display:'block'}); }
	});
	$('soundclip_' + clipID).setStyle({display:'none'});
}

function gradeNav(thisCategory) {
	webkit.recordHistory('show_category-' + thisCategory);		
	if (webkit.cacheget('store','show_category-' + thisCategory + '-page_1')) {
		webkit.cacheoutput('store','show_category-' + thisCategory + '-page_1',$('inventorydisplay'));
		
		storeObservers();
		customStoreObservers();
		
		// dim other grades
		$$('#leftcolumn .grades').each(function(o) {
			o.removeClassName('active');
			var dimCategory = o.id.replace(/^grade/,'');
			if (dimCategory == thisCategory) {
				o.addClassName('active');
			}
		});
		// undim all genres
		$$('#rightcolumn .genres').each(function(o) {
			o.removeClassName('active');
		});	
		// undim showall
		$('showall').removeClassName('active');	
		
		new Effect.ScrollTo('pagecontent', { duration:0.5 });				
	}
	else {
		$('inventorydisplay').setOpacity(0.5);			
		var ajaxParameters = 'act=returntoinventory&show_category=' + thisCategory + '&categoryswitch=1';
		new Ajax.Updater('inventorydisplay', '/nm_webkit/templates/store_template_xhtml.php', {
			method:'get',
			parameters:ajaxParameters,
			onComplete:function() {
				$('inventorydisplay').setOpacity(1);

				storeObservers();
				customStoreObservers();						
				
				// dim other grades
				$$('#leftcolumn .grades').each(function(o) {
					o.removeClassName('active');
					var dimCategory = o.id.replace(/^grade/,'');
					if (dimCategory == thisCategory) {
						o.addClassName('active');
					}
				});
				// undim all genres
				$$('#rightcolumn .genres').each(function(o) {
					o.removeClassName('active');
				});		
				// undim showall
				$('showall').removeClassName('active');	

				// set cache
				webkit.cacheset('store','show_category-' + thisCategory + '-page_1',$('inventorydisplay'));
				
				new Effect.ScrollTo('pagecontent', { duration:0.5 });
			}
		});	
	}
}

function genreNav(thisGenre) {
	webkit.recordHistory('show_genre-' + thisGenre);	
	if (webkit.cacheget('store','show_genre-' + thisGenre + '-page_1')) {
		webkit.cacheoutput('store','show_genre-' + thisGenre + '-page_1',$('inventorydisplay'));

		storeObservers();
		customStoreObservers();				

		// dim active genres
		$$('#rightcolumn .genres').each(function(o) {
			o.removeClassName('active');
			var dimGenre = o.id.replace(/^genre/,'');
			if (dimGenre == thisGenre) {
				o.addClassName('active');
			}
		});
		// undim all grades
		$$('#leftcolumn .grades').each(function(o) {
			o.removeClassName('active');
		});
		// undim showall
		$('showall').removeClassName('active');
		
		new Effect.ScrollTo('pagecontent', { duration:0.5 });				
	}
	else {
		$('inventorydisplay').setOpacity(0.5);
		var ajaxParameters = 'act=returntoinventory&show_genre=' + thisGenre + '&categoryswitch=1';
		new Ajax.Updater('inventorydisplay', '/nm_webkit/templates/store_template_xhtml.php', {
			method:'get',
			parameters:ajaxParameters,
			onComplete:function() {
				$('inventorydisplay').setOpacity(1);

				storeObservers();
				customStoreObservers();						
				
				// dim other genres
				$$('#rightcolumn .genres').each(function(o) {
					o.removeClassName('active');
					var dimGenre = o.id.replace(/^genre/,'');
					if (dimGenre == thisGenre) {
						o.addClassName('active');
					}
				});
				// undim all grades
				$$('#leftcolumn .grades').each(function(o) {
					o.removeClassName('active');
				});
				// undim showall
				$('showall').removeClassName('active');			
				
				// set cache
				webkit.cacheset('store','show_genre-' + thisGenre + '-page_1',$('inventorydisplay'));
				
				new Effect.ScrollTo('pagecontent', { duration:0.5 });
			}
		});
	}
}

function showAllNav() {
	if ($('showall').hasClassName('active')) {
		// already selected, do nothing
		return;
	}
	$('showall').setOpacity(1);

	// undim all grades
	$$('#leftcolumn .grades').each(function(o) {
		o.removeClassName('active');
	});

	// undim all genres
	$$('#rightcolumn .genres').each(function(o) {
		o.removeClassName('active');
	});

	// set showall as active
	$('showall').addClassName('active');
	
	webkit.recordHistory('showall');
	if (document.body.className == "nm_currentPage_store") {
		if (webkit.cacheget('store','showall-page_1')) {
			// load from cache (user didn't start in store, selected a grade/genre, then show all)
			webkit.cacheoutput('store','showall-page_1',$('inventorydisplay'));	
			
			storeObservers();
			customStoreObservers();
			
			// undim all genres
			$$('#rightcolumn .genres').each(function(o) {
				o.removeClassName('active');		
			});
			// undim all grades
			$$('#leftcolumn .grades').each(function(o) {
				o.removeClassName('active');
			});
			
			new Effect.ScrollTo('pagecontent', { duration:0.5 });
		}
		else {
			// ajax load
			var ajaxParameters = 'act=returntoinventory';
			new Ajax.Updater('inventorydisplay', '/nm_webkit/templates/store_template_xhtml.php', {
				method:'get',
				parameters:ajaxParameters,
				onComplete:function() {
					storeObservers();
					customStoreObservers();						

					// undim all genres
					$$('#rightcolumn .genres').each(function(o) {
						o.removeClassName('active');		
					});
					// undim all grades
					$$('#leftcolumn .grades').each(function(o) {
						o.removeClassName('active');
					});

					// set cache
					webkit.cacheset('store','showall-page_1',$('inventorydisplay'));

					new Effect.ScrollTo('pagecontent', { duration:0.5 });
				}
			});
		}
	}
	else {
		if (!$('inventorydisplay')) {			
			$('nmstore').update('<div id="inventorydisplay"></div>');
		}
		var ajaxParameters = 'act=returntoinventory';
		new Ajax.Updater('inventorydisplay', '/nm_webkit/templates/store_template_xhtml.php', {
			method:'get',
			parameters:ajaxParameters,
			onComplete:function() {
				storeObservers();
				customStoreObservers();						

				// undim all genres
				$$('#rightcolumn .genres').each(function(o) {
					o.removeClassName('active');		
				});
				// undim all grades
				$$('#leftcolumn .grades').each(function(o) {
					o.removeClassName('active');
				});
				
				var menuData = $('jsondata').innerHTML.evalJSON();
				document.body.className = 'nm_currentPage_store';
				document.title = menuData.nm_siteTitle + ': ' + menuData.nm_menuItems['store'].title;

				// set cache
				webkit.cacheset('store','showall-page_1',$('inventorydisplay'));

				new Effect.ScrollTo('pagecontent', { duration:0.5 });
			}
		});
	}
}

function composerNav(thisComposer) {
	webkit.recordHistory('show_composer-' + thisComposer);
	if (webkit.cacheget('store','show_composer-' + thisComposer + '-page_1')) {
		webkit.cacheoutput('store','show_composer-' + thisComposer + '-page_1',$('inventorydisplay'));
		
		storeObservers();
		customStoreObservers();
		
		// undim all grades
		$$('#leftcolumn .grades').each(function(o) {
			o.removeClassName('active');
		});
		// undim all genres
		$$('#rightcolumn .genres').each(function(o) {
			o.removeClassName('active');
		});	
		// undim showall
		$('showall').removeClassName('active');	
		
		new Effect.ScrollTo('pagecontent', { duration:0.5 });				
	}
	else {
		$('inventorydisplay').setOpacity(0.5);
		var ajaxParameters = 'act=returntoinventory&show_composer=' + thisComposer + '&categoryswitch=1';
		new Ajax.Updater('inventorydisplay', '/nm_webkit/templates/store_template_xhtml.php', {
			method:'get',
			parameters:ajaxParameters,
			onComplete:function() {
				$('inventorydisplay').setOpacity(1);

				storeObservers();
				customStoreObservers();						
				
				// undim all grades
				$$('#leftcolumn .grades').each(function(o) {
					o.removeClassName('active');
				});
				// undim all genres
				$$('#rightcolumn .genres').each(function(o) {
					o.removeClassName('active');
				});		
				// undim showall
				$('showall').removeClassName('active');	

				// set cache
				webkit.cacheset('store','show_composer-' + thisComposer + '-page_1',$('inventorydisplay'));
				
				new Effect.ScrollTo('pagecontent', { duration:0.5 });
			}
		});	
	}
}