mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-07-19 16:02:15 +00:00
Merge branch 'master' of https://github.com/FH-Complete/FHC-Core
This commit is contained in:
Vendored
-7
File diff suppressed because one or more lines are too long
Vendored
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Vendored
-8
File diff suppressed because one or more lines are too long
Vendored
-314
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@@ -1,221 +0,0 @@
|
||||
/*
|
||||
Author : Tomaz Dragar
|
||||
Mail : <tomaz@dragar.net>
|
||||
Homepage : http://www.dragar.net
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
|
||||
$.fn.simpleCropper = function() {
|
||||
|
||||
var image_dimension_x = 600;
|
||||
var image_dimension_y = 600;
|
||||
var scaled_width = 0;
|
||||
var scaled_height = 0;
|
||||
var x1 = 0;
|
||||
var y1 = 0;
|
||||
var x2 = 0;
|
||||
var y2 = 0;
|
||||
var current_image = null;
|
||||
var aspX = 1;
|
||||
var aspY = 1;
|
||||
var file_display_area = null;
|
||||
var ias = null;
|
||||
var jcrop_api;
|
||||
var bottom_html = "<input type='file' id='fileInput' name='files[]'/><canvas id='myCanvas' style='display:none;'></canvas><div id='modal'></div><div id='preview'><div class='buttons'><div class='cancel' style='background-image:url(../../skin/images/false-27.png);'></div><div class='ok' style='background-image:url(../../skin/images/true-27.png);'></div></div></div>";
|
||||
$('body').append(bottom_html);
|
||||
|
||||
//add click to element
|
||||
this.click(function() {
|
||||
aspX = $(this).width();
|
||||
aspY = $(this).height();
|
||||
file_display_area = $(this);
|
||||
$('#fileInput').click();
|
||||
});
|
||||
|
||||
$(document).ready(function() {
|
||||
//capture selected filename
|
||||
$('#fileInput').change(function(click) {
|
||||
imageUpload($('#preview').get(0));
|
||||
// Reset input value
|
||||
$(this).val("");
|
||||
});
|
||||
|
||||
//ok listener
|
||||
$('.ok').click(function() {
|
||||
preview();
|
||||
$('#preview').delay(100).hide();
|
||||
$('#modal').hide();
|
||||
jcrop_api.destroy();
|
||||
reset();
|
||||
});
|
||||
|
||||
//cancel listener
|
||||
$('.cancel').click(function(event) {
|
||||
$('#preview').delay(100).hide();
|
||||
$('#modal').hide();
|
||||
jcrop_api.destroy();
|
||||
reset();
|
||||
});
|
||||
});
|
||||
|
||||
function reset() {
|
||||
scaled_width = 0;
|
||||
scaled_height = 0;
|
||||
x1 = 0;
|
||||
y1 = 0;
|
||||
x2 = 0;
|
||||
y2 = 0;
|
||||
current_image = null;
|
||||
aspX = 1;
|
||||
aspY = 1;
|
||||
file_display_area = null;
|
||||
}
|
||||
|
||||
function imageUpload(dropbox) {
|
||||
var file = $("#fileInput").get(0).files[0];
|
||||
//var file = document.getElementById('fileInput').files[0];
|
||||
var imageType = /image.*/;
|
||||
|
||||
if (file.type.match(imageType)) {
|
||||
var reader = new FileReader();
|
||||
|
||||
reader.onload = function(e) {
|
||||
// Clear the current image.
|
||||
$('#photo').remove();
|
||||
|
||||
// Create a new image with image crop functionality
|
||||
current_image = new Image();
|
||||
current_image.src = reader.result;
|
||||
current_image.id = "photo";
|
||||
current_image.style['maxWidth'] = image_dimension_x + 'px';
|
||||
current_image.style['maxHeight'] = image_dimension_y + 'px';
|
||||
current_image.onload = function() {
|
||||
// Calculate scaled image dimensions
|
||||
if (current_image.width > image_dimension_x || current_image.height > image_dimension_y) {
|
||||
if (current_image.width > current_image.height) {
|
||||
scaled_width = image_dimension_x;
|
||||
scaled_height = image_dimension_x * current_image.height / current_image.width;
|
||||
}
|
||||
if (current_image.width < current_image.height) {
|
||||
scaled_height = image_dimension_y;
|
||||
scaled_width = image_dimension_y * current_image.width / current_image.height;
|
||||
}
|
||||
if (current_image.width == current_image.height) {
|
||||
scaled_width = image_dimension_x;
|
||||
scaled_height = image_dimension_y;
|
||||
}
|
||||
}
|
||||
else {
|
||||
scaled_width = current_image.width;
|
||||
scaled_height = current_image.height;
|
||||
}
|
||||
|
||||
|
||||
// Position the modal div to the center of the screen
|
||||
$('#modal').css('display', 'block');
|
||||
var window_width = $(window).width() / 2 - scaled_width / 2 + "px";
|
||||
var window_height = $(window).height() / 2 - scaled_height / 2 + "px";
|
||||
|
||||
// Show image in modal view
|
||||
$("#preview").css("top", window_height);
|
||||
$("#preview").css("left", window_width);
|
||||
$('#preview').show(500);
|
||||
|
||||
|
||||
// Calculate selection rect
|
||||
var selection_width = 0;
|
||||
var selection_height = 0;
|
||||
|
||||
var max_x = Math.floor(scaled_height * aspX / aspY);
|
||||
var max_y = Math.floor(scaled_width * aspY / aspX);
|
||||
|
||||
|
||||
if (max_x > scaled_width) {
|
||||
selection_width = scaled_width;
|
||||
selection_height = max_y;
|
||||
}
|
||||
else {
|
||||
selection_width = max_x;
|
||||
selection_height = scaled_height;
|
||||
}
|
||||
|
||||
ias = $(this).Jcrop({
|
||||
onSelect: showCoords,
|
||||
onChange: showCoords,
|
||||
bgColor: '#747474',
|
||||
bgOpacity: .4,
|
||||
aspectRatio: aspX / aspY,
|
||||
setSelect: [0, 0, selection_width, selection_height]
|
||||
}, function() {
|
||||
jcrop_api = this;
|
||||
});
|
||||
}
|
||||
|
||||
// Add image to dropbox element
|
||||
dropbox.appendChild(current_image);
|
||||
}
|
||||
reader.readAsDataURL(file);
|
||||
|
||||
} else {
|
||||
dropbox.innerHTML = "File not supported!";
|
||||
}
|
||||
}
|
||||
|
||||
function showCoords(c) {
|
||||
x1 = c.x;
|
||||
y1 = c.y;
|
||||
x2 = c.x2;
|
||||
y2 = c.y2;
|
||||
}
|
||||
|
||||
function preview() {
|
||||
// Set canvas
|
||||
var canvas = document.getElementById('myCanvas');
|
||||
var context = canvas.getContext('2d');
|
||||
|
||||
// Delete previous image on canvas
|
||||
context.clearRect(0, 0, canvas.width, canvas.height);
|
||||
|
||||
// Set selection width and height
|
||||
var sw = x2 - x1;
|
||||
var sh = y2 - y1;
|
||||
|
||||
|
||||
// Set image original width and height
|
||||
var imgWidth = current_image.naturalWidth;
|
||||
var imgHeight = current_image.naturalHeight;
|
||||
|
||||
// Set selection koeficient
|
||||
var kw = imgWidth / $("#preview").width();
|
||||
var kh = imgHeight / $("#preview").height();
|
||||
|
||||
// Set canvas width and height and draw selection on it
|
||||
canvas.width = aspX;
|
||||
canvas.height = aspY;
|
||||
context.drawImage(current_image, (x1 * kw), (y1 * kh), (sw * kw), (sh * kh), 0, 0, aspX, aspY);
|
||||
|
||||
// Convert canvas image to normal img
|
||||
var dataUrl = canvas.toDataURL();
|
||||
var imageFoo = document.createElement('img');
|
||||
imageFoo.src = dataUrl;
|
||||
|
||||
// Append it to the body element
|
||||
$('#preview').delay(100).hide();
|
||||
$('#modal').hide();
|
||||
file_display_area.html('');
|
||||
file_display_area.append(imageFoo);
|
||||
|
||||
}
|
||||
|
||||
$(window).resize(function() {
|
||||
// Position the modal div to the center of the screen
|
||||
var window_width = $(window).width() / 2 - scaled_width / 2 + "px";
|
||||
var window_height = $(window).height() / 2 - scaled_height / 2 + "px";
|
||||
|
||||
// Show image in modal view
|
||||
$("#preview").css("top", window_height);
|
||||
$("#preview").css("left", window_width);
|
||||
});
|
||||
}
|
||||
}(jQuery));
|
||||
@@ -1,502 +0,0 @@
|
||||
jQuery.autocomplete = function(input, options) {
|
||||
// Create a link to self
|
||||
var me = this;
|
||||
|
||||
// Create jQuery object for input element
|
||||
var $input = $(input).attr("autocomplete", "off");
|
||||
|
||||
// Apply inputClass if necessary
|
||||
if (options.inputClass) $input.addClass(options.inputClass);
|
||||
|
||||
// Create results
|
||||
var results = document.createElement("div");
|
||||
// Create jQuery object for results
|
||||
var $results = $(results);
|
||||
$results.hide().addClass(options.resultsClass).css("position", "absolute");
|
||||
if( options.width > 0 ) $results.css("width", options.width);
|
||||
|
||||
// Add to body element
|
||||
$("body").append(results);
|
||||
|
||||
input.autocompleter = me;
|
||||
|
||||
var timeout = null;
|
||||
var prev = "";
|
||||
var active = -1;
|
||||
var cache = {};
|
||||
var keyb = false;
|
||||
var hasFocus = false;
|
||||
var lastKeyPressCode = null;
|
||||
|
||||
// flush cache
|
||||
function flushCache(){
|
||||
cache = {};
|
||||
cache.data = {};
|
||||
cache.length = 0;
|
||||
};
|
||||
|
||||
// flush cache
|
||||
flushCache();
|
||||
|
||||
// if there is a data array supplied
|
||||
if( options.data != null ){
|
||||
var sFirstChar = "", stMatchSets = {}, row = [];
|
||||
|
||||
// no url was specified, we need to adjust the cache length to make sure it fits the local data store
|
||||
if( typeof options.url != "string" ) options.cacheLength = 1;
|
||||
|
||||
// loop through the array and create a lookup structure
|
||||
for( var i=0; i < options.data.length; i++ ){
|
||||
// if row is a string, make an array otherwise just reference the array
|
||||
row = ((typeof options.data[i] == "string") ? [options.data[i]] : options.data[i]);
|
||||
|
||||
// if the length is zero, don't add to list
|
||||
if( row[0].length > 0 ){
|
||||
// get the first character
|
||||
sFirstChar = row[0].substring(0, 1).toLowerCase();
|
||||
// if no lookup array for this character exists, look it up now
|
||||
if( !stMatchSets[sFirstChar] ) stMatchSets[sFirstChar] = [];
|
||||
// if the match is a string
|
||||
stMatchSets[sFirstChar].push(row);
|
||||
}
|
||||
}
|
||||
|
||||
// add the data items to the cache
|
||||
for( var k in stMatchSets ){
|
||||
// increase the cache size
|
||||
options.cacheLength++;
|
||||
// add to the cache
|
||||
addToCache(k, stMatchSets[k]);
|
||||
}
|
||||
}
|
||||
|
||||
$input
|
||||
.keydown(function(e) {
|
||||
// track last key pressed
|
||||
lastKeyPressCode = e.keyCode;
|
||||
switch(e.keyCode) {
|
||||
case 38: // up
|
||||
e.preventDefault();
|
||||
moveSelect(-1);
|
||||
break;
|
||||
case 40: // down
|
||||
e.preventDefault();
|
||||
moveSelect(1);
|
||||
break;
|
||||
case 9: // tab
|
||||
case 13: // return
|
||||
if( selectCurrent() ){
|
||||
// make sure to blur off the current field
|
||||
$input.get(0).blur();
|
||||
e.preventDefault();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
active = -1;
|
||||
if (timeout) clearTimeout(timeout);
|
||||
timeout = setTimeout(function(){onChange();}, options.delay);
|
||||
break;
|
||||
}
|
||||
})
|
||||
.focus(function(){
|
||||
// track whether the field has focus, we shouldn't process any results if the field no longer has focus
|
||||
hasFocus = true;
|
||||
})
|
||||
.blur(function() {
|
||||
// track whether the field has focus
|
||||
hasFocus = false;
|
||||
hideResults();
|
||||
});
|
||||
|
||||
hideResultsNow();
|
||||
|
||||
function onChange() {
|
||||
// ignore if the following keys are pressed: [del] [shift] [capslock]
|
||||
if( lastKeyPressCode == 46 || (lastKeyPressCode > 8 && lastKeyPressCode < 32) ) return $results.hide();
|
||||
var v = $input.val();
|
||||
if (v == prev) return;
|
||||
prev = v;
|
||||
if (v.length >= options.minChars) {
|
||||
$input.addClass(options.loadingClass);
|
||||
requestData(v);
|
||||
} else {
|
||||
$input.removeClass(options.loadingClass);
|
||||
$results.hide();
|
||||
}
|
||||
};
|
||||
|
||||
function moveSelect(step) {
|
||||
|
||||
var lis = $("li", results);
|
||||
if (!lis) return;
|
||||
|
||||
active += step;
|
||||
|
||||
if (active < 0) {
|
||||
active = 0;
|
||||
} else if (active >= lis.size()) {
|
||||
active = lis.size() - 1;
|
||||
}
|
||||
|
||||
lis.removeClass("ac_over");
|
||||
|
||||
$(lis[active]).addClass("ac_over");
|
||||
|
||||
// Weird behaviour in IE
|
||||
// if (lis[active] && lis[active].scrollIntoView) {
|
||||
// lis[active].scrollIntoView(false);
|
||||
// }
|
||||
|
||||
};
|
||||
|
||||
function selectCurrent() {
|
||||
var li = $("li.ac_over", results)[0];
|
||||
if (!li) {
|
||||
var $li = $("li", results);
|
||||
if (options.selectOnly) {
|
||||
if ($li.length == 1) li = $li[0];
|
||||
} else if (options.selectFirst) {
|
||||
li = $li[0];
|
||||
}
|
||||
}
|
||||
if (li) {
|
||||
selectItem(li);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
function selectItem(li) {
|
||||
if (!li) {
|
||||
li = document.createElement("li");
|
||||
li.extra = [];
|
||||
li.selectValue = "";
|
||||
}
|
||||
var v = $.trim(li.selectValue ? li.selectValue : li.innerHTML);
|
||||
input.lastSelected = v;
|
||||
prev = v;
|
||||
$results.html("");
|
||||
$input.val(v);
|
||||
hideResultsNow();
|
||||
if (options.onItemSelect) setTimeout(function() { options.onItemSelect(li) }, 1);
|
||||
};
|
||||
|
||||
// selects a portion of the input string
|
||||
function createSelection(start, end){
|
||||
// get a reference to the input element
|
||||
var field = $input.get(0);
|
||||
if( field.createTextRange ){
|
||||
var selRange = field.createTextRange();
|
||||
selRange.collapse(true);
|
||||
selRange.moveStart("character", start);
|
||||
selRange.moveEnd("character", end);
|
||||
selRange.select();
|
||||
} else if( field.setSelectionRange ){
|
||||
field.setSelectionRange(start, end);
|
||||
} else {
|
||||
if( field.selectionStart ){
|
||||
field.selectionStart = start;
|
||||
field.selectionEnd = end;
|
||||
}
|
||||
}
|
||||
field.focus();
|
||||
};
|
||||
|
||||
// fills in the input box w/the first match (assumed to be the best match)
|
||||
function autoFill(sValue){
|
||||
// if the last user key pressed was backspace, don't autofill
|
||||
if( lastKeyPressCode != 8 ){
|
||||
// fill in the value (keep the case the user has typed)
|
||||
$input.val($input.val() + sValue.substring(prev.length));
|
||||
// select the portion of the value not typed by the user (so the next character will erase)
|
||||
createSelection(prev.length, sValue.length);
|
||||
}
|
||||
};
|
||||
|
||||
function showResults() {
|
||||
// get the position of the input field right now (in case the DOM is shifted)
|
||||
var pos = findPos(input);
|
||||
// either use the specified width, or autocalculate based on form element
|
||||
var iWidth = (options.width > 0) ? options.width : $input.width();
|
||||
// reposition
|
||||
$results.css({
|
||||
width: parseInt(iWidth) + "px",
|
||||
top: (pos.y + input.offsetHeight) + "px",
|
||||
left: pos.x + "px"
|
||||
}).show();
|
||||
};
|
||||
|
||||
function hideResults() {
|
||||
if (timeout) clearTimeout(timeout);
|
||||
timeout = setTimeout(hideResultsNow, 200);
|
||||
};
|
||||
|
||||
function hideResultsNow() {
|
||||
if (timeout) clearTimeout(timeout);
|
||||
$input.removeClass(options.loadingClass);
|
||||
if ($results.is(":visible")) {
|
||||
$results.hide();
|
||||
}
|
||||
if (options.mustMatch) {
|
||||
var v = $input.val();
|
||||
if (v != input.lastSelected) {
|
||||
selectItem(null);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function receiveData(q, data) {
|
||||
if (data) {
|
||||
$input.removeClass(options.loadingClass);
|
||||
results.innerHTML = "";
|
||||
|
||||
// if the field no longer has focus or if there are no matches, do not display the drop down
|
||||
if( !hasFocus || data.length == 0 ) return hideResultsNow();
|
||||
|
||||
if ($.browser.msie) {
|
||||
// we put a styled iframe behind the calendar so HTML SELECT elements don't show through
|
||||
$results.append(document.createElement('iframe'));
|
||||
}
|
||||
results.appendChild(dataToDom(data));
|
||||
// autofill in the complete box w/the first match as long as the user hasn't entered in more data
|
||||
if( options.autoFill && ($input.val().toLowerCase() == q.toLowerCase()) ) autoFill(data[0][0]);
|
||||
showResults();
|
||||
} else {
|
||||
hideResultsNow();
|
||||
}
|
||||
};
|
||||
|
||||
function parseData(data) {
|
||||
if (!data) return null;
|
||||
var parsed = [];
|
||||
var rows = data.split(options.lineSeparator);
|
||||
for (var i=0; i < rows.length; i++) {
|
||||
var row = $.trim(rows[i]);
|
||||
if (row) {
|
||||
parsed[parsed.length] = row.split(options.cellSeparator);
|
||||
}
|
||||
}
|
||||
return parsed;
|
||||
};
|
||||
|
||||
function dataToDom(data) {
|
||||
var ul = document.createElement("ul");
|
||||
var num = data.length;
|
||||
|
||||
// limited results to a max number
|
||||
if( (options.maxItemsToShow > 0) && (options.maxItemsToShow < num) ) num = options.maxItemsToShow;
|
||||
|
||||
for (var i=0; i < num; i++) {
|
||||
var row = data[i];
|
||||
if (!row) continue;
|
||||
var li = document.createElement("li");
|
||||
if (options.formatItem) {
|
||||
li.innerHTML = options.formatItem(row, i, num);
|
||||
li.selectValue = row[0];
|
||||
} else {
|
||||
li.innerHTML = row[0];
|
||||
li.selectValue = row[0];
|
||||
}
|
||||
var extra = null;
|
||||
if (row.length > 1) {
|
||||
extra = [];
|
||||
for (var j=1; j < row.length; j++) {
|
||||
extra[extra.length] = row[j];
|
||||
}
|
||||
}
|
||||
li.extra = extra;
|
||||
ul.appendChild(li);
|
||||
$(li).hover(
|
||||
function() { $("li", ul).removeClass("ac_over"); $(this).addClass("ac_over"); active = $("li", ul).indexOf($(this).get(0)); },
|
||||
function() { $(this).removeClass("ac_over"); }
|
||||
).click(function(e) { e.preventDefault(); e.stopPropagation(); selectItem(this) });
|
||||
}
|
||||
return ul;
|
||||
};
|
||||
|
||||
function requestData(q) {
|
||||
if (!options.matchCase) q = q.toLowerCase();
|
||||
var data = options.cacheLength ? loadFromCache(q) : null;
|
||||
// recieve the cached data
|
||||
if (data) {
|
||||
receiveData(q, data);
|
||||
// if an AJAX url has been supplied, try loading the data now
|
||||
} else if( (typeof options.url == "string") && (options.url.length > 0) ){
|
||||
$.get(makeUrl(q), function(data) {
|
||||
data = parseData(data);
|
||||
addToCache(q, data);
|
||||
receiveData(q, data);
|
||||
});
|
||||
// if there's been no data found, remove the loading class
|
||||
} else {
|
||||
$input.removeClass(options.loadingClass);
|
||||
}
|
||||
};
|
||||
|
||||
function makeUrl(q) {
|
||||
var url = options.url + "?q=" + encodeURI(q);
|
||||
for (var i in options.extraParams) {
|
||||
url += "&" + i + "=" + encodeURI(options.extraParams[i]);
|
||||
}
|
||||
return url;
|
||||
};
|
||||
|
||||
function loadFromCache(q) {
|
||||
if (!q) return null;
|
||||
if (cache.data[q]) return cache.data[q];
|
||||
if (options.matchSubset) {
|
||||
for (var i = q.length - 1; i >= options.minChars; i--) {
|
||||
var qs = q.substr(0, i);
|
||||
var c = cache.data[qs];
|
||||
if (c) {
|
||||
var csub = [];
|
||||
for (var j = 0; j < c.length; j++) {
|
||||
var x = c[j];
|
||||
var x0 = x[0];
|
||||
if (matchSubset(x0, q)) {
|
||||
csub[csub.length] = x;
|
||||
}
|
||||
}
|
||||
return csub;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
function matchSubset(s, sub) {
|
||||
if (!options.matchCase) s = s.toLowerCase();
|
||||
var i = s.indexOf(sub);
|
||||
if (i == -1) return false;
|
||||
return i == 0 || options.matchContains;
|
||||
};
|
||||
|
||||
this.flushCache = function() {
|
||||
flushCache();
|
||||
};
|
||||
|
||||
this.setExtraParams = function(p) {
|
||||
options.extraParams = p;
|
||||
};
|
||||
|
||||
this.findValue = function(){
|
||||
var q = $input.val();
|
||||
|
||||
if (!options.matchCase) q = q.toLowerCase();
|
||||
var data = options.cacheLength ? loadFromCache(q) : null;
|
||||
if (data) {
|
||||
findValueCallback(q, data);
|
||||
} else if( (typeof options.url == "string") && (options.url.length > 0) ){
|
||||
$.get(makeUrl(q), function(data) {
|
||||
data = parseData(data)
|
||||
addToCache(q, data);
|
||||
findValueCallback(q, data);
|
||||
});
|
||||
} else {
|
||||
// no matches
|
||||
findValueCallback(q, null);
|
||||
}
|
||||
}
|
||||
|
||||
function findValueCallback(q, data){
|
||||
if (data) $input.removeClass(options.loadingClass);
|
||||
|
||||
var num = (data) ? data.length : 0;
|
||||
var li = null;
|
||||
|
||||
for (var i=0; i < num; i++) {
|
||||
var row = data[i];
|
||||
|
||||
if( row[0].toLowerCase() == q.toLowerCase() ){
|
||||
li = document.createElement("li");
|
||||
if (options.formatItem) {
|
||||
li.innerHTML = options.formatItem(row, i, num);
|
||||
li.selectValue = row[0];
|
||||
} else {
|
||||
li.innerHTML = row[0];
|
||||
li.selectValue = row[0];
|
||||
}
|
||||
var extra = null;
|
||||
if( row.length > 1 ){
|
||||
extra = [];
|
||||
for (var j=1; j < row.length; j++) {
|
||||
extra[extra.length] = row[j];
|
||||
}
|
||||
}
|
||||
li.extra = extra;
|
||||
}
|
||||
}
|
||||
|
||||
if( options.onFindValue ) setTimeout(function() { options.onFindValue(li) }, 1);
|
||||
}
|
||||
|
||||
function addToCache(q, data) {
|
||||
if (!data || !q || !options.cacheLength) return;
|
||||
if (!cache.length || cache.length > options.cacheLength) {
|
||||
flushCache();
|
||||
cache.length++;
|
||||
} else if (!cache[q]) {
|
||||
cache.length++;
|
||||
}
|
||||
cache.data[q] = data;
|
||||
};
|
||||
|
||||
function findPos(obj) {
|
||||
var curleft = obj.offsetLeft || 0;
|
||||
var curtop = obj.offsetTop || 0;
|
||||
while (obj = obj.offsetParent) {
|
||||
curleft += obj.offsetLeft
|
||||
curtop += obj.offsetTop
|
||||
}
|
||||
return {x:curleft,y:curtop};
|
||||
}
|
||||
}
|
||||
|
||||
jQuery.fn.autocomplete = function(url, options, data) {
|
||||
// Make sure options exists
|
||||
options = options || {};
|
||||
// Set url as option
|
||||
options.url = url;
|
||||
// set some bulk local data
|
||||
options.data = ((typeof data == "object") && (data.constructor == Array)) ? data : null;
|
||||
|
||||
// Set default values for required options
|
||||
options.inputClass = options.inputClass || "ac_input";
|
||||
options.resultsClass = options.resultsClass || "ac_results";
|
||||
options.lineSeparator = options.lineSeparator || "\n";
|
||||
options.cellSeparator = options.cellSeparator || "|";
|
||||
options.minChars = options.minChars || 1;
|
||||
options.delay = options.delay || 400;
|
||||
options.matchCase = options.matchCase || 0;
|
||||
options.matchSubset = options.matchSubset || 1;
|
||||
options.matchContains = options.matchContains || 0;
|
||||
options.cacheLength = options.cacheLength || 1;
|
||||
options.mustMatch = options.mustMatch || 0;
|
||||
options.extraParams = options.extraParams || {};
|
||||
options.loadingClass = options.loadingClass || "ac_loading";
|
||||
options.selectFirst = options.selectFirst || false;
|
||||
options.selectOnly = options.selectOnly || false;
|
||||
options.maxItemsToShow = options.maxItemsToShow || -1;
|
||||
options.autoFill = options.autoFill || false;
|
||||
options.width = parseInt(options.width, 10) || 0;
|
||||
|
||||
this.each(function() {
|
||||
var input = this;
|
||||
new jQuery.autocomplete(input, options);
|
||||
});
|
||||
|
||||
// Don't break the chain
|
||||
return this;
|
||||
}
|
||||
|
||||
jQuery.fn.autocompleteArray = function(data, options) {
|
||||
return this.autocomplete(null, options, data);
|
||||
}
|
||||
|
||||
jQuery.fn.indexOf = function(e){
|
||||
for( var i=0; i<this.length; i++ ){
|
||||
if( this[i] == e ) return i;
|
||||
}
|
||||
return -1;
|
||||
};
|
||||
-13
File diff suppressed because one or more lines are too long
@@ -1,118 +0,0 @@
|
||||
/*!
|
||||
* jQuery Cookie Plugin v1.4.0
|
||||
* https://github.com/carhartl/jquery-cookie
|
||||
*
|
||||
* Copyright 2013 Klaus Hartl
|
||||
* Released under the MIT license
|
||||
*/
|
||||
(function(factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as anonymous module.
|
||||
define(['jquery'], factory);
|
||||
} else {
|
||||
// Browser globals.
|
||||
factory(jQuery);
|
||||
}
|
||||
}(function($) {
|
||||
|
||||
var pluses = /\+/g;
|
||||
|
||||
function encode(s) {
|
||||
return config.raw ? s : encodeURIComponent(s);
|
||||
}
|
||||
|
||||
function decode(s) {
|
||||
return config.raw ? s : decodeURIComponent(s);
|
||||
}
|
||||
|
||||
function stringifyCookieValue(value) {
|
||||
return encode(config.json ? JSON.stringify(value) : String(value));
|
||||
}
|
||||
|
||||
function parseCookieValue(s) {
|
||||
if (s.indexOf('"') === 0) {
|
||||
// This is a quoted cookie as according to RFC2068, unescape...
|
||||
s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
|
||||
}
|
||||
|
||||
try {
|
||||
// Replace server-side written pluses with spaces.
|
||||
// If we can't decode the cookie, ignore it, it's unusable.
|
||||
s = decodeURIComponent(s.replace(pluses, ' '));
|
||||
} catch (e) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// If we can't parse the cookie, ignore it, it's unusable.
|
||||
return config.json ? JSON.parse(s) : s;
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
|
||||
function read(s, converter) {
|
||||
var value = config.raw ? s : parseCookieValue(s);
|
||||
return $.isFunction(converter) ? converter(value) : value;
|
||||
}
|
||||
|
||||
var config = $.cookie = function(key, value, options) {
|
||||
|
||||
// Write
|
||||
if (value !== undefined && !$.isFunction(value)) {
|
||||
options = $.extend({}, config.defaults, options);
|
||||
|
||||
if (typeof options.expires === 'number') {
|
||||
var days = options.expires, t = options.expires = new Date();
|
||||
t.setDate(t.getDate() + days);
|
||||
}
|
||||
|
||||
return (document.cookie = [
|
||||
encode(key), '=', stringifyCookieValue(value),
|
||||
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
|
||||
options.path ? '; path=' + options.path : '',
|
||||
options.domain ? '; domain=' + options.domain : '',
|
||||
options.secure ? '; secure' : ''
|
||||
].join(''));
|
||||
}
|
||||
|
||||
// Read
|
||||
|
||||
var result = key ? undefined : {};
|
||||
|
||||
// To prevent the for loop in the first place assign an empty array
|
||||
// in case there are no cookies at all. Also prevents odd result when
|
||||
// calling $.cookie().
|
||||
var cookies = document.cookie ? document.cookie.split('; ') : [];
|
||||
|
||||
for (var i = 0, l = cookies.length; i < l; i++) {
|
||||
var parts = cookies[i].split('=');
|
||||
var name = decode(parts.shift());
|
||||
var cookie = parts.join('=');
|
||||
|
||||
if (key && key === name) {
|
||||
// If second argument (value) is a function it's a converter...
|
||||
result = read(cookie, value);
|
||||
break;
|
||||
}
|
||||
|
||||
// Prevent storing a cookie that we couldn't decode.
|
||||
if (!key && (cookie = read(cookie)) !== undefined) {
|
||||
result[name] = cookie;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
config.defaults = {};
|
||||
|
||||
$.removeCookie = function(key, options) {
|
||||
if ($.cookie(key) !== undefined) {
|
||||
// Must not alter options, thus extending a fresh object...
|
||||
$.cookie(key, '', $.extend({}, options, {expires: -1}));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
}));
|
||||
@@ -1,122 +0,0 @@
|
||||
/*
|
||||
* Metadata - jQuery plugin for parsing metadata from elements
|
||||
*
|
||||
* Copyright (c) 2006 John Resig, Yehuda Katz, J�örn Zaefferer, Paul McLanahan
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*
|
||||
* Revision: $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Sets the type of metadata to use. Metadata is encoded in JSON, and each property
|
||||
* in the JSON will become a property of the element itself.
|
||||
*
|
||||
* There are three supported types of metadata storage:
|
||||
*
|
||||
* attr: Inside an attribute. The name parameter indicates *which* attribute.
|
||||
*
|
||||
* class: Inside the class attribute, wrapped in curly braces: { }
|
||||
*
|
||||
* elem: Inside a child element (e.g. a script tag). The
|
||||
* name parameter indicates *which* element.
|
||||
*
|
||||
* The metadata for an element is loaded the first time the element is accessed via jQuery.
|
||||
*
|
||||
* As a result, you can define the metadata type, use $(expr) to load the metadata into the elements
|
||||
* matched by expr, then redefine the metadata type and run another $(expr) for other elements.
|
||||
*
|
||||
* @name $.metadata.setType
|
||||
*
|
||||
* @example <p id="one" class="some_class {item_id: 1, item_label: 'Label'}">This is a p</p>
|
||||
* @before $.metadata.setType("class")
|
||||
* @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
|
||||
* @desc Reads metadata from the class attribute
|
||||
*
|
||||
* @example <p id="one" class="some_class" data="{item_id: 1, item_label: 'Label'}">This is a p</p>
|
||||
* @before $.metadata.setType("attr", "data")
|
||||
* @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
|
||||
* @desc Reads metadata from a "data" attribute
|
||||
*
|
||||
* @example <p id="one" class="some_class"><script>{item_id: 1, item_label: 'Label'}</script>This is a p</p>
|
||||
* @before $.metadata.setType("elem", "script")
|
||||
* @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
|
||||
* @desc Reads metadata from a nested script element
|
||||
*
|
||||
* @param String type The encoding type
|
||||
* @param String name The name of the attribute to be used to get metadata (optional)
|
||||
* @cat Plugins/Metadata
|
||||
* @descr Sets the type of encoding to be used when loading metadata for the first time
|
||||
* @type undefined
|
||||
* @see metadata()
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
|
||||
$.extend({
|
||||
metadata : {
|
||||
defaults : {
|
||||
type: 'class',
|
||||
name: 'metadata',
|
||||
cre: /({.*})/,
|
||||
single: 'metadata'
|
||||
},
|
||||
setType: function( type, name ){
|
||||
this.defaults.type = type;
|
||||
this.defaults.name = name;
|
||||
},
|
||||
get: function( elem, opts ){
|
||||
var settings = $.extend({},this.defaults,opts);
|
||||
// check for empty string in single property
|
||||
if ( !settings.single.length ) settings.single = 'metadata';
|
||||
|
||||
var data = $.data(elem, settings.single);
|
||||
// returned cached data if it already exists
|
||||
if ( data ) return data;
|
||||
|
||||
data = "{}";
|
||||
|
||||
if ( settings.type == "class" ) {
|
||||
var m = settings.cre.exec( elem.className );
|
||||
if ( m )
|
||||
data = m[1];
|
||||
} else if ( settings.type == "elem" ) {
|
||||
if( !elem.getElementsByTagName )
|
||||
return undefined;
|
||||
var e = elem.getElementsByTagName(settings.name);
|
||||
if ( e.length )
|
||||
data = $.trim(e[0].innerHTML);
|
||||
} else if ( elem.getAttribute != undefined ) {
|
||||
var attr = elem.getAttribute( settings.name );
|
||||
if ( attr )
|
||||
data = attr;
|
||||
}
|
||||
|
||||
if ( data.indexOf( '{' ) <0 )
|
||||
data = "{" + data + "}";
|
||||
|
||||
data = eval("(" + data + ")");
|
||||
|
||||
$.data( elem, settings.single, data );
|
||||
return data;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Returns the metadata object for the first member of the jQuery object.
|
||||
*
|
||||
* @name metadata
|
||||
* @descr Returns element's metadata object
|
||||
* @param Object opts An object contianing settings to override the defaults
|
||||
* @type jQuery
|
||||
* @cat Plugins/Metadata
|
||||
*/
|
||||
$.fn.metadata = function( opts ){
|
||||
return $.metadata.get( this[0], opts );
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
File diff suppressed because one or more lines are too long
@@ -1,916 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* 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();
|
||||
}
|
||||
}
|
||||
t=t.replace('ö','o');
|
||||
t=t.replace('Ö','O');
|
||||
t=t.replace('ü','u');
|
||||
t=t.replace('Ü','U');
|
||||
t=t.replace('ä','a');
|
||||
t=t.replace('Ä','A');
|
||||
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.isInt = function(s,config) {
|
||||
if(isNaN(parseInt(s)))
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
};
|
||||
|
||||
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: "digitmittausenderpunkt",
|
||||
is: function(s) {
|
||||
return /^[0-9.,]/.test(s);
|
||||
},
|
||||
format: function(s) {
|
||||
return $.tablesorter.formatFloat(s.replace('.',""));
|
||||
},
|
||||
type: "numeric"
|
||||
});
|
||||
|
||||
ts.addParser({
|
||||
id: "DatummitUhrzeit",
|
||||
is: function(s) {
|
||||
return s.match(new RegExp(/^[0-9]{1,2}.[0-9]{1,2}.[0-9]{4} (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]))$/));
|
||||
},
|
||||
format: function(s) {
|
||||
return $.tablesorter.formatFloat(new Date(s).getTime());
|
||||
},
|
||||
type: "numeric"
|
||||
});
|
||||
|
||||
ts.addParser({
|
||||
id: "integer",
|
||||
is: function(s,table) {
|
||||
var c = table.config;
|
||||
return $.tablesorter.isInt(s,c);
|
||||
},
|
||||
format: function(s) {
|
||||
return $.tablesorter.formatInt(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: "dedate",
|
||||
is: function(s) {
|
||||
return /\d{1,2}.\d{1,2}.\d{2,4}/.test(s);
|
||||
},
|
||||
format: function(s) {
|
||||
s = s.replace(/(\d{1,2}).(\d{1,2}).(\d{2,4})/, "$2/$1/$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);
|
||||
Vendored
-752
@@ -1,752 +0,0 @@
|
||||
/*!
|
||||
* TableSorter 2.15.11 min - Client-side table sorting with ease!
|
||||
* Copyright (c) 2007 Christian Bach
|
||||
*/
|
||||
!function(g) {
|
||||
g.extend({tablesorter: new function() {
|
||||
function d() {
|
||||
var a = arguments[0], b = 1 < arguments.length ? Array.prototype.slice.call(arguments) : a;
|
||||
if ("undefined" !== typeof console && "undefined" !== typeof console.log)
|
||||
console[/error/i.test(a) ? "error" : /warn/i.test(a) ? "warn" : "log"](b);
|
||||
else
|
||||
alert(b)
|
||||
}
|
||||
function t(a, b) {
|
||||
d(a + " (" + ((new Date).getTime() - b.getTime()) + "ms)")
|
||||
}
|
||||
function m(a) {
|
||||
for (var b in a)
|
||||
return!1;
|
||||
return!0
|
||||
}
|
||||
function q(a, b, c) {
|
||||
if (!b)
|
||||
return"";
|
||||
var h = a.config, e = h.textExtraction, f = "", f = "simple" === e ? h.supportsTextContent ? b.textContent : g(b).text() : "function" === typeof e ? e(b, a, c) : "object" === typeof e && e.hasOwnProperty(c) ? e[c](b, a, c) : h.supportsTextContent ? b.textContent : g(b).text();
|
||||
return g.trim(f)
|
||||
}
|
||||
function s(a) {
|
||||
var b = a.config, c = b.$tbodies = b.$table.children("tbody:not(." + b.cssInfoBlock + ")"), h, e, w, k, n, g, l, z = "";
|
||||
if (0 === c.length)
|
||||
return b.debug ? d("Warning: *Empty table!* Not building a parser cache") : "";
|
||||
b.debug && (l = new Date, d("Detecting parsers for each column"));
|
||||
c = c[0].rows;
|
||||
if (c[0])
|
||||
for (h = [], e = c[0].cells.length, w = 0; w < e; w++) {
|
||||
k = b.$headers.filter(":not([colspan])");
|
||||
k = k.add(b.$headers.filter('[colspan="1"]')).filter('[data-column="' + w + '"]:last');
|
||||
n = b.headers[w];
|
||||
g = f.getParserById(f.getData(k, n, "sorter"));
|
||||
b.empties[w] = f.getData(k, n, "empty") || b.emptyTo || (b.emptyToBottom ? "bottom" : "top");
|
||||
b.strings[w] = f.getData(k, n, "string") || b.stringTo || "max";
|
||||
if (!g)
|
||||
a:{
|
||||
k = a;
|
||||
n = c;
|
||||
g = -1;
|
||||
for (var m = w, y = void 0, x = f.parsers.length, r = !1, s = "", y = !0; "" === s && y; )
|
||||
g++, n[g] ? (r = n[g].cells[m], s = q(k, r, m), k.config.debug && d("Checking if value was empty on row " + g + ", column: " + m + ': "' + s + '"')) : y = !1;
|
||||
for (; 0 <= --x; )
|
||||
if ((y = f.parsers[x]) && "text" !== y.id && y.is && y.is(s, k, r)) {
|
||||
g = y;
|
||||
break a
|
||||
}
|
||||
g = f.getParserById("text")
|
||||
}
|
||||
b.debug && (z += "column:" + w + "; parser:" + g.id + "; string:" + b.strings[w] + "; empty: " + b.empties[w] + "\n");
|
||||
h.push(g)
|
||||
}
|
||||
b.debug && (d(z), t("Completed detecting parsers", l));
|
||||
b.parsers = h
|
||||
}
|
||||
function v(a) {
|
||||
var b = a.tBodies, c = a.config, h, e, w = c.parsers, k, n, p, l, z, m, y, x = [];
|
||||
c.cache = {};
|
||||
if (!w)
|
||||
return c.debug ? d("Warning: *Empty table!* Not building a cache") : "";
|
||||
c.debug && (y = new Date);
|
||||
c.showProcessing && f.isProcessing(a, !0);
|
||||
for (l = 0; l < b.length; l++)
|
||||
if (c.cache[l] = {row: [], normalized: []}, !g(b[l]).hasClass(c.cssInfoBlock)) {
|
||||
h = b[l] && b[l].rows.length || 0;
|
||||
e = b[l].rows[0] && b[l].rows[0].cells.length || 0;
|
||||
for (n = 0; n < h; ++n)
|
||||
if (z = g(b[l].rows[n]), m = [], z.hasClass(c.cssChildRow))
|
||||
c.cache[l].row[c.cache[l].row.length - 1] = c.cache[l].row[c.cache[l].row.length - 1].add(z);
|
||||
else {
|
||||
c.cache[l].row.push(z);
|
||||
for (p = 0; p < e; ++p)
|
||||
"undefined" === typeof w[p] ? c.debug && d("No parser found for cell:", z[0].cells[p], "does it have a header?") : (k = q(a, z[0].cells[p], p), k = w[p].format(k, a, z[0].cells[p], p), m.push(k), "numeric" === (w[p].type || "").toLowerCase() && (x[p] = Math.max(Math.abs(k) || 0, x[p] || 0)));
|
||||
m.push(c.cache[l].normalized.length);
|
||||
c.cache[l].normalized.push(m)
|
||||
}
|
||||
c.cache[l].colMax = x
|
||||
}
|
||||
c.showProcessing && f.isProcessing(a);
|
||||
c.debug && t("Building cache for " + h + " rows", y)
|
||||
}
|
||||
function A(a, b) {
|
||||
var c = a.config, h = c.widgetOptions, e = a.tBodies, w = [], k = c.cache, d, p, l, z, q, y, x, r, s, u, v;
|
||||
if (m(k))
|
||||
return c.appender ? c.appender(a, w) : a.isUpdating ? c.$table.trigger("updateComplete", a) : "";
|
||||
c.debug && (v = new Date);
|
||||
for (r = 0; r < e.length; r++)
|
||||
if (d = g(e[r]), d.length && !d.hasClass(c.cssInfoBlock)) {
|
||||
q = f.processTbody(a, d, !0);
|
||||
d = k[r].row;
|
||||
p = k[r].normalized;
|
||||
z = (l = p.length) ? p[0].length - 1 : 0;
|
||||
for (y = 0; y < l; y++)
|
||||
if (u = p[y][z], w.push(d[u]), !c.appender || c.pager && !(c.pager.removeRows && h.pager_removeRows || c.pager.ajax))
|
||||
for (s = d[u].length, x = 0; x < s; x++)
|
||||
q.append(d[u][x]);
|
||||
f.processTbody(a, q, !1)
|
||||
}
|
||||
c.appender && c.appender(a, w);
|
||||
c.debug && t("Rebuilt table", v);
|
||||
b || c.appender || f.applyWidget(a);
|
||||
a.isUpdating && c.$table.trigger("updateComplete", a)
|
||||
}
|
||||
function D(a) {
|
||||
var b = [], c = {}, h = 0, e = g(a).children("thead, tfoot").children("tr"), f, d, n, p, l, m, t, q, s, r;
|
||||
for (f = 0; f < e.length; f++)
|
||||
for (l = e[f].cells, d = 0; d < l.length; d++) {
|
||||
p = l[d];
|
||||
m = p.parentNode.rowIndex;
|
||||
t = m + "-" + p.cellIndex;
|
||||
q = p.rowSpan || 1;
|
||||
s = p.colSpan || 1;
|
||||
"undefined" === typeof b[m] && (b[m] = []);
|
||||
for (n = 0; n < b[m].length + 1; n++)
|
||||
if ("undefined" === typeof b[m][n]) {
|
||||
r = n;
|
||||
break
|
||||
}
|
||||
c[t] = r;
|
||||
h = Math.max(r, h);
|
||||
g(p).attr({"data-column": r});
|
||||
for (n = m; n < m + q; n++)
|
||||
for ("undefined" === typeof b[n] && (b[n] = []), t = b[n], p = r; p < r + s; p++)
|
||||
t[p] = "x"
|
||||
}
|
||||
a.config.columns = h + 1;
|
||||
return c
|
||||
}
|
||||
function C(a) {
|
||||
return/^d/i.test(a) || 1 === a
|
||||
}
|
||||
function E(a) {
|
||||
var b = D(a), c, h, e, w, k, n, p, l = a.config;
|
||||
l.headerList = [];
|
||||
l.headerContent = [];
|
||||
l.debug && (p = new Date);
|
||||
w = l.cssIcon ? '<i class="' + (l.cssIcon === f.css.icon ? f.css.icon : l.cssIcon + " " + f.css.icon) + '"></i>' : "";
|
||||
l.$headers = g(a).find(l.selectorHeaders).each(function(a) {
|
||||
h = g(this);
|
||||
c = l.headers[a];
|
||||
l.headerContent[a] = g(this).html();
|
||||
k = l.headerTemplate.replace(/\{content\}/g, g(this).html()).replace(/\{icon\}/g, w);
|
||||
l.onRenderTemplate && (e = l.onRenderTemplate.apply(h, [a, k])) && "string" === typeof e && (k = e);
|
||||
g(this).html('<div class="' + f.css.headerIn + '">' + k + "</div>");
|
||||
l.onRenderHeader && l.onRenderHeader.apply(h, [a]);
|
||||
this.column = b[this.parentNode.rowIndex + "-" + this.cellIndex];
|
||||
this.order = C(f.getData(h, c, "sortInitialOrder") || l.sortInitialOrder) ? [1, 0, 2] : [0, 1, 2];
|
||||
this.count = -1;
|
||||
this.lockedOrder = !1;
|
||||
n = f.getData(h, c, "lockedOrder") || !1;
|
||||
"undefined" !== typeof n && !1 !== n && (this.order = this.lockedOrder = C(n) ? [1, 1, 1] : [0, 0, 0]);
|
||||
h.addClass(f.css.header + " " + l.cssHeader);
|
||||
l.headerList[a] = this;
|
||||
h.parent().addClass(f.css.headerRow + " " + l.cssHeaderRow).attr("role", "row");
|
||||
l.tabIndex && h.attr("tabindex", 0)
|
||||
}).attr({scope: "col", role: "columnheader"});
|
||||
G(a);
|
||||
l.debug && (t("Built headers:", p), d(l.$headers))
|
||||
}
|
||||
function B(a, b, c) {
|
||||
var h = a.config;
|
||||
h.$table.find(h.selectorRemove).remove();
|
||||
s(a);
|
||||
v(a);
|
||||
H(h.$table, b, c)
|
||||
}
|
||||
function G(a) {
|
||||
var b, c, h = a.config;
|
||||
h.$headers.each(function(e, d) {
|
||||
c = g(d);
|
||||
b = "false" === f.getData(d, h.headers[e], "sorter");
|
||||
d.sortDisabled = b;
|
||||
c[b ? "addClass" : "removeClass"]("sorter-false").attr("aria-disabled", "" + b);
|
||||
a.id && (b ? c.removeAttr("aria-controls") : c.attr("aria-controls", a.id))
|
||||
})
|
||||
}
|
||||
function F(a) {
|
||||
var b, c, h, e = a.config, d = e.sortList, k = f.css.sortNone + " " + e.cssNone, n = [f.css.sortAsc + " " + e.cssAsc, f.css.sortDesc + " " + e.cssDesc], p = ["ascending", "descending"], l = g(a).find("tfoot tr").children().removeClass(n.join(" "));
|
||||
e.$headers.removeClass(n.join(" ")).addClass(k).attr("aria-sort", "none");
|
||||
h = d.length;
|
||||
for (b = 0; b < h; b++)
|
||||
if (2 !== d[b][1] && (a = e.$headers.not(".sorter-false").filter('[data-column="' + d[b][0] + '"]' + (1 === h ? ":last" : "")), a.length))
|
||||
for (c = 0; c < a.length; c++)
|
||||
a[c].sortDisabled || (a.eq(c).removeClass(k).addClass(n[d[b][1]]).attr("aria-sort", p[d[b][1]]), l.length && l.filter('[data-column="' + d[b][0] + '"]').eq(c).addClass(n[d[b][1]]));
|
||||
e.$headers.not(".sorter-false").each(function() {
|
||||
var a = g(this), b = this.order[(this.count + 1) % (e.sortReset ? 3 : 2)], b = a.text() + ": " + f.language[a.hasClass(f.css.sortAsc) ? "sortAsc" : a.hasClass(f.css.sortDesc) ? "sortDesc" : "sortNone"] + f.language[0 === b ? "nextAsc" : 1 === b ? "nextDesc" : "nextNone"];
|
||||
a.attr("aria-label", b)
|
||||
})
|
||||
}
|
||||
function L(a) {
|
||||
if (a.config.widthFixed && 0 === g(a).find("colgroup").length) {
|
||||
var b = g("<colgroup>"), c = g(a).width();
|
||||
g(a.tBodies[0]).find("tr:first").children("td:visible").each(function() {
|
||||
b.append(g("<col>").css("width", parseInt(g(this).width() / c * 1E3, 10) / 10 + "%"))
|
||||
});
|
||||
g(a).prepend(b)
|
||||
}
|
||||
}
|
||||
function M(a, b) {
|
||||
var c, h, e, d = a.config, f = b || d.sortList;
|
||||
d.sortList = [];
|
||||
g.each(f, function(a, b) {
|
||||
c = [parseInt(b[0], 10), parseInt(b[1], 10)];
|
||||
if (e = d.$headers[c[0]])
|
||||
d.sortList.push(c), h = g.inArray(c[1], e.order), e.count = 0 <= h ? h : c[1] % (d.sortReset ? 3 : 2)
|
||||
})
|
||||
}
|
||||
function N(a, b) {
|
||||
return a && a[b] ? a[b].type || "" : ""
|
||||
}
|
||||
function O(a, b, c) {
|
||||
var h, e, d, k = a.config, n = !c[k.sortMultiSortKey], p = k.$table;
|
||||
p.trigger("sortStart", a);
|
||||
b.count = c[k.sortResetKey] ? 2 : (b.count + 1) % (k.sortReset ? 3 : 2);
|
||||
k.sortRestart && (e = b, k.$headers.each(function() {
|
||||
this === e || !n && g(this).is("." + f.css.sortDesc + ",." + f.css.sortAsc) || (this.count = -1)
|
||||
}));
|
||||
e = b.column;
|
||||
if (n) {
|
||||
k.sortList = [];
|
||||
if (null !== k.sortForce)
|
||||
for (h = k.sortForce, c = 0; c < h.length; c++)
|
||||
h[c][0] !== e && k.sortList.push(h[c]);
|
||||
h = b.order[b.count];
|
||||
if (2 > h && (k.sortList.push([e, h]), 1 < b.colSpan))
|
||||
for (c = 1; c < b.colSpan; c++)
|
||||
k.sortList.push([e + c, h])
|
||||
} else {
|
||||
if (k.sortAppend && 1 < k.sortList.length)
|
||||
for (c = 0; c < k.sortAppend.length; c++)
|
||||
d = f.isValueInArray(k.sortAppend[c][0], k.sortList), 0 <= d && k.sortList.splice(d, 1);
|
||||
if (0 <= f.isValueInArray(e, k.sortList))
|
||||
for (c = 0; c < k.sortList.length; c++)
|
||||
d = k.sortList[c], h = k.$headers[d[0]], d[0] === e && (d[1] = h.order[b.count], 2 === d[1] && (k.sortList.splice(c, 1), h.count = -1));
|
||||
else if (h = b.order[b.count], 2 > h && (k.sortList.push([e, h]), 1 < b.colSpan))
|
||||
for (c = 1; c < b.colSpan; c++)
|
||||
k.sortList.push([e + c, h])
|
||||
}
|
||||
if (null !== k.sortAppend)
|
||||
for (h = k.sortAppend, c = 0; c < h.length; c++)
|
||||
h[c][0] !== e && k.sortList.push(h[c]);
|
||||
p.trigger("sortBegin", a);
|
||||
setTimeout(function() {
|
||||
F(a);
|
||||
I(a);
|
||||
A(a);
|
||||
p.trigger("sortEnd", a)
|
||||
}, 1)
|
||||
}
|
||||
function I(a) {
|
||||
var b, c, h, e, d, k, g, p, l, q, s, u, x = 0, r = a.config, v = r.textSorter || "", A = r.sortList, B = A.length, C = a.tBodies.length;
|
||||
if (!r.serverSideSorting && !m(r.cache)) {
|
||||
r.debug && (l = new Date);
|
||||
for (c = 0; c < C; c++)
|
||||
d = r.cache[c].colMax, p = (k = r.cache[c].normalized) && k[0] ? k[0].length - 1 : 0, k.sort(function(c, k) {
|
||||
for (b = 0; b < B; b++) {
|
||||
e = A[b][0];
|
||||
g = A[b][1];
|
||||
x = 0 === g;
|
||||
if (r.sortStable && c[e] === k[e] && 1 === B)
|
||||
break;
|
||||
(h = /n/i.test(N(r.parsers, e))) && r.strings[e] ? (h = "boolean" === typeof r.string[r.strings[e]] ? (x ? 1 : -1) * (r.string[r.strings[e]] ? -1 : 1) : r.strings[e] ? r.string[r.strings[e]] || 0 : 0, q = r.numberSorter ? r.numberSorter(c[e], k[e], x, d[e], a) : f["sortNumeric" + (x ? "Asc" : "Desc")](c[e], k[e], h, d[e], e, a)) : (s = x ? c : k, u = x ? k : c, q = "function" === typeof v ? v(s[e], u[e], x, e, a) : "object" === typeof v && v.hasOwnProperty(e) ? v[e](s[e], u[e], x, e, a) : f["sortNatural" + (x ? "Asc" : "Desc")](c[e], k[e], e, a, r));
|
||||
if (q)
|
||||
return q
|
||||
}
|
||||
return c[p] - k[p]
|
||||
});
|
||||
r.debug && t("Sorting on " + A.toString() + " and dir " + g + " time", l)
|
||||
}
|
||||
}
|
||||
function J(a, b) {
|
||||
a[0].isUpdating && a.trigger("updateComplete");
|
||||
"function" === typeof b && b(a[0])
|
||||
}
|
||||
function H(a, b, c) {
|
||||
var h = a[0].config.sortList;
|
||||
!1 !== b && !a[0].isProcessing && h.length ? a.trigger("sorton", [h, function() {
|
||||
J(a, c)
|
||||
}, !0]) : J(a, c)
|
||||
}
|
||||
function K(a) {
|
||||
var b = a.config, c = b.$table;
|
||||
c.unbind("sortReset update updateRows updateCell updateAll addRows updateComplete sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave ".split(" ").join(b.namespace + " ")).bind("sortReset" + b.namespace, function(c) {
|
||||
c.stopPropagation();
|
||||
b.sortList = [];
|
||||
F(a);
|
||||
I(a);
|
||||
A(a)
|
||||
}).bind("updateAll" + b.namespace, function(c, e, d) {
|
||||
c.stopPropagation();
|
||||
a.isUpdating = !0;
|
||||
f.refreshWidgets(a, !0, !0);
|
||||
f.restoreHeaders(a);
|
||||
E(a);
|
||||
f.bindEvents(a, b.$headers);
|
||||
K(a);
|
||||
B(a, e, d)
|
||||
}).bind("update" + b.namespace + " updateRows" + b.namespace, function(b, c, d) {
|
||||
b.stopPropagation();
|
||||
a.isUpdating = !0;
|
||||
G(a);
|
||||
B(a, c, d)
|
||||
}).bind("updateCell" + b.namespace, function(h, e, d, f) {
|
||||
h.stopPropagation();
|
||||
a.isUpdating = !0;
|
||||
c.find(b.selectorRemove).remove();
|
||||
var n, p, l;
|
||||
n = c.find("tbody");
|
||||
h = n.index(g(e).parents("tbody").filter(":first"));
|
||||
var m = g(e).parents("tr").filter(":first");
|
||||
e = g(e)[0];
|
||||
n.length && 0 <= h && (p = n.eq(h).find("tr").index(m), l = e.cellIndex, n = b.cache[h].normalized[p].length - 1, b.cache[h].row[a.config.cache[h].normalized[p][n]] = m, b.cache[h].normalized[p][l] = b.parsers[l].format(q(a, e, l), a, e, l), H(c, d, f))
|
||||
}).bind("addRows" + b.namespace, function(h, e, d, f) {
|
||||
h.stopPropagation();
|
||||
a.isUpdating = !0;
|
||||
if (m(b.cache))
|
||||
G(a), B(a, d, f);
|
||||
else {
|
||||
var g, p = e.filter("tr").length, l = [], t = e[0].cells.length, v = c.find("tbody").index(e.parents("tbody").filter(":first"));
|
||||
b.parsers || s(a);
|
||||
for (h = 0; h < p; h++) {
|
||||
for (g = 0; g < t; g++)
|
||||
l[g] = b.parsers[g].format(q(a, e[h].cells[g], g), a, e[h].cells[g], g);
|
||||
l.push(b.cache[v].row.length);
|
||||
b.cache[v].row.push([e[h]]);
|
||||
b.cache[v].normalized.push(l);
|
||||
l = []
|
||||
}
|
||||
H(c, d, f)
|
||||
}
|
||||
}).bind("updateComplete" + b.namespace, function() {
|
||||
a.isUpdating = !1
|
||||
}).bind("sorton" + b.namespace, function(b, e, d, f) {
|
||||
var g = a.config;
|
||||
b.stopPropagation();
|
||||
c.trigger("sortStart", this);
|
||||
M(a, e);
|
||||
F(a);
|
||||
g.delayInit && m(g.cache) && v(a);
|
||||
c.trigger("sortBegin", this);
|
||||
I(a);
|
||||
A(a, f);
|
||||
c.trigger("sortEnd", this);
|
||||
"function" === typeof d && d(a)
|
||||
}).bind("appendCache" + b.namespace, function(b, c, d) {
|
||||
b.stopPropagation();
|
||||
A(a, d);
|
||||
"function" === typeof c && c(a)
|
||||
}).bind("updateCache" + b.namespace, function(c, e) {
|
||||
b.parsers || s(a);
|
||||
v(a);
|
||||
"function" === typeof e && e(a)
|
||||
}).bind("applyWidgetId" + b.namespace, function(c, e) {
|
||||
c.stopPropagation();
|
||||
f.getWidgetById(e).format(a, b, b.widgetOptions)
|
||||
}).bind("applyWidgets" + b.namespace, function(b, c) {
|
||||
b.stopPropagation();
|
||||
f.applyWidget(a, c)
|
||||
}).bind("refreshWidgets" + b.namespace, function(b, c, d) {
|
||||
b.stopPropagation();
|
||||
f.refreshWidgets(a, c, d)
|
||||
}).bind("destroy" + b.namespace, function(b, c, d) {
|
||||
b.stopPropagation();
|
||||
f.destroy(a, c, d)
|
||||
})
|
||||
}
|
||||
var f = this;
|
||||
f.version = "2.15.11";
|
||||
f.parsers = [];
|
||||
f.widgets = [];
|
||||
f.defaults = {theme: "default", widthFixed: !1, showProcessing: !1, headerTemplate: "{content}", onRenderTemplate: null, onRenderHeader: null, cancelSelection: !0, tabIndex: !0, dateFormat: "mmddyyyy", sortMultiSortKey: "shiftKey", sortResetKey: "ctrlKey", usNumberFormat: !0, delayInit: !1, serverSideSorting: !1, headers: {}, ignoreCase: !0, sortForce: null, sortList: [], sortAppend: null, sortStable: !1, sortInitialOrder: "asc", sortLocaleCompare: !1, sortReset: !1, sortRestart: !1, emptyTo: "bottom", stringTo: "max", textExtraction: "simple", textSorter: null, numberSorter: null, widgets: [], widgetOptions: {zebra: ["even", "odd"]}, initWidgets: !0, initialized: null, tableClass: "", cssAsc: "", cssDesc: "", cssNone: "", cssHeader: "", cssHeaderRow: "", cssProcessing: "", cssChildRow: "tablesorter-childRow", cssIcon: "tablesorter-icon", cssInfoBlock: "tablesorter-infoOnly", selectorHeaders: "> thead th, > thead td", selectorSort: "th, td", selectorRemove: ".remove-me", debug: !1, headerList: [], empties: {}, strings: {}, parsers: []};
|
||||
f.css = {table: "tablesorter", childRow: "tablesorter-childRow", header: "tablesorter-header", headerRow: "tablesorter-headerRow", headerIn: "tablesorter-header-inner", icon: "tablesorter-icon", info: "tablesorter-infoOnly", processing: "tablesorter-processing", sortAsc: "tablesorter-headerAsc", sortDesc: "tablesorter-headerDesc", sortNone: "tablesorter-headerUnSorted"};
|
||||
f.language = {sortAsc: "Ascending sort applied, ", sortDesc: "Descending sort applied, ", sortNone: "No sort applied, ", nextAsc: "activate to apply an ascending sort", nextDesc: "activate to apply a descending sort", nextNone: "activate to remove the sort"};
|
||||
f.log = d;
|
||||
f.benchmark = t;
|
||||
f.construct = function(a) {
|
||||
return this.each(function() {
|
||||
var b = g.extend(!0, {}, f.defaults, a);
|
||||
!this.hasInitialized && f.buildTable && "TABLE" !== this.tagName ? f.buildTable(this, b) : f.setup(this, b)
|
||||
})
|
||||
};
|
||||
f.setup = function(a, b) {
|
||||
if (!a || !a.tHead || 0 === a.tBodies.length || !0 === a.hasInitialized)
|
||||
return b.debug ? d("ERROR: stopping initialization! No table, thead, tbody or tablesorter has already been initialized") : "";
|
||||
var c = "", h = g(a), e = g.metadata;
|
||||
a.hasInitialized = !1;
|
||||
a.isProcessing = !0;
|
||||
a.config = b;
|
||||
g.data(a, "tablesorter", b);
|
||||
b.debug && g.data(a, "startoveralltimer", new Date);
|
||||
b.supportsTextContent = "x" === g("<span>x</span>")[0].textContent;
|
||||
b.supportsDataObject = function(a) {
|
||||
a[0] = parseInt(a[0], 10);
|
||||
return 1 < a[0] || 1 === a[0] && 4 <= parseInt(a[1], 10)
|
||||
}(g.fn.jquery.split("."));
|
||||
b.string = {max: 1, min: -1, "max+": 1, "max-": -1, zero: 0, none: 0, "null": 0, top: !0, bottom: !1};
|
||||
/tablesorter\-/.test(h.attr("class")) || (c = "" !== b.theme ? " tablesorter-" + b.theme : "");
|
||||
b.$table = h.addClass(f.css.table + " " + b.tableClass + c).attr({role: "grid"});
|
||||
b.namespace = b.namespace ? "." + b.namespace.replace(/\W/g, "") : ".tablesorter" + Math.random().toString(16).slice(2);
|
||||
b.$tbodies = h.children("tbody:not(." + b.cssInfoBlock + ")").attr({"aria-live": "polite", "aria-relevant": "all"});
|
||||
b.$table.find("caption").length && b.$table.attr("aria-labelledby", "theCaption");
|
||||
b.widgetInit = {};
|
||||
E(a);
|
||||
L(a);
|
||||
s(a);
|
||||
b.delayInit || v(a);
|
||||
f.bindEvents(a, b.$headers);
|
||||
K(a);
|
||||
b.supportsDataObject && "undefined" !== typeof h.data().sortlist ? b.sortList = h.data().sortlist : e && h.metadata() && h.metadata().sortlist && (b.sortList = h.metadata().sortlist);
|
||||
f.applyWidget(a, !0);
|
||||
0 < b.sortList.length ? h.trigger("sorton", [b.sortList, {}, !b.initWidgets, !0]) : (F(a), b.initWidgets && f.applyWidget(a));
|
||||
b.showProcessing && h.unbind("sortBegin" + b.namespace + " sortEnd" + b.namespace).bind("sortBegin" + b.namespace + " sortEnd" + b.namespace, function(b) {
|
||||
f.isProcessing(a, "sortBegin" === b.type)
|
||||
});
|
||||
a.hasInitialized = !0;
|
||||
a.isProcessing = !1;
|
||||
b.debug && f.benchmark("Overall initialization time", g.data(a, "startoveralltimer"));
|
||||
h.trigger("tablesorter-initialized", a);
|
||||
"function" === typeof b.initialized && b.initialized(a)
|
||||
};
|
||||
f.isProcessing = function(a, b, c) {
|
||||
a = g(a);
|
||||
var h = a[0].config;
|
||||
a = c || a.find("." + f.css.header);
|
||||
b ? ("undefined" !== typeof c && 0 < h.sortList.length && (a = a.filter(function() {
|
||||
return this.sortDisabled ? !1 : 0 <= f.isValueInArray(parseFloat(g(this).attr("data-column")), h.sortList)
|
||||
})), a.addClass(f.css.processing + " " + h.cssProcessing)) : a.removeClass(f.css.processing + " " + h.cssProcessing)
|
||||
};
|
||||
f.processTbody = function(a, b, c) {
|
||||
a = g(a)[0];
|
||||
if (c)
|
||||
return a.isProcessing = !0, b.before('<span class="tablesorter-savemyplace"/>'), c = g.fn.detach ? b.detach() : b.remove();
|
||||
c = g(a).find("span.tablesorter-savemyplace");
|
||||
b.insertAfter(c);
|
||||
c.remove();
|
||||
a.isProcessing = !1
|
||||
};
|
||||
f.clearTableBody = function(a) {
|
||||
g(a)[0].config.$tbodies.empty()
|
||||
};
|
||||
f.bindEvents = function(a, b) {
|
||||
a = g(a)[0];
|
||||
var c, h = a.config;
|
||||
b.find(h.selectorSort).add(b.filter(h.selectorSort)).unbind(["mousedown", "mouseup", "sort", "keyup", ""].join(h.namespace + " ")).bind(["mousedown", "mouseup", "sort", "keyup", ""].join(h.namespace + " "), function(e, d) {
|
||||
var f;
|
||||
f = e.type;
|
||||
if (!(1 !== (e.which || e.button) && !/sort|keyup/.test(f) || "keyup" === f && 13 !== e.which || "mouseup" === f && !0 !== d && 250 < (new Date).getTime() - c)) {
|
||||
if ("mousedown" === f)
|
||||
return c = (new Date).getTime(), "INPUT" === e.target.tagName ? "" : !h.cancelSelection;
|
||||
h.delayInit && m(h.cache) && v(a);
|
||||
f = /TH|TD/.test(this.tagName) ? this : g(this).parents("th, td")[0];
|
||||
f = h.$headers[b.index(f)];
|
||||
f.sortDisabled || O(a, f, e)
|
||||
}
|
||||
});
|
||||
h.cancelSelection && b.attr("unselectable", "on").bind("selectstart", !1).css({"user-select": "none", MozUserSelect: "none"})
|
||||
};
|
||||
f.restoreHeaders = function(a) {
|
||||
var b = g(a)[0].config;
|
||||
b.$table.find(b.selectorHeaders).each(function(a) {
|
||||
g(this).find("." + f.css.headerIn).length && g(this).html(b.headerContent[a])
|
||||
})
|
||||
};
|
||||
f.destroy = function(a, b, c) {
|
||||
a = g(a)[0];
|
||||
if (a.hasInitialized) {
|
||||
f.refreshWidgets(a, !0, !0);
|
||||
var h = g(a), e = a.config, d = h.find("thead:first"), k = d.find("tr." + f.css.headerRow).removeClass(f.css.headerRow + " " + e.cssHeaderRow), n = h.find("tfoot:first > tr").children("th, td");
|
||||
d.find("tr").not(k).remove();
|
||||
h.removeData("tablesorter").unbind("sortReset update updateAll updateRows updateCell addRows updateComplete sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave keypress sortBegin sortEnd ".split(" ").join(e.namespace + " "));
|
||||
e.$headers.add(n).removeClass([f.css.header, e.cssHeader, e.cssAsc, e.cssDesc, f.css.sortAsc, f.css.sortDesc, f.css.sortNone].join(" ")).removeAttr("data-column");
|
||||
k.find(e.selectorSort).unbind(["mousedown", "mouseup", "keypress", ""].join(e.namespace + " "));
|
||||
f.restoreHeaders(a);
|
||||
!1 !== b && h.removeClass(f.css.table + " " + e.tableClass + " tablesorter-" + e.theme);
|
||||
a.hasInitialized = !1;
|
||||
"function" === typeof c && c(a)
|
||||
}
|
||||
};
|
||||
f.regex = {chunk: /(^([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi, chunks: /(^\\0|\\0$)/, hex: /^0x[0-9a-f]+$/i};
|
||||
f.sortNatural = function(a, b) {
|
||||
if (a === b)
|
||||
return 0;
|
||||
var c, d, e, g, k, n;
|
||||
d = f.regex;
|
||||
if (d.hex.test(b)) {
|
||||
c = parseInt(a.match(d.hex), 16);
|
||||
e = parseInt(b.match(d.hex), 16);
|
||||
if (c < e)
|
||||
return-1;
|
||||
if (c > e)
|
||||
return 1
|
||||
}
|
||||
c = a.replace(d.chunk, "\\0$1\\0").replace(d.chunks, "").split("\\0");
|
||||
d = b.replace(d.chunk, "\\0$1\\0").replace(d.chunks, "").split("\\0");
|
||||
n = Math.max(c.length, d.length);
|
||||
for (k = 0; k < n; k++) {
|
||||
e = isNaN(c[k]) ? c[k] || 0 : parseFloat(c[k]) || 0;
|
||||
g = isNaN(d[k]) ? d[k] || 0 : parseFloat(d[k]) || 0;
|
||||
if (isNaN(e) !== isNaN(g))
|
||||
return isNaN(e) ? 1 : -1;
|
||||
typeof e !== typeof g && (e += "", g += "");
|
||||
if (e < g)
|
||||
return-1;
|
||||
if (e > g)
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
};
|
||||
f.sortNaturalAsc = function(a, b, c, d, e) {
|
||||
if (a === b)
|
||||
return 0;
|
||||
c = e.string[e.empties[c] || e.emptyTo];
|
||||
return"" === a && 0 !== c ? "boolean" === typeof c ? c ? -1 : 1 : -c || -1 : "" === b && 0 !== c ? "boolean" === typeof c ? c ? 1 : -1 : c || 1 : f.sortNatural(a, b)
|
||||
};
|
||||
f.sortNaturalDesc = function(a, b, c, d, e) {
|
||||
if (a === b)
|
||||
return 0;
|
||||
c = e.string[e.empties[c] || e.emptyTo];
|
||||
return"" === a && 0 !== c ? "boolean" === typeof c ? c ? -1 : 1 : c || 1 : "" === b && 0 !== c ? "boolean" === typeof c ? c ? 1 : -1 : -c || -1 : f.sortNatural(b, a)
|
||||
};
|
||||
f.sortText = function(a, b) {
|
||||
return a > b ? 1 : a < b ? -1 : 0
|
||||
};
|
||||
f.getTextValue = function(a, b, c) {
|
||||
if (c) {
|
||||
var d = a ? a.length : 0, e = c + b;
|
||||
for (c = 0; c < d; c++)
|
||||
e += a.charCodeAt(c);
|
||||
return b * e
|
||||
}
|
||||
return 0
|
||||
};
|
||||
f.sortNumericAsc = function(a, b, c, d, e, g) {
|
||||
if (a === b)
|
||||
return 0;
|
||||
g = g.config;
|
||||
e = g.string[g.empties[e] || g.emptyTo];
|
||||
if ("" === a && 0 !== e)
|
||||
return"boolean" === typeof e ? e ? -1 : 1 : -e || -1;
|
||||
if ("" === b && 0 !== e)
|
||||
return"boolean" === typeof e ? e ? 1 : -1 : e || 1;
|
||||
isNaN(a) && (a = f.getTextValue(a, c, d));
|
||||
isNaN(b) && (b = f.getTextValue(b, c, d));
|
||||
return a - b
|
||||
};
|
||||
f.sortNumericDesc = function(a, b, c, d, e, g) {
|
||||
if (a === b)
|
||||
return 0;
|
||||
g = g.config;
|
||||
e = g.string[g.empties[e] || g.emptyTo];
|
||||
if ("" === a && 0 !== e)
|
||||
return"boolean" === typeof e ? e ? -1 : 1 : e || 1;
|
||||
if ("" === b && 0 !== e)
|
||||
return"boolean" === typeof e ? e ? 1 : -1 : -e || -1;
|
||||
isNaN(a) && (a = f.getTextValue(a, c, d));
|
||||
isNaN(b) && (b = f.getTextValue(b, c, d));
|
||||
return b - a
|
||||
};
|
||||
f.sortNumeric = function(a, b) {
|
||||
return a - b
|
||||
};
|
||||
f.characterEquivalents = {a: "\u00e1\u00e0\u00e2\u00e3\u00e4\u0105\u00e5", A: "\u00c1\u00c0\u00c2\u00c3\u00c4\u0104\u00c5", c: "\u00e7\u0107\u010d", C: "\u00c7\u0106\u010c", e: "\u00e9\u00e8\u00ea\u00eb\u011b\u0119", E: "\u00c9\u00c8\u00ca\u00cb\u011a\u0118", i: "\u00ed\u00ec\u0130\u00ee\u00ef\u0131", I: "\u00cd\u00cc\u0130\u00ce\u00cf", o: "\u00f3\u00f2\u00f4\u00f5\u00f6", O: "\u00d3\u00d2\u00d4\u00d5\u00d6", ss: "\u00df", SS: "\u1e9e", u: "\u00fa\u00f9\u00fb\u00fc\u016f", U: "\u00da\u00d9\u00db\u00dc\u016e"};
|
||||
f.replaceAccents = function(a) {
|
||||
var b, c = "[", d = f.characterEquivalents;
|
||||
if (!f.characterRegex) {
|
||||
f.characterRegexArray = {};
|
||||
for (b in d)
|
||||
"string" === typeof b && (c += d[b], f.characterRegexArray[b] = RegExp("[" + d[b] + "]", "g"));
|
||||
f.characterRegex = RegExp(c + "]")
|
||||
}
|
||||
if (f.characterRegex.test(a))
|
||||
for (b in d)
|
||||
"string" === typeof b && (a = a.replace(f.characterRegexArray[b], b));
|
||||
return a
|
||||
};
|
||||
f.isValueInArray = function(a, b) {
|
||||
var c, d = b.length;
|
||||
for (c = 0; c < d; c++)
|
||||
if (b[c][0] === a)
|
||||
return c;
|
||||
return-1
|
||||
};
|
||||
f.addParser = function(a) {
|
||||
var b, c = f.parsers.length, d = !0;
|
||||
for (b = 0; b < c; b++)
|
||||
f.parsers[b].id.toLowerCase() === a.id.toLowerCase() && (d = !1);
|
||||
d && f.parsers.push(a)
|
||||
};
|
||||
f.getParserById = function(a) {
|
||||
var b, c = f.parsers.length;
|
||||
for (b = 0; b < c; b++)
|
||||
if (f.parsers[b].id.toLowerCase() === a.toString().toLowerCase())
|
||||
return f.parsers[b];
|
||||
return!1
|
||||
};
|
||||
f.addWidget = function(a) {
|
||||
f.widgets.push(a)
|
||||
};
|
||||
f.getWidgetById = function(a) {
|
||||
var b, c, d = f.widgets.length;
|
||||
for (b = 0; b < d; b++)
|
||||
if ((c = f.widgets[b]) && c.hasOwnProperty("id") && c.id.toLowerCase() === a.toLowerCase())
|
||||
return c
|
||||
};
|
||||
f.applyWidget = function(a, b) {
|
||||
a = g(a)[0];
|
||||
var c = a.config, d = c.widgetOptions, e = [], m, k, n;
|
||||
c.debug && (m = new Date);
|
||||
c.widgets.length && (c.widgets = g.grep(c.widgets, function(a, b) {
|
||||
return g.inArray(a, c.widgets) === b
|
||||
}), g.each(c.widgets || [], function(a, b) {
|
||||
(n = f.getWidgetById(b)) && n.id && (n.priority || (n.priority = 10), e[a] = n)
|
||||
}), e.sort(function(a, b) {
|
||||
return a.priority < b.priority ? -1 : a.priority === b.priority ? 0 : 1
|
||||
}), g.each(e, function(e, f) {
|
||||
if (f) {
|
||||
if (b || !c.widgetInit[f.id])
|
||||
f.hasOwnProperty("options") && (d = a.config.widgetOptions = g.extend(!0, {}, f.options, d)), f.hasOwnProperty("init") && f.init(a, f, c, d), c.widgetInit[f.id] = !0;
|
||||
!b && f.hasOwnProperty("format") && f.format(a, c, d, !1)
|
||||
}
|
||||
}));
|
||||
c.debug && (k = c.widgets.length, t("Completed " + (!0 === b ? "initializing " : "applying ") + k + " widget" + (1 !== k ? "s" : ""), m))
|
||||
};
|
||||
f.refreshWidgets = function(a, b, c) {
|
||||
a = g(a)[0];
|
||||
var h, e = a.config, m = e.widgets, k = f.widgets, n = k.length;
|
||||
for (h = 0; h < n; h++)
|
||||
k[h] && k[h].id && (b || 0 > g.inArray(k[h].id, m)) && (e.debug && d('Refeshing widgets: Removing "' + k[h].id + '"'), k[h].hasOwnProperty("remove") && e.widgetInit[k[h].id] && (k[h].remove(a, e, e.widgetOptions), e.widgetInit[k[h].id] = !1));
|
||||
!0 !== c && f.applyWidget(a, b)
|
||||
};
|
||||
f.getData = function(a, b, c) {
|
||||
var d = "";
|
||||
a = g(a);
|
||||
var e, f;
|
||||
if (!a.length)
|
||||
return"";
|
||||
e = g.metadata ? a.metadata() : !1;
|
||||
f = " " + (a.attr("class") || "");
|
||||
"undefined" !== typeof a.data(c) || "undefined" !== typeof a.data(c.toLowerCase()) ? d += a.data(c) || a.data(c.toLowerCase()) : e && "undefined" !== typeof e[c] ? d += e[c] : b && "undefined" !== typeof b[c] ? d += b[c] : " " !== f && f.match(" " + c + "-") && (d = f.match(RegExp("\\s" + c + "-([\\w-]+)"))[1] || "");
|
||||
return g.trim(d)
|
||||
};
|
||||
f.formatFloat = function(a, b) {
|
||||
if ("string" !== typeof a || "" === a)
|
||||
return a;
|
||||
var c;
|
||||
a = (b && b.config ? !1 !== b.config.usNumberFormat : "undefined" !== typeof b ? b : 1) ? a.replace(/,/g, "") : a.replace(/[\s|\.]/g, "").replace(/,/g, ".");
|
||||
/^\s*\([.\d]+\)/.test(a) && (a = a.replace(/^\s*\(([.\d]+)\)/, "-$1"));
|
||||
c = parseFloat(a);
|
||||
return isNaN(c) ? g.trim(a) : c
|
||||
};
|
||||
f.isDigit = function(a) {
|
||||
return isNaN(a) ? /^[\-+(]?\d+[)]?$/.test(a.toString().replace(/[,.'"\s]/g, "")) : !0
|
||||
}
|
||||
}});
|
||||
var q = g.tablesorter;
|
||||
g.fn.extend({tablesorter: q.construct});
|
||||
q.addParser({id: "text", is: function() {
|
||||
return!0
|
||||
}, format: function(d, t) {
|
||||
var m = t.config;
|
||||
d && (d = g.trim(m.ignoreCase ? d.toLocaleLowerCase() : d), d = m.sortLocaleCompare ? q.replaceAccents(d) : d);
|
||||
return d
|
||||
}, type: "text"});
|
||||
q.addParser({id: "digit", is: function(d) {
|
||||
return q.isDigit(d)
|
||||
}, format: function(d, t) {
|
||||
var m = q.formatFloat((d || "").replace(/[^\w,. \-()]/g, ""), t);
|
||||
return d && "number" === typeof m ? m : d ? g.trim(d && t.config.ignoreCase ? d.toLocaleLowerCase() : d) : d
|
||||
}, type: "numeric"});
|
||||
q.addParser({id: "currency", is: function(d) {
|
||||
return/^\(?\d+[\u00a3$\u20ac\u00a4\u00a5\u00a2?.]|[\u00a3$\u20ac\u00a4\u00a5\u00a2?.]\d+\)?$/.test((d || "").replace(/[+\-,. ]/g, ""))
|
||||
}, format: function(d, t) {
|
||||
var m = q.formatFloat((d || "").replace(/[^\w,. \-()]/g, ""), t);
|
||||
return d && "number" === typeof m ? m : d ? g.trim(d && t.config.ignoreCase ? d.toLocaleLowerCase() : d) : d
|
||||
}, type: "numeric"});
|
||||
q.addParser({id: "ipAddress", is: function(d) {
|
||||
return/^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}$/.test(d)
|
||||
}, format: function(d, g) {
|
||||
var m, u = d ? d.split(".") : "", s = "", v = u.length;
|
||||
for (m = 0; m < v; m++)
|
||||
s += ("00" + u[m]).slice(-3);
|
||||
return d ? q.formatFloat(s, g) : d
|
||||
}, type: "numeric"});
|
||||
q.addParser({id: "url", is: function(d) {
|
||||
return/^(https?|ftp|file):\/\//.test(d)
|
||||
}, format: function(d) {
|
||||
return d ? g.trim(d.replace(/(https?|ftp|file):\/\//, "")) : d
|
||||
}, type: "text"});
|
||||
q.addParser({id: "isoDate", is: function(d) {
|
||||
return/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}/.test(d)
|
||||
}, format: function(d, g) {
|
||||
return d ? q.formatFloat("" !== d ? (new Date(d.replace(/-/g, "/"))).getTime() || d : "", g) : d
|
||||
}, type: "numeric"});
|
||||
q.addParser({id: "percent", is: function(d) {
|
||||
return/(\d\s*?%|%\s*?\d)/.test(d) && 15 > d.length
|
||||
}, format: function(d, g) {
|
||||
return d ? q.formatFloat(d.replace(/%/g, ""), g) : d
|
||||
}, type: "numeric"});
|
||||
q.addParser({id: "usLongDate", is: function(d) {
|
||||
return/^[A-Z]{3,10}\.?\s+\d{1,2},?\s+(\d{4})(\s+\d{1,2}:\d{2}(:\d{2})?(\s+[AP]M)?)?$/i.test(d) || /^\d{1,2}\s+[A-Z]{3,10}\s+\d{4}/i.test(d)
|
||||
}, format: function(d, g) {
|
||||
return d ? q.formatFloat((new Date(d.replace(/(\S)([AP]M)$/i, "$1 $2"))).getTime() || d, g) : d
|
||||
}, type: "numeric"});
|
||||
q.addParser({id: "shortDate", is: function(d) {
|
||||
return/(^\d{1,2}[\/\s]\d{1,2}[\/\s]\d{4})|(^\d{4}[\/\s]\d{1,2}[\/\s]\d{1,2})/.test((d || "").replace(/\s+/g, " ").replace(/[\-.,]/g, "/"))
|
||||
}, format: function(d, g, m, u) {
|
||||
if (d) {
|
||||
m = g.config;
|
||||
var s = m.$headers.filter("[data-column=" + u + "]:last");
|
||||
u = s.length && s[0].dateFormat || q.getData(s, m.headers[u], "dateFormat") || m.dateFormat;
|
||||
d = d.replace(/\s+/g, " ").replace(/[\-.,]/g, "/");
|
||||
"mmddyyyy" === u ? d = d.replace(/(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{4})/, "$3/$1/$2") : "ddmmyyyy" === u ? d = d.replace(/(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{4})/, "$3/$2/$1") : "yyyymmdd" === u && (d = d.replace(/(\d{4})[\/\s](\d{1,2})[\/\s](\d{1,2})/, "$1/$2/$3"))
|
||||
}
|
||||
return d ? q.formatFloat((new Date(d)).getTime() || d, g) : d
|
||||
}, type: "numeric"});
|
||||
q.addParser({id: "time", is: function(d) {
|
||||
return/^(([0-2]?\d:[0-5]\d)|([0-1]?\d:[0-5]\d\s?([AP]M)))$/i.test(d)
|
||||
}, format: function(d, g) {
|
||||
return d ? q.formatFloat((new Date("2000/01/01 " + d.replace(/(\S)([AP]M)$/i, "$1 $2"))).getTime() || d, g) : d
|
||||
}, type: "numeric"});
|
||||
q.addParser({id: "metadata", is: function() {
|
||||
return!1
|
||||
}, format: function(d, q, m) {
|
||||
d = q.config;
|
||||
d = d.parserMetadataName ? d.parserMetadataName : "sortValue";
|
||||
return g(m).metadata()[d]
|
||||
}, type: "numeric"});
|
||||
q.addWidget({id: "zebra", priority: 90, format: function(d, t, m) {
|
||||
var u, s, v, A, D, C, E = RegExp(t.cssChildRow, "i"), B = t.$tbodies;
|
||||
t.debug && (D = new Date);
|
||||
for (d = 0; d < B.length; d++)
|
||||
u = B.eq(d), C = u.children("tr").length, 1 < C && (v = 0, u = u.children("tr:visible").not(t.selectorRemove), u.each(function() {
|
||||
s = g(this);
|
||||
E.test(this.className) || v++;
|
||||
A = 0 === v % 2;
|
||||
s.removeClass(m.zebra[A ? 1 : 0]).addClass(m.zebra[A ? 0 : 1])
|
||||
}));
|
||||
t.debug && q.benchmark("Applying Zebra widget", D)
|
||||
}, remove: function(d, q, m) {
|
||||
var u;
|
||||
q = q.$tbodies;
|
||||
var s = (m.zebra || ["even", "odd"]).join(" ");
|
||||
for (m = 0; m < q.length; m++)
|
||||
u = g.tablesorter.processTbody(d, q.eq(m), !0), u.children().removeClass(s), g.tablesorter.processTbody(d, u, !1)
|
||||
}})
|
||||
}(jQuery);
|
||||
@@ -0,0 +1,28 @@
|
||||
/* German initialisation for the jQuery UI date picker plugin. */
|
||||
/* Written by Milian Wolff (mail@milianw.de). */
|
||||
jQuery(function($) {
|
||||
if ($.datepicker != null)
|
||||
{
|
||||
$.datepicker.regional['de'] = {
|
||||
closeText: 'schließen',
|
||||
prevText: '<zurück',
|
||||
nextText: 'Vor>',
|
||||
currentText: 'heute',
|
||||
monthNames: [
|
||||
'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'
|
||||
],
|
||||
monthNamesShort: ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
|
||||
dayNames: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
|
||||
dayNamesShort: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
|
||||
dayNamesMin: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
|
||||
weekHeader: 'Wo',
|
||||
dateFormat: 'dd.mm.yy',
|
||||
firstDay: 1,
|
||||
isRTL: false,
|
||||
showMonthAfterYear: false,
|
||||
yearSuffix: ''
|
||||
};
|
||||
|
||||
$.datepicker.setDefaults($.datepicker.regional['de']);
|
||||
}
|
||||
});
|
||||
Vendored
-1496
File diff suppressed because it is too large
Load Diff
Vendored
-952
File diff suppressed because one or more lines are too long
@@ -1,121 +0,0 @@
|
||||
|
||||
/*
|
||||
* Superfish v1.4.8 - jQuery menu widget
|
||||
* Copyright (c) 2008 Joel Birch
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*
|
||||
* CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt
|
||||
*/
|
||||
|
||||
;(function($){
|
||||
$.fn.superfish = function(op){
|
||||
|
||||
var sf = $.fn.superfish,
|
||||
c = sf.c,
|
||||
$arrow = $(['<span class="',c.arrowClass,'"> »</span>'].join('')),
|
||||
over = function(){
|
||||
var $$ = $(this), menu = getMenu($$);
|
||||
clearTimeout(menu.sfTimer);
|
||||
$$.showSuperfishUl().siblings().hideSuperfishUl();
|
||||
},
|
||||
out = function(){
|
||||
var $$ = $(this), menu = getMenu($$), o = sf.op;
|
||||
clearTimeout(menu.sfTimer);
|
||||
menu.sfTimer=setTimeout(function(){
|
||||
o.retainPath=($.inArray($$[0],o.$path)>-1);
|
||||
$$.hideSuperfishUl();
|
||||
if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);}
|
||||
},o.delay);
|
||||
},
|
||||
getMenu = function($menu){
|
||||
var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0];
|
||||
sf.op = sf.o[menu.serial];
|
||||
return menu;
|
||||
},
|
||||
addArrow = function($a){ $a.addClass(c.anchorClass).append($arrow.clone()); };
|
||||
|
||||
return this.each(function() {
|
||||
var s = this.serial = sf.o.length;
|
||||
var o = $.extend({},sf.defaults,op);
|
||||
o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){
|
||||
$(this).addClass([o.hoverClass,c.bcClass].join(' '))
|
||||
.filter('li:has(ul)').removeClass(o.pathClass);
|
||||
});
|
||||
sf.o[s] = sf.op = o;
|
||||
|
||||
$('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over,out).each(function() {
|
||||
if (o.autoArrows) addArrow( $('>a:first-child',this) );
|
||||
})
|
||||
.not('.'+c.bcClass)
|
||||
.hideSuperfishUl();
|
||||
|
||||
var $a = $('a',this);
|
||||
$a.each(function(i){
|
||||
var $li = $a.eq(i).parents('li');
|
||||
$a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);});
|
||||
});
|
||||
o.onInit.call(this);
|
||||
|
||||
}).each(function() {
|
||||
var menuClasses = [c.menuClass];
|
||||
if (sf.op.dropShadows && !($.browser.msie && $.browser.version < 7)) menuClasses.push(c.shadowClass);
|
||||
$(this).addClass(menuClasses.join(' '));
|
||||
});
|
||||
};
|
||||
|
||||
var sf = $.fn.superfish;
|
||||
sf.o = [];
|
||||
sf.op = {};
|
||||
sf.IE7fix = function(){
|
||||
var o = sf.op;
|
||||
if ($.browser.msie && $.browser.version > 6 && o.dropShadows && o.animation.opacity!=undefined)
|
||||
this.toggleClass(sf.c.shadowClass+'-off');
|
||||
};
|
||||
sf.c = {
|
||||
bcClass : 'sf-breadcrumb',
|
||||
menuClass : 'sf-js-enabled',
|
||||
anchorClass : 'sf-with-ul',
|
||||
arrowClass : 'sf-sub-indicator',
|
||||
shadowClass : 'sf-shadow'
|
||||
};
|
||||
sf.defaults = {
|
||||
hoverClass : 'sfHover',
|
||||
pathClass : 'overideThisToUse',
|
||||
pathLevels : 1,
|
||||
delay : 800,
|
||||
animation : {opacity:'show'},
|
||||
speed : 'normal',
|
||||
autoArrows : true,
|
||||
dropShadows : true,
|
||||
disableHI : false, // true disables hoverIntent detection
|
||||
onInit : function(){}, // callback functions
|
||||
onBeforeShow: function(){},
|
||||
onShow : function(){},
|
||||
onHide : function(){}
|
||||
};
|
||||
$.fn.extend({
|
||||
hideSuperfishUl : function(){
|
||||
var o = sf.op,
|
||||
not = (o.retainPath===true) ? o.$path : '';
|
||||
o.retainPath = false;
|
||||
var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass)
|
||||
.find('>ul').hide().css('visibility','hidden');
|
||||
o.onHide.call($ul);
|
||||
return this;
|
||||
},
|
||||
showSuperfishUl : function(){
|
||||
var o = sf.op,
|
||||
sh = sf.c.shadowClass+'-off',
|
||||
$ul = this.addClass(o.hoverClass)
|
||||
.find('>ul:hidden').css('visibility','visible');
|
||||
sf.IE7fix.call($ul);
|
||||
o.onBeforeShow.call($ul);
|
||||
$ul.animate(o.animation,o.speed,function(){ sf.IE7fix.call($ul); o.onShow.call($ul); });
|
||||
return this;
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
Reference in New Issue
Block a user