remove unused assets
147
app/javascript/vendor/jquery-dropdown.js
vendored
@@ -1,147 +0,0 @@
|
||||
/*
|
||||
* jQuery Dropdown: A simple dropdown plugin
|
||||
*
|
||||
* Contribute: https://github.com/claviska/jquery-dropdown
|
||||
*
|
||||
* @license: MIT license: http://opensource.org/licenses/MIT
|
||||
*
|
||||
*/
|
||||
if (jQuery) (function ($) {
|
||||
|
||||
$.extend($.fn, {
|
||||
jqDropdown: function (method, data) {
|
||||
|
||||
switch (method) {
|
||||
case 'show':
|
||||
show(null, $(this));
|
||||
return $(this);
|
||||
case 'hide':
|
||||
hide();
|
||||
return $(this);
|
||||
case 'attach':
|
||||
return $(this).attr('data-jq-dropdown', data);
|
||||
case 'detach':
|
||||
hide();
|
||||
return $(this).removeAttr('data-jq-dropdown');
|
||||
case 'disable':
|
||||
return $(this).addClass('jq-dropdown-disabled');
|
||||
case 'enable':
|
||||
hide();
|
||||
return $(this).removeClass('jq-dropdown-disabled');
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
function show(event, object) {
|
||||
|
||||
var trigger = event ? $(this) : object,
|
||||
jqDropdown = $(trigger.attr('data-jq-dropdown')),
|
||||
isOpen = trigger.hasClass('jq-dropdown-open');
|
||||
|
||||
// In some cases we don't want to show it
|
||||
if (event) {
|
||||
if ($(event.target).hasClass('jq-dropdown-ignore')) return;
|
||||
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
} else {
|
||||
if (trigger !== object.target && $(object.target).hasClass('jq-dropdown-ignore')) return;
|
||||
}
|
||||
hide();
|
||||
|
||||
if (isOpen || trigger.hasClass('jq-dropdown-disabled')) return;
|
||||
|
||||
// Show it
|
||||
trigger.addClass('jq-dropdown-open');
|
||||
jqDropdown
|
||||
.data('jq-dropdown-trigger', trigger)
|
||||
.show();
|
||||
|
||||
// Position it
|
||||
position();
|
||||
|
||||
// Trigger the show callback
|
||||
jqDropdown
|
||||
.trigger('show', {
|
||||
jqDropdown: jqDropdown,
|
||||
trigger: trigger
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function hide(event) {
|
||||
|
||||
// In some cases we don't hide them
|
||||
var targetGroup = event ? $(event.target).parents().addBack() : null;
|
||||
|
||||
// Are we clicking anywhere in a jq-dropdown?
|
||||
if (targetGroup && targetGroup.is('.jq-dropdown')) {
|
||||
// Is it a jq-dropdown menu?
|
||||
if (targetGroup.is('.jq-dropdown-menu')) {
|
||||
// Did we click on an option? If so close it.
|
||||
if (!targetGroup.is('A')) return;
|
||||
} else {
|
||||
// Nope, it's a panel. Leave it open.
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Trigger the event early, so that it might be prevented on the visible popups
|
||||
var hideEvent = jQuery.Event("hide");
|
||||
|
||||
$(document).find('.jq-dropdown:visible').each(function () {
|
||||
var jqDropdown = $(this);
|
||||
jqDropdown
|
||||
.hide()
|
||||
.removeData('jq-dropdown-trigger')
|
||||
.trigger('hide', { jqDropdown: jqDropdown });
|
||||
});
|
||||
|
||||
if(!hideEvent.isDefaultPrevented()) {
|
||||
// Hide any jq-dropdown that may be showing
|
||||
$(document).find('.jq-dropdown:visible').each(function () {
|
||||
var jqDropdown = $(this);
|
||||
jqDropdown
|
||||
.hide()
|
||||
.removeData('jq-dropdown-trigger')
|
||||
.trigger('hide', { jqDropdown: jqDropdown });
|
||||
});
|
||||
|
||||
// Remove all jq-dropdown-open classes
|
||||
$(document).find('.jq-dropdown-open').removeClass('jq-dropdown-open');
|
||||
}
|
||||
}
|
||||
|
||||
function position() {
|
||||
|
||||
var jqDropdown = $('.jq-dropdown:visible').eq(0),
|
||||
trigger = jqDropdown.data('jq-dropdown-trigger'),
|
||||
hOffset = trigger ? parseInt(trigger.attr('data-horizontal-offset') || 0, 10) : null,
|
||||
vOffset = trigger ? parseInt(trigger.attr('data-vertical-offset') || 0, 10) : null;
|
||||
|
||||
if (jqDropdown.length === 0 || !trigger) return;
|
||||
|
||||
// Position the jq-dropdown relative-to-parent...
|
||||
if (jqDropdown.hasClass('jq-dropdown-relative')) {
|
||||
jqDropdown.css({
|
||||
left: jqDropdown.hasClass('jq-dropdown-anchor-right') ?
|
||||
trigger.position().left - (jqDropdown.outerWidth(true) - trigger.outerWidth(true)) - parseInt(trigger.css('margin-right'), 10) + hOffset :
|
||||
trigger.position().left + parseInt(trigger.css('margin-left'), 10) + hOffset,
|
||||
top: trigger.position().top + trigger.outerHeight(true) - parseInt(trigger.css('margin-top'), 10) + vOffset
|
||||
});
|
||||
} else {
|
||||
// ...or relative to document
|
||||
jqDropdown.css({
|
||||
left: jqDropdown.hasClass('jq-dropdown-anchor-right') ?
|
||||
trigger.offset().left - (jqDropdown.outerWidth() - trigger.outerWidth()) + hOffset : trigger.offset().left + hOffset,
|
||||
top: trigger.offset().top + trigger.outerHeight() + vOffset
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
$(document).on('click.jq-dropdown', '[data-jq-dropdown]', show);
|
||||
$(document).on('click.jq-dropdown', hide);
|
||||
$(window).on('resize', position);
|
||||
|
||||
})(jQuery);
|
||||
BIN
vendor/assets/images/ui-bg_flat_0_aaaaaa_40x100.png
vendored
|
Before Width: | Height: | Size: 212 B |
BIN
vendor/assets/images/ui-bg_flat_75_ffffff_40x100.png
vendored
|
Before Width: | Height: | Size: 208 B |
BIN
vendor/assets/images/ui-bg_glass_55_fbf9ee_1x400.png
vendored
|
Before Width: | Height: | Size: 335 B |
BIN
vendor/assets/images/ui-bg_glass_65_ffffff_1x400.png
vendored
|
Before Width: | Height: | Size: 207 B |
BIN
vendor/assets/images/ui-bg_glass_75_dadada_1x400.png
vendored
|
Before Width: | Height: | Size: 262 B |
BIN
vendor/assets/images/ui-bg_glass_75_e6e6e6_1x400.png
vendored
|
Before Width: | Height: | Size: 262 B |
BIN
vendor/assets/images/ui-bg_glass_95_fef1ec_1x400.png
vendored
|
Before Width: | Height: | Size: 332 B |
|
Before Width: | Height: | Size: 280 B |
BIN
vendor/assets/images/ui-icons_222222_256x240.png
vendored
|
Before Width: | Height: | Size: 6.8 KiB |
BIN
vendor/assets/images/ui-icons_2e83ff_256x240.png
vendored
|
Before Width: | Height: | Size: 4.4 KiB |
BIN
vendor/assets/images/ui-icons_454545_256x240.png
vendored
|
Before Width: | Height: | Size: 6.8 KiB |
BIN
vendor/assets/images/ui-icons_888888_256x240.png
vendored
|
Before Width: | Height: | Size: 6.8 KiB |
BIN
vendor/assets/images/ui-icons_cd0a0a_256x240.png
vendored
|
Before Width: | Height: | Size: 4.4 KiB |
3240
vendor/assets/javascripts/hammer.js
vendored
7
vendor/assets/javascripts/hammer.min.js
vendored
@@ -1,610 +0,0 @@
|
||||
/*!
|
||||
* jQuery UI Autocomplete 1.11.2
|
||||
* http://jqueryui.com
|
||||
*
|
||||
* Copyright 2014 jQuery Foundation and other contributors
|
||||
* Released under the MIT license.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://api.jqueryui.com/autocomplete/
|
||||
*/
|
||||
|
||||
|
||||
$.widget( "ui.autocomplete", {
|
||||
version: "1.11.2",
|
||||
defaultElement: "<input>",
|
||||
options: {
|
||||
appendTo: null,
|
||||
autoFocus: false,
|
||||
delay: 300,
|
||||
minLength: 1,
|
||||
position: {
|
||||
my: "left top",
|
||||
at: "left bottom",
|
||||
collision: "none"
|
||||
},
|
||||
source: null,
|
||||
|
||||
// callbacks
|
||||
change: null,
|
||||
close: null,
|
||||
focus: null,
|
||||
open: null,
|
||||
response: null,
|
||||
search: null,
|
||||
select: null
|
||||
},
|
||||
|
||||
requestIndex: 0,
|
||||
pending: 0,
|
||||
|
||||
_create: function() {
|
||||
// Some browsers only repeat keydown events, not keypress events,
|
||||
// so we use the suppressKeyPress flag to determine if we've already
|
||||
// handled the keydown event. #7269
|
||||
// Unfortunately the code for & in keypress is the same as the up arrow,
|
||||
// so we use the suppressKeyPressRepeat flag to avoid handling keypress
|
||||
// events when we know the keydown event was used to modify the
|
||||
// search term. #7799
|
||||
var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
|
||||
nodeName = this.element[ 0 ].nodeName.toLowerCase(),
|
||||
isTextarea = nodeName === "textarea",
|
||||
isInput = nodeName === "input";
|
||||
|
||||
this.isMultiLine =
|
||||
// Textareas are always multi-line
|
||||
isTextarea ? true :
|
||||
// Inputs are always single-line, even if inside a contentEditable element
|
||||
// IE also treats inputs as contentEditable
|
||||
isInput ? false :
|
||||
// All other element types are determined by whether or not they're contentEditable
|
||||
this.element.prop( "isContentEditable" );
|
||||
|
||||
this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
|
||||
this.isNewMenu = true;
|
||||
|
||||
this.element
|
||||
.addClass( "ui-autocomplete-input" )
|
||||
.attr( "autocomplete", "off" );
|
||||
|
||||
this._on( this.element, {
|
||||
keydown: function( event ) {
|
||||
if ( this.element.prop( "readOnly" ) ) {
|
||||
suppressKeyPress = true;
|
||||
suppressInput = true;
|
||||
suppressKeyPressRepeat = true;
|
||||
return;
|
||||
}
|
||||
|
||||
suppressKeyPress = false;
|
||||
suppressInput = false;
|
||||
suppressKeyPressRepeat = false;
|
||||
var keyCode = $.ui.keyCode;
|
||||
switch ( event.keyCode ) {
|
||||
case keyCode.PAGE_UP:
|
||||
suppressKeyPress = true;
|
||||
this._move( "previousPage", event );
|
||||
break;
|
||||
case keyCode.PAGE_DOWN:
|
||||
suppressKeyPress = true;
|
||||
this._move( "nextPage", event );
|
||||
break;
|
||||
case keyCode.UP:
|
||||
suppressKeyPress = true;
|
||||
this._keyEvent( "previous", event );
|
||||
break;
|
||||
case keyCode.DOWN:
|
||||
suppressKeyPress = true;
|
||||
this._keyEvent( "next", event );
|
||||
break;
|
||||
case keyCode.ENTER:
|
||||
// when menu is open and has focus
|
||||
if ( this.menu.active ) {
|
||||
// #6055 - Opera still allows the keypress to occur
|
||||
// which causes forms to submit
|
||||
suppressKeyPress = true;
|
||||
event.preventDefault();
|
||||
this.menu.select( event );
|
||||
}
|
||||
break;
|
||||
case keyCode.TAB:
|
||||
if ( this.menu.active ) {
|
||||
this.menu.select( event );
|
||||
}
|
||||
break;
|
||||
case keyCode.ESCAPE:
|
||||
if ( this.menu.element.is( ":visible" ) ) {
|
||||
if ( !this.isMultiLine ) {
|
||||
this._value( this.term );
|
||||
}
|
||||
this.close( event );
|
||||
// Different browsers have different default behavior for escape
|
||||
// Single press can mean undo or clear
|
||||
// Double press in IE means clear the whole form
|
||||
event.preventDefault();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
suppressKeyPressRepeat = true;
|
||||
// search timeout should be triggered before the input value is changed
|
||||
this._searchTimeout( event );
|
||||
break;
|
||||
}
|
||||
},
|
||||
keypress: function( event ) {
|
||||
if ( suppressKeyPress ) {
|
||||
suppressKeyPress = false;
|
||||
if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
|
||||
event.preventDefault();
|
||||
}
|
||||
return;
|
||||
}
|
||||
if ( suppressKeyPressRepeat ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// replicate some key handlers to allow them to repeat in Firefox and Opera
|
||||
var keyCode = $.ui.keyCode;
|
||||
switch ( event.keyCode ) {
|
||||
case keyCode.PAGE_UP:
|
||||
this._move( "previousPage", event );
|
||||
break;
|
||||
case keyCode.PAGE_DOWN:
|
||||
this._move( "nextPage", event );
|
||||
break;
|
||||
case keyCode.UP:
|
||||
this._keyEvent( "previous", event );
|
||||
break;
|
||||
case keyCode.DOWN:
|
||||
this._keyEvent( "next", event );
|
||||
break;
|
||||
}
|
||||
},
|
||||
input: function( event ) {
|
||||
if ( suppressInput ) {
|
||||
suppressInput = false;
|
||||
event.preventDefault();
|
||||
return;
|
||||
}
|
||||
this._searchTimeout( event );
|
||||
},
|
||||
focus: function() {
|
||||
this.selectedItem = null;
|
||||
this.previous = this._value();
|
||||
},
|
||||
blur: function( event ) {
|
||||
if ( this.cancelBlur ) {
|
||||
delete this.cancelBlur;
|
||||
return;
|
||||
}
|
||||
|
||||
clearTimeout( this.searching );
|
||||
this.close( event );
|
||||
this._change( event );
|
||||
}
|
||||
});
|
||||
|
||||
this._initSource();
|
||||
this.menu = $( "<ul>" )
|
||||
.addClass( "ui-autocomplete ui-front" )
|
||||
.appendTo( this._appendTo() )
|
||||
.menu({
|
||||
// disable ARIA support, the live region takes care of that
|
||||
role: null
|
||||
})
|
||||
.hide()
|
||||
.menu( "instance" );
|
||||
|
||||
this._on( this.menu.element, {
|
||||
mousedown: function( event ) {
|
||||
// prevent moving focus out of the text field
|
||||
event.preventDefault();
|
||||
|
||||
// IE doesn't prevent moving focus even with event.preventDefault()
|
||||
// so we set a flag to know when we should ignore the blur event
|
||||
this.cancelBlur = true;
|
||||
this._delay(function() {
|
||||
delete this.cancelBlur;
|
||||
});
|
||||
|
||||
// clicking on the scrollbar causes focus to shift to the body
|
||||
// but we can't detect a mouseup or a click immediately afterward
|
||||
// so we have to track the next mousedown and close the menu if
|
||||
// the user clicks somewhere outside of the autocomplete
|
||||
var menuElement = this.menu.element[ 0 ];
|
||||
if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
|
||||
this._delay(function() {
|
||||
var that = this;
|
||||
this.document.one( "mousedown", function( event ) {
|
||||
if ( event.target !== that.element[ 0 ] &&
|
||||
event.target !== menuElement &&
|
||||
!$.contains( menuElement, event.target ) ) {
|
||||
that.close();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
menufocus: function( event, ui ) {
|
||||
var label, item;
|
||||
// support: Firefox
|
||||
// Prevent accidental activation of menu items in Firefox (#7024 #9118)
|
||||
if ( this.isNewMenu ) {
|
||||
this.isNewMenu = false;
|
||||
if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
|
||||
this.menu.blur();
|
||||
|
||||
this.document.one( "mousemove", function() {
|
||||
$( event.target ).trigger( event.originalEvent );
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
item = ui.item.data( "ui-autocomplete-item" );
|
||||
if ( false !== this._trigger( "focus", event, { item: item } ) ) {
|
||||
// use value to match what will end up in the input, if it was a key event
|
||||
if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
|
||||
this._value( item.value );
|
||||
}
|
||||
}
|
||||
|
||||
// Announce the value in the liveRegion
|
||||
label = ui.item.attr( "aria-label" ) || item.value;
|
||||
if ( label && $.trim( label ).length ) {
|
||||
this.liveRegion.children().hide();
|
||||
$( "<div>" ).text( label ).appendTo( this.liveRegion );
|
||||
}
|
||||
},
|
||||
menuselect: function( event, ui ) {
|
||||
var item = ui.item.data( "ui-autocomplete-item" ),
|
||||
previous = this.previous;
|
||||
|
||||
// only trigger when focus was lost (click on menu)
|
||||
if ( this.element[ 0 ] !== this.document[ 0 ].activeElement ) {
|
||||
this.element.focus();
|
||||
this.previous = previous;
|
||||
// #6109 - IE triggers two focus events and the second
|
||||
// is asynchronous, so we need to reset the previous
|
||||
// term synchronously and asynchronously :-(
|
||||
this._delay(function() {
|
||||
this.previous = previous;
|
||||
this.selectedItem = item;
|
||||
});
|
||||
}
|
||||
|
||||
if ( false !== this._trigger( "select", event, { item: item } ) ) {
|
||||
this._value( item.value );
|
||||
}
|
||||
// reset the term after the select event
|
||||
// this allows custom select handling to work properly
|
||||
this.term = this._value();
|
||||
|
||||
this.close( event );
|
||||
this.selectedItem = item;
|
||||
}
|
||||
});
|
||||
|
||||
this.liveRegion = $( "<span>", {
|
||||
role: "status",
|
||||
"aria-live": "assertive",
|
||||
"aria-relevant": "additions"
|
||||
})
|
||||
.addClass( "ui-helper-hidden-accessible" )
|
||||
.appendTo( this.document[ 0 ].body );
|
||||
|
||||
// turning off autocomplete prevents the browser from remembering the
|
||||
// value when navigating through history, so we re-enable autocomplete
|
||||
// if the page is unloaded before the widget is destroyed. #7790
|
||||
this._on( this.window, {
|
||||
beforeunload: function() {
|
||||
this.element.removeAttr( "autocomplete" );
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_destroy: function() {
|
||||
clearTimeout( this.searching );
|
||||
this.element
|
||||
.removeClass( "ui-autocomplete-input" )
|
||||
.removeAttr( "autocomplete" );
|
||||
this.menu.element.remove();
|
||||
this.liveRegion.remove();
|
||||
},
|
||||
|
||||
_setOption: function( key, value ) {
|
||||
this._super( key, value );
|
||||
if ( key === "source" ) {
|
||||
this._initSource();
|
||||
}
|
||||
if ( key === "appendTo" ) {
|
||||
this.menu.element.appendTo( this._appendTo() );
|
||||
}
|
||||
if ( key === "disabled" && value && this.xhr ) {
|
||||
this.xhr.abort();
|
||||
}
|
||||
},
|
||||
|
||||
_appendTo: function() {
|
||||
var element = this.options.appendTo;
|
||||
|
||||
if ( element ) {
|
||||
element = element.jquery || element.nodeType ?
|
||||
$( element ) :
|
||||
this.document.find( element ).eq( 0 );
|
||||
}
|
||||
|
||||
if ( !element || !element[ 0 ] ) {
|
||||
element = this.element.closest( ".ui-front" );
|
||||
}
|
||||
|
||||
if ( !element.length ) {
|
||||
element = this.document[ 0 ].body;
|
||||
}
|
||||
|
||||
return element;
|
||||
},
|
||||
|
||||
_initSource: function() {
|
||||
var array, url,
|
||||
that = this;
|
||||
if ( $.isArray( this.options.source ) ) {
|
||||
array = this.options.source;
|
||||
this.source = function( request, response ) {
|
||||
response( $.ui.autocomplete.filter( array, request.term ) );
|
||||
};
|
||||
} else if ( typeof this.options.source === "string" ) {
|
||||
url = this.options.source;
|
||||
this.source = function( request, response ) {
|
||||
if ( that.xhr ) {
|
||||
that.xhr.abort();
|
||||
}
|
||||
that.xhr = $.ajax({
|
||||
url: url,
|
||||
data: request,
|
||||
dataType: "json",
|
||||
success: function( data ) {
|
||||
response( data );
|
||||
},
|
||||
error: function() {
|
||||
response([]);
|
||||
}
|
||||
});
|
||||
};
|
||||
} else {
|
||||
this.source = this.options.source;
|
||||
}
|
||||
},
|
||||
|
||||
_searchTimeout: function( event ) {
|
||||
clearTimeout( this.searching );
|
||||
this.searching = this._delay(function() {
|
||||
|
||||
// Search if the value has changed, or if the user retypes the same value (see #7434)
|
||||
var equalValues = this.term === this._value(),
|
||||
menuVisible = this.menu.element.is( ":visible" ),
|
||||
modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
|
||||
|
||||
if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {
|
||||
this.selectedItem = null;
|
||||
this.search( null, event );
|
||||
}
|
||||
}, this.options.delay );
|
||||
},
|
||||
|
||||
search: function( value, event ) {
|
||||
value = value != null ? value : this._value();
|
||||
|
||||
// always save the actual value, not the one passed as an argument
|
||||
this.term = this._value();
|
||||
|
||||
if ( value.length < this.options.minLength ) {
|
||||
return this.close( event );
|
||||
}
|
||||
|
||||
if ( this._trigger( "search", event ) === false ) {
|
||||
return;
|
||||
}
|
||||
|
||||
return this._search( value );
|
||||
},
|
||||
|
||||
_search: function( value ) {
|
||||
this.pending++;
|
||||
this.element.addClass( "ui-autocomplete-loading" );
|
||||
this.cancelSearch = false;
|
||||
|
||||
this.source( { term: value }, this._response() );
|
||||
},
|
||||
|
||||
_response: function() {
|
||||
var index = ++this.requestIndex;
|
||||
|
||||
return $.proxy(function( content ) {
|
||||
if ( index === this.requestIndex ) {
|
||||
this.__response( content );
|
||||
}
|
||||
|
||||
this.pending--;
|
||||
if ( !this.pending ) {
|
||||
this.element.removeClass( "ui-autocomplete-loading" );
|
||||
}
|
||||
}, this );
|
||||
},
|
||||
|
||||
__response: function( content ) {
|
||||
if ( content ) {
|
||||
content = this._normalize( content );
|
||||
}
|
||||
this._trigger( "response", null, { content: content } );
|
||||
if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
|
||||
this._suggest( content );
|
||||
this._trigger( "open" );
|
||||
} else {
|
||||
// use ._close() instead of .close() so we don't cancel future searches
|
||||
this._close();
|
||||
}
|
||||
},
|
||||
|
||||
close: function( event ) {
|
||||
this.cancelSearch = true;
|
||||
this._close( event );
|
||||
},
|
||||
|
||||
_close: function( event ) {
|
||||
if ( this.menu.element.is( ":visible" ) ) {
|
||||
this.menu.element.hide();
|
||||
this.menu.blur();
|
||||
this.isNewMenu = true;
|
||||
this._trigger( "close", event );
|
||||
}
|
||||
},
|
||||
|
||||
_change: function( event ) {
|
||||
if ( this.previous !== this._value() ) {
|
||||
this._trigger( "change", event, { item: this.selectedItem } );
|
||||
}
|
||||
},
|
||||
|
||||
_normalize: function( items ) {
|
||||
// assume all items have the right format when the first item is complete
|
||||
if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
|
||||
return items;
|
||||
}
|
||||
return $.map( items, function( item ) {
|
||||
if ( typeof item === "string" ) {
|
||||
return {
|
||||
label: item,
|
||||
value: item
|
||||
};
|
||||
}
|
||||
return $.extend( {}, item, {
|
||||
label: item.label || item.value,
|
||||
value: item.value || item.label
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
_suggest: function( items ) {
|
||||
var ul = this.menu.element.empty();
|
||||
this._renderMenu( ul, items );
|
||||
this.isNewMenu = true;
|
||||
this.menu.refresh();
|
||||
|
||||
// size and position menu
|
||||
ul.show();
|
||||
this._resizeMenu();
|
||||
ul.position( $.extend({
|
||||
of: this.element
|
||||
}, this.options.position ) );
|
||||
|
||||
if ( this.options.autoFocus ) {
|
||||
this.menu.next();
|
||||
}
|
||||
},
|
||||
|
||||
_resizeMenu: function() {
|
||||
var ul = this.menu.element;
|
||||
ul.outerWidth( Math.max(
|
||||
// Firefox wraps long text (possibly a rounding bug)
|
||||
// so we add 1px to avoid the wrapping (#7513)
|
||||
ul.width( "" ).outerWidth() + 1,
|
||||
this.element.outerWidth()
|
||||
) );
|
||||
},
|
||||
|
||||
_renderMenu: function( ul, items ) {
|
||||
var that = this;
|
||||
$.each( items, function( index, item ) {
|
||||
that._renderItemData( ul, item );
|
||||
});
|
||||
},
|
||||
|
||||
_renderItemData: function( ul, item ) {
|
||||
return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
|
||||
},
|
||||
|
||||
_renderItem: function( ul, item ) {
|
||||
return $( "<li>" ).text( item.label ).appendTo( ul );
|
||||
},
|
||||
|
||||
_move: function( direction, event ) {
|
||||
if ( !this.menu.element.is( ":visible" ) ) {
|
||||
this.search( null, event );
|
||||
return;
|
||||
}
|
||||
if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
|
||||
this.menu.isLastItem() && /^next/.test( direction ) ) {
|
||||
|
||||
if ( !this.isMultiLine ) {
|
||||
this._value( this.term );
|
||||
}
|
||||
|
||||
this.menu.blur();
|
||||
return;
|
||||
}
|
||||
this.menu[ direction ]( event );
|
||||
},
|
||||
|
||||
widget: function() {
|
||||
return this.menu.element;
|
||||
},
|
||||
|
||||
_value: function() {
|
||||
return this.valueMethod.apply( this.element, arguments );
|
||||
},
|
||||
|
||||
_keyEvent: function( keyEvent, event ) {
|
||||
if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
|
||||
this._move( keyEvent, event );
|
||||
|
||||
// prevents moving cursor to beginning/end of the text field in some browsers
|
||||
event.preventDefault();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$.extend( $.ui.autocomplete, {
|
||||
escapeRegex: function( value ) {
|
||||
return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
|
||||
},
|
||||
filter: function( array, term ) {
|
||||
var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" );
|
||||
return $.grep( array, function( value ) {
|
||||
return matcher.test( value.label || value.value || value );
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// live region extension, adding a `messages` option
|
||||
// NOTE: This is an experimental API. We are still investigating
|
||||
// a full solution for string manipulation and internationalization.
|
||||
$.widget( "ui.autocomplete", $.ui.autocomplete, {
|
||||
options: {
|
||||
messages: {
|
||||
noResults: "No search results.",
|
||||
results: function( amount ) {
|
||||
return amount + ( amount > 1 ? " results are" : " result is" ) +
|
||||
" available, use up and down arrow keys to navigate.";
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
__response: function( content ) {
|
||||
var message;
|
||||
this._superApply( arguments );
|
||||
if ( this.options.disabled || this.cancelSearch ) {
|
||||
return;
|
||||
}
|
||||
if ( content && content.length ) {
|
||||
message = this.options.messages.results( content.length );
|
||||
} else {
|
||||
message = this.options.messages.noResults;
|
||||
}
|
||||
this.liveRegion.children().hide();
|
||||
$( "<div>" ).text( message ).appendTo( this.liveRegion );
|
||||
}
|
||||
});
|
||||
|
||||
var autocomplete = $.ui.autocomplete;
|
||||
147
vendor/assets/javascripts/jquery.dropdown.js
vendored
@@ -1,147 +0,0 @@
|
||||
/*
|
||||
* jQuery Dropdown: A simple dropdown plugin
|
||||
*
|
||||
* Contribute: https://github.com/claviska/jquery-dropdown
|
||||
*
|
||||
* @license: MIT license: http://opensource.org/licenses/MIT
|
||||
*
|
||||
*/
|
||||
if (jQuery) (function ($) {
|
||||
|
||||
$.extend($.fn, {
|
||||
jqDropdown: function (method, data) {
|
||||
|
||||
switch (method) {
|
||||
case 'show':
|
||||
show(null, $(this));
|
||||
return $(this);
|
||||
case 'hide':
|
||||
hide();
|
||||
return $(this);
|
||||
case 'attach':
|
||||
return $(this).attr('data-jq-dropdown', data);
|
||||
case 'detach':
|
||||
hide();
|
||||
return $(this).removeAttr('data-jq-dropdown');
|
||||
case 'disable':
|
||||
return $(this).addClass('jq-dropdown-disabled');
|
||||
case 'enable':
|
||||
hide();
|
||||
return $(this).removeClass('jq-dropdown-disabled');
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
function show(event, object) {
|
||||
|
||||
var trigger = event ? $(this) : object,
|
||||
jqDropdown = $(trigger.attr('data-jq-dropdown')),
|
||||
isOpen = trigger.hasClass('jq-dropdown-open');
|
||||
|
||||
// In some cases we don't want to show it
|
||||
if (event) {
|
||||
if ($(event.target).hasClass('jq-dropdown-ignore')) return;
|
||||
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
} else {
|
||||
if (trigger !== object.target && $(object.target).hasClass('jq-dropdown-ignore')) return;
|
||||
}
|
||||
hide();
|
||||
|
||||
if (isOpen || trigger.hasClass('jq-dropdown-disabled')) return;
|
||||
|
||||
// Show it
|
||||
trigger.addClass('jq-dropdown-open');
|
||||
jqDropdown
|
||||
.data('jq-dropdown-trigger', trigger)
|
||||
.show();
|
||||
|
||||
// Position it
|
||||
position();
|
||||
|
||||
// Trigger the show callback
|
||||
jqDropdown
|
||||
.trigger('show', {
|
||||
jqDropdown: jqDropdown,
|
||||
trigger: trigger
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function hide(event) {
|
||||
|
||||
// In some cases we don't hide them
|
||||
var targetGroup = event ? $(event.target).parents().addBack() : null;
|
||||
|
||||
// Are we clicking anywhere in a jq-dropdown?
|
||||
if (targetGroup && targetGroup.is('.jq-dropdown')) {
|
||||
// Is it a jq-dropdown menu?
|
||||
if (targetGroup.is('.jq-dropdown-menu')) {
|
||||
// Did we click on an option? If so close it.
|
||||
if (!targetGroup.is('A')) return;
|
||||
} else {
|
||||
// Nope, it's a panel. Leave it open.
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Trigger the event early, so that it might be prevented on the visible popups
|
||||
var hideEvent = jQuery.Event("hide");
|
||||
|
||||
$(document).find('.jq-dropdown:visible').each(function () {
|
||||
var jqDropdown = $(this);
|
||||
jqDropdown
|
||||
.hide()
|
||||
.removeData('jq-dropdown-trigger')
|
||||
.trigger('hide', { jqDropdown: jqDropdown });
|
||||
});
|
||||
|
||||
if(!hideEvent.isDefaultPrevented()) {
|
||||
// Hide any jq-dropdown that may be showing
|
||||
$(document).find('.jq-dropdown:visible').each(function () {
|
||||
var jqDropdown = $(this);
|
||||
jqDropdown
|
||||
.hide()
|
||||
.removeData('jq-dropdown-trigger')
|
||||
.trigger('hide', { jqDropdown: jqDropdown });
|
||||
});
|
||||
|
||||
// Remove all jq-dropdown-open classes
|
||||
$(document).find('.jq-dropdown-open').removeClass('jq-dropdown-open');
|
||||
}
|
||||
}
|
||||
|
||||
function position() {
|
||||
|
||||
var jqDropdown = $('.jq-dropdown:visible').eq(0),
|
||||
trigger = jqDropdown.data('jq-dropdown-trigger'),
|
||||
hOffset = trigger ? parseInt(trigger.attr('data-horizontal-offset') || 0, 10) : null,
|
||||
vOffset = trigger ? parseInt(trigger.attr('data-vertical-offset') || 0, 10) : null;
|
||||
|
||||
if (jqDropdown.length === 0 || !trigger) return;
|
||||
|
||||
// Position the jq-dropdown relative-to-parent...
|
||||
if (jqDropdown.hasClass('jq-dropdown-relative')) {
|
||||
jqDropdown.css({
|
||||
left: jqDropdown.hasClass('jq-dropdown-anchor-right') ?
|
||||
trigger.position().left - (jqDropdown.outerWidth(true) - trigger.outerWidth(true)) - parseInt(trigger.css('margin-right'), 10) + hOffset :
|
||||
trigger.position().left + parseInt(trigger.css('margin-left'), 10) + hOffset,
|
||||
top: trigger.position().top + trigger.outerHeight(true) - parseInt(trigger.css('margin-top'), 10) + vOffset
|
||||
});
|
||||
} else {
|
||||
// ...or relative to document
|
||||
jqDropdown.css({
|
||||
left: jqDropdown.hasClass('jq-dropdown-anchor-right') ?
|
||||
trigger.offset().left - (jqDropdown.outerWidth() - trigger.outerWidth()) + hOffset : trigger.offset().left + hOffset,
|
||||
top: trigger.offset().top + trigger.outerHeight() + vOffset
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
$(document).on('click.jq-dropdown', '[data-jq-dropdown]', show);
|
||||
$(document).on('click.jq-dropdown', hide);
|
||||
$(window).on('resize', position);
|
||||
|
||||
})(jQuery);
|
||||
@@ -1,9 +0,0 @@
|
||||
/*
|
||||
* jQuery Dropdown: A simple dropdown plugin
|
||||
*
|
||||
* Contribute: https://github.com/claviska/jquery-dropdown
|
||||
*
|
||||
* @license: MIT license: http://opensource.org/licenses/MIT
|
||||
*
|
||||
*/
|
||||
jQuery&&function($){function t(t,e){var d=t?$(this):e,n=$(d.attr("data-jq-dropdown")),a=d.hasClass("jq-dropdown-open");if(t){if($(t.target).hasClass("jq-dropdown-ignore"))return;t.preventDefault(),t.stopPropagation()}else if(d!==e.target&&$(e.target).hasClass("jq-dropdown-ignore"))return;o(),a||d.hasClass("jq-dropdown-disabled")||(d.addClass("jq-dropdown-open"),n.data("jq-dropdown-trigger",d).show(),r(),n.trigger("show",{jqDropdown:n,trigger:d}))}function o(t){var o=t?$(t.target).parents().addBack():null;if(o&&o.is(".jq-dropdown")){if(!o.is(".jq-dropdown-menu"))return;if(!o.is("A"))return}var r=jQuery.Event("hide");$(document).find(".jq-dropdown:visible").each(function(){var t=$(this);t.hide().removeData("jq-dropdown-trigger").trigger("hide",{jqDropdown:t})}),r.isDefaultPrevented()||($(document).find(".jq-dropdown:visible").each(function(){var t=$(this);t.hide().removeData("jq-dropdown-trigger").trigger("hide",{jqDropdown:t})}),$(document).find(".jq-dropdown-open").removeClass("jq-dropdown-open"))}function r(){var t=$(".jq-dropdown:visible").eq(0),o=t.data("jq-dropdown-trigger"),r=o?parseInt(o.attr("data-horizontal-offset")||0,10):null,e=o?parseInt(o.attr("data-vertical-offset")||0,10):null;0!==t.length&&o&&(t.hasClass("jq-dropdown-relative")?t.css({left:t.hasClass("jq-dropdown-anchor-right")?o.position().left-(t.outerWidth(!0)-o.outerWidth(!0))-parseInt(o.css("margin-right"),10)+r:o.position().left+parseInt(o.css("margin-left"),10)+r,top:o.position().top+o.outerHeight(!0)-parseInt(o.css("margin-top"),10)+e}):t.css({left:t.hasClass("jq-dropdown-anchor-right")?o.offset().left-(t.outerWidth()-o.outerWidth())+r:o.offset().left+r,top:o.offset().top+o.outerHeight()+e}))}$.extend($.fn,{jqDropdown:function(r,e){switch(r){case"show":return t(null,$(this)),$(this);case"hide":return o(),$(this);case"attach":return $(this).attr("data-jq-dropdown",e);case"detach":return o(),$(this).removeAttr("data-jq-dropdown");case"disable":return $(this).addClass("jq-dropdown-disabled");case"enable":return o(),$(this).removeClass("jq-dropdown-disabled")}}}),$(document).on("click.jq-dropdown","[data-jq-dropdown]",t),$(document).on("click.jq-dropdown",o),$(window).on("resize",r)}(jQuery);
|
||||
33
vendor/assets/javascripts/jquery.hammer.js
vendored
@@ -1,33 +0,0 @@
|
||||
(function(factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define(['jquery', 'hammerjs'], factory);
|
||||
} else if (typeof exports === 'object') {
|
||||
factory(require('jquery'), require('hammerjs'));
|
||||
} else {
|
||||
factory(jQuery, Hammer);
|
||||
}
|
||||
}(function($, Hammer) {
|
||||
function hammerify(el, options) {
|
||||
var $el = $(el);
|
||||
if(!$el.data("hammer")) {
|
||||
$el.data("hammer", new Hammer($el[0], options));
|
||||
}
|
||||
}
|
||||
|
||||
$.fn.hammer = function(options) {
|
||||
return this.each(function() {
|
||||
hammerify(this, options);
|
||||
});
|
||||
};
|
||||
|
||||
// extend the emit method to also trigger jQuery events
|
||||
Hammer.Manager.prototype.emit = (function(originalEmit) {
|
||||
return function(type, data) {
|
||||
originalEmit.call(this, type, data);
|
||||
$(this.element).trigger({
|
||||
type: type,
|
||||
gesture: data
|
||||
});
|
||||
};
|
||||
})(Hammer.Manager.prototype.emit);
|
||||
}));
|
||||
204
vendor/assets/javascripts/jquery.hotkeys.js
vendored
@@ -1,204 +0,0 @@
|
||||
/*jslint browser: true*/
|
||||
/*jslint jquery: true*/
|
||||
|
||||
/*
|
||||
* jQuery Hotkeys Plugin
|
||||
* Copyright 2010, John Resig
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
*
|
||||
* Based upon the plugin by Tzury Bar Yochay:
|
||||
* https://github.com/tzuryby/jquery.hotkeys
|
||||
*
|
||||
* Original idea by:
|
||||
* Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
|
||||
*/
|
||||
|
||||
/*
|
||||
* One small change is: now keys are passed by object { keys: '...' }
|
||||
* Might be useful, when you want to pass some other data to your handler
|
||||
*/
|
||||
|
||||
(function(jQuery) {
|
||||
|
||||
jQuery.hotkeys = {
|
||||
version: "0.8",
|
||||
|
||||
specialKeys: {
|
||||
8: "backspace",
|
||||
9: "tab",
|
||||
10: "return",
|
||||
13: "return",
|
||||
16: "shift",
|
||||
17: "ctrl",
|
||||
18: "alt",
|
||||
19: "pause",
|
||||
20: "capslock",
|
||||
27: "esc",
|
||||
32: "space",
|
||||
33: "pageup",
|
||||
34: "pagedown",
|
||||
35: "end",
|
||||
36: "home",
|
||||
37: "left",
|
||||
38: "up",
|
||||
39: "right",
|
||||
40: "down",
|
||||
45: "insert",
|
||||
46: "del",
|
||||
59: ";",
|
||||
61: "=",
|
||||
96: "0",
|
||||
97: "1",
|
||||
98: "2",
|
||||
99: "3",
|
||||
100: "4",
|
||||
101: "5",
|
||||
102: "6",
|
||||
103: "7",
|
||||
104: "8",
|
||||
105: "9",
|
||||
106: "*",
|
||||
107: "+",
|
||||
109: "-",
|
||||
110: ".",
|
||||
111: "/",
|
||||
112: "f1",
|
||||
113: "f2",
|
||||
114: "f3",
|
||||
115: "f4",
|
||||
116: "f5",
|
||||
117: "f6",
|
||||
118: "f7",
|
||||
119: "f8",
|
||||
120: "f9",
|
||||
121: "f10",
|
||||
122: "f11",
|
||||
123: "f12",
|
||||
144: "numlock",
|
||||
145: "scroll",
|
||||
173: "-",
|
||||
186: ";",
|
||||
187: "=",
|
||||
188: ",",
|
||||
189: "-",
|
||||
190: ".",
|
||||
191: "/",
|
||||
192: "`",
|
||||
219: "[",
|
||||
220: "\\",
|
||||
221: "]",
|
||||
222: "'"
|
||||
},
|
||||
|
||||
shiftNums: {
|
||||
"`": "~",
|
||||
"1": "!",
|
||||
"2": "@",
|
||||
"3": "#",
|
||||
"4": "$",
|
||||
"5": "%",
|
||||
"6": "^",
|
||||
"7": "&",
|
||||
"8": "*",
|
||||
"9": "(",
|
||||
"0": ")",
|
||||
"-": "_",
|
||||
"=": "+",
|
||||
";": ": ",
|
||||
"'": "\"",
|
||||
",": "<",
|
||||
".": ">",
|
||||
"/": "?",
|
||||
"\\": "|"
|
||||
},
|
||||
|
||||
// excludes: button, checkbox, file, hidden, image, password, radio, reset, search, submit, url
|
||||
textAcceptingInputTypes: [
|
||||
"text", "password", "number", "email", "url", "range", "date", "month", "week", "time", "datetime",
|
||||
"datetime-local", "search", "color", "tel"],
|
||||
|
||||
// default input types not to bind to unless bound directly
|
||||
textInputTypes: /textarea|input|select/i,
|
||||
|
||||
options: {
|
||||
filterInputAcceptingElements: true,
|
||||
filterTextInputs: true,
|
||||
filterContentEditable: true
|
||||
}
|
||||
};
|
||||
|
||||
function keyHandler(handleObj) {
|
||||
if (typeof handleObj.data === "string") {
|
||||
handleObj.data = {
|
||||
keys: handleObj.data
|
||||
};
|
||||
}
|
||||
|
||||
// Only care when a possible input has been specified
|
||||
if (!handleObj.data || !handleObj.data.keys || typeof handleObj.data.keys !== "string") {
|
||||
return;
|
||||
}
|
||||
|
||||
var origHandler = handleObj.handler,
|
||||
keys = handleObj.data.keys.toLowerCase().split(" ");
|
||||
|
||||
handleObj.handler = function(event) {
|
||||
// Don't fire in text-accepting inputs that we didn't directly bind to
|
||||
if (this !== event.target &&
|
||||
(jQuery.hotkeys.options.filterInputAcceptingElements &&
|
||||
jQuery.hotkeys.textInputTypes.test(event.target.nodeName) ||
|
||||
(jQuery.hotkeys.options.filterContentEditable && jQuery(event.target).attr('contenteditable')) ||
|
||||
(jQuery.hotkeys.options.filterTextInputs &&
|
||||
jQuery.inArray(event.target.type, jQuery.hotkeys.textAcceptingInputTypes) > -1))) {
|
||||
return;
|
||||
}
|
||||
|
||||
var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[event.which],
|
||||
character = String.fromCharCode(event.which).toLowerCase(),
|
||||
modif = "",
|
||||
possible = {};
|
||||
|
||||
jQuery.each(["alt", "ctrl", "shift"], function(index, specialKey) {
|
||||
|
||||
if (event[specialKey + 'Key'] && special !== specialKey) {
|
||||
modif += specialKey + '+';
|
||||
}
|
||||
});
|
||||
|
||||
// metaKey is triggered off ctrlKey erronously
|
||||
if (event.metaKey && !event.ctrlKey && special !== "meta") {
|
||||
modif += "meta+";
|
||||
}
|
||||
|
||||
if (event.metaKey && special !== "meta" && modif.indexOf("alt+ctrl+shift+") > -1) {
|
||||
modif = modif.replace("alt+ctrl+shift+", "hyper+");
|
||||
}
|
||||
|
||||
if (special) {
|
||||
possible[modif + special] = true;
|
||||
}
|
||||
else {
|
||||
possible[modif + character] = true;
|
||||
possible[modif + jQuery.hotkeys.shiftNums[character]] = true;
|
||||
|
||||
// "$" can be triggered as "Shift+4" or "Shift+$" or just "$"
|
||||
if (modif === "shift+") {
|
||||
possible[jQuery.hotkeys.shiftNums[character]] = true;
|
||||
}
|
||||
}
|
||||
|
||||
for (var i = 0, l = keys.length; i < l; i++) {
|
||||
if (possible[keys[i]]) {
|
||||
return origHandler.apply(this, arguments);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
jQuery.each(["keydown", "keyup", "keypress"], function() {
|
||||
jQuery.event.special[this] = {
|
||||
add: keyHandler
|
||||
};
|
||||
});
|
||||
|
||||
})(jQuery || this.jQuery || window.jQuery);
|
||||
2122
vendor/assets/javascripts/jquery.qtip.js
vendored
47
vendor/assets/javascripts/jquery.timeout.js
vendored
@@ -1,47 +0,0 @@
|
||||
/**
|
||||
* jquery.timeout.js
|
||||
*
|
||||
* Copyright (c) 2011 Thomas Kemmer <tkemmer@computer.org>
|
||||
*
|
||||
* http://code.google.com/p/jquery-timeout/
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
;(function($) {
|
||||
$.timeout = function(delay) {
|
||||
var deferred = $.Deferred(function(deferred) {
|
||||
deferred.timeoutID = window.setTimeout(function() {
|
||||
deferred.resolve();
|
||||
}, delay);
|
||||
|
||||
deferred.fail(function() {
|
||||
window.clearTimeout(deferred.timeoutID);
|
||||
});
|
||||
});
|
||||
|
||||
return $.extend(deferred.promise(), {
|
||||
clear: function() {
|
||||
deferred.reject();
|
||||
}
|
||||
});
|
||||
};
|
||||
})(jQuery);
|
||||
281
vendor/assets/javascripts/stupidtable.js
vendored
@@ -1,281 +0,0 @@
|
||||
// Stupid jQuery table plugin.
|
||||
|
||||
(function($) {
|
||||
$.fn.stupidtable = function(sortFns) {
|
||||
return this.each(function() {
|
||||
var $table = $(this);
|
||||
sortFns = sortFns || {};
|
||||
sortFns = $.extend({}, $.fn.stupidtable.default_sort_fns, sortFns);
|
||||
$table.data('sortFns', sortFns);
|
||||
$table.stupidtable_build();
|
||||
|
||||
$table.on("click.stupidtable", "thead th", function() {
|
||||
$(this).stupidsort();
|
||||
});
|
||||
|
||||
// Sort th immediately if data-sort-onload="yes" is specified. Limit to
|
||||
// the first one found - only one default sort column makes sense anyway.
|
||||
var $th_onload_sort = $table.find("th[data-sort-onload=yes]").eq(0);
|
||||
$th_onload_sort.stupidsort();
|
||||
});
|
||||
};
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// Default settings
|
||||
// ------------------------------------------------------------------
|
||||
$.fn.stupidtable.default_settings = {
|
||||
should_redraw: function(sort_info){
|
||||
return true;
|
||||
},
|
||||
will_manually_build_table: false
|
||||
};
|
||||
$.fn.stupidtable.dir = {ASC: "asc", DESC: "desc"};
|
||||
$.fn.stupidtable.default_sort_fns = {
|
||||
"int": function(a, b) {
|
||||
return parseInt(a, 10) - parseInt(b, 10);
|
||||
},
|
||||
"float": function(a, b) {
|
||||
return parseFloat(a) - parseFloat(b);
|
||||
},
|
||||
"string": function(a, b) {
|
||||
return a.toString().localeCompare(b.toString());
|
||||
},
|
||||
"string-ins": function(a, b) {
|
||||
a = a.toString().toLocaleLowerCase();
|
||||
b = b.toString().toLocaleLowerCase();
|
||||
return a.localeCompare(b);
|
||||
}
|
||||
};
|
||||
|
||||
// Allow specification of settings on a per-table basis. Call on a table
|
||||
// jquery object. Call *before* calling .stuidtable();
|
||||
$.fn.stupidtable_settings = function(settings) {
|
||||
return this.each(function() {
|
||||
var $table = $(this);
|
||||
var final_settings = $.extend({}, $.fn.stupidtable.default_settings, settings);
|
||||
$table.stupidtable.settings = final_settings;
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
// Expects $("#mytable").stupidtable() to have already been called.
|
||||
// Call on a table header.
|
||||
$.fn.stupidsort = function(force_direction){
|
||||
var $this_th = $(this);
|
||||
var datatype = $this_th.data("sort") || null;
|
||||
|
||||
// No datatype? Nothing to do.
|
||||
if (datatype === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
var dir = $.fn.stupidtable.dir;
|
||||
var $table = $this_th.closest("table");
|
||||
|
||||
var sort_info = {
|
||||
$th: $this_th,
|
||||
$table: $table,
|
||||
datatype: datatype
|
||||
};
|
||||
|
||||
|
||||
// Bring in default settings if none provided
|
||||
if(!$table.stupidtable.settings){
|
||||
$table.stupidtable.settings = $.extend({}, $.fn.stupidtable.default_settings);
|
||||
}
|
||||
|
||||
sort_info.compare_fn = $table.data('sortFns')[datatype];
|
||||
sort_info.th_index = calculateTHIndex(sort_info);
|
||||
sort_info.sort_dir = calculateSortDir(force_direction, sort_info);
|
||||
|
||||
$this_th.data("sort-dir", sort_info.sort_dir);
|
||||
$table.trigger("beforetablesort", {column: sort_info.th_index, direction: sort_info.sort_dir, $th: $this_th});
|
||||
|
||||
// More reliable method of forcing a redraw
|
||||
$table.css("display");
|
||||
|
||||
// Run sorting asynchronously on a timout to force browser redraw after
|
||||
// `beforetablesort` callback. Also avoids locking up the browser too much.
|
||||
setTimeout(function() {
|
||||
if(!$table.stupidtable.settings.will_manually_build_table){
|
||||
$table.stupidtable_build();
|
||||
}
|
||||
var table_structure = sortTable(sort_info);
|
||||
var trs = getTableRowsFromTableStructure(table_structure, sort_info);
|
||||
|
||||
if(!$table.stupidtable.settings.should_redraw(sort_info)){
|
||||
return;
|
||||
}
|
||||
$table.children("tbody").append(trs);
|
||||
|
||||
updateElementData(sort_info);
|
||||
$table.trigger("aftertablesort", {column: sort_info.th_index, direction: sort_info.sort_dir, $th: $this_th});
|
||||
$table.css("display");
|
||||
|
||||
}, 10);
|
||||
return $this_th;
|
||||
};
|
||||
|
||||
// Call on a sortable td to update its value in the sort. This should be the
|
||||
// only mechanism used to update a cell's sort value. If your display value is
|
||||
// different from your sort value, use jQuery's .text() or .html() to update
|
||||
// the td contents, Assumes stupidtable has already been called for the table.
|
||||
$.fn.updateSortVal = function(new_sort_val){
|
||||
var $this_td = $(this);
|
||||
if($this_td.is('[data-sort-value]')){
|
||||
// For visual consistency with the .data cache
|
||||
$this_td.attr('data-sort-value', new_sort_val);
|
||||
}
|
||||
$this_td.data("sort-value", new_sort_val);
|
||||
return $this_td;
|
||||
};
|
||||
|
||||
|
||||
$.fn.stupidtable_build = function(){
|
||||
return this.each(function() {
|
||||
var $table = $(this);
|
||||
var table_structure = [];
|
||||
var trs = $table.children("tbody").children("tr");
|
||||
trs.each(function(index,tr) {
|
||||
|
||||
// ====================================================================
|
||||
// Transfer to using internal table structure
|
||||
// ====================================================================
|
||||
var ele = {
|
||||
$tr: $(tr),
|
||||
columns: [],
|
||||
index: index
|
||||
};
|
||||
|
||||
$(tr).children('td').each(function(idx, td){
|
||||
var sort_val = $(td).data("sort-value");
|
||||
|
||||
// Store and read from the .data cache for display text only sorts
|
||||
// instead of looking through the DOM every time
|
||||
if(typeof(sort_val) === "undefined"){
|
||||
var txt = $(td).text();
|
||||
$(td).data('sort-value', txt);
|
||||
sort_val = txt;
|
||||
}
|
||||
ele.columns.push(sort_val);
|
||||
});
|
||||
table_structure.push(ele);
|
||||
});
|
||||
$table.data('stupidsort_internaltable', table_structure);
|
||||
});
|
||||
};
|
||||
|
||||
// ====================================================================
|
||||
// Private functions
|
||||
// ====================================================================
|
||||
var sortTable = function(sort_info){
|
||||
var table_structure = sort_info.$table.data('stupidsort_internaltable');
|
||||
var th_index = sort_info.th_index;
|
||||
var $th = sort_info.$th;
|
||||
|
||||
var multicolumn_target_str = $th.data('sort-multicolumn');
|
||||
var multicolumn_targets;
|
||||
if(multicolumn_target_str){
|
||||
multicolumn_targets = multicolumn_target_str.split(',');
|
||||
}
|
||||
else{
|
||||
multicolumn_targets = [];
|
||||
}
|
||||
var multicolumn_th_targets = $.map(multicolumn_targets, function(identifier, i){
|
||||
return get_th(sort_info.$table, identifier);
|
||||
});
|
||||
|
||||
table_structure.sort(function(e1, e2){
|
||||
var multicolumns = multicolumn_th_targets.slice(0); // shallow copy
|
||||
var diff = sort_info.compare_fn(e1.columns[th_index], e2.columns[th_index]);
|
||||
while(diff === 0 && multicolumns.length){
|
||||
var multicolumn = multicolumns[0];
|
||||
var datatype = multicolumn.$e.data("sort");
|
||||
var multiCloumnSortMethod = sort_info.$table.data('sortFns')[datatype];
|
||||
diff = multiCloumnSortMethod(e1.columns[multicolumn.index], e2.columns[multicolumn.index]);
|
||||
multicolumns.shift();
|
||||
}
|
||||
// Sort by position in the table if values are the same. This enforces a
|
||||
// stable sort across all browsers. See https://bugs.chromium.org/p/v8/issues/detail?id=90
|
||||
if (diff === 0)
|
||||
return e1.index - e2.index;
|
||||
else
|
||||
return diff;
|
||||
|
||||
});
|
||||
|
||||
if (sort_info.sort_dir != $.fn.stupidtable.dir.ASC){
|
||||
table_structure.reverse();
|
||||
}
|
||||
return table_structure;
|
||||
};
|
||||
|
||||
var get_th = function($table, identifier){
|
||||
// identifier can be a th id or a th index number;
|
||||
var $table_ths = $table.find('th');
|
||||
var index = parseInt(identifier, 10);
|
||||
var $th;
|
||||
if(!index && index !== 0){
|
||||
$th = $table_ths.siblings('#' + identifier);
|
||||
index = $table_ths.index($th);
|
||||
}
|
||||
else{
|
||||
$th = $table_ths.eq(index);
|
||||
}
|
||||
return {index: index, $e: $th};
|
||||
};
|
||||
|
||||
var getTableRowsFromTableStructure = function(table_structure, sort_info){
|
||||
// Gather individual column for callbacks
|
||||
var column = $.map(table_structure, function(ele, i){
|
||||
return [[ele.columns[sort_info.th_index], ele.$tr, i]];
|
||||
});
|
||||
|
||||
/* Side effect */
|
||||
sort_info.column = column;
|
||||
|
||||
// Replace the content of tbody with the sorted rows. Strangely
|
||||
// enough, .append accomplishes this for us.
|
||||
return $.map(table_structure, function(ele) { return ele.$tr; });
|
||||
|
||||
};
|
||||
|
||||
var updateElementData = function(sort_info){
|
||||
var $table = sort_info.$table;
|
||||
var $this_th = sort_info.$th;
|
||||
var sort_dir = $this_th.data('sort-dir');
|
||||
var th_index = sort_info.th_index;
|
||||
|
||||
|
||||
// Reset siblings
|
||||
$table.find("th").data("sort-dir", null).removeClass("sorting-desc sorting-asc");
|
||||
$this_th.data("sort-dir", sort_dir).addClass("sorting-"+sort_dir);
|
||||
};
|
||||
|
||||
var calculateSortDir = function(force_direction, sort_info){
|
||||
var sort_dir;
|
||||
var $this_th = sort_info.$th;
|
||||
var dir = $.fn.stupidtable.dir;
|
||||
|
||||
if(!!force_direction){
|
||||
sort_dir = force_direction;
|
||||
}
|
||||
else{
|
||||
sort_dir = force_direction || $this_th.data("sort-default") || dir.ASC;
|
||||
if ($this_th.data("sort-dir"))
|
||||
sort_dir = $this_th.data("sort-dir") === dir.ASC ? dir.DESC : dir.ASC;
|
||||
}
|
||||
return sort_dir;
|
||||
};
|
||||
|
||||
var calculateTHIndex = function(sort_info){
|
||||
var th_index = 0;
|
||||
var base_index = sort_info.$th.index();
|
||||
sort_info.$th.parents("tr").find("th").slice(0, base_index).each(function() {
|
||||
var cols = $(this).attr("colspan") || 1;
|
||||
th_index += parseInt(cols,10);
|
||||
});
|
||||
return th_index;
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
521
vendor/assets/javascripts/ugoira_player.js
vendored
@@ -1,521 +0,0 @@
|
||||
// Source: https://github.com/pixiv/zip_player
|
||||
|
||||
// Required for iOS <6, where Blob URLs are not available. This is slow...
|
||||
// Source: https://gist.github.com/jonleighton/958841
|
||||
function base64ArrayBuffer(arrayBuffer, off, byteLength) {
|
||||
var base64 = '';
|
||||
var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
||||
var bytes = new Uint8Array(arrayBuffer);
|
||||
var byteRemainder = byteLength % 3;
|
||||
var mainLength = off + byteLength - byteRemainder;
|
||||
var a, b, c, d;
|
||||
var chunk;
|
||||
// Main loop deals with bytes in chunks of 3
|
||||
for (var i = off; i < mainLength; i = i + 3) {
|
||||
// Combine the three bytes into a single integer
|
||||
chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];
|
||||
|
||||
// Use bitmasks to extract 6-bit segments from the triplet
|
||||
a = (chunk & 16515072) >> 18; // 16515072 = (2^6 - 1) << 18
|
||||
b = (chunk & 258048) >> 12; // 258048 = (2^6 - 1) << 12
|
||||
c = (chunk & 4032) >> 6; // 4032 = (2^6 - 1) << 6
|
||||
d = chunk & 63; // 63 = 2^6 - 1
|
||||
|
||||
// Convert the raw binary segments to the appropriate ASCII encoding
|
||||
base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d];
|
||||
}
|
||||
|
||||
// Deal with the remaining bytes and padding
|
||||
if (byteRemainder == 1) {
|
||||
chunk = bytes[mainLength];
|
||||
|
||||
a = (chunk & 252) >> 2; // 252 = (2^6 - 1) << 2
|
||||
|
||||
// Set the 4 least significant bits to zero
|
||||
b = (chunk & 3) << 4; // 3 = 2^2 - 1
|
||||
|
||||
base64 += encodings[a] + encodings[b] + '==';
|
||||
} else if (byteRemainder == 2) {
|
||||
chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1];
|
||||
|
||||
a = (chunk & 64512) >> 10; // 64512 = (2^6 - 1) << 10
|
||||
b = (chunk & 1008) >> 4; // 1008 = (2^6 - 1) << 4
|
||||
|
||||
// Set the 2 least significant bits to zero
|
||||
c = (chunk & 15) << 2; // 15 = 2^4 - 1
|
||||
|
||||
base64 += encodings[a] + encodings[b] + encodings[c] + '=';
|
||||
}
|
||||
|
||||
return base64;
|
||||
}
|
||||
|
||||
|
||||
function ZipImagePlayer(options) {
|
||||
this.op = options;
|
||||
this._URL = (window.URL || window.webkitURL || window.MozURL
|
||||
|| window.MSURL);
|
||||
this._Blob = (window.Blob || window.WebKitBlob || window.MozBlob
|
||||
|| window.MSBlob);
|
||||
this._BlobBuilder = (window.BlobBuilder || window.WebKitBlobBuilder
|
||||
|| window.MozBlobBuilder || window.MSBlobBuilder);
|
||||
this._Uint8Array = (window.Uint8Array || window.WebKitUint8Array
|
||||
|| window.MozUint8Array || window.MSUint8Array);
|
||||
this._DataView = (window.DataView || window.WebKitDataView
|
||||
|| window.MozDataView || window.MSDataView);
|
||||
this._ArrayBuffer = (window.ArrayBuffer || window.WebKitArrayBuffer
|
||||
|| window.MozArrayBuffer || window.MSArrayBuffer);
|
||||
this._maxLoadAhead = 0;
|
||||
if (!this._URL) {
|
||||
this._debugLog("No URL support! Will use slower data: URLs.");
|
||||
// Throttle loading to avoid making playback stalling completely while
|
||||
// loading images...
|
||||
this._maxLoadAhead = 10;
|
||||
}
|
||||
if (!this._Blob) {
|
||||
this._error("No Blob support");
|
||||
}
|
||||
if (!this._Uint8Array) {
|
||||
this._error("No Uint8Array support");
|
||||
}
|
||||
if (!this._DataView) {
|
||||
this._error("No DataView support");
|
||||
}
|
||||
if (!this._ArrayBuffer) {
|
||||
this._error("No ArrayBuffer support");
|
||||
}
|
||||
this._isSafari = Object.prototype.toString.call(
|
||||
window.HTMLElement).indexOf('Constructor') > 0;
|
||||
this._loadingState = 0;
|
||||
this._dead = false;
|
||||
this._context = options.canvas.getContext("2d");
|
||||
this._files = {};
|
||||
this._frameCount = this.op.metadata.frames.length;
|
||||
this._debugLog("Frame count: " + this._frameCount);
|
||||
this._frame = 0;
|
||||
this._loadFrame = 0;
|
||||
this._frameImages = [];
|
||||
this._paused = false;
|
||||
this._loadTimer = null;
|
||||
this._startLoad();
|
||||
if (this.op.autoStart) {
|
||||
this.play();
|
||||
} else {
|
||||
this._paused = true;
|
||||
}
|
||||
}
|
||||
|
||||
ZipImagePlayer.prototype = {
|
||||
_trailerBytes: 30000,
|
||||
_failed: false,
|
||||
_mkerr: function(msg) {
|
||||
var _this = this;
|
||||
return function() {
|
||||
_this._error(msg);
|
||||
}
|
||||
},
|
||||
_error: function(msg) {
|
||||
this._failed = true;
|
||||
throw Error("ZipImagePlayer error: " + msg);
|
||||
},
|
||||
_debugLog: function(msg) {
|
||||
if (this.op.debug) {
|
||||
console.log(msg);
|
||||
}
|
||||
},
|
||||
_load: function(offset, length, callback) {
|
||||
var _this = this;
|
||||
// Unfortunately JQuery doesn't support ArrayBuffer XHR
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.addEventListener("load", function(ev) {
|
||||
if (_this._dead) {
|
||||
return;
|
||||
}
|
||||
_this._debugLog("Load: " + offset + " " + length + " status=" +
|
||||
xhr.status);
|
||||
if (xhr.status == 200) {
|
||||
_this._debugLog("Range disabled or unsupported, complete load");
|
||||
offset = 0;
|
||||
length = xhr.response.byteLength;
|
||||
_this._len = length;
|
||||
_this._buf = xhr.response;
|
||||
_this._bytes = new _this._Uint8Array(_this._buf);
|
||||
} else {
|
||||
if (xhr.status != 206) {
|
||||
_this._error("Unexpected HTTP status " + xhr.status);
|
||||
}
|
||||
if (xhr.response.byteLength != length) {
|
||||
_this._error("Unexpected length " +
|
||||
xhr.response.byteLength +
|
||||
" (expected " + length + ")");
|
||||
}
|
||||
_this._bytes.set(new _this._Uint8Array(xhr.response), offset);
|
||||
}
|
||||
if (callback) {
|
||||
callback.apply(_this, [offset, length]);
|
||||
}
|
||||
}, false);
|
||||
xhr.addEventListener("error", this._mkerr("Fetch failed"), false);
|
||||
xhr.open("GET", this.op.source);
|
||||
xhr.responseType = "arraybuffer";
|
||||
if (offset != null && length != null) {
|
||||
var end = offset + length;
|
||||
xhr.setRequestHeader("Range", "bytes=" + offset + "-" + (end - 1));
|
||||
if (this._isSafari) {
|
||||
// Range request caching is broken in Safari
|
||||
// https://bugs.webkit.org/show_bug.cgi?id=82672
|
||||
xhr.setRequestHeader("Cache-control", "no-cache");
|
||||
xhr.setRequestHeader("If-None-Match", Math.random().toString());
|
||||
}
|
||||
}
|
||||
/*this._debugLog("Load: " + offset + " " + length);*/
|
||||
xhr.send();
|
||||
},
|
||||
_startLoad: function() {
|
||||
var _this = this;
|
||||
if (!this.op.source) {
|
||||
// Unpacked mode (individiual frame URLs) - just load the frames.
|
||||
this._loadNextFrame();
|
||||
return;
|
||||
}
|
||||
$.ajax({
|
||||
url: this.op.source,
|
||||
type: "HEAD"
|
||||
}).done(function(data, status, xhr) {
|
||||
if (_this._dead) {
|
||||
return;
|
||||
}
|
||||
_this._pHead = 0;
|
||||
_this._pNextHead = 0;
|
||||
_this._pFetch = 0;
|
||||
var len = parseInt(xhr.getResponseHeader("Content-Length"));
|
||||
if (!len) {
|
||||
_this._debugLog("HEAD request failed: invalid file length.");
|
||||
_this._debugLog("Falling back to full file mode.");
|
||||
_this._load(null, null, function(off, len) {
|
||||
_this._pTail = 0;
|
||||
_this._pHead = len;
|
||||
_this._findCentralDirectory();
|
||||
});
|
||||
return;
|
||||
}
|
||||
_this._debugLog("Len: " + len);
|
||||
_this._len = len;
|
||||
_this._buf = new _this._ArrayBuffer(len);
|
||||
_this._bytes = new _this._Uint8Array(_this._buf);
|
||||
var off = len - _this._trailerBytes;
|
||||
if (off < 0) {
|
||||
off = 0;
|
||||
}
|
||||
_this._pTail = len;
|
||||
_this._load(off, len - off, function(off, len) {
|
||||
_this._pTail = off;
|
||||
_this._findCentralDirectory();
|
||||
});
|
||||
}).fail(this._mkerr("Length fetch failed"));
|
||||
},
|
||||
_findCentralDirectory: function() {
|
||||
// No support for ZIP file comment
|
||||
var dv = new this._DataView(this._buf, this._len - 22, 22);
|
||||
if (dv.getUint32(0, true) != 0x06054b50) {
|
||||
this._error("End of Central Directory signature not found");
|
||||
}
|
||||
var cd_count = dv.getUint16(10, true);
|
||||
var cd_size = dv.getUint32(12, true);
|
||||
var cd_off = dv.getUint32(16, true);
|
||||
if (cd_off < this._pTail) {
|
||||
this._load(cd_off, this._pTail - cd_off, function() {
|
||||
this._pTail = cd_off;
|
||||
this._readCentralDirectory(cd_off, cd_size, cd_count);
|
||||
});
|
||||
} else {
|
||||
this._readCentralDirectory(cd_off, cd_size, cd_count);
|
||||
}
|
||||
},
|
||||
_readCentralDirectory: function(offset, size, count) {
|
||||
var dv = new this._DataView(this._buf, offset, size);
|
||||
var p = 0;
|
||||
for (var i = 0; i < count; i++ ) {
|
||||
if (dv.getUint32(p, true) != 0x02014b50) {
|
||||
this._error("Invalid Central Directory signature");
|
||||
}
|
||||
var compMethod = dv.getUint16(p + 10, true);
|
||||
var uncompSize = dv.getUint32(p + 24, true);
|
||||
var nameLen = dv.getUint16(p + 28, true);
|
||||
var extraLen = dv.getUint16(p + 30, true);
|
||||
var cmtLen = dv.getUint16(p + 32, true);
|
||||
var off = dv.getUint32(p + 42, true);
|
||||
if (compMethod != 0) {
|
||||
this._error("Unsupported compression method");
|
||||
}
|
||||
p += 46;
|
||||
var nameView = new this._Uint8Array(this._buf, offset + p, nameLen);
|
||||
var name = "";
|
||||
for (var j = 0; j < nameLen; j++) {
|
||||
name += String.fromCharCode(nameView[j]);
|
||||
}
|
||||
p += nameLen + extraLen + cmtLen;
|
||||
/*this._debugLog("File: " + name + " (" + uncompSize +
|
||||
" bytes @ " + off + ")");*/
|
||||
this._files[name] = {off: off, len: uncompSize};
|
||||
}
|
||||
// Two outstanding fetches at any given time.
|
||||
// Note: the implementation does not support more than two.
|
||||
if (this._pHead >= this._pTail) {
|
||||
this._pHead = this._len;
|
||||
$(this).triggerHandler("loadProgress", [this._pHead / this._len]);
|
||||
this._loadNextFrame();
|
||||
} else {
|
||||
this._loadNextChunk();
|
||||
this._loadNextChunk();
|
||||
}
|
||||
},
|
||||
_loadNextChunk: function() {
|
||||
if (this._pFetch >= this._pTail) {
|
||||
return;
|
||||
}
|
||||
var off = this._pFetch;
|
||||
var len = this.op.chunkSize;
|
||||
if (this._pFetch + len > this._pTail) {
|
||||
len = this._pTail - this._pFetch;
|
||||
}
|
||||
this._pFetch += len;
|
||||
this._load(off, len, function() {
|
||||
if (off == this._pHead) {
|
||||
if (this._pNextHead) {
|
||||
this._pHead = this._pNextHead;
|
||||
this._pNextHead = 0;
|
||||
} else {
|
||||
this._pHead = off + len;
|
||||
}
|
||||
if (this._pHead >= this._pTail) {
|
||||
this._pHead = this._len;
|
||||
}
|
||||
/*this._debugLog("New pHead: " + this._pHead);*/
|
||||
$(this).triggerHandler("loadProgress",
|
||||
[this._pHead / this._len]);
|
||||
if (!this._loadTimer) {
|
||||
this._loadNextFrame();
|
||||
}
|
||||
} else {
|
||||
this._pNextHead = off + len;
|
||||
}
|
||||
this._loadNextChunk();
|
||||
});
|
||||
},
|
||||
_fileDataStart: function(offset) {
|
||||
var dv = new DataView(this._buf, offset, 30);
|
||||
var nameLen = dv.getUint16(26, true);
|
||||
var extraLen = dv.getUint16(28, true);
|
||||
return offset + 30 + nameLen + extraLen;
|
||||
},
|
||||
_isFileAvailable: function(name) {
|
||||
var info = this._files[name];
|
||||
if (!info) {
|
||||
this._error("File " + name + " not found in ZIP");
|
||||
}
|
||||
if (this._pHead < (info.off + 30)) {
|
||||
return false;
|
||||
}
|
||||
return this._pHead >= (this._fileDataStart(info.off) + info.len);
|
||||
},
|
||||
_loadNextFrame: function() {
|
||||
if (this._dead) {
|
||||
return;
|
||||
}
|
||||
var frame = this._loadFrame;
|
||||
if (frame >= this._frameCount) {
|
||||
return;
|
||||
}
|
||||
var meta = this.op.metadata.frames[frame];
|
||||
if (!this.op.source) {
|
||||
// Unpacked mode (individiual frame URLs)
|
||||
this._loadFrame += 1;
|
||||
this._loadImage(frame, meta.file, false);
|
||||
return;
|
||||
}
|
||||
if (!this._isFileAvailable(meta.file)) {
|
||||
return;
|
||||
}
|
||||
this._loadFrame += 1;
|
||||
var off = this._fileDataStart(this._files[meta.file].off);
|
||||
var end = off + this._files[meta.file].len;
|
||||
var url;
|
||||
var mime_type = this.op.metadata.mime_type || "image/png";
|
||||
if (this._URL) {
|
||||
var slice;
|
||||
if (!this._buf.slice) {
|
||||
slice = new this._ArrayBuffer(this._files[meta.file].len);
|
||||
var view = new this._Uint8Array(slice);
|
||||
view.set(this._bytes.subarray(off, end));
|
||||
} else {
|
||||
slice = this._buf.slice(off, end);
|
||||
}
|
||||
var blob;
|
||||
try {
|
||||
blob = new this._Blob([slice], {type: mime_type});
|
||||
}
|
||||
catch (err) {
|
||||
this._debugLog("Blob constructor failed. Trying BlobBuilder..."
|
||||
+ " (" + err.message + ")");
|
||||
var bb = new this._BlobBuilder();
|
||||
bb.append(slice);
|
||||
blob = bb.getBlob();
|
||||
}
|
||||
/*_this._debugLog("Loading " + meta.file + " to frame " + frame);*/
|
||||
url = this._URL.createObjectURL(blob);
|
||||
this._loadImage(frame, url, true);
|
||||
} else {
|
||||
url = ("data:" + mime_type + ";base64,"
|
||||
+ base64ArrayBuffer(this._buf, off, end - off));
|
||||
this._loadImage(frame, url, false);
|
||||
}
|
||||
},
|
||||
_loadImage: function(frame, url, isBlob) {
|
||||
var _this = this;
|
||||
var image = new Image();
|
||||
var meta = this.op.metadata.frames[frame];
|
||||
image.addEventListener('load', function() {
|
||||
_this._debugLog("Loaded " + meta.file + " to frame " + frame);
|
||||
if (isBlob) {
|
||||
_this._URL.revokeObjectURL(url);
|
||||
}
|
||||
if (_this._dead) {
|
||||
return;
|
||||
}
|
||||
_this._frameImages[frame] = image;
|
||||
$(_this).triggerHandler("frameLoaded", frame);
|
||||
if (_this._loadingState == 0) {
|
||||
_this._displayFrame.apply(_this);
|
||||
}
|
||||
if (frame >= (_this._frameCount - 1)) {
|
||||
_this._setLoadingState(2);
|
||||
_this._buf = null;
|
||||
_this._bytes = null;
|
||||
} else {
|
||||
if (!_this._maxLoadAhead ||
|
||||
(frame - _this._frame) < _this._maxLoadAhead) {
|
||||
_this._loadNextFrame();
|
||||
} else if (!_this._loadTimer) {
|
||||
_this._loadTimer = setTimeout(function() {
|
||||
_this._loadTimer = null;
|
||||
_this._loadNextFrame();
|
||||
}, 200);
|
||||
}
|
||||
}
|
||||
});
|
||||
image.src = url;
|
||||
},
|
||||
_setLoadingState: function(state) {
|
||||
if (this._loadingState != state) {
|
||||
this._loadingState = state;
|
||||
$(this).triggerHandler("loadingStateChanged", [state]);
|
||||
}
|
||||
},
|
||||
_displayFrame: function() {
|
||||
if (this._dead) {
|
||||
return;
|
||||
}
|
||||
var _this = this;
|
||||
var meta = this.op.metadata.frames[this._frame];
|
||||
this._debugLog("Displaying frame: " + this._frame + " " + meta.file);
|
||||
var image = this._frameImages[this._frame];
|
||||
if (!image) {
|
||||
this._debugLog("Image not available!");
|
||||
this._setLoadingState(0);
|
||||
return;
|
||||
}
|
||||
if (this._loadingState != 2) {
|
||||
this._setLoadingState(1);
|
||||
}
|
||||
if (this.op.autosize) {
|
||||
if (this._context.canvas.width != image.width || this._context.canvas.height != image.height) {
|
||||
// make the canvas autosize itself according to the images drawn on it
|
||||
// should set it once, since we don't have variable sized frames
|
||||
this._context.canvas.width = image.width;
|
||||
this._context.canvas.height = image.height;
|
||||
}
|
||||
};
|
||||
this._context.clearRect(0, 0, this.op.canvas.width,
|
||||
this.op.canvas.height);
|
||||
this._context.drawImage(image, 0, 0);
|
||||
$(this).triggerHandler("frame", this._frame);
|
||||
if (!this._paused) {
|
||||
this._timer = setTimeout(function() {
|
||||
_this._timer = null;
|
||||
_this._nextFrame.apply(_this);
|
||||
}, meta.delay);
|
||||
}
|
||||
},
|
||||
_nextFrame: function(frame) {
|
||||
if (this._frame >= (this._frameCount - 1)) {
|
||||
if (this.op.loop) {
|
||||
this._frame = 0;
|
||||
} else {
|
||||
this.pause();
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
this._frame += 1;
|
||||
}
|
||||
this._displayFrame();
|
||||
},
|
||||
play: function() {
|
||||
if (this._dead) {
|
||||
return;
|
||||
}
|
||||
if (this._paused) {
|
||||
$(this).triggerHandler("play", [this._frame]);
|
||||
this._paused = false;
|
||||
this._displayFrame();
|
||||
}
|
||||
},
|
||||
pause: function() {
|
||||
if (this._dead) {
|
||||
return;
|
||||
}
|
||||
if (!this._paused) {
|
||||
if (this._timer) {
|
||||
clearTimeout(this._timer);
|
||||
}
|
||||
this._paused = true;
|
||||
$(this).triggerHandler("pause", [this._frame]);
|
||||
}
|
||||
},
|
||||
rewind: function() {
|
||||
if (this._dead) {
|
||||
return;
|
||||
}
|
||||
this._frame = 0;
|
||||
if (this._timer) {
|
||||
clearTimeout(this._timer);
|
||||
}
|
||||
this._displayFrame();
|
||||
},
|
||||
stop: function() {
|
||||
this._debugLog("Stopped!");
|
||||
this._dead = true;
|
||||
if (this._timer) {
|
||||
clearTimeout(this._timer);
|
||||
}
|
||||
if (this._loadTimer) {
|
||||
clearTimeout(this._loadTimer);
|
||||
}
|
||||
this._frameImages = null;
|
||||
this._buf = null;
|
||||
this._bytes = null;
|
||||
$(this).triggerHandler("stop");
|
||||
},
|
||||
getCurrentFrame: function() {
|
||||
return this._frame;
|
||||
},
|
||||
getLoadedFrames: function() {
|
||||
return this._frameImages.length;
|
||||
},
|
||||
getFrameCount: function() {
|
||||
return this._frameCount;
|
||||
},
|
||||
hasError: function() {
|
||||
return this._failed;
|
||||
}
|
||||
}
|
||||
90
vendor/assets/stylesheets/jquery.dropdown.scss
vendored
@@ -1,90 +0,0 @@
|
||||
/* jQuery Dropdown: A simple dropdown plugin
|
||||
*
|
||||
* Contribute: https://github.com/claviska/jquery-dropdown
|
||||
*
|
||||
* @license: MIT license: http://opensource.org/licenses/MIT
|
||||
*
|
||||
*/
|
||||
.jq-dropdown {
|
||||
position: absolute;
|
||||
z-index: 1039;
|
||||
display: none;
|
||||
}
|
||||
.jq-dropdown .jq-dropdown-menu,
|
||||
.jq-dropdown .jq-dropdown-panel {
|
||||
min-width: 160px;
|
||||
max-width: 360px;
|
||||
list-style: none;
|
||||
background: white;
|
||||
border: solid 1px #ddd;
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
|
||||
overflow: visible;
|
||||
padding: 4px 0;
|
||||
margin: 0;
|
||||
}
|
||||
.jq-dropdown .jq-dropdown-panel {
|
||||
padding: 10px;
|
||||
}
|
||||
.jq-dropdown.jq-dropdown-tip {
|
||||
margin-top: 8px;
|
||||
}
|
||||
.jq-dropdown.jq-dropdown-tip:before {
|
||||
position: absolute;
|
||||
top: -6px;
|
||||
left: 9px;
|
||||
content: "";
|
||||
border-left: 7px solid transparent;
|
||||
border-right: 7px solid transparent;
|
||||
border-bottom: 7px solid #ddd;
|
||||
display: inline-block;
|
||||
}
|
||||
.jq-dropdown.jq-dropdown-tip:after {
|
||||
position: absolute;
|
||||
top: -5px;
|
||||
left: 10px;
|
||||
content: "";
|
||||
border-left: 6px solid transparent;
|
||||
border-right: 6px solid transparent;
|
||||
border-bottom: 6px solid white;
|
||||
display: inline-block;
|
||||
}
|
||||
.jq-dropdown.jq-dropdown-tip.jq-dropdown-anchor-right:before {
|
||||
left: auto;
|
||||
right: 9px;
|
||||
}
|
||||
.jq-dropdown.jq-dropdown-tip.jq-dropdown-anchor-right:after {
|
||||
left: auto;
|
||||
right: 10px;
|
||||
}
|
||||
.jq-dropdown.jq-dropdown-scroll .jq-dropdown-menu,
|
||||
.jq-dropdown.jq-dropdown-scroll .jq-dropdown-panel {
|
||||
max-height: 180px;
|
||||
overflow: auto;
|
||||
}
|
||||
.jq-dropdown .jq-dropdown-menu li {
|
||||
list-style: none;
|
||||
padding: 0 0;
|
||||
text-indent: 0;
|
||||
margin: 0;
|
||||
line-height: 18px;
|
||||
}
|
||||
.jq-dropdown .jq-dropdown-menu li > a,
|
||||
.jq-dropdown .jq-dropdown-menu label {
|
||||
display: block;
|
||||
text-decoration: none;
|
||||
line-height: 18px;
|
||||
padding: 3px 15px;
|
||||
margin: 0;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.jq-dropdown .jq-dropdown-menu li > a:hover,
|
||||
.jq-dropdown .jq-dropdown-menu label:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
.jq-dropdown .jq-dropdown-menu .jq-dropdown-divider {
|
||||
font-size: 1px;
|
||||
border-top: solid 1px #e5e5e5;
|
||||
padding: 0;
|
||||
margin: 5px 0;
|
||||
}
|
||||
557
vendor/assets/stylesheets/jquery.qtip.scss
vendored
@@ -1,557 +0,0 @@
|
||||
/*
|
||||
* qTip2 - Pretty powerful tooltips - v3.0.3
|
||||
* http://qtip2.com
|
||||
*
|
||||
* Copyright (c) 2017
|
||||
* Released under the MIT licenses
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* Date: Tue Aug 29 2017 06:03 EDT-0400
|
||||
* Plugins: viewport
|
||||
* Styles: core basic css3
|
||||
*/
|
||||
.qtip{
|
||||
position: absolute;
|
||||
left: -28000px;
|
||||
top: -28000px;
|
||||
display: none;
|
||||
|
||||
max-width: 280px;
|
||||
min-width: 50px;
|
||||
|
||||
font-size: 10.5px;
|
||||
line-height: 12px;
|
||||
|
||||
direction: ltr;
|
||||
|
||||
box-shadow: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.qtip-content{
|
||||
position: relative;
|
||||
padding: 5px 9px;
|
||||
overflow: hidden;
|
||||
|
||||
text-align: left;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
.qtip-titlebar{
|
||||
position: relative;
|
||||
padding: 5px 35px 5px 10px;
|
||||
overflow: hidden;
|
||||
|
||||
border-width: 0 0 1px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.qtip-titlebar + .qtip-content{ border-top-width: 0 !important; }
|
||||
|
||||
/* Default close button class */
|
||||
.qtip-close{
|
||||
position: absolute;
|
||||
right: -9px; top: -9px;
|
||||
z-index: 11; /* Overlap .qtip-tip */
|
||||
|
||||
cursor: pointer;
|
||||
outline: medium none;
|
||||
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
|
||||
.qtip-titlebar .qtip-close{
|
||||
right: 4px; top: 50%;
|
||||
margin-top: -9px;
|
||||
}
|
||||
|
||||
* html .qtip-titlebar .qtip-close{ top: 16px; } /* IE fix */
|
||||
|
||||
.qtip-titlebar .ui-icon,
|
||||
.qtip-icon .ui-icon{
|
||||
display: block;
|
||||
text-indent: -1000em;
|
||||
direction: ltr;
|
||||
}
|
||||
|
||||
.qtip-icon, .qtip-icon .ui-icon{
|
||||
-moz-border-radius: 3px;
|
||||
-webkit-border-radius: 3px;
|
||||
border-radius: 3px;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.qtip-icon .ui-icon{
|
||||
width: 18px;
|
||||
height: 14px;
|
||||
|
||||
line-height: 14px;
|
||||
text-align: center;
|
||||
text-indent: 0;
|
||||
font: normal bold 10px/13px Tahoma,sans-serif;
|
||||
|
||||
color: inherit;
|
||||
background: transparent none no-repeat -100em -100em;
|
||||
}
|
||||
|
||||
/* Applied to 'focused' tooltips e.g. most recently displayed/interacted with */
|
||||
.qtip-focus{}
|
||||
|
||||
/* Applied on hover of tooltips i.e. added/removed on mouseenter/mouseleave respectively */
|
||||
.qtip-hover{}
|
||||
|
||||
/* Default tooltip style */
|
||||
.qtip-default{
|
||||
border: 1px solid #F1D031;
|
||||
|
||||
background-color: #FFFFA3;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.qtip-default .qtip-titlebar{
|
||||
background-color: #FFEF93;
|
||||
}
|
||||
|
||||
.qtip-default .qtip-icon{
|
||||
border-color: #CCC;
|
||||
background: #F1F1F1;
|
||||
color: #777;
|
||||
}
|
||||
|
||||
.qtip-default .qtip-titlebar .qtip-close{
|
||||
border-color: #AAA;
|
||||
color: #111;
|
||||
}
|
||||
|
||||
|
||||
/*! Light tooltip style */
|
||||
.qtip-light{
|
||||
background-color: white;
|
||||
border-color: #E2E2E2;
|
||||
color: #454545;
|
||||
}
|
||||
|
||||
.qtip-light .qtip-titlebar{
|
||||
background-color: #f1f1f1;
|
||||
}
|
||||
|
||||
|
||||
/*! Dark tooltip style */
|
||||
.qtip-dark{
|
||||
background-color: #505050;
|
||||
border-color: #303030;
|
||||
color: #f3f3f3;
|
||||
}
|
||||
|
||||
.qtip-dark .qtip-titlebar{
|
||||
background-color: #404040;
|
||||
}
|
||||
|
||||
.qtip-dark .qtip-icon{
|
||||
border-color: #444;
|
||||
}
|
||||
|
||||
.qtip-dark .qtip-titlebar .ui-state-hover{
|
||||
border-color: #303030;
|
||||
}
|
||||
|
||||
|
||||
/*! Cream tooltip style */
|
||||
.qtip-cream{
|
||||
background-color: #FBF7AA;
|
||||
border-color: #F9E98E;
|
||||
color: #A27D35;
|
||||
}
|
||||
|
||||
.qtip-cream .qtip-titlebar{
|
||||
background-color: #F0DE7D;
|
||||
}
|
||||
|
||||
.qtip-cream .qtip-close .qtip-icon{
|
||||
background-position: -82px 0;
|
||||
}
|
||||
|
||||
|
||||
/*! Red tooltip style */
|
||||
.qtip-red{
|
||||
background-color: #F78B83;
|
||||
border-color: #D95252;
|
||||
color: #912323;
|
||||
}
|
||||
|
||||
.qtip-red .qtip-titlebar{
|
||||
background-color: #F06D65;
|
||||
}
|
||||
|
||||
.qtip-red .qtip-close .qtip-icon{
|
||||
background-position: -102px 0;
|
||||
}
|
||||
|
||||
.qtip-red .qtip-icon{
|
||||
border-color: #D95252;
|
||||
}
|
||||
|
||||
.qtip-red .qtip-titlebar .ui-state-hover{
|
||||
border-color: #D95252;
|
||||
}
|
||||
|
||||
|
||||
/*! Green tooltip style */
|
||||
.qtip-green{
|
||||
background-color: #CAED9E;
|
||||
border-color: #90D93F;
|
||||
color: #3F6219;
|
||||
}
|
||||
|
||||
.qtip-green .qtip-titlebar{
|
||||
background-color: #B0DE78;
|
||||
}
|
||||
|
||||
.qtip-green .qtip-close .qtip-icon{
|
||||
background-position: -42px 0;
|
||||
}
|
||||
|
||||
|
||||
/*! Blue tooltip style */
|
||||
.qtip-blue{
|
||||
background-color: #E5F6FE;
|
||||
border-color: #ADD9ED;
|
||||
color: #5E99BD;
|
||||
}
|
||||
|
||||
.qtip-blue .qtip-titlebar{
|
||||
background-color: #D0E9F5;
|
||||
}
|
||||
|
||||
.qtip-blue .qtip-close .qtip-icon{
|
||||
background-position: -2px 0;
|
||||
}
|
||||
|
||||
|
||||
.qtip-shadow{
|
||||
-webkit-box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15);
|
||||
-moz-box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15);
|
||||
box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
|
||||
/* Add rounded corners to your tooltips in: FF3+, Chrome 2+, Opera 10.6+, IE9+, Safari 2+ */
|
||||
.qtip-rounded,
|
||||
.qtip-tipsy,
|
||||
.qtip-bootstrap{
|
||||
-moz-border-radius: 5px;
|
||||
-webkit-border-radius: 5px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.qtip-rounded .qtip-titlebar{
|
||||
-moz-border-radius: 4px 4px 0 0;
|
||||
-webkit-border-radius: 4px 4px 0 0;
|
||||
border-radius: 4px 4px 0 0;
|
||||
}
|
||||
|
||||
/* Youtube tooltip style */
|
||||
.qtip-youtube{
|
||||
-moz-border-radius: 2px;
|
||||
-webkit-border-radius: 2px;
|
||||
border-radius: 2px;
|
||||
|
||||
-webkit-box-shadow: 0 0 3px #333;
|
||||
-moz-box-shadow: 0 0 3px #333;
|
||||
box-shadow: 0 0 3px #333;
|
||||
|
||||
color: white;
|
||||
border: 0 solid transparent;
|
||||
|
||||
background: #4A4A4A;
|
||||
background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0,#4A4A4A),color-stop(100%,black));
|
||||
background-image: -webkit-linear-gradient(top,#4A4A4A 0,black 100%);
|
||||
background-image: -moz-linear-gradient(top,#4A4A4A 0,black 100%);
|
||||
background-image: -ms-linear-gradient(top,#4A4A4A 0,black 100%);
|
||||
background-image: -o-linear-gradient(top,#4A4A4A 0,black 100%);
|
||||
}
|
||||
|
||||
.qtip-youtube .qtip-titlebar{
|
||||
background-color: #4A4A4A;
|
||||
background-color: rgba(0,0,0,0);
|
||||
}
|
||||
|
||||
.qtip-youtube .qtip-content{
|
||||
padding: .75em;
|
||||
font: 12px arial,sans-serif;
|
||||
|
||||
filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#4a4a4a,EndColorStr=#000000);
|
||||
-ms-filter: "progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#4a4a4a,EndColorStr=#000000);";
|
||||
}
|
||||
|
||||
.qtip-youtube .qtip-icon{
|
||||
border-color: #222;
|
||||
}
|
||||
|
||||
.qtip-youtube .qtip-titlebar .ui-state-hover{
|
||||
border-color: #303030;
|
||||
}
|
||||
|
||||
|
||||
/* jQuery TOOLS Tooltip style */
|
||||
.qtip-jtools{
|
||||
background: #232323;
|
||||
background: rgba(0, 0, 0, 0.7);
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#717171), to(#232323));
|
||||
background-image: -moz-linear-gradient(top, #717171, #232323);
|
||||
background-image: -webkit-linear-gradient(top, #717171, #232323);
|
||||
background-image: -ms-linear-gradient(top, #717171, #232323);
|
||||
background-image: -o-linear-gradient(top, #717171, #232323);
|
||||
|
||||
border: 2px solid #ddd;
|
||||
border: 2px solid rgba(241,241,241,1);
|
||||
|
||||
-moz-border-radius: 2px;
|
||||
-webkit-border-radius: 2px;
|
||||
border-radius: 2px;
|
||||
|
||||
-webkit-box-shadow: 0 0 12px #333;
|
||||
-moz-box-shadow: 0 0 12px #333;
|
||||
box-shadow: 0 0 12px #333;
|
||||
}
|
||||
|
||||
/* IE Specific */
|
||||
.qtip-jtools .qtip-titlebar{
|
||||
background-color: transparent;
|
||||
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A);
|
||||
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A)";
|
||||
}
|
||||
.qtip-jtools .qtip-content{
|
||||
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323);
|
||||
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323)";
|
||||
}
|
||||
|
||||
.qtip-jtools .qtip-titlebar,
|
||||
.qtip-jtools .qtip-content{
|
||||
background: transparent;
|
||||
color: white;
|
||||
border: 0 dashed transparent;
|
||||
}
|
||||
|
||||
.qtip-jtools .qtip-icon{
|
||||
border-color: #555;
|
||||
}
|
||||
|
||||
.qtip-jtools .qtip-titlebar .ui-state-hover{
|
||||
border-color: #333;
|
||||
}
|
||||
|
||||
|
||||
/* Cluetip style */
|
||||
.qtip-cluetip{
|
||||
-webkit-box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4);
|
||||
-moz-box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4);
|
||||
box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4);
|
||||
|
||||
background-color: #D9D9C2;
|
||||
color: #111;
|
||||
border: 0 dashed transparent;
|
||||
}
|
||||
|
||||
.qtip-cluetip .qtip-titlebar{
|
||||
background-color: #87876A;
|
||||
color: white;
|
||||
border: 0 dashed transparent;
|
||||
}
|
||||
|
||||
.qtip-cluetip .qtip-icon{
|
||||
border-color: #808064;
|
||||
}
|
||||
|
||||
.qtip-cluetip .qtip-titlebar .ui-state-hover{
|
||||
border-color: #696952;
|
||||
color: #696952;
|
||||
}
|
||||
|
||||
|
||||
/* Tipsy style */
|
||||
.qtip-tipsy{
|
||||
background: black;
|
||||
background: rgba(0, 0, 0, .87);
|
||||
|
||||
color: white;
|
||||
border: 0 solid transparent;
|
||||
|
||||
font-size: 11px;
|
||||
font-family: 'Lucida Grande', sans-serif;
|
||||
font-weight: bold;
|
||||
line-height: 16px;
|
||||
text-shadow: 0 1px black;
|
||||
}
|
||||
|
||||
.qtip-tipsy .qtip-titlebar{
|
||||
padding: 6px 35px 0 10px;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.qtip-tipsy .qtip-content{
|
||||
padding: 6px 10px;
|
||||
}
|
||||
|
||||
.qtip-tipsy .qtip-icon{
|
||||
border-color: #222;
|
||||
text-shadow: none;
|
||||
}
|
||||
|
||||
.qtip-tipsy .qtip-titlebar .ui-state-hover{
|
||||
border-color: #303030;
|
||||
}
|
||||
|
||||
|
||||
/* Tipped style */
|
||||
.qtip-tipped{
|
||||
border: 3px solid #959FA9;
|
||||
|
||||
-moz-border-radius: 3px;
|
||||
-webkit-border-radius: 3px;
|
||||
border-radius: 3px;
|
||||
|
||||
background-color: #F9F9F9;
|
||||
color: #454545;
|
||||
|
||||
font-weight: normal;
|
||||
font-family: serif;
|
||||
}
|
||||
|
||||
.qtip-tipped .qtip-titlebar{
|
||||
border-bottom-width: 0;
|
||||
|
||||
color: white;
|
||||
background: #3A79B8;
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#3A79B8), to(#2E629D));
|
||||
background-image: -webkit-linear-gradient(top, #3A79B8, #2E629D);
|
||||
background-image: -moz-linear-gradient(top, #3A79B8, #2E629D);
|
||||
background-image: -ms-linear-gradient(top, #3A79B8, #2E629D);
|
||||
background-image: -o-linear-gradient(top, #3A79B8, #2E629D);
|
||||
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D);
|
||||
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D)";
|
||||
}
|
||||
|
||||
.qtip-tipped .qtip-icon{
|
||||
border: 2px solid #285589;
|
||||
background: #285589;
|
||||
}
|
||||
|
||||
.qtip-tipped .qtip-icon .ui-icon{
|
||||
background-color: #FBFBFB;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Twitter Bootstrap style.
|
||||
*
|
||||
* Tested with IE 8, IE 9, Chrome 18, Firefox 9, Opera 11.
|
||||
* Does not work with IE 7.
|
||||
*/
|
||||
.qtip-bootstrap{
|
||||
/** Taken from Bootstrap body */
|
||||
font-size: 14px;
|
||||
line-height: 20px;
|
||||
color: #333333;
|
||||
|
||||
/** Taken from Bootstrap .popover */
|
||||
padding: 1px;
|
||||
background-color: #ffffff;
|
||||
border: 1px solid #ccc;
|
||||
border: 1px solid rgba(0, 0, 0, 0.2);
|
||||
-webkit-border-radius: 6px;
|
||||
-moz-border-radius: 6px;
|
||||
border-radius: 6px;
|
||||
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
|
||||
-moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
|
||||
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
|
||||
-webkit-background-clip: padding-box;
|
||||
-moz-background-clip: padding;
|
||||
background-clip: padding-box;
|
||||
}
|
||||
|
||||
.qtip-bootstrap .qtip-titlebar{
|
||||
/** Taken from Bootstrap .popover-title */
|
||||
padding: 8px 14px;
|
||||
margin: 0;
|
||||
font-size: 14px;
|
||||
font-weight: normal;
|
||||
line-height: 18px;
|
||||
background-color: #f7f7f7;
|
||||
border-bottom: 1px solid #ebebeb;
|
||||
-webkit-border-radius: 5px 5px 0 0;
|
||||
-moz-border-radius: 5px 5px 0 0;
|
||||
border-radius: 5px 5px 0 0;
|
||||
}
|
||||
|
||||
.qtip-bootstrap .qtip-titlebar .qtip-close{
|
||||
/**
|
||||
* Overrides qTip2:
|
||||
* .qtip-titlebar .qtip-close{
|
||||
* [...]
|
||||
* right: 4px;
|
||||
* top: 50%;
|
||||
* [...]
|
||||
* border-style: solid;
|
||||
* }
|
||||
*/
|
||||
right: 11px;
|
||||
top: 45%;
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
.qtip-bootstrap .qtip-content{
|
||||
/** Taken from Bootstrap .popover-content */
|
||||
padding: 9px 14px;
|
||||
}
|
||||
|
||||
.qtip-bootstrap .qtip-icon{
|
||||
/**
|
||||
* Overrides qTip2:
|
||||
* .qtip-default .qtip-icon {
|
||||
* border-color: #CCC;
|
||||
* background: #F1F1F1;
|
||||
* color: #777;
|
||||
* }
|
||||
*/
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.qtip-bootstrap .qtip-icon .ui-icon{
|
||||
/**
|
||||
* Overrides qTip2:
|
||||
* .qtip-icon .ui-icon{
|
||||
* width: 18px;
|
||||
* height: 14px;
|
||||
* }
|
||||
*/
|
||||
width: auto;
|
||||
height: auto;
|
||||
|
||||
/* Taken from Bootstrap .close */
|
||||
float: right;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
line-height: 18px;
|
||||
color: #000000;
|
||||
text-shadow: 0 1px 0 #ffffff;
|
||||
opacity: 0.2;
|
||||
filter: alpha(opacity=20);
|
||||
}
|
||||
|
||||
.qtip-bootstrap .qtip-icon .ui-icon:hover{
|
||||
/* Taken from Bootstrap .close:hover */
|
||||
color: #000000;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
opacity: 0.4;
|
||||
filter: alpha(opacity=40);
|
||||
}
|
||||
|
||||
|
||||
/* IE9 fix - removes all filters */
|
||||
.qtip:not(.ie9haxors) div.qtip-content,
|
||||
.qtip:not(.ie9haxors) div.qtip-titlebar{
|
||||
filter: none;
|
||||
-ms-filter: none;
|
||||
}
|
||||