			//LOWPRO
			LowPro = {};
			LowPro.Version = '0.5';
			LowPro.CompatibleWithPrototype = '1.6';
			
			if (Prototype.Version.indexOf(LowPro.CompatibleWithPrototype) != 0 && console && console.warn)
			  console.warn("This version of Low Pro is tested with Prototype " + LowPro.CompatibleWithPrototype + 
							  " it may not work as expected with this version (" + Prototype.Version + ")");
			
			if (!Element.addMethods) 
			  Element.addMethods = function(o) { Object.extend(Element.Methods, o) };
			
			// Simple utility methods for working with the DOM
			DOM = {};
			
			// DOMBuilder for prototype
			DOM.Builder = {
				tagFunc : function(tag) {
				  return function() {
					var attrs, children; 
					if (arguments.length>0) { 
					  if (arguments[0].nodeName || 
						typeof arguments[0] == "string") 
						children = arguments; 
					  else { 
						attrs = arguments[0]; 
						children = Array.prototype.slice.call(arguments, 1); 
					  };
					}
					return DOM.Builder.create(tag, attrs, children);
				  };
			  },
				create : function(tag, attrs, children) {
					attrs = attrs || {}; children = children || []; tag = tag.toLowerCase();
					var el = new Element(tag, attrs);
				  
					for (var i=0; i<children.length; i++) {
						if (typeof children[i] == 'string') 
						  children[i] = document.createTextNode(children[i]);
						el.appendChild(children[i]);
					}
					return $(el);
				}
			};
			
			// Automatically create node builders as $tagName.
			(function() { 
				var els = ("p|div|span|strong|em|img|table|tr|td|th|thead|tbody|tfoot|pre|code|" + 
								 "h1|h2|h3|h4|h5|h6|ul|ol|li|form|input|textarea|legend|fieldset|" + 
								 "select|option|blockquote|cite|br|hr|dd|dl|dt|address|a|button|abbr|acronym|" +
								 "script|link|style|bdo|ins|del|object|param|col|colgroup|optgroup|caption|" + 
								 "label|dfn|kbd|samp|var").split("|");
			  var el, i=0;
				while (el = els[i++]) 
				  window['$' + el] = DOM.Builder.tagFunc(el);
			})();
			
			DOM.Builder.fromHTML = function(html) {
			  var root;
			  if (!(root = arguments.callee._root))
				root = arguments.callee._root = document.createElement('div');
			  root.innerHTML = html;
			  return root.childNodes[0];
			};
			
			Object.extend(Event, {
			  onReady : function(f) {
				if (document.body) f();
				else document.observe('dom:loaded', f);
			  }
			});
			
			Event.addBehavior = function(rules) {
			  var ab = this.addBehavior;
			  Object.extend(ab.rules, rules);
			  
			  if (!ab.responderApplied) {
				Ajax.Responders.register({
				  onComplete : function() { 
					if (Event.addBehavior.reassignAfterAjax) 
					  setTimeout(function() { ab.reload() }, 10);
				  }
				});
				ab.responderApplied = true;
			  }
			  
			  if (ab.autoTrigger) {
				this.onReady(ab.load.bind(ab, rules));
			  }
			  
			};
			
			Object.extend(Event.addBehavior, {
			  rules : {}, cache : [],
			  reassignAfterAjax : false,
			  autoTrigger : true,
			  
			  load : function(rules) {
				for (var selector in rules) {
				  var observer = rules[selector];
				  var sels = selector.split(',');
				  sels.each(function(sel) {
					var parts = sel.split(/:(?=[a-z]+$)/), css = parts[0], event = parts[1];
					$$(css).each(function(element) {
					  if (event) {
						observer = Event.addBehavior._wrapObserver(observer);
						$(element).observe(event, observer);
						Event.addBehavior.cache.push([element, event, observer]);
					  } else {
						if (!element.$$assigned || !element.$$assigned.include(observer)) {
						  if (observer.attach) observer.attach(element);
						  
						  else observer.call($(element));
						  element.$$assigned = element.$$assigned || [];
						  element.$$assigned.push(observer);
						}
					  }
					});
				  });
				}
			  },
			  
			  unload : function() {
				this.cache.each(function(c) {
				  Event.stopObserving.apply(Event, c);
				});
				this.cache = [];
			  },
			  
			  reload: function() {
				var ab = Event.addBehavior;
				ab.unload(); 
				ab.load(ab.rules);
			  },
			  
			  _wrapObserver: function(observer) {
				return function(event) {
				  if (observer.call(this, event) === false) event.stop(); 
				}
			  }
			  
			});
			
			Event.observe(window, 'unload', Event.addBehavior.unload.bind(Event.addBehavior));
			
			// A silly Prototype style shortcut for the reckless
			$$$ = Event.addBehavior.bind(Event);
			
			var Behavior = {
			  create: function() {
				var parent = null, properties = $A(arguments);
				if (Object.isFunction(properties[0]))
				  parent = properties.shift();
			
				  var behavior = function() { 
					var behavior = arguments.callee;
					if (!this.initialize) {
					  var args = $A(arguments);
			
					  return function() {
						var initArgs = [this].concat(args);
						behavior.attach.apply(behavior, initArgs);
					  };
					} else {
					  var args = (arguments.length == 2 && arguments[1] instanceof Array) ? 
								  arguments[1] : Array.prototype.slice.call(arguments, 1);
			
					  this.element = $(arguments[0]);
					  this.initialize.apply(this, args);
					  behavior._bindEvents(this);
					  behavior.instances.push(this);
					}
				  };
			
				Object.extend(behavior, Class.Methods);
				Object.extend(behavior, Behavior.Methods);
				behavior.superclass = parent;
				behavior.subclasses = [];
				behavior.instances = [];
			
				if (parent) {
				  var subclass = function() { };
				  subclass.prototype = parent.prototype;
				  behavior.prototype = new subclass;
				  parent.subclasses.push(behavior);
				}
			
				for (var i = 0; i < properties.length; i++)
				  behavior.addMethods(properties[i]);
			
				if (!behavior.prototype.initialize)
				  behavior.prototype.initialize = Prototype.emptyFunction;
			
				behavior.prototype.constructor = behavior;
			
				return behavior;
			  },
			  Methods : {
				attach : function(element) {
				  return new this(element, Array.prototype.slice.call(arguments, 1));
				},
				_bindEvents : function(bound) {
				  for (var member in bound)
					if (member.match(/^on(.+)/) && typeof bound[member] == 'function')
					  bound.element.observe(RegExp.$1, Event.addBehavior._wrapObserver(bound[member].bindAsEventListener(bound)));
				}
			  }
			};
			
			Remote = Behavior.create({
			  initialize: function(options) {
				if (this.element.nodeName == 'FORM') new Remote.Form(this.element, options);
				else new Remote.Link(this.element, options);
			  }
			});
			
			Remote.Base = {
			  initialize : function(options) {
				this.options = Object.extend({
				  evaluateScripts : true
				}, options || {});
			  },
			  _makeRequest : function(options) {
				if (options.update) new Ajax.Updater(options.update, options.url, options);
				else new Ajax.Request(options.url, options);
				return false;
			  }
			}
			
			Remote.Link = Behavior.create(Remote.Base, {
			  onclick : function() {
				var options = Object.extend({ url : this.element.href, method : 'get' }, this.options);
				return this._makeRequest(options);
			  }
			});
			
			
			Remote.Form = Behavior.create(Remote.Base, {
			  onclick : function(e) {
				var sourceElement = e.element();
				
				if (['input', 'button'].include(sourceElement.nodeName.toLowerCase()) && 
					sourceElement.type == 'submit')
				  this._submitButton = sourceElement;
			  },
			  onsubmit : function() {
				var options = Object.extend({
				  url : this.element.action,
				  method : this.element.method || 'get',
				  parameters : this.element.serialize({ submit: this._submitButton.name })
				}, this.options);
				this._submitButton = null;
				return this._makeRequest(options);
			  }
			});
			
			Observed = Behavior.create({
			  initialize : function(callback, options) {
				this.callback = callback.bind(this);
				this.options = options || {};
				this.observer = (this.element.nodeName == 'FORM') ? this._observeForm() : this._observeField();
			  },
			  stop: function() {
				this.observer.stop();
			  },
			  _observeForm: function() {
				return (this.options.frequency) ? new Form.Observer(this.element, this.options.frequency, this.callback) :
												  new Form.EventObserver(this.element, this.callback);
			  },
			  _observeField: function() {
				return (this.options.frequency) ? new Form.Element.Observer(this.element, this.options.frequency, this.callback) :
												  new Form.Element.EventObserver(this.element, this.callback);
			  }
			});
			
			
			function blackout(){
				var winWidth = $j(document).width();
				var winHeight = $j(document).height();
				if($j('#blackout').length == 0) {
					$j(document.body).append('<div id="blackout"></div>');
					$j('#blackout').css('height',winHeight+'px');
					$j('#blackout').css('width',winWidth+'px');
					$j('#blackout').css('position','absolute');
					$j('#blackout').css('display','block');				
					$j('#blackout').css('background-color','#000000');
					$j('#blackout').css('opacity','0.7');
					$j('#blackout').css('-moz-opacity','0.7');
					$j('#blackout').css('khtmlopacity','0.7');
					$j('#blackout').css('filter','alpha(opacity=70)');
				} else {
					$j('#blackout').toggle();
				}			
				
			}
			
			function htmlPopup(name,content,iw,ih,header) {
				if(typeof name == 'undefined' ||
				   typeof name == 'null') {
					name = 'htmlPop';
				}
				var aw = $j(window).width();
				var ah = $j(window).height();
				var st = $j(document).scrollTop();
				var sl = $j(document).scrollLeft();
				var w = aw * iw;
				var h = ah * ih;
				var ch = h;
				var headh = 0;
				var theHtml = '';
				if($j('#'+name).length == 0) {
					$j(document.body).append('<div id="'+name+'"><div class="popup-content"></div></div>');				
				}
				
				/* include header */
				if(typeof header != 'undefined' &&
				   typeof header != 'null') {
					if(header.substring(0,1) == '#') {
						$j('#'+name).prepend('<div class="popup-header">'+$j(header).html()+'</div>');
					} else {
						$j('#'+name).prepend('<div class="popup-header">'+header+'</div>');
					}
					
					//new content height
					headh = $j('#'+name+' .popup-header').height();
					ch = (h-headh);
					h += headh;
				}
				
				var t = ((ah - h)/2);
				var l = ((aw - w)/2);

				
				$j('#'+name).css('background-color','#ffffff');
				$j('#'+name).css('width',w+'px');
				$j('#'+name).css('height',h+'px');	
				$j('#'+name).css('position','fixed');
				$j('#'+name).css('zIndex',999);
				$j('#'+name).css('top',t+'px');
				$j('#'+name).css('left',l+'px');				
				$j('#'+name).show();
				
				if(content.substring(0,1) == '#') {
					theHtml = $j(content).html();
				} else {
					theHtml = content;
				}
				$j('#'+name+' .popup-content').css('width',w+'px');
				$j('#'+name+' .popup-content').css('height',ch+'px');
				$j('#'+name+' .popup-content').css('overflow','auto');
				$j('#'+name+' .popup-content').html(theHtml);
			}
			
			function windowsLoaderAdd(func) {
				windowsLoader[windowsLoader.length] = func;
			}
			function windowsLoadFunc() {
				for(i=0;i<windowsLoader.length;i++) {
					eval(windowsLoader[i]);
				}
			}
			function loadFunc() { window.onload = windowsLoadFunc;}
			windowsLoader = new Array();
			
			function setState(w) {
				if(w.value != 'US') {
					$('state').value = '99';
					$('state').disabled = true;
					$('state_outside').disabled = false;
				} else {
					$('state').value = '0';
					$('state').disabled = false;
					$('state_outside').disabled = true;
				}
					
			}
			
			
			function popUp(theURL, Name, popW, popH, scroll) { 
					var winleft = (screen.width - popW) / 2;
					var winUp = (screen.height - popH) / 2;
					winProp = 'width='+popW+',height='+popH+',left='+winleft+',top='+winUp+',scrollbars='+scroll+',resizable'
					Win = window.open(theURL, Name, winProp)
					if (parseInt(navigator.appVersion) >= 4) { Win.window.focus(); }
			}
			
			function verify_country(country,stateID) {
				
				var state = document.getElementById(stateID);
				if(state) {
					if(country.options[country.selectedIndex].text == "US") {
						state.disabled = false;
					} else {
						state.disabled = true;
					}
				}
				
			}
			
			function accept() {
				if(document.forms[0].agree.checked) {
					return true;
				} else {
					alert('You must accept our Terms and Conditions');
					return false;
			
				}
			}
			
			function mOvr(src,clrOver) {
				if (!src.contains(event.fromElement)) {
				  src.style.cursor = 'default';
				  src.bgColor = clrOver;
				}
			  }
			  
			function mOut(src,clrIn) {
				if (!src.contains(event.toElement)) {
				  src.style.cursor = 'default';
				  src.bgColor = clrIn;
				}
			  }
			function mClk(src) {
				document.location.href=src;
				/*if(event.srcElement.tagName=='TR'){
				   src.children.tags('A')[2].click();
				}*/
			  }
			
			function doCheckout(form) {
				if(!accept()) {
					return false;
				} 
				form.submit.disabled=true;
			}
			
			//check all
			function checkAll(field,type,theclass) {
				
				if(!type) {
					type = 'checkbox';
				}
							
				if(field.checked) {					
					if(typeof theclass != 'undefined') {
						if($j(':'+type).hasClass(theclass)) {						
							$j('.'+theclass).attr('checked',true);
						} else {
							return false;
						}
					} else {	
						$j(':'+type).attr('checked',true);						
					}
				} else {
					if(typeof theclass != 'undefined') {
						if($j(':'+type).hasClass(theclass)) {						
							$j('.'+theclass).attr('checked',false);
						} else {
							return false;
						}
					} else {	
						$j(':'+type).attr('checked',false);
					}
				}
				
				$j(':'+type).select();
			}

			function Delete(m) {
				if(!window.confirm(m)) { 
					return false;
				}
				return true;
			}