/***
/	@jonathanlau.co.uk
/	@descripton: Global site script
/	@author j.lau http://www.jonathanlau.co.uk
/	@build 03.11.11
=================*/

jQuery(function($) {
	
	$.JL = {};
	
	$.JL.Page = Page = {
		
		_jsclass: "jsEnabled",
		_ieclass: "ie",
		_isIE6: ($.browser.msie && $.browser.version.substr(0, 1) < 7)?true:false,
		_selectedclass: "selected",
		_activeclass: "active",
		_inactiveclass: "inactive",
		_lastclass: "last",
		_loaderClass: "loader",
		_loaderInterval: 1600,
		//_tceCookie: "TCE_TC",
		
		init: function() {
			$('body').addClass(Page._jsclass);
			if($.browser.msie && $.browser.version.substr(0, 1) < 9)$('body').addClass(Page._ieclass);
			
			/*var $dlinks = $('.pdf, .msword').children('a');
			if($dlinks.length) if(Utils.getCookie($.JL.Page._tceCookie)) Aux.downloadLinks($dlinks);*/

			Peekaboo.launch();
			//ExtendedPanels.launch();
			//Tabs.launch();
			//Truncate.launch();
			//Accordion.launch();
			Forms.launch();
			//Plugins.launch();
			//Aux.init();
		}
	};
	
	$.JL.Utils = Utils = {
		getSelector: function(str) {
			var rtn = '.' + str;
			return rtn;
		},
		
		activateElement: function(obj) {
			$(obj).removeClass(Page._inactiveclass);
			$(obj).addClass(Page._activeclass);
		},
		
		deactivateElement: function(obj) {
			$(obj).removeClass(Page._activeclass);
			$(obj).addClass(Page._inactiveclass);
		},

		activateAll: function(arr) {
			$(arr).each(function(index) {
				Utils.activateElement(this);
			});
		},
		
		deactivateAll: function(arr) {
			$(arr).each(function(index) {
				Utils.deactivateElement(this);
			});
		},
		
		openElement: function(obj) {
			$(obj).addClass(Page._activeclass);
		},
		
		closeElement: function(obj) {
			$(obj).removeClass(Page._activeclass);
		},
		
		openAll: function(arr) {
			$(arr).each(function(index) {
				Utils.openElement(this);
			});
		},
		
		closeAll: function(arr) {
			$(arr).each(function(index) {
				Utils.closeElement(this);
			});
		},
		
		toggleElement: function($obj) {
			$obj.toggleClass(Page._activeclass);
		},
		
		pseudoHover: function($obj){
			$obj.hover(function(){
				$(this).addClass("hover");
			}, function(){
				$(this).removeClass("hover");
			});
		},
		
		trim: function(str) {
			return str.replace(/^\s+|\s+$/g,"");
		},
		
		ltrim: function(str) {
			return str.replace(/^\s+/,"");
		},
		
		rtrim: function(str) {
			return str.replace(/\s+$/,"");
		},
		
		trimAll: function(str) {
			return str.replace(/\s+/g,"");
		},
		
		getQueryString: function (key, _default) {
			if (_default == null) _default = "";
			key = key.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
			var regex = new RegExp("[\\?&]" + key + "=([^&#]*)");
			var qs = regex.exec(window.location.href);
			if (qs == null) return _default;
			else return qs[1];
		},

		setCookie: function(_name, _value) {
			$.cookie(_name, _value, {expires: 31556926});
		},
		
		getCookie: function(_name) {
			return $.cookie(_name);
		}
	};
	
	$.JL.Peekaboo = Peekaboo = {
		
		_selector: "#toggle a",
		_h: 'auto',
		_interval: 400,
		
		launch: function() {
			var $t = $(this._selector);
			if($t.length) $t.each(Peekaboo.init);
		},
		
		init: function(i) {
			var $this = $(this, i);
			var k=false;
			
			$this.click(function(event){
				var $this = $(this);
				$("#peekaboo")[!k ? "addClass":"removeClass"](Page._activeclass).css("opacity",0).stop().animate({
					"height":"toggle",
					"marginBottom":"toggle",
					"marginTop":"toggle",
					"paddingBottom":"toggle",
					"paddingTop":"toggle",
					"opacity":(k ? 0 : 1)
				}, (k ? Peekaboo._interval/1.6 : Peekaboo._interval), function(){
					$this[k ? "addClass":"removeClass"](Page._activeclass);
				});
				k = !k;
				
				return false;
			});
		},
		
		initQuick: function(i) {
			var $this = $(this, i),
				isIE = $('body').hasClass(Page._ieclass),
				timer;
				
			Peekaboo.position($this);
			
			var $target = $($this.children()).children().not(":only-child").parent();
			
			$target.hover(function(event){
				var $this = $(this);
				clearTimeout(timer);
				
				$this.siblings().removeClass("hover").find(".wrapper").hide();
				$this.parent().addClass("focus").end().addClass("hover").find(".wrapper").show();
				
			}, function(event){
				var $this = $(this);
				
				timer = setTimeout(function(){
					$this.parent().removeClass("focus").end().removeClass("hover").find(".wrapper").hide();
				},300)
			});
		},
		
		position: function($target) {
			var boundary = $target.parent().outerWidth(),
				navOffset = $target.position().left;

			var $subnav = $target.children('li').find(".wrapper");

			$subnav.each(function(i){
				var $this = $(this, i),
					loc = ($this.parent().position().left + navOffset + parseInt($this.parent().css("marginLeft"), 10) + $this.width());
				if(loc > boundary){
					var offset = loc - boundary;
					$this.css("left", (offset*-1)+parseInt($this.parent().css("marginLeft"), 10));
				};

				$this.prepend(Peekaboo.constructBridge($this, offset))
			});
		},
		
		constructBridge: function($this, offset) {
			if(typeof offset == 'undefined' ) offset = 0;
			else if(offset) offset = Math.floor(offset - $this.parent().width()/2);
			var html = '<div class="bridge" style="width:'+$this.parent().width()+'px;left:'+offset+'px;" />'
			return html;
		}
	};
	
	$.JL.ExtendedPanels = ExtendedPanels = {
		
		_carouselselector: '.panel.carousel',
		_toggleselector: '.panel.toggle',
		_targetselector: '.toggleThis',
		_targetclass: 'toggleThis',
		_togglestring: ["Less detail", "More detail"],
		_duration: 250,
		_cprevClass: 'pc_prev',
		_cnextClass: 'pc_next',
		
		launch: function() {
			var $carousel = $(this._carouselselector);
			if($carousel.length) {
				$carousel.each(function(i){
					var $this = $(this, i),
						$img = $this.find("li img");
					
					if($img.length > 1) $this.each(ExtendedPanels.initCarousel);
				});
			};
			
			var $toggle = $(this._toggleselector);
			if($toggle.length) $toggle.each(this.initToggle);
		},
		
		initCarousel: function(i) {
			var $this = $(this, i),
				$target = $this.find("li:first").parent(),
				$img = $target.find('li img');
			
			var carouselType = true;
			
			var $h = $this.find('h2, .faux-header'),
				html = '<a class="'+ExtendedPanels._cprevClass+'" href="#">&lt;</a><a class="'+ExtendedPanels._cnextClass+'" href="#">&gt;</a>';
			$h.append(html);
			
			if($h[0].nodeName.toLowerCase() == "h2"){
				var $link = $img.parent("a").css("cursor", "auto").click(function(event){return false;});
				$h.after('<div class="'+ ExtendedPanels._targetclass +'"><p><a class="cta" href="'+$link.eq(0).attr("href")+'">' + $this.find("ul img:first")[0].title + '</a></p></div>');
				var $t = $h.siblings("."+ExtendedPanels._targetselector);
				
				var $hotspot = $('<div />').data({"_height": $t.height(), "_toggletype": false}).hoverIntent(ExtendedPanels.toggleShowHandler, ExtendedPanels.toggleHideHandler);
					$h.add($t).wrapAll($hotspot);
			}else{carouselType = false;}
			
			var opts = {
				fx: 'scrollHorz',
				speed: ExtendedPanels._duration,
				timeout: 0,
				prev: $this.find('.'+ExtendedPanels._cprevClass),
				next: $this.find('.'+ExtendedPanels._cnextClass),
				after: carouselType ? ExtendedPanels.onAfterCarouselHandler1 : ExtendedPanels.onAfterCarouselHandler2
			}
			
			Plugins.initCycle($target, opts);
		},
		
		onAfterCarouselHandler1: function(){
			var $this =  $(this).find("img"),
				link = $this.parent("a").attr("href"),
				$title = $this.closest(ExtendedPanels._carouselselector).find("."+ExtendedPanels._targetselector+" a");
				$title.text($this[0].title).attr("href", link);
		},
		
		onAfterCarouselHandler2: function(){
			var $this =  $(this).find("img"),
				$title = $this.closest(ExtendedPanels._carouselselector).find(".faux-header");
				
				var txtnode = $title.contents().filter(function(){ return this.nodeType != 1; });
				txtnode[0].nodeValue = $this[0].title
		},
		
		initToggle: function(i) {
			var $this = $(this, i),
				$t = $this.find(ExtendedPanels._targetselector);
			
			var toggletype = $this.hasClass("portfolio-item");
			
			if(toggletype){
				var $hotspot = $('<p class="toggleLink" ><a href="#">'+ ExtendedPanels._togglestring[1] +'</a></p>')
					.prependTo($this.children(".content"))
					.data({"_height": $t.height(), "_toggletype": toggletype}).click(function(event){
						var $this = $(event.currentTarget),
							state = $this.hasClass(Page._selectedclass);
							
						$this[!state ? "addClass" : "removeClass"](Page._selectedclass);
						$this.children("a").text(ExtendedPanels._togglestring[+state]); //bool
						(!state) ? ExtendedPanels.toggleShowHandler(event) : ExtendedPanels.toggleHideHandler(event);
						
						return false;
					});
				
			} else{
				var $hotspot = $('<div />').data({"_height": $t.height(), "_toggletype": toggletype}).hoverIntent(ExtendedPanels.toggleShowHandler, ExtendedPanels.toggleHideHandler);
					$this.find("h2").add($t).wrapAll($hotspot);
			}
		},
		
		toggleShowHandler: function(event) {
			var $this = $(event.currentTarget).addClass(Page._selectedclass),
				$t = $this.closest(ExtendedPanels._toggleselector+ ', '+ExtendedPanels._carouselselector).find(ExtendedPanels._targetselector);
			
			if(!$this.data("_height"))$this.data("_height", $t.height()); //DEVNOTE:safeguard against display:none on parents preventing height
			
			$t.css({"height": 0, "left": "0", "position":[$this.data("_toggletype")? "static" : "relative"]});
			$t.stop().animate({"height": $this.data("_height")}, ExtendedPanels._duration, function(){
				if($this.data("_toggletype")) $(this).css({"height": "auto"});
			});
		},
		
		toggleHideHandler: function(event) {
			var $this = $(event.currentTarget).removeClass(Page._selectedclass),
				$t = $this.closest(ExtendedPanels._toggleselector+ ', '+ExtendedPanels._carouselselector).find(ExtendedPanels._targetselector);
			
			$t.css('height', $t.height() + 'px');//DEVNOTE: fixes jumpiness
			if($this.data("_toggletype")) $this.data("_height", $t.height());
			$t.stop().animate({"height": 0}, ExtendedPanels._duration, "easeOutQuad", function(){
				($this.data("_toggletype")) ? $(this).css("position", "absolute") : $(this).css("left", "-9999em");
			});
		}
	};
	
	$.JL.Tabs = Tabs = {
		
		_selector: ".tabbed-content",
		_tabSelector: "dt",
		_contentSelector: "dd",
		_prevTabClass: "prev-tab",
		_isIE: null,
		
		launch: function() {
			var $tabs = $(this._selector);
			if ($tabs.length) $tabs.each(function(i){Tabs.init($tabs.eq(i))});
		},
		
		init: function($target){
			$target.bind("COMPLETE", this.onCompleteHandler);
			
			Tabs._isIE = function(){if($.browser.msie && $.browser.version.substr(0, 1) < 9){return true;}else{return false;}}();
			
			var html = '<p class="'+ Page._loaderClass +'">';
			(!Tabs._isIE) ? $target.css("opacity", 0).wrap(html) : $target.wrap(html);
			
			var $tabs = $target.children(this._tabSelector+":not(.tab-header)"),
				$contents = $target.children(this._contentSelector);
			
			$tabs.filter(function(i){return i%4 == 3;}).addClass("omega");
			
			var $tabwrapper = $('<dt class="tab-wrapper"></dt>').append('<dl></dl>');

			for(var i = $tabs.length; i--;) $tabs.eq(i).wrapInner('<a href="#"></a>').prependTo($tabwrapper.children());
			$tabwrapper.prependTo($target);
			
			var $tabheader = $target.children(".tab-header");
			if($tabheader.length) $tabheader.prependTo($tabwrapper.children()).parent("dl").css("paddingTop", 7)
			
			var qs = Utils.getQueryString("tab");
			if(!+qs.length) qs=1; //trigger('click')
			
			$target.children("dt dt:eq("+(qs-1)+"), dd:eq("+(qs-1)+")").addClass(Page._selectedclass);
			
			$tabs.click(function(event){
				var $this = $(this);
				
				var index = $tabs.removeClass(Page._selectedclass + " " + Tabs._prevTabClass).index($this);
				$this.addClass(Page._selectedclass).prev().addClass(Tabs._prevTabClass);
				$contents.removeClass(Page._selectedclass).eq(index).addClass(Page._selectedclass);
				
				return false;
			});
			
			$target.trigger("COMPLETE").css("visibility", "visible");
		},
		
		onCompleteHandler: function(event) {
			if(!Tabs._isIE) $(event.target).unwrap().animate({"opacity": 1}, Page._loaderInterval).unbind("COMPLETE");
			else $(event.target).unwrap().unbind("COMPLETE");
		}
	};
	
	$.JL.Accordion = Accordion = {
		
		_selector: ".accordion",
		_tabSelector: "dt",
		_contentSelector: "dd",
		_interval: 200,
		
		launch: function() {
			var $accordion = $(this._selector);
			if ($accordion.length) $accordion.each(function(i){Accordion.init($accordion.eq(i))});
		},
		
		init: function($target) {
			var $tabs = $target.children(this._tabSelector).not("." + Truncate._noTargetClass),
				$contents = $target.children(this._contentSelector);
			
			$tabs.contents().filter(function(){return this.nodeType == 3;}).wrap('<a href="#" />');
			
			var $links = $tabs.children('a');
			
			$links.click(function(event){
				var $this = $(this);
				
				$this.parent().toggleClass(Page._selectedclass).next().slideToggle(Accordion._interval);
				
				return false;
			});
		}
	};
	
	$.JL.Truncate = Truncate = {
		
		_selector: "truncate dd",
		_targetSelector: "dt",
		_targetClass: "trunked",
		_noTargetClass: "dunked",
		_numOfLines: 2,
		_w: null,
		_p: null,
		_$p: null,
		_$cache: $('<p style="position:absolute;left:-9999em;" />'),
		
		launch: function(){
			var $el = $("." + this._selector);
			if($el.length) $el.each(this.init);
		},
		
		init: function(i){
			var $target = $(this, i);
			
			Truncate._w = $target.width();
			Truncate._$p = $target.find('p');
			Truncate._$cache.appendTo("body");
			
			var extract = [],
				line_count = letter_count = 0;
			
			for(var j = 0; Truncate._$p.length > j; j++){
				
				if(line_count < Truncate._numOfLines){
					Truncate._p = Truncate._$p.eq(j).text();
					
					var arr = [];
					for(var k = 0; k < Truncate._numOfLines; k++){
						
						if(Truncate._p.length && line_count < Truncate._numOfLines) {
							arr.push(Truncate.evalParagraph(Truncate._p));
							letter_count += arr[k].length;
							line_count++;
						}
						else break;
					}
					extract.push(arr);
				}else break;
			}
			
			Truncate._$cache.remove();
			
			if(letter_count < Truncate._$p.text().length) Truncate.populate(extract, $target);
			else $target.prev().addClass(Truncate._noTargetClass);
		},
		
		populate: function(extract, $target){
			$.each(extract, function(i, line){
				var txt = line.join("");
				$target.prev(Truncate._targetSelector).addClass(Truncate._targetClass).append('<p>' + txt + '</p>');
				
				if((i+1) == extract.length){
					if(Truncate._$p.eq(i).text().length == txt.length) Truncate._$p.eq(i).remove();
					else Truncate._$p.eq(i).html(Truncate._$p.eq(i).text().slice(txt.length));
				}else{
					Truncate._$p.eq(i).remove();
				}
			});
			
			$target.find("p:last").add($target.prev("." + this._targetClass).find("p:last")).addClass("last");
			
			this.extension($target);
		},
		
		extension: function($target){
			$target.hide().parent().children("dt:first").addClass("alpha");
		},
		
		evalParagraph: function(txt){
			Truncate._$cache.html("");
			
			var line = "",
				w = 0;
			
			var pattern = /\s*[\S]+\s*/g,
				result;
			
			while((result = pattern.exec(txt)) != null && w < Truncate._w){
				var cursor = result.index;
				
				line += result[0];
				Truncate._$cache.html(line);
				
				w = Truncate._$cache.width();
			}
			
			if(w > Truncate._w){
				line = line.slice(0, cursor);
				Truncate._p = txt.slice(cursor);
			}else{
				Truncate._p = "";
			}
			
			return line;
		}
	}
	
	$.JL.Forms = Forms = {
		
		_selector: "",
		_prepopulatedInputSelector: ".isLabel",
		_validateSelector: ".validate",
		
		launch: function(){
			var $isLabel = $(this._prepopulatedInputSelector + ":text");
			if($isLabel.length) $isLabel.each(Forms.initLabelInput);
			
			var $validate = $(".validate");
			if($validate.length) $validate.each(Forms.initValidation);
			
			var $ajaxInput = $('.ajax input');
			if($ajaxInput.length) $('.ajax input:checkbox, .ajax input:radio').change(Forms.ajaxSubmitFormHandler);
		},
		
		initValidation: function(i){
			var $this = $(this, i),
				opts ={
					debug:true,

					messages: {
						'name': "required",
						'email': {
							required: "required",
							email: "invalid"
						},
						'enquiry': "required",
						'optimusprime': "Halt decipti-creep!"
					},
					
					rules: {
						'email': {email:true},
						'optimusprime': {maxlength:0}
					},
					
					errorPlacement: function($err, $el){
						$err.insertAfter($el.parent())
					},
					
					highlight: function(el, errorClass){
						$(el).parent().addClass(errorClass);
					},
					
					unhighlight: function(el, errorClass){
						$(el).parent().removeClass(errorClass);
					},
					
					success: "valid",
					
					submitHandler: function(form){
						var $form = $(form);
						$form.find('input:submit').attr("value", "Please Wait").attr("disabled", "disabled");
						var dataString = $form.serialize();

						$.ajax({
							type: "POST",
							url: "../_themes/default/bin/contact_form.php",
							data: dataString,
							timeout: 10000,
							error: function(){
								//$form.find("label[id='message_error']").text('Failed to send, try again').show();
								$form.find('input:submit').attr("value", "Send &rarr;").removeAttr('disabled');
							},
							success: function(){
								/*var h = $form.height();
								$form.css({"height":h}).html('<div id="message"></div>');
								$('#message').html('<h2>Contact Form Submitted!</h2>').append('<p>Thank you. We will be in touch soon.</p>').hide().fadeIn(1500, function(){
									$('#message').append('<img id="checkmark" src="images/icon/check.png" />')
								});*/
								
								$form.find('input:submit').attr("value", 'Send &rarr;').removeAttr('disabled');
								var $t = $('#toggle a');
								var $s = $t.trigger('click').data("str", $t.text()).wrapInner("<span>").parent().css({"overflow":"hidden", "width": $t.parent().width()}).find("span").css({"position":"relative", "white-space":"nowrap"});
								$s.html($s.text() + '<span style="padding-left:25px;">Thank you for your message</span>').delay(800).animate({"left":-($s.width()+parseInt($t.css("paddingLeft"),10))}, 10000, function(){
									$s.css({"opacity":0, "position":"static"}).delay(800).fadeIn(3000, function(){
										$s.find("span").unwrap().remove();
										$t.parent().removeAttr("style");
									});
								});
							}
						});

						return false;
					}
				}
			
			$this.validate(opts);
		},
		
		parseForm: function(el) {
			var $form = $(el),
				$fields = $form.find(':input:not(:submit, [type="hidden"])');
			
			var dataObj = new Object;
			
			for(var i = $fields.length; i--;){
				dataObj[$fields.eq(i).attr("name")] = $fields.eq(i).val();
			}
			
			return dataObj;
		},
		
		ajaxSubmitFormHandler: function(event) {
			var $target = $(event.target),
				$form = $target.closest("form");
			
			switch($form[0].id.toLowerCase()){
				case "site-quicknav":
					var url = $target[0].options[$target[0].selectedIndex].value;
					if(url != 0) window.location.href = url;
					break;
			}
			
			if($form.hasClass("ajax")){
				var url,
					method = "POST",
					datatype = "json",
					dataObj = Forms.parseForm($form[0]);
				
				switch($form[0].id.toLowerCase()){
					case "site-office-search":
						url = "JSONOffices";
						method = "GET";
						var $target = $form.parent().find('address');
						$target.text("").addClass(Page._loaderClass);
						break;
				}
				
				$.ajax({
					type: method,
					url: url,
					data: dataObj,
					dataType: datatype,
					success: function(data) {

						if(data[0].type != "undefined"){
							
							switch(data[0].type){
								case "office":
									Forms.ajaxOfficeSearch($form, data[0]);
									break;
							}
						}
					}
				});
			}
		},
		
		//Input[text] label is value attribute
		initLabelInput: function(i){
			var $this = $(this, i);
			
			$this.data("_prompt", $this.val());
			
			$this.focus(Forms.labelInputFocusHandler).blur(Forms.labelInputBlurHandler);
			
			$this.change(function (event) {
				var $this = $(this);
				$this.unbind("focus", Forms.inputFocusHandler);
				$this.unbind("blur", Forms.inputBlurHandler);
			});
		},
		
		labelInputFocusHandler: function(){
			var $this = $(this);
			$this.attr("value", "");
		},
		
		labelInputBlurHandler: function(){
			var $this = $(this);
			var msg = $this.data('_prompt');
			if (!$this.val()) $this.attr("value", msg);
		},
		
		ajaxOfficeSearch: function($form, data){
			var str = data.addressLine1 + "<br />" + data.addressLine2 + [data.addressLine2 ? "<br />" : ""] + data.city + " " + data.postcode;
			var $target = $form.parent().find('address');
			$target.html(str).removeClass(Page._loaderClass);
		}
	};
	
	$.JL.Plugins = Plugins = {
		
		_colorboxSelector: '.colorbox',
		_stylishselectSelector: 'select',
		_jscrollpaneSelector: '.scrollable',
		_listnavSelector: '.directory',
	
		launch: function() {
			var $colorbox = $(this._colorboxSelector+"*");
			if($colorbox.length) $colorbox.each(this.initColorbox);
			
			var $stylishselect = $(this._stylishselectSelector);
			if($stylishselect.length)(Page._isIE6) ? $stylishselect.each(this.noStylishSelect) : $stylishselect.each(this.initStylishSelect);
			
			var $jScroll = $(this._jscrollpaneSelector);
			if($jScroll.length) $jScroll.each(this.initjScroll);
			
			var $cycle = $('#slideshow .cycle');
			if($cycle.length) this.launchCycle($cycle);
			
			var $directory = $(this._listnavSelector + " > ul");
			if($directory.length) $directory.each(this.initListnav);
		},
		
		initStylishSelect: function(i){
			var $this = $(this, i);
			$this.sSelect({ddMaxHeight:"132px"}).change(Forms.ajaxSubmitFormHandler);
		},
		
		noStylishSelect: function(i){
			var $this = $(this, i);
			$this.change(Forms.ajaxSubmitFormHandler);
		},
		
		initColorbox: function(i){
			var $this = $(this, i),
				opts = {opacity: 0.6, returnFocus: true};
			
			//iFrame
			if ($this.hasClass("iframe")) {
				opts.iframe = true;
				opts.width = "80%";
				opts.height = "80%";
			} if($this.parent().hasClass("pdf") || $this.parent().hasClass("msword")){
				opts.initialWidth = 180;
				opts.initialHeight = 200;
				opts.width = 370;
				opts.returnFocus = true;
			}
			
			$this.colorbox(opts);
		},
		
		launchCycle: function($target){
			var opts = {
				fx: 'fade',
				speed: 800,
				timeout: 8000,
				autostop: 1,
				end: function() {
					//alert('Slideshow has ended.');
				}
			};
			
			this.initCycle($target ,opts);
		},
		
		initCycle: function($obj, opts){
			var $cycle = $obj.cycle(opts);
			return $cycle;
		},
		
		initjScroll: function(i){
			var $this = $(this, i),
				opts = {verticalDragMinHeight: 25, verticalDragMaxHeight: 25, verticalGutter: 17};
			
			$this.jScrollPane(opts)
		},
		
		initListnav: function(i){
			var $this = $(this, i),
				opts = {"includeAll": false, "showCounts": false, "includeDir": !$this.parent().hasClass("no-listing")};
			var qs = Utils.getQueryString("ltr");
			if(+qs.length) opts.initLetter = qs;
			
			$this.listnav(opts);
		}
	};
	
	$.JL.Aux = Aux = {
		
		_pageUrl: document.URL,
		_pageTitle: document.title,
		
		init: function(){
			$("a.print").click(function(){
				self.focus();
				window.print();
				return false;
			});
			$("a.bookmark").click(this.bookmarkPage);
			$('a.back').click(function(event) {window.history.back();event.preventDefault();});

			var $table = $('table');
			if($table.length) {
				$('tbody tr').hover(function() {
					$(this).addClass(Page._selectedclass);
				}, function() {
					$(this).removeClass(Page._selectedclass);
				});
			}
		},
		
		checkUserAgent: function(){
			var ua = navigator.userAgent.toLowerCase();
			return {"browser": $.browser, "isMac": (ua.indexOf('mac') != -1)};
		},
		
		bookmarkPage: function(event){
			event.preventDefault();
			
			var ua = Aux.checkUserAgent();
			
			//Firefox/Mozilla
			if(ua.browser.mozilla && window.sidebar) window.sidebar.addPanel(Aux._pageTitle, Aux._pageUrl, "")
			
			//ie
			if(ua.browser.msie && document.all) window.external.AddFavorite(Aux._pageUrl, Aux._pageTitle);
			
			//Opera
			if(ua.browser.opera && window.opera) {
				var el = document.createElement('a');
				el.setAttribute('href', Aux._pageUrl);
				el.setAttribute('title', Aux._pageTitle);
				el.setAttribute('rel', 'sidebar');
				el.click();
			};
			
			//Webkit - Note: Webkit will not permit this action(security restriction)
			if(ua.browser.webkit) alert('You need to press ' + [ua.isMac ? 'Command/Cmd' : 'CTRL'] + ' + D to bookmark our site.');
		},
		
		downloadLinks: function($dlinks){
			$hidden = $dlinks.siblings("input.downloadLink:hidden");
			if($hidden.length) var url = $hidden[0].value;

			$dlinks.removeClass('colorbox cboxElement').attr({
				"target": "_blank",
				"href": url
			});
		}
	};
	
	Page.init();
});
