text: /*! Widget: storage - updated 11/26/2016 (v2.28.0) */
  /*global JSON:false */
  ;(function ($, window, document) {
  	'use strict';
  
  	var ts = $.tablesorter || {};
  	// *** Store data in local storage, with a cookie fallback ***
  	/* IE7 needs JSON library for JSON.stringify - (http://caniuse.com/#search=json)
  	   if you need it, then include https://github.com/douglascrockford/JSON-js
  
  	   $.parseJSON is not available is jQuery versions older than 1.4.1, using older
  	   versions will only allow storing information for one page at a time
  
  	   // *** Save data (JSON format only) ***
  	   // val must be valid JSON... use http://jsonlint.com/ to ensure it is valid
  	   var val = { "mywidget" : "data1" }; // valid JSON uses double quotes
  	   // $.tablesorter.storage(table, key, val);
  	   $.tablesorter.storage(table, 'tablesorter-mywidget', val);
  
  	   // *** Get data: $.tablesorter.storage(table, key); ***
  	   v = $.tablesorter.storage(table, 'tablesorter-mywidget');
  	   // val may be empty, so also check for your data
  	   val = (v && v.hasOwnProperty('mywidget')) ? v.mywidget : '';
  	   alert(val); // 'data1' if saved, or '' if not
  	*/
  	ts.storage = function(table, key, value, options) {
  		table = $(table)[0];
  		var cookieIndex, cookies, date,
  			hasStorage = false,
  			values = {},
  			c = table.config,
  			wo = c && c.widgetOptions,
  			storageType = ( options && options.useSessionStorage ) || ( wo && wo.storage_useSessionStorage ) ?
  				'sessionStorage' : 'localStorage',
  			$table = $(table),
  			// id from (1) options ID, (2) table 'data-table-group' attribute, (3) widgetOptions.storage_tableId,
  			// (4) table ID, then (5) table index
  			id = options && options.id ||
  				$table.attr( options && options.group || wo && wo.storage_group || 'data-table-group') ||
  				wo && wo.storage_tableId || table.id || $('.tablesorter').index( $table ),
  			// url from (1) options url, (2) table 'data-table-page' attribute, (3) widgetOptions.storage_fixedUrl,
  			// (4) table.config.fixedUrl (deprecated), then (5) window location path
  			url = options && options.url ||
  				$table.attr(options && options.page || wo && wo.storage_page || 'data-table-page') ||
  				wo && wo.storage_fixedUrl || c && c.fixedUrl || window.location.pathname;
  		// update defaults for validator; these values must be falsy!
  		$.extend(true, ts.defaults, {
  			fixedUrl: '',
  			widgetOptions: {
  				storage_fixedUrl: '',
  				storage_group: '',
  				storage_page: '',
  				storage_tableId: '',
  				storage_useSessionStorage: ''
  			}
  		});
  		// https://gist.github.com/paulirish/5558557
  		if (storageType in window) {
  			try {
  				window[storageType].setItem('_tmptest', 'temp');
  				hasStorage = true;
  				window[storageType].removeItem('_tmptest');
  			} catch (error) {
  				if (c && c.debug) {
  					console.warn( storageType + ' is not supported in this browser' );
  				}
  			}
  		}
  		// *** get value ***
  		if ($.parseJSON) {
  			if (hasStorage) {
  				values = $.parseJSON( window[storageType][key] || 'null' ) || {};
  			} else {
  				// old browser, using cookies
  				cookies = document.cookie.split(/[;\s|=]/);
  				// add one to get from the key to the value
  				cookieIndex = $.inArray(key, cookies) + 1;
  				values = (cookieIndex !== 0) ? $.parseJSON(cookies[cookieIndex] || 'null') || {} : {};
  			}
  		}
  		// allow value to be an empty string too
  		if (typeof value !== 'undefined' && window.JSON && JSON.hasOwnProperty('stringify')) {
  			// add unique identifiers = url pathname > table ID/index on page > data
  			if (!values[url]) {
  				values[url] = {};
  			}
  			values[url][id] = value;
  			// *** set value ***
  			if (hasStorage) {
  				window[storageType][key] = JSON.stringify(values);
  			} else {
  				date = new Date();
  				date.setTime(date.getTime() + (31536e+6)); // 365 days
  				document.cookie = key + '=' + (JSON.stringify(values)).replace(/\"/g, '\"') + '; expires=' + date.toGMTString() + '; path=/';
  			}
  		} else {
  			return values && values[url] ? values[url][id] : '';
  		}
  	};
  
  })(jQuery, window, document);
  