var current_media = new Hash();
var types = new Array ('video', 'audio', 'print');
window.addEvent ('domready', function() {
	makeMagicButtons();
	var states = new Array ('Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut',
					'Delaware', 'D.C.', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 
					'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts',
					'Michigan', 'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada',
					'New Hampshire', 'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota',
					'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island', 'South Carolina',
					'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington',
					'West Virginia', 'Wisconsin', 'Wyoming');
	var container = $('states_container');
	var columns = new Array(4);
	
	for (var i = 0; i < 4; ++i) {
		columns[i] = new Element ('div', {'class': 'left'});
		columns[i].injectInside (container);
	}
	
	for (var i = 0, j=0; i < states.length; ++i) {
		if (i != 0 && i%Math.ceil(states.length/4) == 0) ++j;
		var state = new Element ('div', {'class': 'option'});
		var name = states[i].toUpperCase();
		state.setProperty ('id', 'states'+i);
		state.set ('text', name);
		state.injectInside (columns[j]);
		state.addEvent ('mouseover', new Function ('', "$('states"+i+"').addClass ('hover_option');"));
		state.addEvent ('mouseout', new Function ('', "$('states"+i+"').removeClass ('hover_option');"));
		state.addEvent ('click', new Function ('', "selectState('"+name+"');"));
	}
	types.each (function(type) {
		var box = $(type+'_scrollbox');
		var selectBox = new Element ('select', {
			'id' : type+'_chapter_select'
		});
		selectBox.addEvent ('change', function () {
			selectSection(selectBox.value,-1);
		});
		new Element ('option', {
			'value' : '-1', 'text' : 'Select'
		}).inject (selectBox);
		selectBox.inject (box, 'before');
		box.set ('html', '<div class="vscroll-bar scroll-bar">'+
								'<div class="vscroll-up decrease"></div>'+
								'<div class="vscroll-line scroll-line">'+
									'<div class="vscroll-slider"></div>'+
								'</div>'+
								'<div class="vscroll-down increase"></div>'+
							'</div>'+
							'<div class="scrollee">'+
								'<ul id="'+type+'_selection" class="media_list">'+
								'</ul>'+
							'</div>');
		scrollBar(box, false, false);
	});
	scrollBar($('book_container').getElement('.scrollable'), true, false);
	//new Asset.images (['/images/video_accordion_exp.jpg', '/images/audio_accordion_exp.jpg', '/images/print_accordion_exp.jpg']);
	$('email_link').addEvent ('click', function () {
		var query_vars = '?';
		current_media.each (function (val, key) {
			query_vars += '&'+key+'='+escape(val);
		});
		showPopWin('mail.php'+query_vars, 400, 250);
	});
});
var accordion;
window.addEvent ('domready', function () {
	var pagers = $$('.pager');
	/*for (var i = 0; i < pagers.length; ++i) {
		var el = pagers[i].getFirst();
		var clone = el.clone();
		clone.setStyle ('display', 'none');
		clone.addClass ('active');
		clone.injectAfter (el);
	}*/
	var accordion_divs = $$('.accordion');
	accordion = new Accordion(pagers, $$('.page'), {
		show: 0,
		opacity: true,
		alwaysHide: true,
		onActive: function(toggler, element){
			var back = toggler.getFirst();
			if (back) back.addClass ('active');
			/*var backs = toggler.getChildren();
			for (var i = 0; i < backs.length; ++i) {
				backs[i].setStyle('display', backs[i].hasClass('active')? 'block' : 'none');
			}*/
		},
	 	onBackground: function(toggler, element){
	 		var back = toggler.getFirst();
			if (back) back.removeClass ('active');
			/*var backs = toggler.getChildren();
			for (var i = 0; i < backs.length; ++i) {
				backs[i].setStyle('display', backs[i].hasClass('active')? 'none' : 'block');
			}*/
		}
	});
});

function resizeContainerDiv () {
	var container = $('page_container');
	var size = window.getSize();
	container.setStyle ('width', size.x+'px');
	container.setStyle ('height', size.y+'px');
}
//window.addEvent ('resize', resizeContainerDiv);
//window.addEvent ('load', function () {window.setInterval(resizeContainerDiv, 600);});
function setHeader (type, featured) {
	if (!featured) {
		$('content_box_header').set ({'class' : type+'_button', 'text' : type.toUpperCase()+' library'});
		$('info_title').getParent().setStyle('display', '');		
	}
}
function selectMedia (type, element_id, featured) {
	var element = $(element_id);
	if (element == null) {
		setTimeout (function () {selectMedia (type, element_id, featured);}, 100);
		return;
	}
	if (element.getProperty ('media_selected') != 'true') {
		$$('.media_list li').each (function (el) {
			el.setProperty ('media_selected', 'false');
			el.removeClass ('hover');
		});
		element.setProperty ('media_selected', 'true');
		element.addClass ('hover');
		setHeader (type, featured);
		$('media_title').set ('text', element.getProperty (type+'_title')+(element.getProperty (type+'_duration') == null? '' : +':'));
		$('media_duration').set ('text', element.getProperty (type+'_duration'));
		$('media_description').set ('html', element.getProperty (type+'_description'));
		current_media.set ('asset', element.getProperty(type+'_id'));
		current_media.set ('type', type);
		current_media.set ('chapter', element.getProperty(type+'_chapter'));
		var url = element.getProperty (type+'_link');
		
		var rights = element.getProperty (type+'_rights');
		if (type == 'video') selectVideo(url);
		else if (type == 'audio') selectAudio(url);
		else if (type == 'print') selectPrint(url);
	}
	var download_link = $('download_link');
	var dls = $('dls');
	if(rights.toUpperCase() == 'FREE'){
		dls.style.display = 'inline';
		download_link.href = url;
	} else {
		download_link.href = '';
		dls.style.display = 'none';		
	}	
}

function selectVideo (url) {
	var holder = $('player_holder');
	holder.set ('html', '<embed src="flvplayer.swf?noCache='+new Date().getTime()+'" width="450" height="370" wmode="opaque" '+
					'allowfullscreen="true" allowscriptaccess="always" '+
					'flashvars="&file='+url+
					'&image=images/video_preview.jpg&height=370&width=450&bufferlength=60"/>'); 
}

function selectAudio (url) {
	var holder = $('player_holder');
	holder.set ('html', '<embed src="flvplayer.swf?noCache='+new Date().getTime()+'" width="450" height="370" wmode="opaque" '+
					'allowfullscreen="true" allowscriptaccess="always" '+
					'flashvars="&file='+url+
					'&image=images/audio_preview.jpg&height=370&width=450"/>');
}
function selectPrint (url) {
	var holder = $('player_holder');
	window.setTimeout ('document.location = \'output_print_media.php?link='+escape(url)+'\';', 1000);
	holder.set ('html', '<embed src="flvplayer.swf?noCache='+new Date().getTime()+'" width="450" height="370" wmode="opaque" '+
					'allowfullscreen="true" allowscriptaccess="always" '+
					'flashvars="&file=images/print_preview.jpg&image=images/print_preview.jpg&height=370&width=450"/>');
}

function makeMagicButtons () {
	var buttons = $$('.magic_button');
	buttons.push($('state_result'));
	buttons.push($('subject_result'));
	buttons.push($('level_result'));
	
	buttons.each (function (el) {
		var button_id = el.getProperty('id');
		contSuffix = (button_id.search('result') > 0)?'s_container':'_container';
		var button_child = $(button_id.substring (0,button_id.indexOf('_')) + contSuffix);
		el.addEvent ('click', function () {
			var wasHidden = button_child.getStyle ('display') == 'none';
			buttons.each (function (el2) {
				var id = el2.getProperty('id');
				var contSuffix = (id.search('result') > 0)?'s_container':'_container';
				var container = $(id.substring (0,id.indexOf('_')) + contSuffix);
				container.setStyle ('display', 'none');
			});
			if (wasHidden) {
				button_child.setStyle ('display', 'block');
			}
		});
	});
}

function getTags (parent, tag) {
	var nodes = parent.childNodes;
	var elements = new Array();
	for (var i = 0; i < nodes.length; ++i) {
		if (nodes[i].nodeType == 1 && (typeof tag == 'undefined' || nodes[i].tagName == tag)) {
			elements.push(nodes[i]);
		}
	}
	return elements;
}

function getTagValues (parent, tag) {
	var elements = getTags (parent, tag);
	var values = new Array(elements.length);
	for (var i = 0; i < elements.length; ++i) {
		try {
			values[i] = elements[i].firstChild.nodeValue;
		} catch (e) {
			values[i] = '';
		}
	}
	return values;
}

function selectState (name, xml) {
	var result_holder = $('state_result');
	if (name != result_holder.get ('text')) {
		result_holder.set ('text', name);
		$('subjects_container').set ('html', 'Wait one moment while subjects are being loaded.<br/><br/>');
		$('subject_result').set ('text', 'Select Subject');
		$('subject_result').style.visibility = 'visible';		
		$('level_result').set ('text', 'Select Level');
		$('book_listing_holder').set ('html', '');
		var loadSubjects = function (root) { 
			var subjects = getTagValues(root, 'subject');
			var container = $('subjects_container');
			container.set ('html', '');
			var columns = new Array(4);
			for (var i = 0; i < 4; ++i) {
				columns[i] = new Element ('div', {'class': 'left'});
				columns[i].injectInside (container);
			}
			for (var i = 0, j = 0; i < subjects.length; ++i) {
				if (i != 0 && i%Math.ceil(subjects.length/4) == 0) ++j;
				var subject_element = new Element ('div', {'class' : 'option'});
				subject_element.setProperty ('id', 'subjects'+i);
				var subject = subjects[i];
				subject_element.set ('text', subject);
				subject_element.addEvent ('mouseover', new Function ('', "$('subjects"+i+"').addClass ('hover_option');"));
				subject_element.addEvent ('mouseout', new Function ('', "$('subjects"+i+"').removeClass ('hover_option');"));
				subject_element.addEvent ('click', new Function ('', "selectSubject('"+subject+"');"));
				subject_element.injectInside (columns[j]);
			};
		}
		if (typeof xml != 'undefined') {
			loadSubjects (xml);
		} else {
			var request = new Request ({
				'url' : 'pajax/get_subjects.php',
				'onSuccess' : function (responseText, responseXML) {
					var root = responseXML.documentElement;
					loadSubjects (root);
				}
			}).send("state="+name);
		}
	}
	$('states_container').setStyle ('display', 'none');
}
function selectSubject (name, xml) {
	var result_holder = $('subject_result');
	if (name != result_holder.get ('text')) {
		result_holder.set ('text', name);
		$('levels_container').set ('html', 'Wait one moment while levels are being loaded.<br/><br/>');
		$('level_result').set ('text', 'Select Level');
		$('level_result').style.visibility = 'visible';				
		$('book_listing_holder').set ('html', '');
		var loadLevels = function (root) {
			var levels = getTagValues(root, 'level');
			var container = $('levels_container');
			container.set ('html', '');
			var columns = new Array(4);
			for (var i = 0; i < 4; ++i) {
				columns[i] = new Element ('div', {'class': 'left'});
				columns[i].injectInside (container);
			}
			for (var i = 0, j = 0; i < levels.length; ++i) {
				if (i != 0 && i%Math.ceil(levels.length/4) == 0) ++j;
				var level_element = new Element ('div', {'class' : 'option'});
				level_element.setProperty ('id', 'levels'+i);
				var name = levels[i];
				level_element.set ('text', name);
				level_element.addEvent ('mouseover', new Function ('', "$('levels"+i+"').addClass ('hover_option');"));
				level_element.addEvent ('mouseout', new Function ('', "$('levels"+i+"').removeClass ('hover_option');"));
				level_element.addEvent ('click', new Function ('', "selectLevel('"+name+"');"));
				level_element.injectInside (columns[j]);
			};
		}
		if (typeof xml != 'undefined') {
			loadLevels (xml);
			// alert ('not undefined!');
		} else {
			var request = new Request ({
				'url' : 'pajax/get_levels.php',
				'onSuccess' : function (responseText, responseXML) {
					var root = responseXML.documentElement;
					loadLevels (root);
				}
			}).send("state="+$('state_result').get('text')+"&subject="+name);
		}
	}
	$('subjects_container').setStyle ('display', 'none');
}
function selectLevel (name, xml) {
	var result_holder = $('level_result');
	
	if (name != result_holder.get ('text')) {
		result_holder.set ('text', name);
		$('book_listing_holder').set ('html', '');
		var loadBooks = function (root) {
			var books = getTags(root, 'book');
			var container = $('book_listing_holder');
			container.set ('html', '');
			for (var i = 0; i < books.length; ++i) {
				var li = new Element ('li');
				li.injectInside (container);
				if (i != 0) {
					new Element ('img', {
						'class' : 'separator',
						'src' : 'images/vertical_separator.gif'
					}).injectInside (li);
				}
				var book_element = new Element ('img', {'class' : 'book'});
				var attrs = books[i].attributes;
				for (var j = 0; j < attrs.length; ++j) {
					var node = attrs.item(j);
					book_element.setProperty ('book_'+node.nodeName, node.value);
				}
				var isbn = attrs.getNamedItem('isbn').value;
				book_element.setProperty ('src', 'http://covers.mhedu.com/Jpeg_75-wide/'+isbn+'.jpeg');
				book_element.setProperty ('id', 'books_'+isbn);
				book_element.setOpacity ('.5');
				book_element.addEvent ('mouseover', new Function ('', "$('books_"+isbn+"').setOpacity (1);"));
				book_element.addEvent ('mouseout', new Function ('', "var book = $('books_"+isbn+"'); if(book.getProperty('book_selected') != 'true') book.setOpacity (.5);"));
				book_element.addEvent ('click', new Function ('', "selectBook($('books_"+isbn+"'));"));
				book_element.injectInside (li);
			}
			/*var controller = $('hcontroller');
			var scrollbar = controller.getElement('.hscroll-line');
			makeScrollbar ($('hscrollee'), 
				scrollbar,
				scrollbar.getElement('div'),
				controller.getElement('.increase'),
				controller.getElement('.decrease'), true, false);*/
		}
		if (typeof xml != 'undefined') {
			loadBooks (xml);
		} else {
			var request = new Request ({
				'url' : 'pajax/get_books.php',
				'onSuccess' : function (responseText, responseXML) {
					var root = responseXML.documentElement;
					loadBooks (root);
				}
			}).send("state="+$('state_result').get('text')+"&subject="+$('subject_result').get('text')+"&level="+name);
		}
	}
	$('levels_container').setStyle ('display', 'none');
}

function setInfoDisplay(featured){
	if(featured){
		$('info_title').getParent().setStyle('display', 'none');
		$('media_title').set ('html', 'Search, View, Listen, and Learn');
		$('media_description').set ('html', "McGraw-Hill's new Media Library allows students and teachers to expand their knowledge by providing high-quality multimedia assets for study at home or on the go.  View the samples or select your State, Level, Subject and Book to navigate to your textbook resources<br/>");
		$('info_cover').setStyle('display','none');
		$('media_description').setStyle('width','400px');
		$('media_description').setStyle('height','100px');		
	} else {
		$('info_title').getParent().setStyle('display', '');
		$('info_cover').setStyle('display','');
		$('media_description').setStyle('width','280px');
		$('media_description').setStyle('height','75px');		
	}
}

function selectBook (el, xml) {
	setInfoDisplay(false);
	if (el.getProperty('book_selected') != 'true') {
		var books = $$('.book');
		books.each (function(e) {
			e.setProperty ('book_selected', 'false');
			e.setOpacity (0.5);
		});
		el.setProperty ('book_selected', 'true');
		el.setOpacity (1);
		var isbn = el.getProperty ('book_isbn');
		current_media.set ('isbn', isbn);
		current_media.set ('state', $('state_result').get('text'));
		current_media.set ('subject', $('subject_result').get('text'));
		current_media.set ('level', $('level_result').get('text'));
		current_media.set ('type', '');
		current_media.set ('asset', '');
		$('info_cover').setProperty ('src', 'http://covers.mhedu.com/Jpeg_140-wide/'+isbn+'.jpeg');
		$('info_title').set ('html', el.getProperty('book_title'));
		$('info_copy').set ('html', '&copy;'+el.getProperty('book_copy'));
		$('media_title').set ('text', '');
		$('media_duration').set ('text', '');
		$('media_description').set ('text', 'Please select media in the VIDEO, AUDIO, or PRINT library tabs.');
		
		/*
		var image_loc = 'http://covers.mhedu.com/Jpeg_400-high/'+isbn+'.jpeg';
		$('player_holder').set ('html', '<embed src="flvplayer.swf?noCache='+new Date().getTime()+'" width="450" height="370" wmode="opaque" '+
					'allowfullscreen="true" allowscriptaccess="always" '+
					'flashvars="&file='+image_loc+'&image='+image_loc+
					'&height=370&width=450&type=jpg"/>');
		*/
		
		$('player_holder').set ('html', '<embed src="flvplayer.swf" width="450" height="370" wmode="opaque" '+
					'allowfullscreen="true" allowscriptaccess="always" '+
					'flashvars="file=HowTo_MediaLibrary.swf&height=370&width=450&type=jpg&autostart=1"/>');		
		
		var loadMedia = function (root) {
			types.each (function (type) {
				var media = getTags (root, type+'s')[0];
				buildMedia (type, isbn, -1, media);
			});
		}
		if (typeof xml == 'undefined') {
			var request = new Request ({
				'url' : 'pajax/get_media.php',
				'onSuccess' : function (responseText, responseXML) {
					var root = responseXML.documentElement;
					loadMedia(root);
				}
			}).send("book="+escape(isbn)+"&type=-1&chapter=-1");
		} else {
			loadMedia (xml);
		}
	}
}
function setChapter (type, chapter) {
	if (type == -1) {
		types.each (function (t) {
			setChapter (t, chapter);
		});
	} else {
		var cs = $(type+'_chapter_select');
		cs.setProperty ('value', chapter);
		current_media.set ('chapter', chapter);
	}
}
function buildMedia (type, isbn, sect, xml) {
	var cs = $(type+'_chapter_select');
	var mh = $(type+'_selection');
	cs.set ('html', '');
	mh.set ('html', '');
	
	if (typeof xml == 'number' && xml == -1) {
		var request = new Request ({
			'url' : 'pajax/get_media.php',
			'onSuccess' : function (responseText, responseXML) {
				var root = responseXML.documentElement;
				buildMedia (type, isbn, sect, getTags(root, type+'s')[0]);
			}
		}).send("book="+isbn+"&chapter="+sect+"&type="+type);
		
	} else {
		new Element ('option', {'text' : 'Select', 'value' : -1}).injectInside (cs);
		if (typeof xml != 'undefined') {
			var chapters = getTags (xml, 'chapter');
			for (var i = 0; i < chapters.length; ++i) {
				var chapter = new Element ('option');
				var val = chapters[i].attributes.getNamedItem ('value').value;
				chapter.setProperty ('value', val);
				if (val == sect) {
					chapter.setProperty ('selected', 'selected');
					current_media.set ('chapter', val);
				}
				chapter.set ('text', chapters[i].attributes.getNamedItem ('label').value);
				chapter.injectInside (cs);
			}
			var media = getTags (xml, type);
	
			butt = $$('.' + type + '_button h3');
			
			if(media.length > 0){
				butt.removeClass ('empty');	
			} else {
				butt.removeClass ('active');
				butt.addClass ('empty');
			}			
			for (var i = 0; i < media.length; ++i) {
				var media_div = new Element ('li');
				var attrs = media[i].attributes;
				for (var j = 0; j < attrs.length; ++j) {
					var node = attrs.item(j);
					media_div.setProperty (type+'_'+node.nodeName, node.value);
				}
				var id = type+'s_'+attrs.getNamedItem('id').value;
				if (attrs.getNamedItem('id').value == current_media.get('asset')) {
					media_div.setProperty ('media_selected', 'true');
					media_div.addClass ('hover');
				}
				media_div.setProperty ('id', id);
				media_div.addEvent ('mouseover', new Function ('', "$('"+id+"').addClass ('hover');"));
				media_div.addEvent ('mouseout', new Function ('', "var el = $('"+id+"'); if (el.getProperty('media_selected') != 'true') el.removeClass ('hover');"));
				media_div.addEvent ('click', new Function ('', "selectMedia('"+type+"', '"+id+"');"));
				var format = type == 'print'? attrs.getNamedItem('format').value : type;
				new Element ('img', {'src': 'images/'+format+'_icon.gif'}).injectInside (media_div);
				var inner_div = new Element ('div').injectInside (media_div);
				//new Element ('h4', {'text' : $('info_title').get('text').toUpperCase()}).injectInside (inner_div);
				new Element ('strong', {
					'text' : attrs.getNamedItem ('title').value+
					((attrs.getNamedItem ('duration').value == '')? '' : ': '+attrs.getNamedItem ('duration').value)
				}).injectInside (inner_div);
				new Element ('p', {'html' : attrs.getNamedItem ('description').value}).injectInside (inner_div);
				media_div.injectInside (mh);			
			}
		} else alert ('no data for '+type);
		/*var scroll_box = $(type+'_scrollbox');
		var scroll_controller = scroll_box.getElement ('.vscroll-bar');
		var scroll_bar = scroll_controller.getElement ('.vscroll-line');
		makeScrollbar (scroll_box.getElement('.scrollee'),
			scroll_bar,
			scroll_bar.getElement('div'),
			scroll_controller.getElement('.increase'),
			scroll_controller.getElement('.decrease'), false, false);*/
	}
}
function selectSection (value, type) {
	if (type == -1) {
		types.each (function (t) {
			selectSection (value, t);
		});
	} else {
		buildMedia (type, current_media.get('isbn'), value, -1);
	}
}

function scrollBar (box, horizontal, ignoreMouse, sizeCheck) {
	var curSize = 'not a number';
	try {
		var content = $(box).getElement('.scrollee');
		curSize = horizontal? content.getScrollSize().x : content.getScrollSize().y;
		if (sizeCheck != curSize) {
			var controller = $(box).getElement ('.scroll-bar');
			var scrollbar = controller.getElement ('.scroll-line');
			var handle = scrollbar.getElement('div');
			var increase = controller.getElement('.increase');
			var decrease = controller.getElement('.decrease');
			makeScrollbar (content, scrollbar, handle, increase, decrease, horizontal, ignoreMouse);
		}
	} catch (e) {}
	window.setTimeout(function () {
		scrollBar (box, horizontal, ignoreMouse, curSize);
	}, 750);
}

var scrollBarIdCounter = 0;
function makeScrollbar(content,scrollbar,handle,increase,decrease,horizontal,ignoreMouse){
	var timer;
	var steps = (horizontal?(content.getScrollSize().x - content.getSize().x):(content.getScrollSize().y - content.getSize().y));
	var scrollbarSize = scrollbar.getSize();
	var majorSize = (horizontal)? scrollbarSize.x : scrollbarSize.y;
	handle.setStyle(horizontal? 'width' : 'height', ((steps<=0)? majorSize : Math.min(100*majorSize/steps+20, majorSize*.5))+'px');
	content.removeEvents();
	scrollbar.removeEvents();
	handle.removeEvents();
	var slider = new Slider(scrollbar, handle, {
		steps: steps,
		mode: (horizontal?'horizontal':'vertical'),
		onChange: function(step){
			// Scrolls the content element in x or y direction.
			var x = (horizontal?step:0);
			var y = (horizontal?0:step);
			content.scrollTo(x,y);
			if (this.increase != null) clearTimeout(timer);
			if (this.decrease != null) clearTimeout(timer);
		}
	}).set(0);
	if( !(ignoreMouse) ){
		// Scroll the content element when the mousewheel is used within the 
		// content or the scrollbar element.
		$$(content, scrollbar).addEvent('mousewheel', function(e){	
			e = new Event(e).stop();
			var step = slider.step - e.wheel * 30;	
			slider.set(step);					
		});
	}
	var stopScroll = function (e) {
		clearTimeout (timer);
	}
	if (increase != null) {
		increase.removeEvents();
		var increase_id = increase.getProperty('id');
		if (increase_id == null) {
			increase_id = 'increaser'+scrollBarIdCounter++;
			increase.setProperty ('id', increase_id);
		}
		var increaser = function(e) {
			var step = slider.step + 10;
			slider.set(step);
			clearTimeout (timer);
			timer = setTimeout ("$('"+increase_id+"').fireEvent('mousedown')", 75);
		};
		slider.increaser = increaser;
		increase.addEvent ('mousedown', increaser);
		increase.addEvent ('mouseup', stopScroll);
		increase.addEvent ('mouseout', stopScroll);
	}
	if (decrease != null) {
		decrease.removeEvents();
		var decrease_id = decrease.getProperty('id');
		if (decrease_id == null) {
			decrease_id = 'decreaser'+scrollBarIdCounter++;
			decrease.setProperty ('id', decrease_id);
		}
		var decreaser = function(e) {
			var step = slider.step - 10;
			slider.set(step);
			clearTimeout(timer);
			timer = setTimeout ("$('"+decrease_id+"').fireEvent('mousedown')", 75);
		};
		slider.decreaser = decreaser;
		decrease.addEvent ('mousedown', decreaser);
		decrease.addEvent ('mouseup', stopScroll);
		decrease.addEvent ('mouseout', stopScroll);
	}
	// Stops the handle dragging process when the mouse leaves the document body.
	$(document.body).addEvent('mouseleave',function(){slider.drag.stop()});
}

function fauxAttributes () {
	this.list = new Array();
	this.length = 0;
}

fauxAttributes.prototype.addAttr = function (name, value) {
	this.list.push ({'nodeName' : name, 'value' : value});
	this.length = this.list.length;
}

fauxAttributes.prototype.item = function (i) {
	return this.list[i];
}

fauxAttributes.prototype.getNamedItem = function (name) {
	for (var i = 0; i < this.length; ++i) {
		var item = this.list[i]; 
		if (item.nodeName == name) return item;
	}
	return null;
}

function fauxNode (tagName, text) {
	this.childNodes = new Array();
	this.tagName = tagName;
	this.nodeType = 1;
	this.attributes = new fauxAttributes();
	if (typeof text != 'undefined') {
		this.addChild({'nodeValue' : text});
	}
}

fauxNode.prototype.addChild = function (node) {
	this.childNodes.push(node);
	this.firstChild = this.childNodes[0];
}

fauxNode.prototype.hasChildren = function () {
	return this.childNodes.length > 0;
}