﻿/* * FancyBox - jQuery Plugin * simple and fancy lightbox alternative * * Copyright (c) 2009 Janis Skarnelis * Examples and documentation at: http://fancybox.net *  * Version: 1.2.6 (16/11/2009) * Requires: jQuery v1.3+ *  * Dual licensed under the MIT and GPL licenses: *   http://www.opensource.org/licenses/mit-license.php *   http://www.gnu.org/licenses/gpl.html */;(function($) {	$.fn.fixPNG = function() {		return this.each(function () {			var image = $(this).css('backgroundImage');			if (image.match(/^url\(["']?(.*\.png)["']?\)$/i)) {				image = RegExp.$1;				$(this).css({					'backgroundImage': 'none',					'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=" + ($(this).css('backgroundRepeat') == 'no-repeat' ? 'crop' : 'scale') + ", src='" + image + "')"				}).each(function () {					var position = $(this).css('position');					if (position != 'absolute' && position != 'relative')						$(this).css('position', 'relative');				});			}		});	};	var elem, opts, busy = false, imagePreloader = new Image, loadingTimer, loadingFrame = 1, imageRegExp = /\.(jpg|gif|png|bmp|jpeg)(.*)?$/i;	var ieQuirks = null, IE6 = $.browser.msie && $.browser.version.substr(0,1) == 6 && !window.XMLHttpRequest, oldIE = IE6 || ($.browser.msie && $.browser.version.substr(0,1) == 7);	$.fn.fancybox = function(o) {		var settings		= $.extend({}, $.fn.fancybox.defaults, o);		var matchedGroup	= this;		function _initialize() {			elem = this;			opts = $.extend({}, settings);			_start();			return false;		};		function _start() {			if (busy) return;			if ($.isFunction(opts.callbackOnStart)) {				opts.callbackOnStart();			}			opts.itemArray		= [];			opts.itemCurrent	= 0;			if (settings.itemArray.length > 0) {				opts.itemArray = settings.itemArray;			} else {				var item = {};				if (!elem.rel || elem.rel == '') {					var item = {href: elem.href, title: elem.title};					if ($(elem).children("img:first").length) {						item.orig = $(elem).children("img:first");					} else {						item.orig = $(elem);					}					if (item.title == '' || typeof item.title == 'undefined') {						item.title = item.orig.attr('alt');					}										opts.itemArray.push( item );				} else {					var subGroup = $(matchedGroup).filter("a[rel=" + elem.rel + "]");					var item = {};					for (var i = 0; i < subGroup.length; i++) {						item = {href: subGroup[i].href, title: subGroup[i].title};						if ($(subGroup[i]).children("img:first").length) {							item.orig = $(subGroup[i]).children("img:first");						} else {							item.orig = $(subGroup[i]);						}						if (item.title == '' || typeof item.title == 'undefined') {							item.title = item.orig.attr('alt');						}						opts.itemArray.push( item );					}				}			}			while ( opts.itemArray[ opts.itemCurrent ].href != elem.href ) {				opts.itemCurrent++;			}			if (opts.overlayShow) {				if (IE6) {					$('embed, object, select').css('visibility', 'hidden');					$("#fancy_overlay").css('height', $(document).height());				}				$("#fancy_overlay").css({					'background-color'	: opts.overlayColor,					'opacity'			: opts.overlayOpacity				}).show();			}						$(window).bind("resize.fb scroll.fb", $.fn.fancybox.scrollBox);			_change_item();		};		function _change_item() {			$("#fancy_right, #fancy_left, #fancy_close, #fancy_title").hide();			var href = opts.itemArray[ opts.itemCurrent ].href;			if (href.match("iframe") || elem.className.indexOf("iframe") >= 0) {				$.fn.fancybox.showLoading();				_set_content('<iframe id="fancy_frame" onload="jQuery.fn.fancybox.showIframe()" name="fancy_iframe' + Math.round(Math.random()*1000) + '" frameborder="0" hspace="0" src="' + href + '"></iframe>', opts.frameWidth, opts.frameHeight);			} else if (href.match(/#/)) {				var target = window.location.href.split('#')[0]; target = href.replace(target, ''); target = target.substr(target.indexOf('#'));				_set_content('<div id="fancy_div">' + $(target).html() + '</div>', opts.frameWidth, opts.frameHeight);			} else if (href.match(imageRegExp)) {				imagePreloader = new Image; imagePreloader.src = href;				if (imagePreloader.complete) {					_proceed_image();				} else {					$.fn.fancybox.showLoading();					$(imagePreloader).unbind().bind('load', function() {						$("#fancy_loading").hide();						_proceed_image();					});				}			} else {				$.fn.fancybox.showLoading();				$.get(href, function(data) {					$("#fancy_loading").hide();					_set_content( '<div id="fancy_ajax">' + data + '</div>', opts.frameWidth, opts.frameHeight );				});			}		};		function _proceed_image() {			var width	= imagePreloader.width;			var height	= imagePreloader.height;			var horizontal_space	= (opts.padding * 2) + 40;			var vertical_space		= (opts.padding * 2) + 60;			var w = $.fn.fancybox.getViewport();						if (opts.imageScale && (width > (w[0] - horizontal_space) || height > (w[1] - vertical_space))) {				var ratio = Math.min(Math.min(w[0] - horizontal_space, width) / width, Math.min(w[1] - vertical_space, height) / height);				width	= Math.round(ratio * width);				height	= Math.round(ratio * height);			}			_set_content('<img alt="" id="fancy_img" src="' + imagePreloader.src + '" />', width, height);		};		function _preload_neighbor_images() {			if ((opts.itemArray.length -1) > opts.itemCurrent) {				var href = opts.itemArray[opts.itemCurrent + 1].href || false;				if (href && href.match(imageRegExp)) {					objNext = new Image();					objNext.src = href;				}			}			if (opts.itemCurrent > 0) {				var href = opts.itemArray[opts.itemCurrent -1].href || false;				if (href && href.match(imageRegExp)) {					objNext = new Image();					objNext.src = href;				}			}		};		function _set_content(value, width, height) {			busy = true;			var pad = opts.padding;			if (oldIE || ieQuirks) {				$("#fancy_content")[0].style.removeExpression("height");				$("#fancy_content")[0].style.removeExpression("width");			}			if (pad > 0) {				width	+= pad * 2;				height	+= pad * 2;				$("#fancy_content").css({					'top'		: pad + 'px',					'right'		: pad + 'px',					'bottom'	: pad + 'px',					'left'		: pad + 'px',					'width'		: 'auto',					'height'	: 'auto'				});				if (oldIE || ieQuirks) {					$("#fancy_content")[0].style.setExpression('height',	'(this.parentNode.clientHeight - '	+ pad * 2 + ')');					$("#fancy_content")[0].style.setExpression('width',		'(this.parentNode.clientWidth - '	+ pad * 2 + ')');				}			} else {				$("#fancy_content").css({					'top'		: 0,					'right'		: 0,					'bottom'	: 0,					'left'		: 0,					'width'		: '100%',					'height'	: '100%'				});			}			if ($("#fancy_outer").is(":visible") && width == $("#fancy_outer").width() && height == $("#fancy_outer").height()) {				$("#fancy_content").fadeOut('fast', function() {					$("#fancy_content").empty().append($(value)).fadeIn("normal", function() {						_finish();					});				});				return;			}			var w = $.fn.fancybox.getViewport();			var itemTop		= (height	+ 60) > w[1] ? w[3] : (w[3] + Math.round((w[1] - height	- 60) * 0.5));			var itemLeft	= (width	+ 40) > w[0] ? w[2] : (w[2] + Math.round((w[0] - width	- 40) * 0.5));			var itemOpts = {				'left':		itemLeft,				'top':		itemTop,				'width':	width + 'px',				'height':	height + 'px'			};			if ($("#fancy_outer").is(":visible")) {				$("#fancy_content").fadeOut("normal", function() {					$("#fancy_content").empty();					$("#fancy_outer").animate(itemOpts, opts.zoomSpeedChange, opts.easingChange, function() {						$("#fancy_content").append($(value)).fadeIn("normal", function() {							_finish();						});					});				});			} else {				if (opts.zoomSpeedIn > 0 && opts.itemArray[opts.itemCurrent].orig !== undefined) {					$("#fancy_content").empty().append($(value));					var orig_item	= opts.itemArray[opts.itemCurrent].orig;					var orig_pos	= $.fn.fancybox.getPosition(orig_item);					$("#fancy_outer").css({						'left':		(orig_pos.left	- 20 - opts.padding) + 'px',						'top':		(orig_pos.top	- 20 - opts.padding) + 'px',						'width':	$(orig_item).width() + (opts.padding * 2),						'height':	$(orig_item).height() + (opts.padding * 2)					});					if (opts.zoomOpacity) {						itemOpts.opacity = 'show';					}					$("#fancy_outer").animate(itemOpts, opts.zoomSpeedIn, opts.easingIn, function() {						_finish();					});				} else {					$("#fancy_content").hide().empty().append($(value)).show();					$("#fancy_outer").css(itemOpts).fadeIn("normal", function() {						_finish();					});				}			}		};		function _set_navigation() {			if (opts.itemCurrent !== 0) {				$("#fancy_left, #fancy_left_ico").unbind().bind("click", function(e) {					e.stopPropagation();					opts.itemCurrent--;					_change_item();					return false;				});				$("#fancy_left").show();			}			if (opts.itemCurrent != ( opts.itemArray.length -1)) {				$("#fancy_right, #fancy_right_ico").unbind().bind("click", function(e) {					e.stopPropagation();					opts.itemCurrent++;					_change_item();					return false;				});				$("#fancy_right").show();			}		};		function _finish() {			if ($.browser.msie) {				$("#fancy_content")[0].style.removeAttribute('filter');				$("#fancy_outer")[0].style.removeAttribute('filter');			}			_set_navigation();			_preload_neighbor_images();			$(document).bind("keydown.fb", function(e) {				if (e.keyCode == 27 && opts.enableEscapeButton) {					$.fn.fancybox.close();				} else if(e.keyCode == 37 && opts.itemCurrent !== 0) {					$(document).unbind("keydown.fb");					opts.itemCurrent--;					_change_item();									} else if(e.keyCode == 39 && opts.itemCurrent != (opts.itemArray.length - 1)) {					$(document).unbind("keydown.fb");					opts.itemCurrent++;					_change_item();				}			});			if (opts.hideOnContentClick) {				$("#fancy_content").click($.fn.fancybox.close);			}			if (opts.overlayShow && opts.hideOnOverlayClick) {				$("#fancy_overlay").bind("click", $.fn.fancybox.close);			}			if (opts.showCloseButton) {				$("#fancy_close").bind("click", $.fn.fancybox.close).show();			}			if (typeof opts.itemArray[ opts.itemCurrent ].title !== 'undefined' && opts.itemArray[ opts.itemCurrent ].title.length > 0) {				var pos = $("#fancy_outer").position();				$('#fancy_title div').text( opts.itemArray[ opts.itemCurrent ].title).html();				$('#fancy_title').css({					'top'	: pos.top + $("#fancy_outer").outerHeight() - 32,					'left'	: pos.left + (($("#fancy_outer").outerWidth() * 0.5) - ($('#fancy_title').width() * 0.5))				}).show();			}			if (opts.overlayShow && IE6) {				$('embed, object, select', $('#fancy_content')).css('visibility', 'visible');			}			if ($.isFunction(opts.callbackOnShow)) {				opts.callbackOnShow( opts.itemArray[ opts.itemCurrent ] );			}			if ($.browser.msie) {				$("#fancy_outer")[0].style.removeAttribute('filter'); 				$("#fancy_content")[0].style.removeAttribute('filter'); 			}						busy = false;		};		return this.unbind('click.fb').bind('click.fb', _initialize);	};	$.fn.fancybox.scrollBox = function() {		var w = $.fn.fancybox.getViewport();				if (opts.centerOnScroll && $("#fancy_outer").is(':visible')) {			var ow	= $("#fancy_outer").outerWidth();			var oh	= $("#fancy_outer").outerHeight();			var pos	= {				'top'	: (oh > w[1] ? w[3] : w[3] + Math.round((w[1] - oh) * 0.5)),				'left'	: (ow > w[0] ? w[2] : w[2] + Math.round((w[0] - ow) * 0.5))			};			$("#fancy_outer").css(pos);			$('#fancy_title').css({				'top'	: pos.top	+ oh - 32,				'left'	: pos.left	+ ((ow * 0.5) - ($('#fancy_title').width() * 0.5))			});		}				if (IE6 && $("#fancy_overlay").is(':visible')) {			$("#fancy_overlay").css({				'height' : $(document).height()			});		}				if ($("#fancy_loading").is(':visible')) {			$("#fancy_loading").css({'left': ((w[0] - 40) * 0.5 + w[2]), 'top': ((w[1] - 40) * 0.5 + w[3])});		}	};	$.fn.fancybox.getNumeric = function(el, prop) {		return parseInt($.curCSS(el.jquery?el[0]:el,prop,true))||0;	};	$.fn.fancybox.getPosition = function(el) {		var pos = el.offset();		pos.top	+= $.fn.fancybox.getNumeric(el, 'paddingTop');		pos.top	+= $.fn.fancybox.getNumeric(el, 'borderTopWidth');		pos.left += $.fn.fancybox.getNumeric(el, 'paddingLeft');		pos.left += $.fn.fancybox.getNumeric(el, 'borderLeftWidth');		return pos;	};	$.fn.fancybox.showIframe = function() {		$("#fancy_loading").hide();		$("#fancy_frame").show();	};	$.fn.fancybox.getViewport = function() {		return [$(window).width(), $(window).height(), $(document).scrollLeft(), $(document).scrollTop() ];	};	$.fn.fancybox.animateLoading = function() {		if (!$("#fancy_loading").is(':visible')){			clearInterval(loadingTimer);			return;		}		$("#fancy_loading > div").css('top', (loadingFrame * -40) + 'px');		loadingFrame = (loadingFrame + 1) % 12;	};	$.fn.fancybox.showLoading = function() {		clearInterval(loadingTimer);		var w = $.fn.fancybox.getViewport();		$("#fancy_loading").css({'left': ((w[0] - 40) * 0.5 + w[2]), 'top': ((w[1] - 40) * 0.5 + w[3])}).show();		$("#fancy_loading").bind('click', $.fn.fancybox.close);		loadingTimer = setInterval($.fn.fancybox.animateLoading, 66);	};	$.fn.fancybox.close = function() {		busy = true;		$(imagePreloader).unbind();		$(document).unbind("keydown.fb");		$(window).unbind("resize.fb scroll.fb");		$("#fancy_overlay, #fancy_content, #fancy_close").unbind();		$("#fancy_close, #fancy_loading, #fancy_left, #fancy_right, #fancy_title").hide();		__cleanup = function() {			if ($("#fancy_overlay").is(':visible')) {				$("#fancy_overlay").fadeOut("fast");			}			$("#fancy_content").empty();						if (opts.centerOnScroll) {				$(window).unbind("resize.fb scroll.fb");			}			if (IE6) {				$('embed, object, select').css('visibility', 'visible');			}			if ($.isFunction(opts.callbackOnClose)) {				opts.callbackOnClose();			}			busy = false;		};		if ($("#fancy_outer").is(":visible") !== false) {			if (opts.zoomSpeedOut > 0 && opts.itemArray[opts.itemCurrent].orig !== undefined) {				var orig_item	= opts.itemArray[opts.itemCurrent].orig;				var orig_pos	= $.fn.fancybox.getPosition(orig_item);				var itemOpts = {					'left':		(orig_pos.left	- 20 - opts.padding) + 'px',					'top': 		(orig_pos.top	- 20 - opts.padding) + 'px',					'width':	$(orig_item).width() + (opts.padding * 2),					'height':	$(orig_item).height() + (opts.padding * 2)				};				if (opts.zoomOpacity) {					itemOpts.opacity = 'hide';				}				$("#fancy_outer").stop(false, true).animate(itemOpts, opts.zoomSpeedOut, opts.easingOut, __cleanup);			} else {				$("#fancy_outer").stop(false, true).fadeOut('fast', __cleanup);			}		} else {			__cleanup();		}		return false;	};	$.fn.fancybox.build = function() {		var html = '';		html += '<div id="fancy_overlay"></div>';		html += '<div id="fancy_loading"><div></div></div>';		html += '<div id="fancy_outer">';		html += '<div id="fancy_inner">';		html += '<div id="fancy_close"></div>';		html += '<div id="fancy_bg"><div class="fancy_bg" id="fancy_bg_n"></div><div class="fancy_bg" id="fancy_bg_ne"></div><div class="fancy_bg" id="fancy_bg_e"></div><div class="fancy_bg" id="fancy_bg_se"></div><div class="fancy_bg" id="fancy_bg_s"></div><div class="fancy_bg" id="fancy_bg_sw"></div><div class="fancy_bg" id="fancy_bg_w"></div><div class="fancy_bg" id="fancy_bg_nw"></div></div>';		html += '<a href="javascript:;" id="fancy_left"><span class="fancy_ico" id="fancy_left_ico"></span></a><a href="javascript:;" id="fancy_right"><span class="fancy_ico" id="fancy_right_ico"></span></a>';		html += '<div id="fancy_content"></div>';		html += '</div>';		html += '</div>';				html += '<div id="fancy_title"></div>';				$(html).appendTo("body");		$('<table cellspacing="0" cellpadding="0" border="0"><tr><td class="fancy_title" id="fancy_title_left"></td><td class="fancy_title" id="fancy_title_main"><div></div></td><td class="fancy_title" id="fancy_title_right"></td></tr></table>').appendTo('#fancy_title');		if ($.browser.msie) {			$(".fancy_bg").fixPNG();		}		if (IE6) {			$("div#fancy_overlay").css("position", "absolute");			$("#fancy_loading div, #fancy_close, .fancy_title, .fancy_ico").fixPNG();			$("#fancy_inner").prepend('<iframe id="fancy_bigIframe" src="javascript:false;" scrolling="no" frameborder="0"></iframe>');			// Get rid of the 'false' text introduced by the URL of the iframe			var frameDoc = $('#fancy_bigIframe')[0].contentWindow.document;			frameDoc.open();			frameDoc.close();					}	};	$.fn.fancybox.defaults = {		padding				:	10,		imageScale			:	true,		zoomOpacity			:	true,		zoomSpeedIn			:	0,		zoomSpeedOut		:	0,		zoomSpeedChange		:	300,		easingIn			:	'swing',		easingOut			:	'swing',		easingChange		:	'swing',		frameWidth			:	560,		frameHeight			:	340,		overlayShow			:	true,		overlayOpacity		:	0.3,		overlayColor		:	'#666',		enableEscapeButton	:	true,		showCloseButton		:	true,		hideOnOverlayClick	:	true,		hideOnContentClick	:	true,		centerOnScroll		:	true,		itemArray			:	[],		callbackOnStart		:	null,		callbackOnShow		:	null,		callbackOnClose		:	null	};	$(document).ready(function() {		ieQuirks = $.browser.msie && !$.boxModel;		if ($("#fancy_outer").length < 1) {			$.fn.fancybox.build();		}	});})(jQuery);/* *  * TableSorter 2.0 - Client-side table sorting with ease! * Version 2.0.3 * @requires jQuery v1.2.3 *  * Copyright (c) 2007 Christian Bach * Examples and docs at: http://tablesorter.com * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html *  *//** * * @description Create a sortable table with multi-column sorting capabilitys *  * @example $('table').tablesorter(); * @desc Create a simple tablesorter interface. * * @example $('table').tablesorter({ sortList:[[0,0],[1,0]] }); * @desc Create a tablesorter interface and sort on the first and secound column in ascending order. *  * @example $('table').tablesorter({ headers: { 0: { sorter: false}, 1: {sorter: false} } }); * @desc Create a tablesorter interface and disableing the first and secound column headers. *  * @example $('table').tablesorter({ 0: {sorter:"integer"}, 1: {sorter:"currency"} }); * @desc Create a tablesorter interface and set a column parser for the first and secound column. *  *  * @param Object settings An object literal containing key/value pairs to provide optional settings. *  * @option String cssHeader (optional) 			A string of the class name to be appended to sortable tr elements in the thead of the table.  * 												Default value: "header" *  * @option String cssAsc (optional) 			A string of the class name to be appended to sortable tr elements in the thead on a ascending sort.  * 												Default value: "headerSortUp" *  * @option String cssDesc (optional) 			A string of the class name to be appended to sortable tr elements in the thead on a descending sort.  * 												Default value: "headerSortDown" *  * @option String sortInitialOrder (optional) 	A string of the inital sorting order can be asc or desc.  * 												Default value: "asc" *  * @option String sortMultisortKey (optional) 	A string of the multi-column sort key.  * 												Default value: "shiftKey" *  * @option String textExtraction (optional) 	A string of the text-extraction method to use.  * 												For complex html structures inside td cell set this option to "complex",  * 												on large tables the complex option can be slow.  * 												Default value: "simple" *  * @option Object headers (optional) 			An array containing the forces sorting rules.  * 												This option let's you specify a default sorting rule.  * 												Default value: null *  * @option Array sortList (optional) 			An array containing the forces sorting rules.  * 												This option let's you specify a default sorting rule.  * 												Default value: null *  * @option Array sortForce (optional) 			An array containing forced sorting rules.  * 												This option let's you specify a default sorting rule, which is prepended to user-selected rules. * 												Default value: null *    * @option Array sortAppend (optional) 			An array containing forced sorting rules.  * 												This option let's you specify a default sorting rule, which is appended to user-selected rules. * 												Default value: null *  * @option Boolean widthFixed (optional) 		Boolean flag indicating if tablesorter should apply fixed widths to the table columns. * 												This is usefull when using the pager companion plugin. * 												This options requires the dimension jquery plugin. * 												Default value: false * * @option Boolean cancelSelection (optional) 	Boolean flag indicating if tablesorter should cancel selection of the table headers text. * 												Default value: true * * @option Boolean debug (optional) 			Boolean flag indicating if tablesorter should display debuging information usefull for development. * * @type jQuery * * @name tablesorter *  * @cat Plugins/Tablesorter *  * @author Christian Bach/christian.bach@polyester.se */(function($) {	$.extend({		tablesorter: new function() {						var parsers = [], widgets = [];						this.defaults = {				cssHeader: "header",				cssAsc: "headerSortUp",				cssDesc: "headerSortDown",				sortInitialOrder: "asc",				sortMultiSortKey: "shiftKey",				sortForce: null,				sortAppend: null,				textExtraction: "simple",				parsers: {}, 				widgets: [],						widgetZebra: {css: ["even","odd"]},				headers: {},				widthFixed: false,				cancelSelection: true,				sortList: [],				headerList: [],				dateFormat: "us",				decimal: '.',				debug: false			};						/* debuging utils */			function benchmark(s,d) {				log(s + "," + (new Date().getTime() - d.getTime()) + "ms");			}						this.benchmark = benchmark;						function log(s) {				if (typeof console != "undefined" && typeof console.debug != "undefined") {					console.log(s);				} else {					alert(s);				}			}									/* parsers utils */			function buildParserCache(table,$headers) {								if(table.config.debug) { var parsersDebug = ""; }								var rows = table.tBodies[0].rows;								if(table.tBodies[0].rows[0]) {					var list = [], cells = rows[0].cells, l = cells.length;										for (var i=0;i < l; i++) {						var p = false;												if($.metadata && ($($headers[i]).metadata() && $($headers[i]).metadata().sorter)  ) {													p = getParserById($($headers[i]).metadata().sorter);													} else if((table.config.headers[i] && table.config.headers[i].sorter)) {								p = getParserById(table.config.headers[i].sorter);						}						if(!p) {							p = detectParserForColumn(table,cells[i]);						}							if(table.config.debug) { parsersDebug += "column:" + i + " parser:" +p.id + "\n"; }							list.push(p);					}				}								if(table.config.debug) { log(parsersDebug); }				return list;			};						function detectParserForColumn(table,node) {				var l = parsers.length;				for(var i=1; i < l; i++) {					if(parsers[i].is($.trim(getElementText(table.config,node)),table,node)) {						return parsers[i];					}				}				// 0 is always the generic parser (text)				return parsers[0];			}						function getParserById(name) {				var l = parsers.length;				for(var i=0; i < l; i++) {					if(parsers[i].id.toLowerCase() == name.toLowerCase()) {							return parsers[i];					}				}				return false;			}						/* utils */			function buildCache(table) {								if(table.config.debug) { var cacheTime = new Date(); }												var totalRows = (table.tBodies[0] && table.tBodies[0].rows.length) || 0,					totalCells = (table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length) || 0,					parsers = table.config.parsers, 					cache = {row: [], normalized: []};									for (var i=0;i < totalRows; ++i) {											/** Add the table data to main data array */						var c = table.tBodies[0].rows[i], cols = [];											cache.row.push($(c));												for(var j=0; j < totalCells; ++j) {							cols.push(parsers[j].format(getElementText(table.config,c.cells[j]),table,c.cells[j]));							}																		cols.push(i); // add position for rowCache						cache.normalized.push(cols);						cols = null;					};								if(table.config.debug) { benchmark("Building cache for " + totalRows + " rows:", cacheTime); }								return cache;			};						function getElementText(config,node) {								if(!node) return "";												var t = "";								if(config.textExtraction == "simple") {					if(node.childNodes[0] && node.childNodes[0].hasChildNodes()) {						t = node.childNodes[0].innerHTML;					} else {						t = node.innerHTML;					}				} else {					if(typeof(config.textExtraction) == "function") {						t = config.textExtraction(node);					} else { 						t = $(node).text();					}					}				return t;			}						function appendToTable(table,cache) {								if(table.config.debug) {var appendTime = new Date()}								var c = cache, 					r = c.row, 					n= c.normalized, 					totalRows = n.length, 					checkCell = (n[0].length-1), 					tableBody = $(table.tBodies[0]),					rows = [];								for (var i=0;i < totalRows; i++) {					rows.push(r[n[i][checkCell]]);						if(!table.config.appender) {												var o = r[n[i][checkCell]];						var l = o.length;						for(var j=0; j < l; j++) {														tableBody[0].appendChild(o[j]);												}												//tableBody.append(r[n[i][checkCell]]);					}				}									if(table.config.appender) {									table.config.appender(table,rows);					}								rows = null;								if(table.config.debug) { benchmark("Rebuilt table:", appendTime); }												//apply table widgets				applyWidget(table);								// trigger sortend				setTimeout(function() {					$(table).trigger("sortEnd");					},0);							};						function buildHeaders(table) {								if(table.config.debug) { var time = new Date(); }								var meta = ($.metadata) ? true : false, tableHeadersRows = [];							for(var i = 0; i < table.tHead.rows.length; i++) { tableHeadersRows[i]=0; };								$tableHeaders = $("thead th",table);						$tableHeaders.each(function(index) {												this.count = 0;					this.column = index;					this.order = formatSortingOrder(table.config.sortInitialOrder);										if(checkHeaderMetadata(this) || checkHeaderOptions(table,index)) this.sortDisabled = true;										if(!this.sortDisabled) {						$(this).addClass(table.config.cssHeader);					}										// add cell to headerList					table.config.headerList[index]= this;				});								if(table.config.debug) { benchmark("Built headers:", time); log($tableHeaders); }								return $tableHeaders;							};								   	function checkCellColSpan(table, rows, row) {                var arr = [], r = table.tHead.rows, c = r[row].cells;								for(var i=0; i < c.length; i++) {					var cell = c[i];										if ( cell.colSpan > 1) { 						arr = arr.concat(checkCellColSpan(table, headerArr,row++));					} else  {						if(table.tHead.length == 1 || (cell.rowSpan > 1 || !r[row+1])) {							arr.push(cell);						}						//headerArr[row] = (i+row);					}				}				return arr;			};						function checkHeaderMetadata(cell) {				if(($.metadata) && ($(cell).metadata().sorter === false)) { return true; };				return false;			}						function checkHeaderOptions(table,i) {					if((table.config.headers[i]) && (table.config.headers[i].sorter === false)) { return true; };				return false;			}						function applyWidget(table) {				var c = table.config.widgets;				var l = c.length;				for(var i=0; i < l; i++) {										getWidgetById(c[i]).format(table);				}							}						function getWidgetById(name) {				var l = widgets.length;				for(var i=0; i < l; i++) {					if(widgets[i].id.toLowerCase() == name.toLowerCase() ) {						return widgets[i]; 					}				}			};						function formatSortingOrder(v) {								if(typeof(v) != "Number") {					i = (v.toLowerCase() == "desc") ? 1 : 0;				} else {					i = (v == (0 || 1)) ? v : 0;				}				return i;			}						function isValueInArray(v, a) {				var l = a.length;				for(var i=0; i < l; i++) {					if(a[i][0] == v) {						return true;						}				}				return false;			}							function setHeadersCss(table,$headers, list, css) {				// remove all header information				$headers.removeClass(css[0]).removeClass(css[1]);								var h = [];				$headers.each(function(offset) {						if(!this.sortDisabled) {							h[this.column] = $(this);											}				});								var l = list.length; 				for(var i=0; i < l; i++) {					h[list[i][0]].addClass(css[list[i][1]]);				}			}						function fixColumnWidth(table,$headers) {				var c = table.config;				if(c.widthFixed) {					var colgroup = $('<colgroup>');					$("tr:first td",table.tBodies[0]).each(function() {						colgroup.append($('<col>').css('width',$(this).width()));					});					$(table).prepend(colgroup);				};			}						function updateHeaderSortCount(table,sortList) {				var c = table.config, l = sortList.length;				for(var i=0; i < l; i++) {					var s = sortList[i], o = c.headerList[s[0]];					o.count = s[1];					o.count++;				}			}						/* sorting methods */			function multisort(table,sortList,cache) {								if(table.config.debug) { var sortTime = new Date(); }								var dynamicExp = "var sortWrapper = function(a,b) {", l = sortList.length;									for(var i=0; i < l; i++) {										var c = sortList[i][0];					var order = sortList[i][1];					var s = (getCachedSortType(table.config.parsers,c) == "text") ? ((order == 0) ? "sortText" : "sortTextDesc") : ((order == 0) ? "sortNumeric" : "sortNumericDesc");										var e = "e" + i;										dynamicExp += "var " + e + " = " + s + "(a[" + c + "],b[" + c + "]); ";					dynamicExp += "if(" + e + ") { return " + e + "; } ";					dynamicExp += "else { ";				}								// if value is the same keep orignal order					var orgOrderCol = cache.normalized[0].length - 1;				dynamicExp += "return a[" + orgOrderCol + "]-b[" + orgOrderCol + "];";										for(var i=0; i < l; i++) {					dynamicExp += "}; ";				}								dynamicExp += "return 0; ";					dynamicExp += "}; ";									eval(dynamicExp);								cache.normalized.sort(sortWrapper);								if(table.config.debug) { benchmark("Sorting on " + sortList.toString() + " and dir " + order+ " time:", sortTime); }								return cache;			};						function sortText(a,b) {				return ((a < b) ? -1 : ((a > b) ? 1 : 0));			};						function sortTextDesc(a,b) {				return ((b < a) ? -1 : ((b > a) ? 1 : 0));			};					 		function sortNumeric(a,b) {				return a-b;			};						function sortNumericDesc(a,b) {				return b-a;			};						function getCachedSortType(parsers,i) {				return parsers[i].type;			};						/* public methods */			this.construct = function(settings) {				return this.each(function() {										if(!this.tHead || !this.tBodies) return;										var $this, $document,$headers, cache, config, shiftDown = 0, sortOrder;										this.config = {};										config = $.extend(this.config, $.tablesorter.defaults, settings);										// store common expression for speed										$this = $(this);										// build headers					$headers = buildHeaders(this);										// try to auto detect column type, and store in tables config					this.config.parsers = buildParserCache(this,$headers);															// build the cache for the tbody cells					cache = buildCache(this);										// get the css class names, could be done else where.					var sortCSS = [config.cssDesc,config.cssAsc];										// fixate columns if the users supplies the fixedWidth option					fixColumnWidth(this);										// apply event handling to headers					// this is to big, perhaps break it out?					$headers.click(function(e) {												$this.trigger("sortStart");												var totalRows = ($this[0].tBodies[0] && $this[0].tBodies[0].rows.length) || 0;												if(!this.sortDisabled && totalRows > 0) {																					// store exp, for speed							var $cell = $(this);								// get current column index							var i = this.column;														// get current column sort order							this.order = this.count++ % 2;														// user only whants to sort on one column							if(!e[config.sortMultiSortKey]) {																// flush the sort list								config.sortList = [];																if(config.sortForce != null) {									var a = config.sortForce; 									for(var j=0; j < a.length; j++) {										if(a[j][0] != i) {											config.sortList.push(a[j]);										}									}								}																// add column to sort list								config.sortList.push([i,this.order]);														// multi column sorting							} else {								// the user has clicked on an all ready sortet column.								if(isValueInArray(i,config.sortList)) {	 																		// revers the sorting direction for all tables.									for(var j=0; j < config.sortList.length; j++) {										var s = config.sortList[j], o = config.headerList[s[0]];										if(s[0] == i) {											o.count = s[1];											o.count++;											s[1] = o.count % 2;										}									}									} else {									// add column to sort list array									config.sortList.push([i,this.order]);								}							};							setTimeout(function() {								//set css for headers								setHeadersCss($this[0],$headers,config.sortList,sortCSS);								appendToTable($this[0],multisort($this[0],config.sortList,cache));							},1);							// stop normal event by returning false							return false;						}					// cancel selection						}).mousedown(function() {						if(config.cancelSelection) {							this.onselectstart = function() {return false};							return false;						}					});										// apply easy methods that trigger binded events					$this.bind("update",function() {												// rebuild parsers.						this.config.parsers = buildParserCache(this,$headers);												// rebuild the cache map						cache = buildCache(this);											}).bind("sorton",function(e,list) {												$(this).trigger("sortStart");												config.sortList = list;												// update and store the sortlist						var sortList = config.sortList;												// update header count index						updateHeaderSortCount(this,sortList);												//set css for headers						setHeadersCss(this,$headers,sortList,sortCSS);																		// sort the table and append it to the dom						appendToTable(this,multisort(this,sortList,cache));					}).bind("appendCache",function() {												appendToTable(this,cache);										}).bind("applyWidgetId",function(e,id) {												getWidgetById(id).format(this);											}).bind("applyWidgets",function() {						// apply widgets						applyWidget(this);					});										if($.metadata && ($(this).metadata() && $(this).metadata().sortlist)) {						config.sortList = $(this).metadata().sortlist;					}					// if user has supplied a sort list to constructor.					if(config.sortList.length > 0) {						$this.trigger("sorton",[config.sortList]);						}										// apply widgets					applyWidget(this);				});			};						this.addParser = function(parser) {				var l = parsers.length, a = true;				for(var i=0; i < l; i++) {					if(parsers[i].id.toLowerCase() == parser.id.toLowerCase()) {						a = false;					}				}				if(a) { parsers.push(parser); };			};						this.addWidget = function(widget) {				widgets.push(widget);			};						this.formatFloat = function(s) {				var i = parseFloat(s);				return (isNaN(i)) ? 0 : i;			};			this.formatInt = function(s) {				var i = parseInt(s);				return (isNaN(i)) ? 0 : i;			};						this.isDigit = function(s,config) {				var DECIMAL = '\\' + config.decimal;				var exp = '/(^[+]?0(' + DECIMAL +'0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)' + DECIMAL +'(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*' + DECIMAL +'0+$)/';				return RegExp(exp).test($.trim(s));			};						this.clearTableBody = function(table) {				if($.browser.msie) {					function empty() {						while ( this.firstChild ) this.removeChild( this.firstChild );					}					empty.apply(table.tBodies[0]);				} else {					table.tBodies[0].innerHTML = "";				}			};		}	});		// extend plugin scope	$.fn.extend({        tablesorter: $.tablesorter.construct	});		var ts = $.tablesorter;		// add default parsers	ts.addParser({		id: "text",		is: function(s) {			return true;		},		format: function(s) {			return $.trim(s.toLowerCase());		},		type: "text"	});		ts.addParser({		id: "digit",		is: function(s,table) {			var c = table.config;			return $.tablesorter.isDigit(s,c);		},		format: function(s) {			return $.tablesorter.formatFloat(s);		},		type: "numeric"	});		ts.addParser({		id: "currency",		is: function(s) {			return /^[£$€?.]/.test(s);		},		format: function(s) {			return $.tablesorter.formatFloat(s.replace(new RegExp(/[^0-9.]/g),""));		},		type: "numeric"	});		ts.addParser({		id: "ipAddress",		is: function(s) {			return /^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);		},		format: function(s) {			var a = s.split("."), r = "", l = a.length;			for(var i = 0; i < l; i++) {				var item = a[i];			   	if(item.length == 2) {					r += "0" + item;			   	} else {					r += item;			   	}			}			return $.tablesorter.formatFloat(r);		},		type: "numeric"	});		ts.addParser({		id: "url",		is: function(s) {			return /^(https?|ftp|file):\/\/$/.test(s);		},		format: function(s) {			return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),''));		},		type: "text"	});		ts.addParser({		id: "isoDate",		is: function(s) {			return /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);		},		format: function(s) {			return $.tablesorter.formatFloat((s != "") ? new Date(s.replace(new RegExp(/-/g),"/")).getTime() : "0");		},		type: "numeric"	});			ts.addParser({		id: "percent",		is: function(s) { 			return /\%$/.test($.trim(s));		},		format: function(s) {			return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""));		},		type: "numeric"	});	ts.addParser({		id: "usLongDate",		is: function(s) {			return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));		},		format: function(s) {			return $.tablesorter.formatFloat(new Date(s).getTime());		},		type: "numeric"	});	ts.addParser({		id: "shortDate",		is: function(s) {			return /\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);		},		format: function(s,table) {			var c = table.config;			s = s.replace(/\-/g,"/");			if(c.dateFormat == "us") {				// reformat the string in ISO format				s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$1/$2");			} else if(c.dateFormat == "uk") {				//reformat the string in ISO format				s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1");			} else if(c.dateFormat == "dd/mm/yy" || c.dateFormat == "dd-mm-yy") {				s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/, "$1/$2/$3");				}			return $.tablesorter.formatFloat(new Date(s).getTime());		},		type: "numeric"	});	ts.addParser({	    id: "time",	    is: function(s) {	        return /^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);	    },	    format: function(s) {	        return $.tablesorter.formatFloat(new Date("2000/01/01 " + s).getTime());	    },	  type: "numeric"	});			ts.addParser({	    id: "metadata",	    is: function(s) {	        return false;	    },	    format: function(s,table,cell) {			var c = table.config, p = (!c.parserMetadataName) ? 'sortValue' : c.parserMetadataName;	        return $(cell).metadata()[p];	    },	  type: "numeric"	});		// add default widgets	ts.addWidget({		id: "zebra",		format: function(table) {			if(table.config.debug) { var time = new Date(); }			$("tr:visible",table.tBodies[0])	        .filter(':even')	        .removeClass(table.config.widgetZebra.css[1]).addClass(table.config.widgetZebra.css[0])	        .end().filter(':odd')	        .removeClass(table.config.widgetZebra.css[0]).addClass(table.config.widgetZebra.css[1]);			if(table.config.debug) { $.tablesorter.benchmark("Applying Zebra widget", time); }		}	});	})(jQuery);/** * Common jQuery * * jQuery code common to all pages in RSAR * */var root_dir = "App_Themes/RSAR/";var img_dir = root_dir + "images/";var icon_dir = img_dir + "icons/";function linkCheck() {    /**    * This next section appends icons to the links to show the type of link it is    */    var $img = new Object();    // Holds the information for images attached to links    var exts = new Object();    var $icon_dir = img_path + "/icons";    $('a').not(':has(img)').each(function() {        $(this).filter(function() {            // Test to see if this is an external link, if it is append the external link image            if (this.hostname && this.hostname !== location.hostname) {                $img = { src: "external.png", alt: "External Link" };                $(this).after('&nbsp;<img src="' + $icon_dir + '/external.png" alt="External Link" />');            }            // Now we're going to determine the file type we're linking to,            // and append the appropriate icon to the link            var $href = this.href;            var $ext = $href.split('.')[-1];            var $dir = $href.split('/')[5];            switch ($dir) {                case 'PDF':                    $img = { src: 'pdf.png', alt: 'PDF File' };                    break;                case 'Word':                    $img = { src: 'doc.png', alt: 'Word Document' };                    break;                case 'Excel':                    $img = { src: 'excel.png', alt: 'Excel Spreadsheet' };                    break;            }        }).after('&nbsp;<img src="' + $icon_dir + "/" + $img.src + '" alt="' + $img.alt + '"/>');    });}function theRotator() {	//Set the opacity of all images to 0	$('div#rotator ul li').css({ opacity: 0.0 });	//Get the first image and display it (gets set to full opacity)	$('div#rotator ul li:first').css({ opacity: 1.0 });	//Call the rotator function to run the slideshow, 6000 = change to next image after 6 seconds	setInterval('rotate()', 6000);}function rotate() {	//Get the first image	var current = ($('div#rotator ul li.show') ? $('div#rotator ul li.show') : $('div#rotator ul li:first'));	//Get next image, when it reaches the end, rotate it back to the first image	var next = ((current.next().length) ? ((current.next().hasClass('show')) ? $('div#rotator ul li:first') : current.next()) : $('div#rotator ul li:first'));	//Set the fade in effect for the next image, the show class has higher z-index	next.css({ opacity: 0.0 }).addClass('show').animate({ opacity: 1.0 }, 1000);	//Hide the current image	current.animate({ opacity: 0.0 }, 1000).removeClass('show');}function zebraStripe() {    $('table tbody tr:even').addClass('tr-even');    $('table tbody tr:odd').addClass('tr-odd');    $('table tbdoy tr').hover(function() {        $(this).addClass('tr-hover');    }, function() {        $(this).removeClass('tr-hover');    });}$(document).ready(function() {    //Load the slideshow    theRotator();    // Zebra Stripe Tables    zebraStripe();    // BCheck Links    //linkCheck();    // Tablesorter    $('table.ItemTable').addClass('tablesorter').tablesorter({        // Sort on the first and second columns, order asc        sortList: [[0, 0]]    });    // Fancybox    $('a.fb-link').fancybox({        'zoomSpeedIn': 500,        'zoomSpeedOut': 500,        'overlayShow': false    });        // Make the searchbox more informative    $('.sf_searchText').val("MEMBERS");    // Clear the contents when the user clicks/focuses on the box, unless they've entered something    $('.sf_searchText').focus(function() {        var empty = "";        if($(this).val() == "MEMBERS") {            $(this).val(empty);        }    }).blur(function() {        if($(this).val() == "") {            $(this).val("MEMBERS");        }    });});
