
var Conf = {
	debug : false,
	js_path : '/js/',
	src_img_clear : '/js/bv/clear.gif',
	src_js_domready : '/js/bv/domready.js',
	src_htc_domready : '/js/bv/domready.htc'
};

// set defaults for this file, which may have already been configured
if (!Conf) var Conf = {};
Conf.debug = Conf.debug || false; // note: setting to "true" here cannot be overridden by a "false" somewhere else
Conf.js_path = Conf.js_path || '/js/';
Conf.src_img_clear = Conf.src_img_clear || '/js/bv/clear.gif';
Conf.src_js_domready = Conf.src_js_domready || '/js/bv/domready.js';
Conf.src_htc_domready = Conf.src_htc_domready || '/js/bv/domready.htc';
Conf.ajax_request_timeout = Conf.ajax_request_timeout || 30;
Conf.ajax_response_timeout = Conf.ajax_response_timeout || 30;



var bv = {
	tickBase : new Date(),
	initialized : false,
	init : function () {
		bv.initialized = new Date();
		bv.debug.init();
		bv.dom.init();
		bv.css.init();
		//bv.ajax.init();
	}, // END init

	bv_guid : 1,
	guid_counter : 2, // 0 is reserved, bv.bv_guid == 1
	getNewGuid : function() { return bv.guid_counter++; },
	getId : function (el,base) {
		if (!el.id) {
			var b = (base) ? base : "bv";
			el.id = b + bv.getNewGuid();
		}
		return el.id;
	},
	
	debug : {
		initialized : false,
		init : function () {
			bv.debug.initialized = new Date();
			if (Conf['debug']) {
				bv.event.add(window, 'domready', function () { bv.debug.msg('domready','debug'); });
				bv.event.add(window, 'domready', function () { bv.debug.msg('domready (prioritized)','debug'); }, "priority");
				bv.event.add(window, 'load', function () { bv.debug.msg('page loaded','debug'); });
				bv.event.add(window, 'load', bv.debug.make);
				bv.debug.win = window.open('', '_blank');
				bv.debug.msg('init','debug');
			} else {
				bv.debug.msg = function () { };
			}
			if (!window.d) window.d = bv.debug.msg;
		},
		cnt : 1,
		msgList : { debug : ['script-parse [event #0 :: msg @ 0s]'] },
		msgWait : null,
		msg : function(Msg,Cat) {
			if (bv.debug.msgWait) clearTimeout(bv.debug.msgWait);
			if (!Cat) Cat = 'unspecified';
			if (!bv.debug.msgList[Cat])
				bv.debug.msgList[Cat] = new Array();
			var Now = new Date();
			bv.debug.msgList[Cat].push(Msg +' [event #'+ bv.debug.cnt++ +' :: msg @ '+ ((Now.getTime() - bv.tickBase.getTime()) /1000) +'s]');
			bv.debug.msgWait = setTimeout('bv.debug.make();', 1000);
		}, // END debug.msg
		make : function() {
			if (!bv.dom.initialized) return;
			var Alert = '<ul>';
			for (var Cat in bv.debug.msgList) {
				if (typeof Cat != "string" || (typeof bv.debug.msgList[Cat] != "object" || !bv.debug.msgList[Cat].length)) continue;
				Alert += '<li>'+ Cat +'<ol>';
				for (var xx=0; xx<bv.debug.msgList[Cat].length; xx++)
					Alert += '<li>'+ bv.debug.msgList[Cat][xx] +'</li>';
				Alert += '</ol></li>';
			}
			var Now = new Date();
			Alert += '</ul><br />-- end tick count: '+ ((Now.getTime() - bv.tickBase.getTime()) /1000) +'s --';
			if (bv.debug.win) {
				bv.debug.win.document.open();
				bv.debug.win.document.write(Alert);
				bv.debug.win.document.close();
			}
		} // END debug.make
	},

	event : {
		add : function(el, evt, fn, prioritize) {
			if (evt == 'domready') el = window;
			if (typeof el == "string") el = document.getElementById(el);
			if (!el) return;
			if (evt == 'domready') {
				if (prioritize) bv.dom.readyList.unshift(fn);
				else bv.dom.readyList.push(fn);
				if (bv.dom.initialized)
					bv.dom.ready('event.add'); // do not call function directly, because you want it executed in order
			} else { // start Dean Edwards-port code
				if (!fn.bv_guid) fn.bv_guid = bv.getNewGuid();
				if (!el.bv_events) el.bv_events = {};
				if (!el.bv_events[evt]) {
					el.bv_events[evt] = {};
					if (el["on" + evt]) { // store any previously-assigned handlers
						el.bv_events[evt][0] = el["on" + evt];
					}
				}
				el.bv_events[evt][fn.bv_guid] = fn;
				el["on" + evt] = bv.event.handle;
			}
		}, // END event.add
		remove : function(el, evt, fn) {
			if (el.events && el.bv_events[evt] && fn.bv_guid)
				delete el.bv_events[evt][fn.bv_guid];
		}, // END event.remove
		handle : function(e) {
			var Rtn = true;
			e = e || bv.event.fixEvent(window.event);
			for (var ii in this.bv_events[e.type]) {
				this.bv_handleEvent = this.bv_events[e.type][ii];
				if (this.bv_handleEvent(e) === false)
					Rtn = false;
			}
			return Rtn;
		}, // END event.handle
		fixEvent : function (event) {
			// add W3C standard event methods
			event.preventDefault = bv.event.fixEvent_preventDefault;
			event.stopPropagation = bv.event.fixEvent_stopPropagation;
			return event;
		},
		fixEvent_preventDefault : function() {
			this.returnValue = false;
		},
		fixEvent_stopPropagation : function() {
			this.cancelBubble = true;
		}

	}, // END event

	dom : {
		initialized : false,
		init : function () {
			bv.dom.initialized = false; // not initialized until dom.ready is run
			if (document.addEventListener) {
				document.addEventListener('DOMContentLoaded', bv.dom.ready, false); // Gecko-based browsers
			} else {
				/*@cc_on @*/
				/*@if (@_win32) // Win IE 5+ loads js with direct call or htc with ondocumentready event
				//document.write('<script defer src="'+ Conf['src_js_domready'] +'"><'+'/script>');
				document.all.tags("TITLE")[0].addBehavior(Conf['src_htc_domready']);
				@else @*/
				/*@end @*/
			}
			bv.dom.bodyScan(); // a scanner to catch the rest, like Safari and Opera
			bv.event.add(window, 'load', bv.dom.ready); // fail-safe fire onload, in case the above hangs
			bv.event.add(window, 'unload', function(){ window.bv = null; } ); // clean up after yourself
		}, // END dom.init

		readyList : [
			function () {
				bv.dom.initialized = new Date();
				if (bv.css && bv.css.addClass)
					bv.css.addClass(document.getElementsByTagName('body')[0], 'domReady');
			}
		],
//		readyDeferList : [],
		ready : function() {
			while (this.E = bv.dom.readyList.shift()) // deletes as it goes
				this.E(); // note: may safely support multiple, simultaneous firings
//			while (this.E = bv.dom.readyDeferList.shift()) this.E(); 
		}, // END dom.ready
		check_nodes : 0,
		check_count : 0,
		bodyCheck : function() {
			var Cnt = document.getElementsByTagName('*').length;
			if (bv.dom.check_nodes == Cnt) bv.dom.check_count++;
			else bv.dom.check_count = 0; // every changes resets the count
			bv.dom.check_nodes = Cnt;
			return (
				bv.dom.check_count >= 3 // the number of nodes has been the same for 3 checks
				&&
				(H = document.documentElement || document.getElementsByTagName("html")) // there is a document node
				&&
				H.hasChildNodes() && H.childNodes.length >= 2 // document node has children; the body would be the second node
				&&
				(/[^>]+<\/body>/i).test(H.innerHTML) // some browsers imagine a </body> as soon as they see the <body>; this checks that the character immeditately before the imagined </body> is not a similarly-imagined closing tag, thus, any enclosing wrapper div (etc.) has finished loading -- BUT, the real </body> in the source must be on a line by itself!
			);
		}, // END dom.bodyCheck
		bodyScan : function() {
			if (bv.dom.bodyCheck()) bv.dom.ready('bodyScan');
			else if (!bv.dom.initialized) setTimeout("bv.dom.bodyScan();", 500);
		}, // END dom.bodyScan

		getElementsByClassName : function (el,TagsIn,Class) {
			var It = "\\b"+Class+"\\b";
			var rtn = [];
			var Tags = TagsIn.split(",");
			for (var xx=0; xx<Tags.length; xx++) {
				var Els = (el.getElementsByTagName) ? el.getElementsByTagName(Tags[xx]) : el.all;
				for (var ii=0; ii<Els.length; ii++) {
					if (Els[ii].className.match(It))
						rtn[rtn.length] = Els[ii];
				}
			}
			return rtn;
		},
		getChildNodesOfType : function (el,TagsIn) {
			var rtn = [];
			TagsIn = TagsIn.toUpperCase();
			for (var xx=0; xx<el.childNodes.length; xx++)
				if ((","+TagsIn+",").indexOf(","+ el.childNodes[xx].nodeName +",") != -1)
					rtn[rtn.length] = el.childNodes[xx];
			return rtn;
		}
	}, // END dom
	
	css : {
		initialized : false,
		init : function () {
			bv.css.initialized = new Date();
			bv.css.makeRuleSheet();
		},
		
		ruleSheet : null,
		makeRuleSheet : function () {
// deactivate until Safari bug is squashed
return;
/*
			var ruleSheet = document.createElement('style');
			ruleSheet.type = 'text/css';
			document.getElementsByTagName('head')[0].appendChild(ruleSheet);
			bv.css.ruleSheet = document.styleSheets[document.styleSheets.length -1] || ruleSheet;
*/
			bv.css.ruleSheet = document.styleSheets[document.styleSheets.length -1];
			if (!bv.css.ruleSheet.rules) // make Mozilla conform to IE and Safari
				bv.css.ruleSheet.rules = bv.css.ruleSheet.cssRules;
		},
		insertRule : function (selector, declaration) {
// deactivate until Safari bug is squashed
return;
			var index = bv.css.ruleSheet.rules.length;
			if (bv.css.ruleSheet.insertRule)
				bv.css.ruleSheet.insertRule(selector +'{'+ declaration +'}', index);
			else bv.css.ruleSheet.addRule(selector, declaration,index);
/* 
	annoying Safari bug; seems it won't render a new style rule to the page 
	unless you change one of its properties first
*/
			bv.css.ruleSheet.rules[index].style.orphans = 'inherit';
			return index;
		}, // END css.insertRule
		deleteRule : function (selector) {
// deactivate until Safari bug is squashed
return;
			for (var xx=0; xx<bv.css.ruleSheet.rules.length; xx++)
				if (bv.css.ruleSheet.bv_rules[xx].selectorText.toLowerCase() == selector)
					bv.css.deleteRuleByIndex(xx);
		}, // END css.deleteRule
		deleteRuleByIndex : function (index) {
// deactivate until Safari bug is squashed
return;
			if (bv.css.ruleSheet.deleteRule)
				bv.css.ruleSheet.deleteRule(index);
			else bv.css.ruleSheet.removeRule(index);
		}, // END css.deleteRuleByIndex

		addClass : function (el,nm) {
			var regex = new RegExp("\\b"+nm+"\\b");
			if (!el.className.match(regex))
				el.className = bv.string.trim(el.className +" "+ nm, true);
		}, // END style.addClass
		removeClass : function (el,nm) {
			var regex = new RegExp("\\b"+nm+"\\b", "g");
			el.className = bv.string.trim(el.className.replace(regex, ''), true);
		}, // END css.removeClass

		getValue : function (el,prop) {
			if (document.defaultView && document.defaultView.getComputedStyle) {
				return document.defaultView.getComputedStyle(el,'').getPropertyValue(prop);
			} else {
				var propCased = bv.string.camelCase(prop);
				if (el.currentStyle) {
					return el.currentStyle[propCased];
				} else return el.style[propCased];
			}
		},
		getOffset : function (el,base) { // no base = offset from parent
			// IE will treat the offset as to the parentNode; Moz refers all to the body element
			// so if we're not finding an offset relative to a base, take a shortcut for IE:
			if (!base && el.offsetParent == el.parentNode) {
				return { top : el.offsetTop, left : el.offsetLeft };
			} else if (!base) base = el.parentNode;
//			var elOffset   = bv.css.getOffsetFromRoot(el);
//			var baseOffset = bv.css.getOffsetFromRoot(base);
			return {
				top  : el.offsetTop  - base.offsetTop,
				left : el.offsetLeft - base.offsetLeft
			};
		},
		getOffsetFromRoot : function (el) {
			var offset = { top : 0, left : 0};
			while (el) {
				offset.top  += el.offsetTop;
				offset.left += el.offsetLeft;
				el = el.offsetParent;
			}
			return offset;
		},
		getWindowSize : function () {
			if (typeof(window.innerWidth) == 'number') {
				return {
					w : window.innerWidth,
					h : window.innerHeight
				};
			} else {
				if (window.document.documentElement && window.document.documentElement.clientWidth) {
					return {
						w : window.document.documentElement.clientWidth,
						h : window.document.documentElement.clientHeight
					};
				} else {
					if (window.document.body && window.document.body.clientWidth) {
						return {
							w : window.document.body.clientWidth,
							h : window.document.body.clientHeight
						};
//							w : window.document.document.body.clientWidth,
//							h : window.document.document.body.clientHeight
					}
				}
			}
			return false;
		},
		opacity : {
			get : function (el) {
				var Style = null;
				var Alpha = 1;
				if (typeof el.bv_opacity == 'number')
					Alpha = el.bv_opacity;
				else if (Style = bv.css.getValue(el, 'opacity'))
					Alpha = parseFloat(Style);
				else if (Style = bv.css.getValue(el, '-moz-opacity'))
					Alpha = parseFloat(Style);
				else if (el.filters && el.filters.length && el.filters.alpha)
					Alpha = parseFloat(el.filters.alpha.opacity) /100;
				if (Alpha >= 0.99999) Alpha = 1; // unmask masked values
				if (Alpha <= 0.00001) Alpha = 0; // unmask masked values
				return Alpha;
			},
			set : function (el,Alpha) {
				if (Alpha > 0.99) Alpha = 0.99999; // mask incoming 1 to prevent fully-visible flickering transitions
				if (Alpha < 0.01) Alpha = 0.00001; // mask incoming 0 to prevent fully-invisible flickering transitions
				el.bv_opacity = parseInt(Alpha *100000) /100000; // helps speed getter; needed for Safari in some cases
				el.style.opacity = el.bv_opacity;
				el.style.MozOpacity = el.bv_opacity;
				el.style.KHTMLOpacity = el.bv_opacity;
				if (el.filters && !el.filters.alpha) // if this hasn't been declared yet as a style, it's not a filter object
					el.style.filter += ' alpha(opacity='+ (el.bv_opacity *100) +')'; // append to prevent overwriting previous filters
				if (el.filters && el.filters.length && el.filters.alpha)
					el.filters.alpha.opacity = el.bv_opacity *100;
				if (el.bv_opacity >= 0.99999) el.bv_opacity = 1; // unmask masked values
				if (el.bv_opacity <= 0.00001) el.bv_opacity = 0; // unmask masked values
				return el.bv_opacity;
			},
			adjustBy : function (el,AlphaDelta) {
				if ((""+AlphaDelta).charAt((""+AlphaDelta).length -1) == "%") {
					var Pct = parseFloat(AlphaDelta) /100;
					AlphaDelta = (Pct >= 0) ? // round up/down away from zero
						Math.ceil((1 - bv.css.opacity.get(el)) * Pct) :
						Math.floor(bv.css.opacity.get(el) * Pct);
				}
				return bv.css.opacity.set(el, bv.css.opacity.get(el) + parseFloat(AlphaDelta));
			}
		}
	}, // END css
	

	string : {
		trim : function (s,dedupe) {
			// Mac IE chokes on the '?'; you can break this into two replaces for Mac IE compatibility
			s = s.replace(/^[\t\r\n\s]*(.*?)[\t\r\n\s]*$/, '$1');
			if (dedupe) // reduce internal runs of whitespace
				s = s.replace(/[\t\r\n\s]+/g, ' ');
			return s;
		},
		camelCase : function (s) {
			var bits = s.split("[- ]+");
			for (var xx=1; xx<bits.length; xx++)
				if (bits[xx].length)
					bits[xx] = bits[xx].charAt(0).toUpperCase() + bits[xx].substring(1);
			return bits.join('');
		},
		stripHTML : function (s) {
			return s.replace(/<\/?\w+.*?>/g,'');
		},
		parseKeyValueString : function (s,d) {
			if (!d) d = "|"; // delimiter for multiple values with the same key
			while (s.charAt(0) == "?") s = s.substring(1);
			var Pairs = s.split(/\&(amp;)?/);
			var Rtn = {};
			for (var xx=0; xx<Pairs.length; xx++) {
				var NameValue = Pairs[xx].split("=");
				if (Rtn[unescape(NameValue[0])])
					Rtn[unescape(NameValue[0])] += d;
				else
					Rtn[unescape(NameValue[0])] = '';
				Rtn[unescape(NameValue[0])] += Rtn[unescape(NameValue[1])]
			}
			return Rtn;
		},
		makeKeyValueString : function (obj, escapeAmp, delimiter, separater) {
			var amp = (escapeAmp) ? "&amp;" : "&";
			var d = delimiter || amp;
			var s = separater || "=";
			var Arr = [];
			for (var Prop in obj)
				Arr.push(escape(Prop) + s + escape(obj[Prop]));
			return Arr.join(d);
		},
		appendQueryString : function (url, string, escapeAmp) {
			var amp = (escapeAmp) ? "&amp;" : "&";
			var pre = (url.indexOf("?") != -1) ? amp : "?";
			return url + pre + string;
		}
	}, // END string
	
	data : {
		isEmailFormat : function (str) {
			return /^[^\s]@[^\s]\.\w{2,}$/.test(str);
		}
	}, // END form
	
	cookie : {
		get : function (name) {
		
		},
		set : function (name, value, path, expires, domain) {
		
		},
		verifyAccepted : function () {}
	},
	
	array : {
		shuffle : function (a) {
			if (a.length < 2) return a;
			var Last = a[a.length -1]; // store the current last element
			do a = a.sort(bv.utility.sortRandom);
			while (Last == a[0]); // repeat until the new first is not the old last
			return a;
		}
	}, // END array

	utility : {
		sortRandom : function (a,b) {
			if (Math.random() > 0.5) return 1;
			else return -1;
		}
	},

	complete : true
}; // END bv declaration
bv.init();

/* add to debug:

function loopThrough(el,depth) {
	var D = depth || 0;
	var Indent = "";
	for (var xx=0; xx<D; xx++) Indent += "-";
	var Items = el.childNodes;
	for (var xx=0; xx<Items.length; xx++) {
		d(Indent +' '+ Items[xx].nodeName +' offsetWidth:'+ Items[xx].offsetWidth, 'map menus');
		if (Items[xx].hasChildNodes())
			loopThrough(Items[xx], D +1);
	}
}
*/

/* ... /packer:END(_bv_utilities.js) */
/* (3) packer:START(enableScrollBars.js) ... */

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/
 * enableScrollBars, v1.1
 * (c) 2005 bivia.com
 * created by Ben Curtis of bivia.com, February 27 2005
 *   - revised for _bv_utilities, March 25, 2006
 *
 * Creates CSS-defined custom scrollbars for divs, 
 * for when overflow:auto|scroll is bad looking.
 *~~~~*/

var enableScrollBars = {

	model : document.createElement('div'),

	init : function () {
		if (navigator.appName == "Microsoft Internet Explorer" && navigator.platform == "MacPPC") return;
	// Safari issues with overflow:hidden not hiding scrollbars;
		if (navigator.userAgent.indexOf('Safari') != -1)
			document.write('<style type="text/css">div.bvScrollBars { overflow:hidden !important; }</style>');
		bv.event.add(window, 'domready', enableScrollBars.find);
	}, // END: init
	
	find : function () {
		var Sc = bv.dom.getElementsByClassName(document, "div,span,ol,ul", "bvScrollBars");
		if (Sc.length) { // since there are scrollbars needed, create the model node
			enableScrollBars.model.className = "bvScrollGui";
			var ThumbTrack       = document.createElement('div');
			ThumbTrack.className = "bvScrollTrack";
			enableScrollBars.model.appendChild(ThumbTrack);
			var ThumbSlide       = document.createElement('div');
			ThumbSlide.className = "bvScrollThumb";
			var ThumbDetails       = document.createElement('div');
			ThumbDetails.className = "bvScrollThumbDetails";
			ThumbSlide.appendChild(ThumbDetails);
			enableScrollBars.model.appendChild(ThumbSlide);
			var ArrowUp       = document.createElement('div');
			ArrowUp.className = "bvScrollUp";
			enableScrollBars.model.appendChild(ArrowUp);
			var ArrowDown       = document.createElement('div');
			ArrowDown.className = "bvScrollDown";
			enableScrollBars.model.appendChild(ArrowDown);
	
			bv.event.add(document, "mousemove", enableScrollBars.act.slide.Move);
			bv.event.add(document, "mousedown", enableScrollBars.act.check);
			bv.event.add(document, "mouseup", enableScrollBars.act.slide.ClickUp);
		}
		for (var xx=0; xx<Sc.length; xx++) enableScrollBars.make(Sc[xx]);
	}, // END: find
	
	make : function (Div) {
		Div.bv_scrollContent = bv.dom.getElementsByClassName(Div,'div','bvScrollContainer')[0];
		Div.bv_scrollContent.style.top = "0px";
		Div.bv_scrollMax = Div.bv_scrollContent.offsetHeight - Div.offsetHeight;
		Div.bv_scrollUnit = Div.offsetHeight *0.9;
//		Div.style.overflow = "hidden";
		bv.css.addClass(Div,"hideOverflow");
	
		var Gui = enableScrollBars.model.cloneNode(true);
			Div.appendChild(Gui);
			Div.bv_scrollContent.style.marginRight = (Gui.offsetWidth +5) +"px";
			Div.bv_scrollGui = Gui;
		
	// the addition of scrollbars can cause the content to squash and grow taller
		Div.bv_scrollMax = Div.bv_scrollContent.offsetHeight - Div.offsetHeight;
	
		if (Div.bv_scrollMax <= 0) bv.css.addClass(Gui, "bvScrollDisabled");
		else {
			
		// Track
			Div.bv_scrollTrack = bv.dom.getElementsByClassName(Div,'div','bvScrollTrack')[0];
			Div.bv_scrollTrack.bv_scroller   = Div;
			bv.event.add(Div.bv_scrollTrack, 'mousedown', enableScrollBars.act.track.ClickDown);
			bv.event.add(Div.bv_scrollTrack, 'mouseup', enableScrollBars.act.track.ClickUp);
			Div.bv_scrollTrack.bv_waitTimer  = null;
			Div.bv_scrollTrack.bv_cycleTimer = null;
		
		// Thumb
			Div.bv_scrollThumb = bv.dom.getElementsByClassName(Div,'div','bvScrollThumb')[0];
			Div.bv_scrollThumb.bv_scroller = Div;
			bv.event.add(Div.bv_scrollThumb, 'mousedown', enableScrollBars.act.slide.ClickDown);
			bv.event.add(Div.bv_scrollThumb, 'mouseup',   enableScrollBars.act.slide.ClickUp);
		
		// ArrowUp
			Div.bv_scrollArrowUp = bv.dom.getElementsByClassName(Div,'div','bvScrollUp')[0];
			Div.bv_scrollArrowUp.bv_scroller   = Div;
			bv.event.add(Div.bv_scrollArrowUp, 'click',     enableScrollBars.act.arrow.UpClick);
			bv.event.add(Div.bv_scrollArrowUp, 'mousedown', enableScrollBars.act.arrow.UpClickDown);
			bv.event.add(Div.bv_scrollArrowUp, 'mouseup',   enableScrollBars.act.arrow.UpClickUp);
			bv.event.add(Div.bv_scrollArrowUp, 'mouseout',  enableScrollBars.act.arrow.UpClickUp);
			Div.bv_scrollArrowUp.bv_waitTimer  = null;
			Div.bv_scrollArrowUp.bv_cycleTimer = null;
		
		// ArrowDown
			Div.bv_scrollArrowDown = bv.dom.getElementsByClassName(Div,'div','bvScrollDown')[0];
			Div.bv_scrollArrowDown.bv_scroller   = Div;
			bv.event.add(Div.bv_scrollArrowDown, 'click',     enableScrollBars.act.arrow.DownClick);
			bv.event.add(Div.bv_scrollArrowDown, 'mousedown', enableScrollBars.act.arrow.DownClickDown);
			bv.event.add(Div.bv_scrollArrowDown, 'mouseup',   enableScrollBars.act.arrow.DownClickUp);
			bv.event.add(Div.bv_scrollArrowDown, 'mouseout',  enableScrollBars.act.arrow.DownClickUp);
			Div.bv_scrollArrowDown.bv_waitTimer  = null;
			Div.bv_scrollArrowDown.bv_cycleTimer = null;
	
			var TrackLength = Gui.offsetHeight - Div.bv_scrollArrowUp.offsetHeight - Div.bv_scrollArrowDown.offsetHeight;
			Div.bv_scrollThumb.style.height = Math.max(
						parseInt(Div.bv_scrollThumb.offsetWidth) /1.5, 
						Div.offsetHeight *(TrackLength / Div.bv_scrollContent.offsetHeight)
					) +"px";
			Div.bv_scrollThumb.getElementsByTagName('div')[0].style.height = "100%";
			Div.bv_scrollThumb.bv_top = Div.bv_scrollArrowUp.offsetHeight;
			Div.bv_scrollThumb.style.top = Div.bv_scrollThumb.bv_top +"px";
			Div.bv_scrollThumb.bv_excursion = TrackLength - Div.bv_scrollThumb.offsetHeight;
			
		} // end disabled check
	}, // END: make
	
	scroll : {
		to : function (Which, Pos) {
			if (Pos < 0) Pos = 0;
			if (Pos > Which.bv_scrollMax) Pos = Which.bv_scrollMax;
			Which.bv_scrollContent.style.top = (-1* Pos) +"px";
			enableScrollBars.scroll.thumb(Which);
		}, // END: scroll.to
		by : function (Which, Amt) {
			enableScrollBars.scroll.to(Which, -1* (parseInt(Which.bv_scrollContent.style.top) - Amt));
		}, // END: scroll.by
		thumb : function (Which) {
			var T = Which.bv_scrollThumb;
			T.style.top = (Math.round(T.bv_excursion *(-1* parseInt(Which.bv_scrollContent.style.top)/Which.bv_scrollMax)) + T.bv_top) +"px";
		} // END: scroll.thumb
	}, // END: scroll
	
	act : {
		check : function (evt) {
			if (evt.target && evt.target.className.indexOf('Scroll') != -1) {
				evt.stopPropagation();
				return false;
			}
		}, //END: act.check

		track : {
			ClickDown : function (evt) {
				var ClickAt = evt.offsetY || evt.layerY;
				var Mod = (ClickAt > parseInt(this.bv_scroller.bv_scrollThumb.style.top)) ? 1 : -1;
				if (this.bv_cycleTimer) clearInterval(this.bv_cycleTimer);
				this.bv_waitTimer  = setTimeout("",350);
				this.bv_cycleTimer = setInterval("enableScrollBars.act.track.Budge(document.getElementById('"+ bv.getId(this.bv_scroller) +"'),"+ Mod +");",350);
			}, // END: act.track.ClickDown
			ClickUp : function (evt) {
				if (this.bv_cycleTimer) clearInterval(this.bv_cycleTimer);
				if (this.bv_waitTimer) {
					clearTimeout(this.bv_waitTimer);
					var ClickAt = evt.offsetY || evt.layerY;
					var Mod = (ClickAt > parseInt(this.bv_scroller.bv_scrollThumb.style.top)) ? 1 : -1;
					enableScrollBars.act.track.Budge(this.bv_scroller, Mod);
				}
			}, // END: act.track.ClickUp
			Budge : function (Which, Mod) {
				if (Which.bv_scrollTrack.bv_waitTimer) clearTimeout(Which.bv_scrollTrack.bv_waitTimer);
				Which.bv_scrollTrack.bv_waitTimer = null;
				enableScrollBars.scroll.by(Which, Mod * Which.bv_scrollUnit);
			} // END: act.track.Budge
		}, // END: act.track

		slide : {
			Move : function (evt) {
				if (!window.bvScrollBarGrabbed) return true;
				else {
					enableScrollBars.scroll.to(
							window.bvScrollBarGrabbed.bv_scroller,
							window.bvScrollBarGrabbed.bv_scroller.bv_scrollMax *(
								(evt.clientY - window.bvScrollBarGrabbed.bv_scrollZeroPoint) / 
								window.bvScrollBarGrabbed.bv_excursion
							)
						);
					return true;
				}
			}, // END: act.slide.Move
			ClickDown : function (evt) {
				window.bvScrollBarGrabbed = this;
				this.bv_scrollZeroPoint = evt.clientY - parseInt(this.style.top) + this.bv_top;
			}, // END: act.slide.ClickDown
			ClickUp : function () {
				window.bvScrollBarGrabbed = null;
			} // END: act.slide.ClickUp
		}, // END: act.slide

		arrow : {
			UpClick : function () {
				if (this.bv_waitTimer) clearTimeout(this.bv_waitTimer);
				if (this.bv_cycleTimer) clearInterval(this.bv_cycleTimer);
				else enableScrollBars.scroll.by(this.bv_scroller, -15);
			}, // END: act.arrow.UpClick
			UpClickDown : function () {
				if (this.bv_waitTimer) clearTimeout(this.bv_waitTimer);
				if (this.bv_cycleTimer) clearInterval(this.bv_cycleTimer);
				this.bv_waitTimer = setTimeout("enableScrollBars.act.arrow.UpClickDownCycle('"+ bv.getId(this.bv_scroller) +"');",500);
			}, // END: act.arrow.UpClickDown
			UpClickDownCycle : function (Id) {
				document.getElementById(Id).bv_scrollArrowUp.bv_cycleTimer = setInterval("enableScrollBars.scroll.by(document.getElementById('"+ Id +"'), -5);",25);
			}, // END: act.arrow.UpClickDownCycle
			UpClickUp : function () {
				if (this.bv_waitTimer) clearTimeout(this.bv_waitTimer);
				if (this.bv_cycleTimer) clearInterval(this.bv_cycleTimer);
			}, // END: act.arrow.UpClickUp
			DownClick : function () {
				if (this.bv_waitTimer) clearTimeout(this.bv_waitTimer);
				if (this.bv_cycleTimer) clearInterval(this.bv_cycleTimer);
				else enableScrollBars.scroll.by(this.bv_scroller, +15);
			}, // END: act.arrow.DownClick
			DownClickDown : function () {
				if (this.bv_waitTimer) clearTimeout(this.bv_waitTimer);
				if (this.bv_cycleTimer) clearInterval(this.bv_cycleTimer);
				this.bv_waitTimer = setTimeout("enableScrollBars.act.arrow.DownClickDownCycle('"+ bv.getId(this.bv_scroller) +"');",500);
			}, // END: act.arrow.DownClickDown
			DownClickDownCycle : function (Id) {
				document.getElementById(Id).bv_scrollArrowDown.bv_cycleTimer = setInterval("enableScrollBars.scroll.by(document.getElementById('"+ Id +"'), +5);",25);
			}, // END: act.arrow.DownClickDownCycle
			DownClickUp : function () {
				if (this.bv_waitTimer) clearTimeout(this.bv_waitTimer);
				if (this.bv_cycleTimer) clearInterval(this.bv_cycleTimer);
			} // END: act.arrow.DownClickUp
		} // END: act.arrow
	}, // END: act
	
	complete : true
};
enableScrollBars.init();

