Browse Source
* upstream: (36 commits) bug fix. Added composer extension. Added psr-0. Fixed breaking test. Fixed iii include path. reorganized the main repo to satisfy PSR-0. Fixed bootstrap asset registration issue. Widget::$transition removed, bundles depency fixed 'yii/bootstrap/popover' bundle depency optimization Bundle names fixes, base widget fixes, other widgets fixes Fixed join query for AR. Responsive bundle depency fix Bundle names and depency fixes YiiBase move all after class definition YiiBase Reloaded Additional bootstrap packages New approach minor refactoring. Uncompressed assets js files for better overall compression ...tags/2.0.0-beta
Antonio Ramirez
12 years ago
492 changed files with 66314 additions and 55740 deletions
@ -0,0 +1,27 @@ |
|||||||
|
{ |
||||||
|
"name": "yiisoft/yii2-composer", |
||||||
|
"description": "The composer integration for the Yii framework", |
||||||
|
"keywords": ["yii", "composer", "install", "update"], |
||||||
|
"type": "library", |
||||||
|
"license": "BSD-3-Clause", |
||||||
|
"support": { |
||||||
|
"issues": "https://github.com/yiisoft/yii2/issues?state=open", |
||||||
|
"forum": "http://www.yiiframework.com/forum/", |
||||||
|
"wiki": "http://www.yiiframework.com/wiki/", |
||||||
|
"irc": "irc://irc.freenode.net/yii", |
||||||
|
"source": "https://github.com/yiisoft/yii2" |
||||||
|
}, |
||||||
|
"authors": [ |
||||||
|
{ |
||||||
|
"name": "Qiang Xue", |
||||||
|
"email": "qiang.xue@gmail.com" |
||||||
|
} |
||||||
|
], |
||||||
|
"minimum-stability": "dev", |
||||||
|
"require": { |
||||||
|
"yiisoft/yii2": "dev-master" |
||||||
|
}, |
||||||
|
"autoload": { |
||||||
|
"psr-0": { "yii\\composer": "" } |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,53 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* @link http://www.yiiframework.com/ |
||||||
|
* @copyright Copyright (c) 2008 Yii Software LLC |
||||||
|
* @license http://www.yiiframework.com/license/ |
||||||
|
*/ |
||||||
|
|
||||||
|
namespace yii\composer; |
||||||
|
|
||||||
|
use Composer\Script\CommandEvent; |
||||||
|
|
||||||
|
/** |
||||||
|
* InstallHandler is called by Composer after it installs/updates the current package. |
||||||
|
* |
||||||
|
* @author Qiang Xue <qiang.xue@gmail.com> |
||||||
|
* @since 2.0 |
||||||
|
*/ |
||||||
|
class InstallHandler |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Sets the correct permissions of files and directories. |
||||||
|
* @param CommandEvent $event |
||||||
|
*/ |
||||||
|
public static function setPermissions($event) |
||||||
|
{ |
||||||
|
$options = array_merge(array( |
||||||
|
'writable' => array(), |
||||||
|
'executable' => array(), |
||||||
|
), $event->getComposer()->getPackage()->getExtra()); |
||||||
|
|
||||||
|
foreach ((array)$options['writable'] as $path) { |
||||||
|
echo "Setting writable: $path ..."; |
||||||
|
if (is_dir($path)) { |
||||||
|
chmod($path, 0777); |
||||||
|
echo "done\n"; |
||||||
|
} else { |
||||||
|
echo "The directory was not found: " . getcwd() . DIRECTORY_SEPARATOR . $path; |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
foreach ((array)$options['executable'] as $path) { |
||||||
|
echo "Setting executable: $path ..."; |
||||||
|
if (is_file($path)) { |
||||||
|
chmod($path, 0755); |
||||||
|
echo "done\n"; |
||||||
|
} else { |
||||||
|
echo "\n\tThe file was not found: " . getcwd() . DIRECTORY_SEPARATOR . $path . "\n"; |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,502 @@ |
|||||||
|
/*! http://mths.be/punycode v1.2.1 by @mathias */ |
||||||
|
;(function(root) { |
||||||
|
|
||||||
|
/** Detect free variables */ |
||||||
|
var freeExports = typeof exports == 'object' && exports; |
||||||
|
var freeModule = typeof module == 'object' && module && |
||||||
|
module.exports == freeExports && module; |
||||||
|
var freeGlobal = typeof global == 'object' && global; |
||||||
|
if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { |
||||||
|
root = freeGlobal; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* The `punycode` object. |
||||||
|
* @name punycode |
||||||
|
* @type Object |
||||||
|
*/ |
||||||
|
var punycode, |
||||||
|
|
||||||
|
/** Highest positive signed 32-bit float value */ |
||||||
|
maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
|
||||||
|
|
||||||
|
/** Bootstring parameters */ |
||||||
|
base = 36, |
||||||
|
tMin = 1, |
||||||
|
tMax = 26, |
||||||
|
skew = 38, |
||||||
|
damp = 700, |
||||||
|
initialBias = 72, |
||||||
|
initialN = 128, // 0x80
|
||||||
|
delimiter = '-', // '\x2D'
|
||||||
|
|
||||||
|
/** Regular expressions */ |
||||||
|
regexPunycode = /^xn--/, |
||||||
|
regexNonASCII = /[^ -~]/, // unprintable ASCII chars + non-ASCII chars
|
||||||
|
regexSeparators = /\x2E|\u3002|\uFF0E|\uFF61/g, // RFC 3490 separators
|
||||||
|
|
||||||
|
/** Error messages */ |
||||||
|
errors = { |
||||||
|
'overflow': 'Overflow: input needs wider integers to process', |
||||||
|
'not-basic': 'Illegal input >= 0x80 (not a basic code point)', |
||||||
|
'invalid-input': 'Invalid input' |
||||||
|
}, |
||||||
|
|
||||||
|
/** Convenience shortcuts */ |
||||||
|
baseMinusTMin = base - tMin, |
||||||
|
floor = Math.floor, |
||||||
|
stringFromCharCode = String.fromCharCode, |
||||||
|
|
||||||
|
/** Temporary variable */ |
||||||
|
key; |
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* A generic error utility function. |
||||||
|
* @private |
||||||
|
* @param {String} type The error type. |
||||||
|
* @returns {Error} Throws a `RangeError` with the applicable error message. |
||||||
|
*/ |
||||||
|
function error(type) { |
||||||
|
throw RangeError(errors[type]); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* A generic `Array#map` utility function. |
||||||
|
* @private |
||||||
|
* @param {Array} array The array to iterate over. |
||||||
|
* @param {Function} callback The function that gets called for every array |
||||||
|
* item. |
||||||
|
* @returns {Array} A new array of values returned by the callback function. |
||||||
|
*/ |
||||||
|
function map(array, fn) { |
||||||
|
var length = array.length; |
||||||
|
while (length--) { |
||||||
|
array[length] = fn(array[length]); |
||||||
|
} |
||||||
|
return array; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* A simple `Array#map`-like wrapper to work with domain name strings. |
||||||
|
* @private |
||||||
|
* @param {String} domain The domain name. |
||||||
|
* @param {Function} callback The function that gets called for every |
||||||
|
* character. |
||||||
|
* @returns {Array} A new string of characters returned by the callback |
||||||
|
* function. |
||||||
|
*/ |
||||||
|
function mapDomain(string, fn) { |
||||||
|
return map(string.split(regexSeparators), fn).join('.'); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates an array containing the decimal code points of each Unicode |
||||||
|
* character in the string. While JavaScript uses UCS-2 internally, |
||||||
|
* this function will convert a pair of surrogate halves (each of which |
||||||
|
* UCS-2 exposes as separate characters) into a single code point, |
||||||
|
* matching UTF-16. |
||||||
|
* @see `punycode.ucs2.encode` |
||||||
|
* @see <http://mathiasbynens.be/notes/javascript-encoding>
|
||||||
|
* @memberOf punycode.ucs2 |
||||||
|
* @name decode |
||||||
|
* @param {String} string The Unicode input string (UCS-2). |
||||||
|
* @returns {Array} The new array of code points. |
||||||
|
*/ |
||||||
|
function ucs2decode(string) { |
||||||
|
var output = [], |
||||||
|
counter = 0, |
||||||
|
length = string.length, |
||||||
|
value, |
||||||
|
extra; |
||||||
|
while (counter < length) { |
||||||
|
value = string.charCodeAt(counter++); |
||||||
|
if ((value & 0xF800) == 0xD800 && counter < length) { |
||||||
|
// high surrogate, and there is a next character
|
||||||
|
extra = string.charCodeAt(counter++); |
||||||
|
if ((extra & 0xFC00) == 0xDC00) { // low surrogate
|
||||||
|
output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); |
||||||
|
} else { |
||||||
|
output.push(value, extra); |
||||||
|
} |
||||||
|
} else { |
||||||
|
output.push(value); |
||||||
|
} |
||||||
|
} |
||||||
|
return output; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates a string based on an array of decimal code points. |
||||||
|
* @see `punycode.ucs2.decode` |
||||||
|
* @memberOf punycode.ucs2 |
||||||
|
* @name encode |
||||||
|
* @param {Array} codePoints The array of decimal code points. |
||||||
|
* @returns {String} The new Unicode string (UCS-2). |
||||||
|
*/ |
||||||
|
function ucs2encode(array) { |
||||||
|
return map(array, function(value) { |
||||||
|
var output = ''; |
||||||
|
if (value > 0xFFFF) { |
||||||
|
value -= 0x10000; |
||||||
|
output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); |
||||||
|
value = 0xDC00 | value & 0x3FF; |
||||||
|
} |
||||||
|
output += stringFromCharCode(value); |
||||||
|
return output; |
||||||
|
}).join(''); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Converts a basic code point into a digit/integer. |
||||||
|
* @see `digitToBasic()` |
||||||
|
* @private |
||||||
|
* @param {Number} codePoint The basic (decimal) code point. |
||||||
|
* @returns {Number} The numeric value of a basic code point (for use in |
||||||
|
* representing integers) in the range `0` to `base - 1`, or `base` if |
||||||
|
* the code point does not represent a value. |
||||||
|
*/ |
||||||
|
function basicToDigit(codePoint) { |
||||||
|
return codePoint - 48 < 10 |
||||||
|
? codePoint - 22 |
||||||
|
: codePoint - 65 < 26 |
||||||
|
? codePoint - 65 |
||||||
|
: codePoint - 97 < 26 |
||||||
|
? codePoint - 97 |
||||||
|
: base; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Converts a digit/integer into a basic code point. |
||||||
|
* @see `basicToDigit()` |
||||||
|
* @private |
||||||
|
* @param {Number} digit The numeric value of a basic code point. |
||||||
|
* @returns {Number} The basic code point whose value (when used for |
||||||
|
* representing integers) is `digit`, which needs to be in the range |
||||||
|
* `0` to `base - 1`. If `flag` is non-zero, the uppercase form is |
||||||
|
* used; else, the lowercase form is used. The behavior is undefined |
||||||
|
* if flag is non-zero and `digit` has no uppercase form. |
||||||
|
*/ |
||||||
|
function digitToBasic(digit, flag) { |
||||||
|
// 0..25 map to ASCII a..z or A..Z
|
||||||
|
// 26..35 map to ASCII 0..9
|
||||||
|
return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Bias adaptation function as per section 3.4 of RFC 3492. |
||||||
|
* http://tools.ietf.org/html/rfc3492#section-3.4
|
||||||
|
* @private |
||||||
|
*/ |
||||||
|
function adapt(delta, numPoints, firstTime) { |
||||||
|
var k = 0; |
||||||
|
delta = firstTime ? floor(delta / damp) : delta >> 1; |
||||||
|
delta += floor(delta / numPoints); |
||||||
|
for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { |
||||||
|
delta = floor(delta / baseMinusTMin); |
||||||
|
} |
||||||
|
return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Converts a Punycode string of ASCII code points to a string of Unicode |
||||||
|
* code points. |
||||||
|
* @memberOf punycode |
||||||
|
* @param {String} input The Punycode string of ASCII code points. |
||||||
|
* @returns {String} The resulting string of Unicode code points. |
||||||
|
*/ |
||||||
|
function decode(input) { |
||||||
|
// Don't use UCS-2
|
||||||
|
var output = [], |
||||||
|
inputLength = input.length, |
||||||
|
out, |
||||||
|
i = 0, |
||||||
|
n = initialN, |
||||||
|
bias = initialBias, |
||||||
|
basic, |
||||||
|
j, |
||||||
|
index, |
||||||
|
oldi, |
||||||
|
w, |
||||||
|
k, |
||||||
|
digit, |
||||||
|
t, |
||||||
|
length, |
||||||
|
/** Cached calculation results */ |
||||||
|
baseMinusT; |
||||||
|
|
||||||
|
// Handle the basic code points: let `basic` be the number of input code
|
||||||
|
// points before the last delimiter, or `0` if there is none, then copy
|
||||||
|
// the first basic code points to the output.
|
||||||
|
|
||||||
|
basic = input.lastIndexOf(delimiter); |
||||||
|
if (basic < 0) { |
||||||
|
basic = 0; |
||||||
|
} |
||||||
|
|
||||||
|
for (j = 0; j < basic; ++j) { |
||||||
|
// if it's not a basic code point
|
||||||
|
if (input.charCodeAt(j) >= 0x80) { |
||||||
|
error('not-basic'); |
||||||
|
} |
||||||
|
output.push(input.charCodeAt(j)); |
||||||
|
} |
||||||
|
|
||||||
|
// Main decoding loop: start just after the last delimiter if any basic code
|
||||||
|
// points were copied; start at the beginning otherwise.
|
||||||
|
|
||||||
|
for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { |
||||||
|
|
||||||
|
// `index` is the index of the next character to be consumed.
|
||||||
|
// Decode a generalized variable-length integer into `delta`,
|
||||||
|
// which gets added to `i`. The overflow checking is easier
|
||||||
|
// if we increase `i` as we go, then subtract off its starting
|
||||||
|
// value at the end to obtain `delta`.
|
||||||
|
for (oldi = i, w = 1, k = base; /* no condition */; k += base) { |
||||||
|
|
||||||
|
if (index >= inputLength) { |
||||||
|
error('invalid-input'); |
||||||
|
} |
||||||
|
|
||||||
|
digit = basicToDigit(input.charCodeAt(index++)); |
||||||
|
|
||||||
|
if (digit >= base || digit > floor((maxInt - i) / w)) { |
||||||
|
error('overflow'); |
||||||
|
} |
||||||
|
|
||||||
|
i += digit * w; |
||||||
|
t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); |
||||||
|
|
||||||
|
if (digit < t) { |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
baseMinusT = base - t; |
||||||
|
if (w > floor(maxInt / baseMinusT)) { |
||||||
|
error('overflow'); |
||||||
|
} |
||||||
|
|
||||||
|
w *= baseMinusT; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
out = output.length + 1; |
||||||
|
bias = adapt(i - oldi, out, oldi == 0); |
||||||
|
|
||||||
|
// `i` was supposed to wrap around from `out` to `0`,
|
||||||
|
// incrementing `n` each time, so we'll fix that now:
|
||||||
|
if (floor(i / out) > maxInt - n) { |
||||||
|
error('overflow'); |
||||||
|
} |
||||||
|
|
||||||
|
n += floor(i / out); |
||||||
|
i %= out; |
||||||
|
|
||||||
|
// Insert `n` at position `i` of the output
|
||||||
|
output.splice(i++, 0, n); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
return ucs2encode(output); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Converts a string of Unicode code points to a Punycode string of ASCII |
||||||
|
* code points. |
||||||
|
* @memberOf punycode |
||||||
|
* @param {String} input The string of Unicode code points. |
||||||
|
* @returns {String} The resulting Punycode string of ASCII code points. |
||||||
|
*/ |
||||||
|
function encode(input) { |
||||||
|
var n, |
||||||
|
delta, |
||||||
|
handledCPCount, |
||||||
|
basicLength, |
||||||
|
bias, |
||||||
|
j, |
||||||
|
m, |
||||||
|
q, |
||||||
|
k, |
||||||
|
t, |
||||||
|
currentValue, |
||||||
|
output = [], |
||||||
|
/** `inputLength` will hold the number of code points in `input`. */ |
||||||
|
inputLength, |
||||||
|
/** Cached calculation results */ |
||||||
|
handledCPCountPlusOne, |
||||||
|
baseMinusT, |
||||||
|
qMinusT; |
||||||
|
|
||||||
|
// Convert the input in UCS-2 to Unicode
|
||||||
|
input = ucs2decode(input); |
||||||
|
|
||||||
|
// Cache the length
|
||||||
|
inputLength = input.length; |
||||||
|
|
||||||
|
// Initialize the state
|
||||||
|
n = initialN; |
||||||
|
delta = 0; |
||||||
|
bias = initialBias; |
||||||
|
|
||||||
|
// Handle the basic code points
|
||||||
|
for (j = 0; j < inputLength; ++j) { |
||||||
|
currentValue = input[j]; |
||||||
|
if (currentValue < 0x80) { |
||||||
|
output.push(stringFromCharCode(currentValue)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
handledCPCount = basicLength = output.length; |
||||||
|
|
||||||
|
// `handledCPCount` is the number of code points that have been handled;
|
||||||
|
// `basicLength` is the number of basic code points.
|
||||||
|
|
||||||
|
// Finish the basic string - if it is not empty - with a delimiter
|
||||||
|
if (basicLength) { |
||||||
|
output.push(delimiter); |
||||||
|
} |
||||||
|
|
||||||
|
// Main encoding loop:
|
||||||
|
while (handledCPCount < inputLength) { |
||||||
|
|
||||||
|
// All non-basic code points < n have been handled already. Find the next
|
||||||
|
// larger one:
|
||||||
|
for (m = maxInt, j = 0; j < inputLength; ++j) { |
||||||
|
currentValue = input[j]; |
||||||
|
if (currentValue >= n && currentValue < m) { |
||||||
|
m = currentValue; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
|
||||||
|
// but guard against overflow
|
||||||
|
handledCPCountPlusOne = handledCPCount + 1; |
||||||
|
if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { |
||||||
|
error('overflow'); |
||||||
|
} |
||||||
|
|
||||||
|
delta += (m - n) * handledCPCountPlusOne; |
||||||
|
n = m; |
||||||
|
|
||||||
|
for (j = 0; j < inputLength; ++j) { |
||||||
|
currentValue = input[j]; |
||||||
|
|
||||||
|
if (currentValue < n && ++delta > maxInt) { |
||||||
|
error('overflow'); |
||||||
|
} |
||||||
|
|
||||||
|
if (currentValue == n) { |
||||||
|
// Represent delta as a generalized variable-length integer
|
||||||
|
for (q = delta, k = base; /* no condition */; k += base) { |
||||||
|
t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); |
||||||
|
if (q < t) { |
||||||
|
break; |
||||||
|
} |
||||||
|
qMinusT = q - t; |
||||||
|
baseMinusT = base - t; |
||||||
|
output.push( |
||||||
|
stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) |
||||||
|
); |
||||||
|
q = floor(qMinusT / baseMinusT); |
||||||
|
} |
||||||
|
|
||||||
|
output.push(stringFromCharCode(digitToBasic(q, 0))); |
||||||
|
bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); |
||||||
|
delta = 0; |
||||||
|
++handledCPCount; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
++delta; |
||||||
|
++n; |
||||||
|
|
||||||
|
} |
||||||
|
return output.join(''); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Converts a Punycode string representing a domain name to Unicode. Only the |
||||||
|
* Punycoded parts of the domain name will be converted, i.e. it doesn't |
||||||
|
* matter if you call it on a string that has already been converted to |
||||||
|
* Unicode. |
||||||
|
* @memberOf punycode |
||||||
|
* @param {String} domain The Punycode domain name to convert to Unicode. |
||||||
|
* @returns {String} The Unicode representation of the given Punycode |
||||||
|
* string. |
||||||
|
*/ |
||||||
|
function toUnicode(domain) { |
||||||
|
return mapDomain(domain, function(string) { |
||||||
|
return regexPunycode.test(string) |
||||||
|
? decode(string.slice(4).toLowerCase()) |
||||||
|
: string; |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Converts a Unicode string representing a domain name to Punycode. Only the |
||||||
|
* non-ASCII parts of the domain name will be converted, i.e. it doesn't |
||||||
|
* matter if you call it with a domain that's already in ASCII. |
||||||
|
* @memberOf punycode |
||||||
|
* @param {String} domain The domain name to convert, as a Unicode string. |
||||||
|
* @returns {String} The Punycode representation of the given domain name. |
||||||
|
*/ |
||||||
|
function toASCII(domain) { |
||||||
|
return mapDomain(domain, function(string) { |
||||||
|
return regexNonASCII.test(string) |
||||||
|
? 'xn--' + encode(string) |
||||||
|
: string; |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/ |
||||||
|
|
||||||
|
/** Define the public API */ |
||||||
|
punycode = { |
||||||
|
/** |
||||||
|
* A string representing the current Punycode.js version number. |
||||||
|
* @memberOf punycode |
||||||
|
* @type String |
||||||
|
*/ |
||||||
|
'version': '1.2.1', |
||||||
|
/** |
||||||
|
* An object of methods to convert from JavaScript's internal character |
||||||
|
* representation (UCS-2) to decimal Unicode code points, and back. |
||||||
|
* @see <http://mathiasbynens.be/notes/javascript-encoding>
|
||||||
|
* @memberOf punycode |
||||||
|
* @type Object |
||||||
|
*/ |
||||||
|
'ucs2': { |
||||||
|
'decode': ucs2decode, |
||||||
|
'encode': ucs2encode |
||||||
|
}, |
||||||
|
'decode': decode, |
||||||
|
'encode': encode, |
||||||
|
'toASCII': toASCII, |
||||||
|
'toUnicode': toUnicode |
||||||
|
}; |
||||||
|
|
||||||
|
/** Expose `punycode` */ |
||||||
|
// Some AMD build optimizers, like r.js, check for specific condition patterns
|
||||||
|
// like the following:
|
||||||
|
if ( |
||||||
|
typeof define == 'function' && |
||||||
|
typeof define.amd == 'object' && |
||||||
|
define.amd |
||||||
|
) { |
||||||
|
define(function() { |
||||||
|
return punycode; |
||||||
|
}); |
||||||
|
} else if (freeExports && !freeExports.nodeType) { |
||||||
|
if (freeModule) { // in Node.js or RingoJS v0.8.0+
|
||||||
|
freeModule.exports = punycode; |
||||||
|
} else { // in Narwhal or RingoJS v0.7.0-
|
||||||
|
for (key in punycode) { |
||||||
|
punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]); |
||||||
|
} |
||||||
|
} |
||||||
|
} else { // in Rhino or a web browser
|
||||||
|
root.punycode = punycode; |
||||||
|
} |
||||||
|
|
||||||
|
}(this)); |
@ -0,0 +1,154 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* @link http://www.yiiframework.com/ |
||||||
|
* @copyright Copyright (c) 2008 Yii Software LLC |
||||||
|
* @license http://www.yiiframework.com/license/ |
||||||
|
*/ |
||||||
|
|
||||||
|
namespace yii\bootstrap; |
||||||
|
|
||||||
|
use Yii; |
||||||
|
use yii\helpers\ArrayHelper; |
||||||
|
use yii\helpers\Html; |
||||||
|
|
||||||
|
/** |
||||||
|
* Alert renders an alert bootstrap component. |
||||||
|
* |
||||||
|
* For example, |
||||||
|
* |
||||||
|
* ```php |
||||||
|
* echo Alert::widget(array( |
||||||
|
* 'body' => 'Say hello...', |
||||||
|
* 'closeButton' => array( |
||||||
|
* 'label' => '×', |
||||||
|
* 'tag' => 'a', |
||||||
|
* ), |
||||||
|
* )); |
||||||
|
* ``` |
||||||
|
* |
||||||
|
* The following example will show the content enclosed between the [[begin()]] |
||||||
|
* and [[end()]] calls within the alert box: |
||||||
|
* |
||||||
|
* ```php |
||||||
|
* Alert::begin(array( |
||||||
|
* 'closeButton' => array( |
||||||
|
* 'label' => '×', |
||||||
|
* ), |
||||||
|
* )); |
||||||
|
* |
||||||
|
* echo 'Say hello...'; |
||||||
|
* |
||||||
|
* Alert::end(); |
||||||
|
* ``` |
||||||
|
* |
||||||
|
* @see http://twitter.github.io/bootstrap/javascript.html#alerts |
||||||
|
* @author Antonio Ramirez <amigo.cobos@gmail.com> |
||||||
|
* @since 2.0 |
||||||
|
*/ |
||||||
|
class Alert extends Widget |
||||||
|
{ |
||||||
|
/** |
||||||
|
* @var string the body content in the alert component. Note that anything between |
||||||
|
* the [[begin()]] and [[end()]] calls of the Alert widget will also be treated |
||||||
|
* as the body content, and will be rendered before this. |
||||||
|
*/ |
||||||
|
public $body; |
||||||
|
/** |
||||||
|
* @var array the options for rendering the close button tag. |
||||||
|
* The close button is displayed in the header of the modal window. Clicking |
||||||
|
* on the button will hide the modal window. If this is null, no close button will be rendered. |
||||||
|
* |
||||||
|
* The following special options are supported: |
||||||
|
* |
||||||
|
* - tag: string, the tag name of the button. Defaults to 'button'. |
||||||
|
* - label: string, the label of the button. Defaults to '×'. |
||||||
|
* |
||||||
|
* The rest of the options will be rendered as the HTML attributes of the button tag. |
||||||
|
* Please refer to the [Alert plugin help](http://twitter.github.com/bootstrap/javascript.html#alerts) |
||||||
|
* for the supported HTML attributes. |
||||||
|
*/ |
||||||
|
public $closeButton = array(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Initializes the widget. |
||||||
|
*/ |
||||||
|
public function init() |
||||||
|
{ |
||||||
|
parent::init(); |
||||||
|
|
||||||
|
$this->getView()->registerAssetBundle('yii/bootstrap/alert'); |
||||||
|
$this->initOptions(); |
||||||
|
|
||||||
|
echo Html::beginTag('div', $this->options) . "\n"; |
||||||
|
echo $this->renderBodyBegin() . "\n"; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Renders the widget. |
||||||
|
*/ |
||||||
|
public function run() |
||||||
|
{ |
||||||
|
echo "\n" . $this->renderBodyEnd(); |
||||||
|
echo "\n" . Html::endTag('div'); |
||||||
|
|
||||||
|
$this->registerPlugin('alert'); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Renders the close button if any before rendering the content. |
||||||
|
* @return string the rendering result |
||||||
|
*/ |
||||||
|
protected function renderBodyBegin() |
||||||
|
{ |
||||||
|
return $this->renderCloseButton(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Renders the alert body (if any). |
||||||
|
* @return string the rendering result |
||||||
|
*/ |
||||||
|
protected function renderBodyEnd() |
||||||
|
{ |
||||||
|
return $this->body . "\n"; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Renders the close button. |
||||||
|
* @return string the rendering result |
||||||
|
*/ |
||||||
|
protected function renderCloseButton() |
||||||
|
{ |
||||||
|
if ($this->closeButton !== null) { |
||||||
|
$tag = ArrayHelper::remove($this->closeButton, 'tag', 'button'); |
||||||
|
$label = ArrayHelper::remove($this->closeButton, 'label', '×'); |
||||||
|
if ($tag === 'button' && !isset($this->closeButton['type'])) { |
||||||
|
$this->closeButton['type'] = 'button'; |
||||||
|
} |
||||||
|
return Html::tag($tag, $label, $this->closeButton); |
||||||
|
} else { |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Initializes the widget options. |
||||||
|
* This method sets the default values for various options. |
||||||
|
*/ |
||||||
|
protected function initOptions() |
||||||
|
{ |
||||||
|
$this->options = array_merge(array( |
||||||
|
'class' => 'fade in', |
||||||
|
), $this->options); |
||||||
|
|
||||||
|
$this->addCssClass($this->options, 'alert'); |
||||||
|
|
||||||
|
if ($this->closeButton !== null) { |
||||||
|
$this->closeButton = array_merge(array( |
||||||
|
'data-dismiss' => 'alert', |
||||||
|
'aria-hidden' => 'true', |
||||||
|
'class' => 'close', |
||||||
|
), $this->closeButton); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,94 @@ |
|||||||
|
<?php |
||||||
|
/** |
||||||
|
* @link http://www.yiiframework.com/ |
||||||
|
* @copyright Copyright (c) 2008 Yii Software LLC |
||||||
|
* @license http://www.yiiframework.com/license/ |
||||||
|
*/ |
||||||
|
|
||||||
|
namespace yii\bootstrap; |
||||||
|
|
||||||
|
use Yii; |
||||||
|
use yii\base\InvalidConfigException; |
||||||
|
use yii\base\Model; |
||||||
|
use yii\helpers\Html; |
||||||
|
|
||||||
|
/** |
||||||
|
* TypeAhead renders a typehead bootstrap javascript component. |
||||||
|
* |
||||||
|
* For example, |
||||||
|
* |
||||||
|
* ```php |
||||||
|
* echo TypeAhead::widget(array( |
||||||
|
* 'form' => $form, |
||||||
|
* 'model' => $model, |
||||||
|
* 'attribute' => 'country', |
||||||
|
* 'pluginOptions' => array( |
||||||
|
* 'source' => array('USA', 'ESP'), |
||||||
|
* ), |
||||||
|
* )); |
||||||
|
* ``` |
||||||
|
* |
||||||
|
* The following example will use the name property instead |
||||||
|
* |
||||||
|
* ```php |
||||||
|
* echo TypeAhead::widget(array( |
||||||
|
* 'name' => 'country', |
||||||
|
* 'pluginOptions' => array( |
||||||
|
* 'source' => array('USA', 'ESP'), |
||||||
|
* ), |
||||||
|
* )); |
||||||
|
*``` |
||||||
|
* |
||||||
|
* @see http://twitter.github.io/bootstrap/javascript.html#typeahead |
||||||
|
* @author Antonio Ramirez <amigo.cobos@gmail.com> |
||||||
|
* @since 2.0 |
||||||
|
*/ |
||||||
|
class TypeAhead extends Widget |
||||||
|
{ |
||||||
|
/** |
||||||
|
* @var \yii\base\Model the data model that this widget is associated with |
||||||
|
*/ |
||||||
|
public $model; |
||||||
|
/** |
||||||
|
* @var string the model attribute that this widget is associated with |
||||||
|
*/ |
||||||
|
public $attribute; |
||||||
|
/** |
||||||
|
* @var string the input name. This must be set if [[model]] and [[attribute]] are not set. |
||||||
|
*/ |
||||||
|
public $name; |
||||||
|
/** |
||||||
|
* @var string the input value. |
||||||
|
*/ |
||||||
|
public $value; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Renders the widget |
||||||
|
*/ |
||||||
|
public function run() |
||||||
|
{ |
||||||
|
$this->getView()->registerAssetBundle('yii/bootstrap/typeahead'); |
||||||
|
echo $this->renderField(); |
||||||
|
$this->registerPlugin('typeahead'); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Renders the TypeAhead field. If [[model]] has been specified then it will render an active field. |
||||||
|
* If [[model]] is null or not from an [[Model]] instance, then the field will be rendered according to |
||||||
|
* the [[name]] attribute. |
||||||
|
* @return string the rendering result |
||||||
|
* @throws InvalidConfigException when none of the required attributes are set to render the textInput. That is, |
||||||
|
* if [[model]] and [[attribute]] are not set, then [[name]] is required. |
||||||
|
*/ |
||||||
|
public function renderField() |
||||||
|
{ |
||||||
|
if ($this->model instanceof Model && $this->attribute !== null) { |
||||||
|
return Html::activeTextInput($this->model, $this->attribute, $this->options); |
||||||
|
} elseif ($this->name !== null) { |
||||||
|
return Html::textInput($this->name, $this->value, $this->options); |
||||||
|
} else { |
||||||
|
throw new InvalidConfigException('Either "name" or "model" and "attribute" properties must be specified.'); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,108 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
return array( |
||||||
|
'yii/bootstrap' => array( |
||||||
|
'sourcePath' => __DIR__ . '/assets', |
||||||
|
'css' => array( |
||||||
|
YII_DEBUG ? 'css/bootstrap.css' : 'css/bootstrap.min.css', |
||||||
|
), |
||||||
|
), |
||||||
|
'yii/bootstrap/responsive' => array( |
||||||
|
'sourcePath' => __DIR__ . '/assets', |
||||||
|
'css' => array( |
||||||
|
YII_DEBUG ? 'css/bootstrap-responsive.css' : 'css/bootstrap-responsive.min.css', |
||||||
|
), |
||||||
|
'depends' => array('yii/bootstrap'), |
||||||
|
), |
||||||
|
'yii/bootstrap/affix' => array( |
||||||
|
'sourcePath' => __DIR__ . '/assets', |
||||||
|
'js' => array( |
||||||
|
'js/bootstrap-affix.js', |
||||||
|
), |
||||||
|
'depends' => array('yii/jquery', 'yii/bootstrap', 'yii/bootstrap/transition'), |
||||||
|
), |
||||||
|
'yii/bootstrap/alert' => array( |
||||||
|
'sourcePath' => __DIR__ . '/assets', |
||||||
|
'js' => array( |
||||||
|
'js/bootstrap-alert.js', |
||||||
|
), |
||||||
|
'depends' => array('yii/jquery', 'yii/bootstrap', 'yii/bootstrap/transition'), |
||||||
|
), |
||||||
|
'yii/bootstrap/button' => array( |
||||||
|
'sourcePath' => __DIR__ . '/assets', |
||||||
|
'js' => array( |
||||||
|
'js/bootstrap-button.js', |
||||||
|
), |
||||||
|
'depends' => array('yii/jquery', 'yii/bootstrap', 'yii/bootstrap/transition'), |
||||||
|
), |
||||||
|
'yii/bootstrap/carousel' => array( |
||||||
|
'sourcePath' => __DIR__ . '/assets', |
||||||
|
'js' => array( |
||||||
|
'js/bootstrap-carousel.js', |
||||||
|
), |
||||||
|
'depends' => array('yii/jquery', 'yii/bootstrap', 'yii/bootstrap/transition'), |
||||||
|
), |
||||||
|
'yii/bootstrap/collapse' => array( |
||||||
|
'sourcePath' => __DIR__ . '/assets', |
||||||
|
'js' => array( |
||||||
|
'js/bootstrap-collapse.js', |
||||||
|
), |
||||||
|
'depends' => array('yii/jquery', 'yii/bootstrap', 'yii/bootstrap/transition'), |
||||||
|
), |
||||||
|
'yii/bootstrap/dropdown' => array( |
||||||
|
'sourcePath' => __DIR__ . '/assets', |
||||||
|
'js' => array( |
||||||
|
'js/bootstrap-dropdown.js', |
||||||
|
), |
||||||
|
'depends' => array('yii/jquery', 'yii/bootstrap', 'yii/bootstrap/transition'), |
||||||
|
), |
||||||
|
'yii/bootstrap/modal' => array( |
||||||
|
'sourcePath' => __DIR__ . '/assets', |
||||||
|
'js' => array( |
||||||
|
'js/bootstrap-modal.js', |
||||||
|
), |
||||||
|
'depends' => array('yii/jquery', 'yii/bootstrap', 'yii/bootstrap/transition'), |
||||||
|
), |
||||||
|
'yii/bootstrap/popover' => array( |
||||||
|
'sourcePath' => __DIR__ . '/assets', |
||||||
|
'js' => array( |
||||||
|
'js/bootstrap-popover.js', |
||||||
|
), |
||||||
|
'depends' => array('yii/bootstrap/tooltip'), |
||||||
|
), |
||||||
|
'yii/bootstrap/scrollspy' => array( |
||||||
|
'sourcePath' => __DIR__ . '/assets', |
||||||
|
'js' => array( |
||||||
|
'js/bootstrap-scrollspy.js', |
||||||
|
), |
||||||
|
'depends' => array('yii/jquery', 'yii/bootstrap', 'yii/bootstrap/transition'), |
||||||
|
), |
||||||
|
'yii/bootstrap/tab' => array( |
||||||
|
'sourcePath' => __DIR__ . '/assets', |
||||||
|
'js' => array( |
||||||
|
'js/bootstrap-tab.js', |
||||||
|
), |
||||||
|
'depends' => array('yii/jquery', 'yii/bootstrap', 'yii/bootstrap/transition'), |
||||||
|
), |
||||||
|
'yii/bootstrap/tooltip' => array( |
||||||
|
'sourcePath' => __DIR__ . '/assets', |
||||||
|
'js' => array( |
||||||
|
'js/bootstrap-tooltip.js', |
||||||
|
), |
||||||
|
'depends' => array('yii/jquery', 'yii/bootstrap', 'yii/bootstrap/transition'), |
||||||
|
), |
||||||
|
'yii/bootstrap/transition' => array( |
||||||
|
'sourcePath' => __DIR__ . '/assets', |
||||||
|
'js' => array( |
||||||
|
'js/bootstrap-transition.js', |
||||||
|
), |
||||||
|
'depends' => array('yii/jquery', 'yii/bootstrap'), |
||||||
|
), |
||||||
|
'yii/bootstrap/typeahead' => array( |
||||||
|
'sourcePath' => __DIR__ . '/assets', |
||||||
|
'js' => array( |
||||||
|
'js/bootstrap-typeahead.js', |
||||||
|
), |
||||||
|
'depends' => array('yii/jquery', 'yii/bootstrap', 'yii/bootstrap/transition'), |
||||||
|
), |
||||||
|
); |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 8.6 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
@ -0,0 +1,117 @@ |
|||||||
|
/* ========================================================== |
||||||
|
* bootstrap-affix.js v2.3.2 |
||||||
|
* http://twitter.github.com/bootstrap/javascript.html#affix
|
||||||
|
* ========================================================== |
||||||
|
* Copyright 2012 Twitter, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* ========================================================== */ |
||||||
|
|
||||||
|
|
||||||
|
!function ($) { |
||||||
|
|
||||||
|
"use strict"; // jshint ;_;
|
||||||
|
|
||||||
|
|
||||||
|
/* AFFIX CLASS DEFINITION |
||||||
|
* ====================== */ |
||||||
|
|
||||||
|
var Affix = function (element, options) { |
||||||
|
this.options = $.extend({}, $.fn.affix.defaults, options) |
||||||
|
this.$window = $(window) |
||||||
|
.on('scroll.affix.data-api', $.proxy(this.checkPosition, this)) |
||||||
|
.on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this)) |
||||||
|
this.$element = $(element) |
||||||
|
this.checkPosition() |
||||||
|
} |
||||||
|
|
||||||
|
Affix.prototype.checkPosition = function () { |
||||||
|
if (!this.$element.is(':visible')) return |
||||||
|
|
||||||
|
var scrollHeight = $(document).height() |
||||||
|
, scrollTop = this.$window.scrollTop() |
||||||
|
, position = this.$element.offset() |
||||||
|
, offset = this.options.offset |
||||||
|
, offsetBottom = offset.bottom |
||||||
|
, offsetTop = offset.top |
||||||
|
, reset = 'affix affix-top affix-bottom' |
||||||
|
, affix |
||||||
|
|
||||||
|
if (typeof offset != 'object') offsetBottom = offsetTop = offset |
||||||
|
if (typeof offsetTop == 'function') offsetTop = offset.top() |
||||||
|
if (typeof offsetBottom == 'function') offsetBottom = offset.bottom() |
||||||
|
|
||||||
|
affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? |
||||||
|
false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? |
||||||
|
'bottom' : offsetTop != null && scrollTop <= offsetTop ? |
||||||
|
'top' : false |
||||||
|
|
||||||
|
if (this.affixed === affix) return |
||||||
|
|
||||||
|
this.affixed = affix |
||||||
|
this.unpin = affix == 'bottom' ? position.top - scrollTop : null |
||||||
|
|
||||||
|
this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : '')) |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* AFFIX PLUGIN DEFINITION |
||||||
|
* ======================= */ |
||||||
|
|
||||||
|
var old = $.fn.affix |
||||||
|
|
||||||
|
$.fn.affix = function (option) { |
||||||
|
return this.each(function () { |
||||||
|
var $this = $(this) |
||||||
|
, data = $this.data('affix') |
||||||
|
, options = typeof option == 'object' && option |
||||||
|
if (!data) $this.data('affix', (data = new Affix(this, options))) |
||||||
|
if (typeof option == 'string') data[option]() |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
$.fn.affix.Constructor = Affix |
||||||
|
|
||||||
|
$.fn.affix.defaults = { |
||||||
|
offset: 0 |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* AFFIX NO CONFLICT |
||||||
|
* ================= */ |
||||||
|
|
||||||
|
$.fn.affix.noConflict = function () { |
||||||
|
$.fn.affix = old |
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* AFFIX DATA-API |
||||||
|
* ============== */ |
||||||
|
|
||||||
|
$(window).on('load', function () { |
||||||
|
$('[data-spy="affix"]').each(function () { |
||||||
|
var $spy = $(this) |
||||||
|
, data = $spy.data() |
||||||
|
|
||||||
|
data.offset = data.offset || {} |
||||||
|
|
||||||
|
data.offsetBottom && (data.offset.bottom = data.offsetBottom) |
||||||
|
data.offsetTop && (data.offset.top = data.offsetTop) |
||||||
|
|
||||||
|
$spy.affix(data) |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
|
||||||
|
}(window.jQuery); |
@ -0,0 +1,99 @@ |
|||||||
|
/* ========================================================== |
||||||
|
* bootstrap-alert.js v2.3.2 |
||||||
|
* http://twitter.github.com/bootstrap/javascript.html#alerts
|
||||||
|
* ========================================================== |
||||||
|
* Copyright 2012 Twitter, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* ========================================================== */ |
||||||
|
|
||||||
|
|
||||||
|
!function ($) { |
||||||
|
|
||||||
|
"use strict"; // jshint ;_;
|
||||||
|
|
||||||
|
|
||||||
|
/* ALERT CLASS DEFINITION |
||||||
|
* ====================== */ |
||||||
|
|
||||||
|
var dismiss = '[data-dismiss="alert"]' |
||||||
|
, Alert = function (el) { |
||||||
|
$(el).on('click', dismiss, this.close) |
||||||
|
} |
||||||
|
|
||||||
|
Alert.prototype.close = function (e) { |
||||||
|
var $this = $(this) |
||||||
|
, selector = $this.attr('data-target') |
||||||
|
, $parent |
||||||
|
|
||||||
|
if (!selector) { |
||||||
|
selector = $this.attr('href') |
||||||
|
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
|
||||||
|
} |
||||||
|
|
||||||
|
$parent = $(selector) |
||||||
|
|
||||||
|
e && e.preventDefault() |
||||||
|
|
||||||
|
$parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) |
||||||
|
|
||||||
|
$parent.trigger(e = $.Event('close')) |
||||||
|
|
||||||
|
if (e.isDefaultPrevented()) return |
||||||
|
|
||||||
|
$parent.removeClass('in') |
||||||
|
|
||||||
|
function removeElement() { |
||||||
|
$parent |
||||||
|
.trigger('closed') |
||||||
|
.remove() |
||||||
|
} |
||||||
|
|
||||||
|
$.support.transition && $parent.hasClass('fade') ? |
||||||
|
$parent.on($.support.transition.end, removeElement) : |
||||||
|
removeElement() |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* ALERT PLUGIN DEFINITION |
||||||
|
* ======================= */ |
||||||
|
|
||||||
|
var old = $.fn.alert |
||||||
|
|
||||||
|
$.fn.alert = function (option) { |
||||||
|
return this.each(function () { |
||||||
|
var $this = $(this) |
||||||
|
, data = $this.data('alert') |
||||||
|
if (!data) $this.data('alert', (data = new Alert(this))) |
||||||
|
if (typeof option == 'string') data[option].call($this) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
$.fn.alert.Constructor = Alert |
||||||
|
|
||||||
|
|
||||||
|
/* ALERT NO CONFLICT |
||||||
|
* ================= */ |
||||||
|
|
||||||
|
$.fn.alert.noConflict = function () { |
||||||
|
$.fn.alert = old |
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* ALERT DATA-API |
||||||
|
* ============== */ |
||||||
|
|
||||||
|
$(document).on('click.alert.data-api', dismiss, Alert.prototype.close) |
||||||
|
|
||||||
|
}(window.jQuery); |
@ -0,0 +1,105 @@ |
|||||||
|
/* ============================================================ |
||||||
|
* bootstrap-button.js v2.3.2 |
||||||
|
* http://twitter.github.com/bootstrap/javascript.html#buttons
|
||||||
|
* ============================================================ |
||||||
|
* Copyright 2012 Twitter, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* ============================================================ */ |
||||||
|
|
||||||
|
|
||||||
|
!function ($) { |
||||||
|
|
||||||
|
"use strict"; // jshint ;_;
|
||||||
|
|
||||||
|
|
||||||
|
/* BUTTON PUBLIC CLASS DEFINITION |
||||||
|
* ============================== */ |
||||||
|
|
||||||
|
var Button = function (element, options) { |
||||||
|
this.$element = $(element) |
||||||
|
this.options = $.extend({}, $.fn.button.defaults, options) |
||||||
|
} |
||||||
|
|
||||||
|
Button.prototype.setState = function (state) { |
||||||
|
var d = 'disabled' |
||||||
|
, $el = this.$element |
||||||
|
, data = $el.data() |
||||||
|
, val = $el.is('input') ? 'val' : 'html' |
||||||
|
|
||||||
|
state = state + 'Text' |
||||||
|
data.resetText || $el.data('resetText', $el[val]()) |
||||||
|
|
||||||
|
$el[val](data[state] || this.options[state]) |
||||||
|
|
||||||
|
// push to event loop to allow forms to submit
|
||||||
|
setTimeout(function () { |
||||||
|
state == 'loadingText' ? |
||||||
|
$el.addClass(d).attr(d, d) : |
||||||
|
$el.removeClass(d).removeAttr(d) |
||||||
|
}, 0) |
||||||
|
} |
||||||
|
|
||||||
|
Button.prototype.toggle = function () { |
||||||
|
var $parent = this.$element.closest('[data-toggle="buttons-radio"]') |
||||||
|
|
||||||
|
$parent && $parent |
||||||
|
.find('.active') |
||||||
|
.removeClass('active') |
||||||
|
|
||||||
|
this.$element.toggleClass('active') |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* BUTTON PLUGIN DEFINITION |
||||||
|
* ======================== */ |
||||||
|
|
||||||
|
var old = $.fn.button |
||||||
|
|
||||||
|
$.fn.button = function (option) { |
||||||
|
return this.each(function () { |
||||||
|
var $this = $(this) |
||||||
|
, data = $this.data('button') |
||||||
|
, options = typeof option == 'object' && option |
||||||
|
if (!data) $this.data('button', (data = new Button(this, options))) |
||||||
|
if (option == 'toggle') data.toggle() |
||||||
|
else if (option) data.setState(option) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
$.fn.button.defaults = { |
||||||
|
loadingText: 'loading...' |
||||||
|
} |
||||||
|
|
||||||
|
$.fn.button.Constructor = Button |
||||||
|
|
||||||
|
|
||||||
|
/* BUTTON NO CONFLICT |
||||||
|
* ================== */ |
||||||
|
|
||||||
|
$.fn.button.noConflict = function () { |
||||||
|
$.fn.button = old |
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* BUTTON DATA-API |
||||||
|
* =============== */ |
||||||
|
|
||||||
|
$(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { |
||||||
|
var $btn = $(e.target) |
||||||
|
if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') |
||||||
|
$btn.button('toggle') |
||||||
|
}) |
||||||
|
|
||||||
|
}(window.jQuery); |
@ -0,0 +1,207 @@ |
|||||||
|
/* ========================================================== |
||||||
|
* bootstrap-carousel.js v2.3.2 |
||||||
|
* http://twitter.github.com/bootstrap/javascript.html#carousel
|
||||||
|
* ========================================================== |
||||||
|
* Copyright 2012 Twitter, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* ========================================================== */ |
||||||
|
|
||||||
|
|
||||||
|
!function ($) { |
||||||
|
|
||||||
|
"use strict"; // jshint ;_;
|
||||||
|
|
||||||
|
|
||||||
|
/* CAROUSEL CLASS DEFINITION |
||||||
|
* ========================= */ |
||||||
|
|
||||||
|
var Carousel = function (element, options) { |
||||||
|
this.$element = $(element) |
||||||
|
this.$indicators = this.$element.find('.carousel-indicators') |
||||||
|
this.options = options |
||||||
|
this.options.pause == 'hover' && this.$element |
||||||
|
.on('mouseenter', $.proxy(this.pause, this)) |
||||||
|
.on('mouseleave', $.proxy(this.cycle, this)) |
||||||
|
} |
||||||
|
|
||||||
|
Carousel.prototype = { |
||||||
|
|
||||||
|
cycle: function (e) { |
||||||
|
if (!e) this.paused = false |
||||||
|
if (this.interval) clearInterval(this.interval); |
||||||
|
this.options.interval |
||||||
|
&& !this.paused |
||||||
|
&& (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) |
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
, getActiveIndex: function () { |
||||||
|
this.$active = this.$element.find('.item.active') |
||||||
|
this.$items = this.$active.parent().children() |
||||||
|
return this.$items.index(this.$active) |
||||||
|
} |
||||||
|
|
||||||
|
, to: function (pos) { |
||||||
|
var activeIndex = this.getActiveIndex() |
||||||
|
, that = this |
||||||
|
|
||||||
|
if (pos > (this.$items.length - 1) || pos < 0) return |
||||||
|
|
||||||
|
if (this.sliding) { |
||||||
|
return this.$element.one('slid', function () { |
||||||
|
that.to(pos) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
if (activeIndex == pos) { |
||||||
|
return this.pause().cycle() |
||||||
|
} |
||||||
|
|
||||||
|
return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) |
||||||
|
} |
||||||
|
|
||||||
|
, pause: function (e) { |
||||||
|
if (!e) this.paused = true |
||||||
|
if (this.$element.find('.next, .prev').length && $.support.transition.end) { |
||||||
|
this.$element.trigger($.support.transition.end) |
||||||
|
this.cycle(true) |
||||||
|
} |
||||||
|
clearInterval(this.interval) |
||||||
|
this.interval = null |
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
, next: function () { |
||||||
|
if (this.sliding) return |
||||||
|
return this.slide('next') |
||||||
|
} |
||||||
|
|
||||||
|
, prev: function () { |
||||||
|
if (this.sliding) return |
||||||
|
return this.slide('prev') |
||||||
|
} |
||||||
|
|
||||||
|
, slide: function (type, next) { |
||||||
|
var $active = this.$element.find('.item.active') |
||||||
|
, $next = next || $active[type]() |
||||||
|
, isCycling = this.interval |
||||||
|
, direction = type == 'next' ? 'left' : 'right' |
||||||
|
, fallback = type == 'next' ? 'first' : 'last' |
||||||
|
, that = this |
||||||
|
, e |
||||||
|
|
||||||
|
this.sliding = true |
||||||
|
|
||||||
|
isCycling && this.pause() |
||||||
|
|
||||||
|
$next = $next.length ? $next : this.$element.find('.item')[fallback]() |
||||||
|
|
||||||
|
e = $.Event('slide', { |
||||||
|
relatedTarget: $next[0] |
||||||
|
, direction: direction |
||||||
|
}) |
||||||
|
|
||||||
|
if ($next.hasClass('active')) return |
||||||
|
|
||||||
|
if (this.$indicators.length) { |
||||||
|
this.$indicators.find('.active').removeClass('active') |
||||||
|
this.$element.one('slid', function () { |
||||||
|
var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) |
||||||
|
$nextIndicator && $nextIndicator.addClass('active') |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
if ($.support.transition && this.$element.hasClass('slide')) { |
||||||
|
this.$element.trigger(e) |
||||||
|
if (e.isDefaultPrevented()) return |
||||||
|
$next.addClass(type) |
||||||
|
$next[0].offsetWidth // force reflow
|
||||||
|
$active.addClass(direction) |
||||||
|
$next.addClass(direction) |
||||||
|
this.$element.one($.support.transition.end, function () { |
||||||
|
$next.removeClass([type, direction].join(' ')).addClass('active') |
||||||
|
$active.removeClass(['active', direction].join(' ')) |
||||||
|
that.sliding = false |
||||||
|
setTimeout(function () { that.$element.trigger('slid') }, 0) |
||||||
|
}) |
||||||
|
} else { |
||||||
|
this.$element.trigger(e) |
||||||
|
if (e.isDefaultPrevented()) return |
||||||
|
$active.removeClass('active') |
||||||
|
$next.addClass('active') |
||||||
|
this.sliding = false |
||||||
|
this.$element.trigger('slid') |
||||||
|
} |
||||||
|
|
||||||
|
isCycling && this.cycle() |
||||||
|
|
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* CAROUSEL PLUGIN DEFINITION |
||||||
|
* ========================== */ |
||||||
|
|
||||||
|
var old = $.fn.carousel |
||||||
|
|
||||||
|
$.fn.carousel = function (option) { |
||||||
|
return this.each(function () { |
||||||
|
var $this = $(this) |
||||||
|
, data = $this.data('carousel') |
||||||
|
, options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) |
||||||
|
, action = typeof option == 'string' ? option : options.slide |
||||||
|
if (!data) $this.data('carousel', (data = new Carousel(this, options))) |
||||||
|
if (typeof option == 'number') data.to(option) |
||||||
|
else if (action) data[action]() |
||||||
|
else if (options.interval) data.pause().cycle() |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
$.fn.carousel.defaults = { |
||||||
|
interval: 5000 |
||||||
|
, pause: 'hover' |
||||||
|
} |
||||||
|
|
||||||
|
$.fn.carousel.Constructor = Carousel |
||||||
|
|
||||||
|
|
||||||
|
/* CAROUSEL NO CONFLICT |
||||||
|
* ==================== */ |
||||||
|
|
||||||
|
$.fn.carousel.noConflict = function () { |
||||||
|
$.fn.carousel = old |
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
/* CAROUSEL DATA-API |
||||||
|
* ================= */ |
||||||
|
|
||||||
|
$(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { |
||||||
|
var $this = $(this), href |
||||||
|
, $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
|
||||||
|
, options = $.extend({}, $target.data(), $this.data()) |
||||||
|
, slideIndex |
||||||
|
|
||||||
|
$target.carousel(options) |
||||||
|
|
||||||
|
if (slideIndex = $this.attr('data-slide-to')) { |
||||||
|
$target.data('carousel').pause().to(slideIndex).cycle() |
||||||
|
} |
||||||
|
|
||||||
|
e.preventDefault() |
||||||
|
}) |
||||||
|
|
||||||
|
}(window.jQuery); |
@ -0,0 +1,167 @@ |
|||||||
|
/* ============================================================= |
||||||
|
* bootstrap-collapse.js v2.3.2 |
||||||
|
* http://twitter.github.com/bootstrap/javascript.html#collapse
|
||||||
|
* ============================================================= |
||||||
|
* Copyright 2012 Twitter, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* ============================================================ */ |
||||||
|
|
||||||
|
|
||||||
|
!function ($) { |
||||||
|
|
||||||
|
"use strict"; // jshint ;_;
|
||||||
|
|
||||||
|
|
||||||
|
/* COLLAPSE PUBLIC CLASS DEFINITION |
||||||
|
* ================================ */ |
||||||
|
|
||||||
|
var Collapse = function (element, options) { |
||||||
|
this.$element = $(element) |
||||||
|
this.options = $.extend({}, $.fn.collapse.defaults, options) |
||||||
|
|
||||||
|
if (this.options.parent) { |
||||||
|
this.$parent = $(this.options.parent) |
||||||
|
} |
||||||
|
|
||||||
|
this.options.toggle && this.toggle() |
||||||
|
} |
||||||
|
|
||||||
|
Collapse.prototype = { |
||||||
|
|
||||||
|
constructor: Collapse |
||||||
|
|
||||||
|
, dimension: function () { |
||||||
|
var hasWidth = this.$element.hasClass('width') |
||||||
|
return hasWidth ? 'width' : 'height' |
||||||
|
} |
||||||
|
|
||||||
|
, show: function () { |
||||||
|
var dimension |
||||||
|
, scroll |
||||||
|
, actives |
||||||
|
, hasData |
||||||
|
|
||||||
|
if (this.transitioning || this.$element.hasClass('in')) return |
||||||
|
|
||||||
|
dimension = this.dimension() |
||||||
|
scroll = $.camelCase(['scroll', dimension].join('-')) |
||||||
|
actives = this.$parent && this.$parent.find('> .accordion-group > .in') |
||||||
|
|
||||||
|
if (actives && actives.length) { |
||||||
|
hasData = actives.data('collapse') |
||||||
|
if (hasData && hasData.transitioning) return |
||||||
|
actives.collapse('hide') |
||||||
|
hasData || actives.data('collapse', null) |
||||||
|
} |
||||||
|
|
||||||
|
this.$element[dimension](0) |
||||||
|
this.transition('addClass', $.Event('show'), 'shown') |
||||||
|
$.support.transition && this.$element[dimension](this.$element[0][scroll]) |
||||||
|
} |
||||||
|
|
||||||
|
, hide: function () { |
||||||
|
var dimension |
||||||
|
if (this.transitioning || !this.$element.hasClass('in')) return |
||||||
|
dimension = this.dimension() |
||||||
|
this.reset(this.$element[dimension]()) |
||||||
|
this.transition('removeClass', $.Event('hide'), 'hidden') |
||||||
|
this.$element[dimension](0) |
||||||
|
} |
||||||
|
|
||||||
|
, reset: function (size) { |
||||||
|
var dimension = this.dimension() |
||||||
|
|
||||||
|
this.$element |
||||||
|
.removeClass('collapse') |
||||||
|
[dimension](size || 'auto') |
||||||
|
[0].offsetWidth |
||||||
|
|
||||||
|
this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') |
||||||
|
|
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
, transition: function (method, startEvent, completeEvent) { |
||||||
|
var that = this |
||||||
|
, complete = function () { |
||||||
|
if (startEvent.type == 'show') that.reset() |
||||||
|
that.transitioning = 0 |
||||||
|
that.$element.trigger(completeEvent) |
||||||
|
} |
||||||
|
|
||||||
|
this.$element.trigger(startEvent) |
||||||
|
|
||||||
|
if (startEvent.isDefaultPrevented()) return |
||||||
|
|
||||||
|
this.transitioning = 1 |
||||||
|
|
||||||
|
this.$element[method]('in') |
||||||
|
|
||||||
|
$.support.transition && this.$element.hasClass('collapse') ? |
||||||
|
this.$element.one($.support.transition.end, complete) : |
||||||
|
complete() |
||||||
|
} |
||||||
|
|
||||||
|
, toggle: function () { |
||||||
|
this[this.$element.hasClass('in') ? 'hide' : 'show']() |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* COLLAPSE PLUGIN DEFINITION |
||||||
|
* ========================== */ |
||||||
|
|
||||||
|
var old = $.fn.collapse |
||||||
|
|
||||||
|
$.fn.collapse = function (option) { |
||||||
|
return this.each(function () { |
||||||
|
var $this = $(this) |
||||||
|
, data = $this.data('collapse') |
||||||
|
, options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) |
||||||
|
if (!data) $this.data('collapse', (data = new Collapse(this, options))) |
||||||
|
if (typeof option == 'string') data[option]() |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
$.fn.collapse.defaults = { |
||||||
|
toggle: true |
||||||
|
} |
||||||
|
|
||||||
|
$.fn.collapse.Constructor = Collapse |
||||||
|
|
||||||
|
|
||||||
|
/* COLLAPSE NO CONFLICT |
||||||
|
* ==================== */ |
||||||
|
|
||||||
|
$.fn.collapse.noConflict = function () { |
||||||
|
$.fn.collapse = old |
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* COLLAPSE DATA-API |
||||||
|
* ================= */ |
||||||
|
|
||||||
|
$(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { |
||||||
|
var $this = $(this), href |
||||||
|
, target = $this.attr('data-target') |
||||||
|
|| e.preventDefault() |
||||||
|
|| (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
|
||||||
|
, option = $(target).data('collapse') ? 'toggle' : $this.data() |
||||||
|
$this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') |
||||||
|
$(target).collapse(option) |
||||||
|
}) |
||||||
|
|
||||||
|
}(window.jQuery); |
@ -0,0 +1,169 @@ |
|||||||
|
/* ============================================================ |
||||||
|
* bootstrap-dropdown.js v2.3.2 |
||||||
|
* http://twitter.github.com/bootstrap/javascript.html#dropdowns
|
||||||
|
* ============================================================ |
||||||
|
* Copyright 2012 Twitter, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* ============================================================ */ |
||||||
|
|
||||||
|
|
||||||
|
!function ($) { |
||||||
|
|
||||||
|
"use strict"; // jshint ;_;
|
||||||
|
|
||||||
|
|
||||||
|
/* DROPDOWN CLASS DEFINITION |
||||||
|
* ========================= */ |
||||||
|
|
||||||
|
var toggle = '[data-toggle=dropdown]' |
||||||
|
, Dropdown = function (element) { |
||||||
|
var $el = $(element).on('click.dropdown.data-api', this.toggle) |
||||||
|
$('html').on('click.dropdown.data-api', function () { |
||||||
|
$el.parent().removeClass('open') |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
Dropdown.prototype = { |
||||||
|
|
||||||
|
constructor: Dropdown |
||||||
|
|
||||||
|
, toggle: function (e) { |
||||||
|
var $this = $(this) |
||||||
|
, $parent |
||||||
|
, isActive |
||||||
|
|
||||||
|
if ($this.is('.disabled, :disabled')) return |
||||||
|
|
||||||
|
$parent = getParent($this) |
||||||
|
|
||||||
|
isActive = $parent.hasClass('open') |
||||||
|
|
||||||
|
clearMenus() |
||||||
|
|
||||||
|
if (!isActive) { |
||||||
|
if ('ontouchstart' in document.documentElement) { |
||||||
|
// if mobile we we use a backdrop because click events don't delegate
|
||||||
|
$('<div class="dropdown-backdrop"/>').insertBefore($(this)).on('click', clearMenus) |
||||||
|
} |
||||||
|
$parent.toggleClass('open') |
||||||
|
} |
||||||
|
|
||||||
|
$this.focus() |
||||||
|
|
||||||
|
return false |
||||||
|
} |
||||||
|
|
||||||
|
, keydown: function (e) { |
||||||
|
var $this |
||||||
|
, $items |
||||||
|
, $active |
||||||
|
, $parent |
||||||
|
, isActive |
||||||
|
, index |
||||||
|
|
||||||
|
if (!/(38|40|27)/.test(e.keyCode)) return |
||||||
|
|
||||||
|
$this = $(this) |
||||||
|
|
||||||
|
e.preventDefault() |
||||||
|
e.stopPropagation() |
||||||
|
|
||||||
|
if ($this.is('.disabled, :disabled')) return |
||||||
|
|
||||||
|
$parent = getParent($this) |
||||||
|
|
||||||
|
isActive = $parent.hasClass('open') |
||||||
|
|
||||||
|
if (!isActive || (isActive && e.keyCode == 27)) { |
||||||
|
if (e.which == 27) $parent.find(toggle).focus() |
||||||
|
return $this.click() |
||||||
|
} |
||||||
|
|
||||||
|
$items = $('[role=menu] li:not(.divider):visible a', $parent) |
||||||
|
|
||||||
|
if (!$items.length) return |
||||||
|
|
||||||
|
index = $items.index($items.filter(':focus')) |
||||||
|
|
||||||
|
if (e.keyCode == 38 && index > 0) index-- // up
|
||||||
|
if (e.keyCode == 40 && index < $items.length - 1) index++ // down
|
||||||
|
if (!~index) index = 0 |
||||||
|
|
||||||
|
$items |
||||||
|
.eq(index) |
||||||
|
.focus() |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
function clearMenus() { |
||||||
|
$('.dropdown-backdrop').remove() |
||||||
|
$(toggle).each(function () { |
||||||
|
getParent($(this)).removeClass('open') |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
function getParent($this) { |
||||||
|
var selector = $this.attr('data-target') |
||||||
|
, $parent |
||||||
|
|
||||||
|
if (!selector) { |
||||||
|
selector = $this.attr('href') |
||||||
|
selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
|
||||||
|
} |
||||||
|
|
||||||
|
$parent = selector && $(selector) |
||||||
|
|
||||||
|
if (!$parent || !$parent.length) $parent = $this.parent() |
||||||
|
|
||||||
|
return $parent |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* DROPDOWN PLUGIN DEFINITION |
||||||
|
* ========================== */ |
||||||
|
|
||||||
|
var old = $.fn.dropdown |
||||||
|
|
||||||
|
$.fn.dropdown = function (option) { |
||||||
|
return this.each(function () { |
||||||
|
var $this = $(this) |
||||||
|
, data = $this.data('dropdown') |
||||||
|
if (!data) $this.data('dropdown', (data = new Dropdown(this))) |
||||||
|
if (typeof option == 'string') data[option].call($this) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
$.fn.dropdown.Constructor = Dropdown |
||||||
|
|
||||||
|
|
||||||
|
/* DROPDOWN NO CONFLICT |
||||||
|
* ==================== */ |
||||||
|
|
||||||
|
$.fn.dropdown.noConflict = function () { |
||||||
|
$.fn.dropdown = old |
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* APPLY TO STANDARD DROPDOWN ELEMENTS |
||||||
|
* =================================== */ |
||||||
|
|
||||||
|
$(document) |
||||||
|
.on('click.dropdown.data-api', clearMenus) |
||||||
|
.on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) |
||||||
|
.on('click.dropdown.data-api' , toggle, Dropdown.prototype.toggle) |
||||||
|
.on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown) |
||||||
|
|
||||||
|
}(window.jQuery); |
@ -0,0 +1,247 @@ |
|||||||
|
/* ========================================================= |
||||||
|
* bootstrap-modal.js v2.3.2 |
||||||
|
* http://twitter.github.com/bootstrap/javascript.html#modals
|
||||||
|
* ========================================================= |
||||||
|
* Copyright 2012 Twitter, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* ========================================================= */ |
||||||
|
|
||||||
|
|
||||||
|
!function ($) { |
||||||
|
|
||||||
|
"use strict"; // jshint ;_;
|
||||||
|
|
||||||
|
|
||||||
|
/* MODAL CLASS DEFINITION |
||||||
|
* ====================== */ |
||||||
|
|
||||||
|
var Modal = function (element, options) { |
||||||
|
this.options = options |
||||||
|
this.$element = $(element) |
||||||
|
.delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) |
||||||
|
this.options.remote && this.$element.find('.modal-body').load(this.options.remote) |
||||||
|
} |
||||||
|
|
||||||
|
Modal.prototype = { |
||||||
|
|
||||||
|
constructor: Modal |
||||||
|
|
||||||
|
, toggle: function () { |
||||||
|
return this[!this.isShown ? 'show' : 'hide']() |
||||||
|
} |
||||||
|
|
||||||
|
, show: function () { |
||||||
|
var that = this |
||||||
|
, e = $.Event('show') |
||||||
|
|
||||||
|
this.$element.trigger(e) |
||||||
|
|
||||||
|
if (this.isShown || e.isDefaultPrevented()) return |
||||||
|
|
||||||
|
this.isShown = true |
||||||
|
|
||||||
|
this.escape() |
||||||
|
|
||||||
|
this.backdrop(function () { |
||||||
|
var transition = $.support.transition && that.$element.hasClass('fade') |
||||||
|
|
||||||
|
if (!that.$element.parent().length) { |
||||||
|
that.$element.appendTo(document.body) //don't move modals dom position
|
||||||
|
} |
||||||
|
|
||||||
|
that.$element.show() |
||||||
|
|
||||||
|
if (transition) { |
||||||
|
that.$element[0].offsetWidth // force reflow
|
||||||
|
} |
||||||
|
|
||||||
|
that.$element |
||||||
|
.addClass('in') |
||||||
|
.attr('aria-hidden', false) |
||||||
|
|
||||||
|
that.enforceFocus() |
||||||
|
|
||||||
|
transition ? |
||||||
|
that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) : |
||||||
|
that.$element.focus().trigger('shown') |
||||||
|
|
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
, hide: function (e) { |
||||||
|
e && e.preventDefault() |
||||||
|
|
||||||
|
var that = this |
||||||
|
|
||||||
|
e = $.Event('hide') |
||||||
|
|
||||||
|
this.$element.trigger(e) |
||||||
|
|
||||||
|
if (!this.isShown || e.isDefaultPrevented()) return |
||||||
|
|
||||||
|
this.isShown = false |
||||||
|
|
||||||
|
this.escape() |
||||||
|
|
||||||
|
$(document).off('focusin.modal') |
||||||
|
|
||||||
|
this.$element |
||||||
|
.removeClass('in') |
||||||
|
.attr('aria-hidden', true) |
||||||
|
|
||||||
|
$.support.transition && this.$element.hasClass('fade') ? |
||||||
|
this.hideWithTransition() : |
||||||
|
this.hideModal() |
||||||
|
} |
||||||
|
|
||||||
|
, enforceFocus: function () { |
||||||
|
var that = this |
||||||
|
$(document).on('focusin.modal', function (e) { |
||||||
|
if (that.$element[0] !== e.target && !that.$element.has(e.target).length) { |
||||||
|
that.$element.focus() |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
, escape: function () { |
||||||
|
var that = this |
||||||
|
if (this.isShown && this.options.keyboard) { |
||||||
|
this.$element.on('keyup.dismiss.modal', function ( e ) { |
||||||
|
e.which == 27 && that.hide() |
||||||
|
}) |
||||||
|
} else if (!this.isShown) { |
||||||
|
this.$element.off('keyup.dismiss.modal') |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
, hideWithTransition: function () { |
||||||
|
var that = this |
||||||
|
, timeout = setTimeout(function () { |
||||||
|
that.$element.off($.support.transition.end) |
||||||
|
that.hideModal() |
||||||
|
}, 500) |
||||||
|
|
||||||
|
this.$element.one($.support.transition.end, function () { |
||||||
|
clearTimeout(timeout) |
||||||
|
that.hideModal() |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
, hideModal: function () { |
||||||
|
var that = this |
||||||
|
this.$element.hide() |
||||||
|
this.backdrop(function () { |
||||||
|
that.removeBackdrop() |
||||||
|
that.$element.trigger('hidden') |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
, removeBackdrop: function () { |
||||||
|
this.$backdrop && this.$backdrop.remove() |
||||||
|
this.$backdrop = null |
||||||
|
} |
||||||
|
|
||||||
|
, backdrop: function (callback) { |
||||||
|
var that = this |
||||||
|
, animate = this.$element.hasClass('fade') ? 'fade' : '' |
||||||
|
|
||||||
|
if (this.isShown && this.options.backdrop) { |
||||||
|
var doAnimate = $.support.transition && animate |
||||||
|
|
||||||
|
this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') |
||||||
|
.appendTo(document.body) |
||||||
|
|
||||||
|
this.$backdrop.click( |
||||||
|
this.options.backdrop == 'static' ? |
||||||
|
$.proxy(this.$element[0].focus, this.$element[0]) |
||||||
|
: $.proxy(this.hide, this) |
||||||
|
) |
||||||
|
|
||||||
|
if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
|
||||||
|
|
||||||
|
this.$backdrop.addClass('in') |
||||||
|
|
||||||
|
if (!callback) return |
||||||
|
|
||||||
|
doAnimate ? |
||||||
|
this.$backdrop.one($.support.transition.end, callback) : |
||||||
|
callback() |
||||||
|
|
||||||
|
} else if (!this.isShown && this.$backdrop) { |
||||||
|
this.$backdrop.removeClass('in') |
||||||
|
|
||||||
|
$.support.transition && this.$element.hasClass('fade')? |
||||||
|
this.$backdrop.one($.support.transition.end, callback) : |
||||||
|
callback() |
||||||
|
|
||||||
|
} else if (callback) { |
||||||
|
callback() |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* MODAL PLUGIN DEFINITION |
||||||
|
* ======================= */ |
||||||
|
|
||||||
|
var old = $.fn.modal |
||||||
|
|
||||||
|
$.fn.modal = function (option) { |
||||||
|
return this.each(function () { |
||||||
|
var $this = $(this) |
||||||
|
, data = $this.data('modal') |
||||||
|
, options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option) |
||||||
|
if (!data) $this.data('modal', (data = new Modal(this, options))) |
||||||
|
if (typeof option == 'string') data[option]() |
||||||
|
else if (options.show) data.show() |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
$.fn.modal.defaults = { |
||||||
|
backdrop: true |
||||||
|
, keyboard: true |
||||||
|
, show: true |
||||||
|
} |
||||||
|
|
||||||
|
$.fn.modal.Constructor = Modal |
||||||
|
|
||||||
|
|
||||||
|
/* MODAL NO CONFLICT |
||||||
|
* ================= */ |
||||||
|
|
||||||
|
$.fn.modal.noConflict = function () { |
||||||
|
$.fn.modal = old |
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* MODAL DATA-API |
||||||
|
* ============== */ |
||||||
|
|
||||||
|
$(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) { |
||||||
|
var $this = $(this) |
||||||
|
, href = $this.attr('href') |
||||||
|
, $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
|
||||||
|
, option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data()) |
||||||
|
|
||||||
|
e.preventDefault() |
||||||
|
|
||||||
|
$target |
||||||
|
.modal(option) |
||||||
|
.one('hide', function () { |
||||||
|
$this.focus() |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
}(window.jQuery); |
@ -0,0 +1,114 @@ |
|||||||
|
/* =========================================================== |
||||||
|
* bootstrap-popover.js v2.3.2 |
||||||
|
* http://twitter.github.com/bootstrap/javascript.html#popovers
|
||||||
|
* =========================================================== |
||||||
|
* Copyright 2012 Twitter, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* =========================================================== */ |
||||||
|
|
||||||
|
|
||||||
|
!function ($) { |
||||||
|
|
||||||
|
"use strict"; // jshint ;_;
|
||||||
|
|
||||||
|
|
||||||
|
/* POPOVER PUBLIC CLASS DEFINITION |
||||||
|
* =============================== */ |
||||||
|
|
||||||
|
var Popover = function (element, options) { |
||||||
|
this.init('popover', element, options) |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js |
||||||
|
========================================== */ |
||||||
|
|
||||||
|
Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, { |
||||||
|
|
||||||
|
constructor: Popover |
||||||
|
|
||||||
|
, setContent: function () { |
||||||
|
var $tip = this.tip() |
||||||
|
, title = this.getTitle() |
||||||
|
, content = this.getContent() |
||||||
|
|
||||||
|
$tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) |
||||||
|
$tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content) |
||||||
|
|
||||||
|
$tip.removeClass('fade top bottom left right in') |
||||||
|
} |
||||||
|
|
||||||
|
, hasContent: function () { |
||||||
|
return this.getTitle() || this.getContent() |
||||||
|
} |
||||||
|
|
||||||
|
, getContent: function () { |
||||||
|
var content |
||||||
|
, $e = this.$element |
||||||
|
, o = this.options |
||||||
|
|
||||||
|
content = (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) |
||||||
|
|| $e.attr('data-content') |
||||||
|
|
||||||
|
return content |
||||||
|
} |
||||||
|
|
||||||
|
, tip: function () { |
||||||
|
if (!this.$tip) { |
||||||
|
this.$tip = $(this.options.template) |
||||||
|
} |
||||||
|
return this.$tip |
||||||
|
} |
||||||
|
|
||||||
|
, destroy: function () { |
||||||
|
this.hide().$element.off('.' + this.type).removeData(this.type) |
||||||
|
} |
||||||
|
|
||||||
|
}) |
||||||
|
|
||||||
|
|
||||||
|
/* POPOVER PLUGIN DEFINITION |
||||||
|
* ======================= */ |
||||||
|
|
||||||
|
var old = $.fn.popover |
||||||
|
|
||||||
|
$.fn.popover = function (option) { |
||||||
|
return this.each(function () { |
||||||
|
var $this = $(this) |
||||||
|
, data = $this.data('popover') |
||||||
|
, options = typeof option == 'object' && option |
||||||
|
if (!data) $this.data('popover', (data = new Popover(this, options))) |
||||||
|
if (typeof option == 'string') data[option]() |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
$.fn.popover.Constructor = Popover |
||||||
|
|
||||||
|
$.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, { |
||||||
|
placement: 'right' |
||||||
|
, trigger: 'click' |
||||||
|
, content: '' |
||||||
|
, template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' |
||||||
|
}) |
||||||
|
|
||||||
|
|
||||||
|
/* POPOVER NO CONFLICT |
||||||
|
* =================== */ |
||||||
|
|
||||||
|
$.fn.popover.noConflict = function () { |
||||||
|
$.fn.popover = old |
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
}(window.jQuery); |
@ -0,0 +1,162 @@ |
|||||||
|
/* ============================================================= |
||||||
|
* bootstrap-scrollspy.js v2.3.2 |
||||||
|
* http://twitter.github.com/bootstrap/javascript.html#scrollspy
|
||||||
|
* ============================================================= |
||||||
|
* Copyright 2012 Twitter, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* ============================================================== */ |
||||||
|
|
||||||
|
|
||||||
|
!function ($) { |
||||||
|
|
||||||
|
"use strict"; // jshint ;_;
|
||||||
|
|
||||||
|
|
||||||
|
/* SCROLLSPY CLASS DEFINITION |
||||||
|
* ========================== */ |
||||||
|
|
||||||
|
function ScrollSpy(element, options) { |
||||||
|
var process = $.proxy(this.process, this) |
||||||
|
, $element = $(element).is('body') ? $(window) : $(element) |
||||||
|
, href |
||||||
|
this.options = $.extend({}, $.fn.scrollspy.defaults, options) |
||||||
|
this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process) |
||||||
|
this.selector = (this.options.target |
||||||
|
|| ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
|
||||||
|
|| '') + ' .nav li > a' |
||||||
|
this.$body = $('body') |
||||||
|
this.refresh() |
||||||
|
this.process() |
||||||
|
} |
||||||
|
|
||||||
|
ScrollSpy.prototype = { |
||||||
|
|
||||||
|
constructor: ScrollSpy |
||||||
|
|
||||||
|
, refresh: function () { |
||||||
|
var self = this |
||||||
|
, $targets |
||||||
|
|
||||||
|
this.offsets = $([]) |
||||||
|
this.targets = $([]) |
||||||
|
|
||||||
|
$targets = this.$body |
||||||
|
.find(this.selector) |
||||||
|
.map(function () { |
||||||
|
var $el = $(this) |
||||||
|
, href = $el.data('target') || $el.attr('href') |
||||||
|
, $href = /^#\w/.test(href) && $(href) |
||||||
|
return ( $href |
||||||
|
&& $href.length |
||||||
|
&& [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null |
||||||
|
}) |
||||||
|
.sort(function (a, b) { return a[0] - b[0] }) |
||||||
|
.each(function () { |
||||||
|
self.offsets.push(this[0]) |
||||||
|
self.targets.push(this[1]) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
, process: function () { |
||||||
|
var scrollTop = this.$scrollElement.scrollTop() + this.options.offset |
||||||
|
, scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight |
||||||
|
, maxScroll = scrollHeight - this.$scrollElement.height() |
||||||
|
, offsets = this.offsets |
||||||
|
, targets = this.targets |
||||||
|
, activeTarget = this.activeTarget |
||||||
|
, i |
||||||
|
|
||||||
|
if (scrollTop >= maxScroll) { |
||||||
|
return activeTarget != (i = targets.last()[0]) |
||||||
|
&& this.activate ( i ) |
||||||
|
} |
||||||
|
|
||||||
|
for (i = offsets.length; i--;) { |
||||||
|
activeTarget != targets[i] |
||||||
|
&& scrollTop >= offsets[i] |
||||||
|
&& (!offsets[i + 1] || scrollTop <= offsets[i + 1]) |
||||||
|
&& this.activate( targets[i] ) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
, activate: function (target) { |
||||||
|
var active |
||||||
|
, selector |
||||||
|
|
||||||
|
this.activeTarget = target |
||||||
|
|
||||||
|
$(this.selector) |
||||||
|
.parent('.active') |
||||||
|
.removeClass('active') |
||||||
|
|
||||||
|
selector = this.selector |
||||||
|
+ '[data-target="' + target + '"],' |
||||||
|
+ this.selector + '[href="' + target + '"]' |
||||||
|
|
||||||
|
active = $(selector) |
||||||
|
.parent('li') |
||||||
|
.addClass('active') |
||||||
|
|
||||||
|
if (active.parent('.dropdown-menu').length) { |
||||||
|
active = active.closest('li.dropdown').addClass('active') |
||||||
|
} |
||||||
|
|
||||||
|
active.trigger('activate') |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* SCROLLSPY PLUGIN DEFINITION |
||||||
|
* =========================== */ |
||||||
|
|
||||||
|
var old = $.fn.scrollspy |
||||||
|
|
||||||
|
$.fn.scrollspy = function (option) { |
||||||
|
return this.each(function () { |
||||||
|
var $this = $(this) |
||||||
|
, data = $this.data('scrollspy') |
||||||
|
, options = typeof option == 'object' && option |
||||||
|
if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options))) |
||||||
|
if (typeof option == 'string') data[option]() |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
$.fn.scrollspy.Constructor = ScrollSpy |
||||||
|
|
||||||
|
$.fn.scrollspy.defaults = { |
||||||
|
offset: 10 |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* SCROLLSPY NO CONFLICT |
||||||
|
* ===================== */ |
||||||
|
|
||||||
|
$.fn.scrollspy.noConflict = function () { |
||||||
|
$.fn.scrollspy = old |
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* SCROLLSPY DATA-API |
||||||
|
* ================== */ |
||||||
|
|
||||||
|
$(window).on('load', function () { |
||||||
|
$('[data-spy="scroll"]').each(function () { |
||||||
|
var $spy = $(this) |
||||||
|
$spy.scrollspy($spy.data()) |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
}(window.jQuery); |
@ -0,0 +1,144 @@ |
|||||||
|
/* ======================================================== |
||||||
|
* bootstrap-tab.js v2.3.2 |
||||||
|
* http://twitter.github.com/bootstrap/javascript.html#tabs
|
||||||
|
* ======================================================== |
||||||
|
* Copyright 2012 Twitter, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* ======================================================== */ |
||||||
|
|
||||||
|
|
||||||
|
!function ($) { |
||||||
|
|
||||||
|
"use strict"; // jshint ;_;
|
||||||
|
|
||||||
|
|
||||||
|
/* TAB CLASS DEFINITION |
||||||
|
* ==================== */ |
||||||
|
|
||||||
|
var Tab = function (element) { |
||||||
|
this.element = $(element) |
||||||
|
} |
||||||
|
|
||||||
|
Tab.prototype = { |
||||||
|
|
||||||
|
constructor: Tab |
||||||
|
|
||||||
|
, show: function () { |
||||||
|
var $this = this.element |
||||||
|
, $ul = $this.closest('ul:not(.dropdown-menu)') |
||||||
|
, selector = $this.attr('data-target') |
||||||
|
, previous |
||||||
|
, $target |
||||||
|
, e |
||||||
|
|
||||||
|
if (!selector) { |
||||||
|
selector = $this.attr('href') |
||||||
|
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
|
||||||
|
} |
||||||
|
|
||||||
|
if ( $this.parent('li').hasClass('active') ) return |
||||||
|
|
||||||
|
previous = $ul.find('.active:last a')[0] |
||||||
|
|
||||||
|
e = $.Event('show', { |
||||||
|
relatedTarget: previous |
||||||
|
}) |
||||||
|
|
||||||
|
$this.trigger(e) |
||||||
|
|
||||||
|
if (e.isDefaultPrevented()) return |
||||||
|
|
||||||
|
$target = $(selector) |
||||||
|
|
||||||
|
this.activate($this.parent('li'), $ul) |
||||||
|
this.activate($target, $target.parent(), function () { |
||||||
|
$this.trigger({ |
||||||
|
type: 'shown' |
||||||
|
, relatedTarget: previous |
||||||
|
}) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
, activate: function ( element, container, callback) { |
||||||
|
var $active = container.find('> .active') |
||||||
|
, transition = callback |
||||||
|
&& $.support.transition |
||||||
|
&& $active.hasClass('fade') |
||||||
|
|
||||||
|
function next() { |
||||||
|
$active |
||||||
|
.removeClass('active') |
||||||
|
.find('> .dropdown-menu > .active') |
||||||
|
.removeClass('active') |
||||||
|
|
||||||
|
element.addClass('active') |
||||||
|
|
||||||
|
if (transition) { |
||||||
|
element[0].offsetWidth // reflow for transition
|
||||||
|
element.addClass('in') |
||||||
|
} else { |
||||||
|
element.removeClass('fade') |
||||||
|
} |
||||||
|
|
||||||
|
if ( element.parent('.dropdown-menu') ) { |
||||||
|
element.closest('li.dropdown').addClass('active') |
||||||
|
} |
||||||
|
|
||||||
|
callback && callback() |
||||||
|
} |
||||||
|
|
||||||
|
transition ? |
||||||
|
$active.one($.support.transition.end, next) : |
||||||
|
next() |
||||||
|
|
||||||
|
$active.removeClass('in') |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* TAB PLUGIN DEFINITION |
||||||
|
* ===================== */ |
||||||
|
|
||||||
|
var old = $.fn.tab |
||||||
|
|
||||||
|
$.fn.tab = function ( option ) { |
||||||
|
return this.each(function () { |
||||||
|
var $this = $(this) |
||||||
|
, data = $this.data('tab') |
||||||
|
if (!data) $this.data('tab', (data = new Tab(this))) |
||||||
|
if (typeof option == 'string') data[option]() |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
$.fn.tab.Constructor = Tab |
||||||
|
|
||||||
|
|
||||||
|
/* TAB NO CONFLICT |
||||||
|
* =============== */ |
||||||
|
|
||||||
|
$.fn.tab.noConflict = function () { |
||||||
|
$.fn.tab = old |
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* TAB DATA-API |
||||||
|
* ============ */ |
||||||
|
|
||||||
|
$(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { |
||||||
|
e.preventDefault() |
||||||
|
$(this).tab('show') |
||||||
|
}) |
||||||
|
|
||||||
|
}(window.jQuery); |
@ -0,0 +1,361 @@ |
|||||||
|
/* =========================================================== |
||||||
|
* bootstrap-tooltip.js v2.3.2 |
||||||
|
* http://twitter.github.com/bootstrap/javascript.html#tooltips
|
||||||
|
* Inspired by the original jQuery.tipsy by Jason Frame |
||||||
|
* =========================================================== |
||||||
|
* Copyright 2012 Twitter, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* ========================================================== */ |
||||||
|
|
||||||
|
|
||||||
|
!function ($) { |
||||||
|
|
||||||
|
"use strict"; // jshint ;_;
|
||||||
|
|
||||||
|
|
||||||
|
/* TOOLTIP PUBLIC CLASS DEFINITION |
||||||
|
* =============================== */ |
||||||
|
|
||||||
|
var Tooltip = function (element, options) { |
||||||
|
this.init('tooltip', element, options) |
||||||
|
} |
||||||
|
|
||||||
|
Tooltip.prototype = { |
||||||
|
|
||||||
|
constructor: Tooltip |
||||||
|
|
||||||
|
, init: function (type, element, options) { |
||||||
|
var eventIn |
||||||
|
, eventOut |
||||||
|
, triggers |
||||||
|
, trigger |
||||||
|
, i |
||||||
|
|
||||||
|
this.type = type |
||||||
|
this.$element = $(element) |
||||||
|
this.options = this.getOptions(options) |
||||||
|
this.enabled = true |
||||||
|
|
||||||
|
triggers = this.options.trigger.split(' ') |
||||||
|
|
||||||
|
for (i = triggers.length; i--;) { |
||||||
|
trigger = triggers[i] |
||||||
|
if (trigger == 'click') { |
||||||
|
this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) |
||||||
|
} else if (trigger != 'manual') { |
||||||
|
eventIn = trigger == 'hover' ? 'mouseenter' : 'focus' |
||||||
|
eventOut = trigger == 'hover' ? 'mouseleave' : 'blur' |
||||||
|
this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) |
||||||
|
this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
this.options.selector ? |
||||||
|
(this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : |
||||||
|
this.fixTitle() |
||||||
|
} |
||||||
|
|
||||||
|
, getOptions: function (options) { |
||||||
|
options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options) |
||||||
|
|
||||||
|
if (options.delay && typeof options.delay == 'number') { |
||||||
|
options.delay = { |
||||||
|
show: options.delay |
||||||
|
, hide: options.delay |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return options |
||||||
|
} |
||||||
|
|
||||||
|
, enter: function (e) { |
||||||
|
var defaults = $.fn[this.type].defaults |
||||||
|
, options = {} |
||||||
|
, self |
||||||
|
|
||||||
|
this._options && $.each(this._options, function (key, value) { |
||||||
|
if (defaults[key] != value) options[key] = value |
||||||
|
}, this) |
||||||
|
|
||||||
|
self = $(e.currentTarget)[this.type](options).data(this.type) |
||||||
|
|
||||||
|
if (!self.options.delay || !self.options.delay.show) return self.show() |
||||||
|
|
||||||
|
clearTimeout(this.timeout) |
||||||
|
self.hoverState = 'in' |
||||||
|
this.timeout = setTimeout(function() { |
||||||
|
if (self.hoverState == 'in') self.show() |
||||||
|
}, self.options.delay.show) |
||||||
|
} |
||||||
|
|
||||||
|
, leave: function (e) { |
||||||
|
var self = $(e.currentTarget)[this.type](this._options).data(this.type) |
||||||
|
|
||||||
|
if (this.timeout) clearTimeout(this.timeout) |
||||||
|
if (!self.options.delay || !self.options.delay.hide) return self.hide() |
||||||
|
|
||||||
|
self.hoverState = 'out' |
||||||
|
this.timeout = setTimeout(function() { |
||||||
|
if (self.hoverState == 'out') self.hide() |
||||||
|
}, self.options.delay.hide) |
||||||
|
} |
||||||
|
|
||||||
|
, show: function () { |
||||||
|
var $tip |
||||||
|
, pos |
||||||
|
, actualWidth |
||||||
|
, actualHeight |
||||||
|
, placement |
||||||
|
, tp |
||||||
|
, e = $.Event('show') |
||||||
|
|
||||||
|
if (this.hasContent() && this.enabled) { |
||||||
|
this.$element.trigger(e) |
||||||
|
if (e.isDefaultPrevented()) return |
||||||
|
$tip = this.tip() |
||||||
|
this.setContent() |
||||||
|
|
||||||
|
if (this.options.animation) { |
||||||
|
$tip.addClass('fade') |
||||||
|
} |
||||||
|
|
||||||
|
placement = typeof this.options.placement == 'function' ? |
||||||
|
this.options.placement.call(this, $tip[0], this.$element[0]) : |
||||||
|
this.options.placement |
||||||
|
|
||||||
|
$tip |
||||||
|
.detach() |
||||||
|
.css({ top: 0, left: 0, display: 'block' }) |
||||||
|
|
||||||
|
this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) |
||||||
|
|
||||||
|
pos = this.getPosition() |
||||||
|
|
||||||
|
actualWidth = $tip[0].offsetWidth |
||||||
|
actualHeight = $tip[0].offsetHeight |
||||||
|
|
||||||
|
switch (placement) { |
||||||
|
case 'bottom': |
||||||
|
tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2} |
||||||
|
break |
||||||
|
case 'top': |
||||||
|
tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2} |
||||||
|
break |
||||||
|
case 'left': |
||||||
|
tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth} |
||||||
|
break |
||||||
|
case 'right': |
||||||
|
tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width} |
||||||
|
break |
||||||
|
} |
||||||
|
|
||||||
|
this.applyPlacement(tp, placement) |
||||||
|
this.$element.trigger('shown') |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
, applyPlacement: function(offset, placement){ |
||||||
|
var $tip = this.tip() |
||||||
|
, width = $tip[0].offsetWidth |
||||||
|
, height = $tip[0].offsetHeight |
||||||
|
, actualWidth |
||||||
|
, actualHeight |
||||||
|
, delta |
||||||
|
, replace |
||||||
|
|
||||||
|
$tip |
||||||
|
.offset(offset) |
||||||
|
.addClass(placement) |
||||||
|
.addClass('in') |
||||||
|
|
||||||
|
actualWidth = $tip[0].offsetWidth |
||||||
|
actualHeight = $tip[0].offsetHeight |
||||||
|
|
||||||
|
if (placement == 'top' && actualHeight != height) { |
||||||
|
offset.top = offset.top + height - actualHeight |
||||||
|
replace = true |
||||||
|
} |
||||||
|
|
||||||
|
if (placement == 'bottom' || placement == 'top') { |
||||||
|
delta = 0 |
||||||
|
|
||||||
|
if (offset.left < 0){ |
||||||
|
delta = offset.left * -2 |
||||||
|
offset.left = 0 |
||||||
|
$tip.offset(offset) |
||||||
|
actualWidth = $tip[0].offsetWidth |
||||||
|
actualHeight = $tip[0].offsetHeight |
||||||
|
} |
||||||
|
|
||||||
|
this.replaceArrow(delta - width + actualWidth, actualWidth, 'left') |
||||||
|
} else { |
||||||
|
this.replaceArrow(actualHeight - height, actualHeight, 'top') |
||||||
|
} |
||||||
|
|
||||||
|
if (replace) $tip.offset(offset) |
||||||
|
} |
||||||
|
|
||||||
|
, replaceArrow: function(delta, dimension, position){ |
||||||
|
this |
||||||
|
.arrow() |
||||||
|
.css(position, delta ? (50 * (1 - delta / dimension) + "%") : '') |
||||||
|
} |
||||||
|
|
||||||
|
, setContent: function () { |
||||||
|
var $tip = this.tip() |
||||||
|
, title = this.getTitle() |
||||||
|
|
||||||
|
$tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) |
||||||
|
$tip.removeClass('fade in top bottom left right') |
||||||
|
} |
||||||
|
|
||||||
|
, hide: function () { |
||||||
|
var that = this |
||||||
|
, $tip = this.tip() |
||||||
|
, e = $.Event('hide') |
||||||
|
|
||||||
|
this.$element.trigger(e) |
||||||
|
if (e.isDefaultPrevented()) return |
||||||
|
|
||||||
|
$tip.removeClass('in') |
||||||
|
|
||||||
|
function removeWithAnimation() { |
||||||
|
var timeout = setTimeout(function () { |
||||||
|
$tip.off($.support.transition.end).detach() |
||||||
|
}, 500) |
||||||
|
|
||||||
|
$tip.one($.support.transition.end, function () { |
||||||
|
clearTimeout(timeout) |
||||||
|
$tip.detach() |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
$.support.transition && this.$tip.hasClass('fade') ? |
||||||
|
removeWithAnimation() : |
||||||
|
$tip.detach() |
||||||
|
|
||||||
|
this.$element.trigger('hidden') |
||||||
|
|
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
, fixTitle: function () { |
||||||
|
var $e = this.$element |
||||||
|
if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { |
||||||
|
$e.attr('data-original-title', $e.attr('title') || '').attr('title', '') |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
, hasContent: function () { |
||||||
|
return this.getTitle() |
||||||
|
} |
||||||
|
|
||||||
|
, getPosition: function () { |
||||||
|
var el = this.$element[0] |
||||||
|
return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : { |
||||||
|
width: el.offsetWidth |
||||||
|
, height: el.offsetHeight |
||||||
|
}, this.$element.offset()) |
||||||
|
} |
||||||
|
|
||||||
|
, getTitle: function () { |
||||||
|
var title |
||||||
|
, $e = this.$element |
||||||
|
, o = this.options |
||||||
|
|
||||||
|
title = $e.attr('data-original-title') |
||||||
|
|| (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) |
||||||
|
|
||||||
|
return title |
||||||
|
} |
||||||
|
|
||||||
|
, tip: function () { |
||||||
|
return this.$tip = this.$tip || $(this.options.template) |
||||||
|
} |
||||||
|
|
||||||
|
, arrow: function(){ |
||||||
|
return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow") |
||||||
|
} |
||||||
|
|
||||||
|
, validate: function () { |
||||||
|
if (!this.$element[0].parentNode) { |
||||||
|
this.hide() |
||||||
|
this.$element = null |
||||||
|
this.options = null |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
, enable: function () { |
||||||
|
this.enabled = true |
||||||
|
} |
||||||
|
|
||||||
|
, disable: function () { |
||||||
|
this.enabled = false |
||||||
|
} |
||||||
|
|
||||||
|
, toggleEnabled: function () { |
||||||
|
this.enabled = !this.enabled |
||||||
|
} |
||||||
|
|
||||||
|
, toggle: function (e) { |
||||||
|
var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this |
||||||
|
self.tip().hasClass('in') ? self.hide() : self.show() |
||||||
|
} |
||||||
|
|
||||||
|
, destroy: function () { |
||||||
|
this.hide().$element.off('.' + this.type).removeData(this.type) |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* TOOLTIP PLUGIN DEFINITION |
||||||
|
* ========================= */ |
||||||
|
|
||||||
|
var old = $.fn.tooltip |
||||||
|
|
||||||
|
$.fn.tooltip = function ( option ) { |
||||||
|
return this.each(function () { |
||||||
|
var $this = $(this) |
||||||
|
, data = $this.data('tooltip') |
||||||
|
, options = typeof option == 'object' && option |
||||||
|
if (!data) $this.data('tooltip', (data = new Tooltip(this, options))) |
||||||
|
if (typeof option == 'string') data[option]() |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
$.fn.tooltip.Constructor = Tooltip |
||||||
|
|
||||||
|
$.fn.tooltip.defaults = { |
||||||
|
animation: true |
||||||
|
, placement: 'top' |
||||||
|
, selector: false |
||||||
|
, template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>' |
||||||
|
, trigger: 'hover focus' |
||||||
|
, title: '' |
||||||
|
, delay: 0 |
||||||
|
, html: false |
||||||
|
, container: false |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* TOOLTIP NO CONFLICT |
||||||
|
* =================== */ |
||||||
|
|
||||||
|
$.fn.tooltip.noConflict = function () { |
||||||
|
$.fn.tooltip = old |
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
}(window.jQuery); |
@ -0,0 +1,60 @@ |
|||||||
|
/* =================================================== |
||||||
|
* bootstrap-transition.js v2.3.2 |
||||||
|
* http://twitter.github.com/bootstrap/javascript.html#transitions
|
||||||
|
* =================================================== |
||||||
|
* Copyright 2012 Twitter, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* ========================================================== */ |
||||||
|
|
||||||
|
|
||||||
|
!function ($) { |
||||||
|
|
||||||
|
"use strict"; // jshint ;_;
|
||||||
|
|
||||||
|
|
||||||
|
/* CSS TRANSITION SUPPORT (http://www.modernizr.com/) |
||||||
|
* ======================================================= */ |
||||||
|
|
||||||
|
$(function () { |
||||||
|
|
||||||
|
$.support.transition = (function () { |
||||||
|
|
||||||
|
var transitionEnd = (function () { |
||||||
|
|
||||||
|
var el = document.createElement('bootstrap') |
||||||
|
, transEndEventNames = { |
||||||
|
'WebkitTransition' : 'webkitTransitionEnd' |
||||||
|
, 'MozTransition' : 'transitionend' |
||||||
|
, 'OTransition' : 'oTransitionEnd otransitionend' |
||||||
|
, 'transition' : 'transitionend' |
||||||
|
} |
||||||
|
, name |
||||||
|
|
||||||
|
for (name in transEndEventNames){ |
||||||
|
if (el.style[name] !== undefined) { |
||||||
|
return transEndEventNames[name] |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
}()) |
||||||
|
|
||||||
|
return transitionEnd && { |
||||||
|
end: transitionEnd |
||||||
|
} |
||||||
|
|
||||||
|
})() |
||||||
|
|
||||||
|
}) |
||||||
|
|
||||||
|
}(window.jQuery); |
@ -0,0 +1,335 @@ |
|||||||
|
/* ============================================================= |
||||||
|
* bootstrap-typeahead.js v2.3.2 |
||||||
|
* http://twitter.github.com/bootstrap/javascript.html#typeahead
|
||||||
|
* ============================================================= |
||||||
|
* Copyright 2012 Twitter, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* ============================================================ */ |
||||||
|
|
||||||
|
|
||||||
|
!function($){ |
||||||
|
|
||||||
|
"use strict"; // jshint ;_;
|
||||||
|
|
||||||
|
|
||||||
|
/* TYPEAHEAD PUBLIC CLASS DEFINITION |
||||||
|
* ================================= */ |
||||||
|
|
||||||
|
var Typeahead = function (element, options) { |
||||||
|
this.$element = $(element) |
||||||
|
this.options = $.extend({}, $.fn.typeahead.defaults, options) |
||||||
|
this.matcher = this.options.matcher || this.matcher |
||||||
|
this.sorter = this.options.sorter || this.sorter |
||||||
|
this.highlighter = this.options.highlighter || this.highlighter |
||||||
|
this.updater = this.options.updater || this.updater |
||||||
|
this.source = this.options.source |
||||||
|
this.$menu = $(this.options.menu) |
||||||
|
this.shown = false |
||||||
|
this.listen() |
||||||
|
} |
||||||
|
|
||||||
|
Typeahead.prototype = { |
||||||
|
|
||||||
|
constructor: Typeahead |
||||||
|
|
||||||
|
, select: function () { |
||||||
|
var val = this.$menu.find('.active').attr('data-value') |
||||||
|
this.$element |
||||||
|
.val(this.updater(val)) |
||||||
|
.change() |
||||||
|
return this.hide() |
||||||
|
} |
||||||
|
|
||||||
|
, updater: function (item) { |
||||||
|
return item |
||||||
|
} |
||||||
|
|
||||||
|
, show: function () { |
||||||
|
var pos = $.extend({}, this.$element.position(), { |
||||||
|
height: this.$element[0].offsetHeight |
||||||
|
}) |
||||||
|
|
||||||
|
this.$menu |
||||||
|
.insertAfter(this.$element) |
||||||
|
.css({ |
||||||
|
top: pos.top + pos.height |
||||||
|
, left: pos.left |
||||||
|
}) |
||||||
|
.show() |
||||||
|
|
||||||
|
this.shown = true |
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
, hide: function () { |
||||||
|
this.$menu.hide() |
||||||
|
this.shown = false |
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
, lookup: function (event) { |
||||||
|
var items |
||||||
|
|
||||||
|
this.query = this.$element.val() |
||||||
|
|
||||||
|
if (!this.query || this.query.length < this.options.minLength) { |
||||||
|
return this.shown ? this.hide() : this |
||||||
|
} |
||||||
|
|
||||||
|
items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source |
||||||
|
|
||||||
|
return items ? this.process(items) : this |
||||||
|
} |
||||||
|
|
||||||
|
, process: function (items) { |
||||||
|
var that = this |
||||||
|
|
||||||
|
items = $.grep(items, function (item) { |
||||||
|
return that.matcher(item) |
||||||
|
}) |
||||||
|
|
||||||
|
items = this.sorter(items) |
||||||
|
|
||||||
|
if (!items.length) { |
||||||
|
return this.shown ? this.hide() : this |
||||||
|
} |
||||||
|
|
||||||
|
return this.render(items.slice(0, this.options.items)).show() |
||||||
|
} |
||||||
|
|
||||||
|
, matcher: function (item) { |
||||||
|
return ~item.toLowerCase().indexOf(this.query.toLowerCase()) |
||||||
|
} |
||||||
|
|
||||||
|
, sorter: function (items) { |
||||||
|
var beginswith = [] |
||||||
|
, caseSensitive = [] |
||||||
|
, caseInsensitive = [] |
||||||
|
, item |
||||||
|
|
||||||
|
while (item = items.shift()) { |
||||||
|
if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item) |
||||||
|
else if (~item.indexOf(this.query)) caseSensitive.push(item) |
||||||
|
else caseInsensitive.push(item) |
||||||
|
} |
||||||
|
|
||||||
|
return beginswith.concat(caseSensitive, caseInsensitive) |
||||||
|
} |
||||||
|
|
||||||
|
, highlighter: function (item) { |
||||||
|
var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&') |
||||||
|
return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) { |
||||||
|
return '<strong>' + match + '</strong>' |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
, render: function (items) { |
||||||
|
var that = this |
||||||
|
|
||||||
|
items = $(items).map(function (i, item) { |
||||||
|
i = $(that.options.item).attr('data-value', item) |
||||||
|
i.find('a').html(that.highlighter(item)) |
||||||
|
return i[0] |
||||||
|
}) |
||||||
|
|
||||||
|
items.first().addClass('active') |
||||||
|
this.$menu.html(items) |
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
, next: function (event) { |
||||||
|
var active = this.$menu.find('.active').removeClass('active') |
||||||
|
, next = active.next() |
||||||
|
|
||||||
|
if (!next.length) { |
||||||
|
next = $(this.$menu.find('li')[0]) |
||||||
|
} |
||||||
|
|
||||||
|
next.addClass('active') |
||||||
|
} |
||||||
|
|
||||||
|
, prev: function (event) { |
||||||
|
var active = this.$menu.find('.active').removeClass('active') |
||||||
|
, prev = active.prev() |
||||||
|
|
||||||
|
if (!prev.length) { |
||||||
|
prev = this.$menu.find('li').last() |
||||||
|
} |
||||||
|
|
||||||
|
prev.addClass('active') |
||||||
|
} |
||||||
|
|
||||||
|
, listen: function () { |
||||||
|
this.$element |
||||||
|
.on('focus', $.proxy(this.focus, this)) |
||||||
|
.on('blur', $.proxy(this.blur, this)) |
||||||
|
.on('keypress', $.proxy(this.keypress, this)) |
||||||
|
.on('keyup', $.proxy(this.keyup, this)) |
||||||
|
|
||||||
|
if (this.eventSupported('keydown')) { |
||||||
|
this.$element.on('keydown', $.proxy(this.keydown, this)) |
||||||
|
} |
||||||
|
|
||||||
|
this.$menu |
||||||
|
.on('click', $.proxy(this.click, this)) |
||||||
|
.on('mouseenter', 'li', $.proxy(this.mouseenter, this)) |
||||||
|
.on('mouseleave', 'li', $.proxy(this.mouseleave, this)) |
||||||
|
} |
||||||
|
|
||||||
|
, eventSupported: function(eventName) { |
||||||
|
var isSupported = eventName in this.$element |
||||||
|
if (!isSupported) { |
||||||
|
this.$element.setAttribute(eventName, 'return;') |
||||||
|
isSupported = typeof this.$element[eventName] === 'function' |
||||||
|
} |
||||||
|
return isSupported |
||||||
|
} |
||||||
|
|
||||||
|
, move: function (e) { |
||||||
|
if (!this.shown) return |
||||||
|
|
||||||
|
switch(e.keyCode) { |
||||||
|
case 9: // tab
|
||||||
|
case 13: // enter
|
||||||
|
case 27: // escape
|
||||||
|
e.preventDefault() |
||||||
|
break |
||||||
|
|
||||||
|
case 38: // up arrow
|
||||||
|
e.preventDefault() |
||||||
|
this.prev() |
||||||
|
break |
||||||
|
|
||||||
|
case 40: // down arrow
|
||||||
|
e.preventDefault() |
||||||
|
this.next() |
||||||
|
break |
||||||
|
} |
||||||
|
|
||||||
|
e.stopPropagation() |
||||||
|
} |
||||||
|
|
||||||
|
, keydown: function (e) { |
||||||
|
this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27]) |
||||||
|
this.move(e) |
||||||
|
} |
||||||
|
|
||||||
|
, keypress: function (e) { |
||||||
|
if (this.suppressKeyPressRepeat) return |
||||||
|
this.move(e) |
||||||
|
} |
||||||
|
|
||||||
|
, keyup: function (e) { |
||||||
|
switch(e.keyCode) { |
||||||
|
case 40: // down arrow
|
||||||
|
case 38: // up arrow
|
||||||
|
case 16: // shift
|
||||||
|
case 17: // ctrl
|
||||||
|
case 18: // alt
|
||||||
|
break |
||||||
|
|
||||||
|
case 9: // tab
|
||||||
|
case 13: // enter
|
||||||
|
if (!this.shown) return |
||||||
|
this.select() |
||||||
|
break |
||||||
|
|
||||||
|
case 27: // escape
|
||||||
|
if (!this.shown) return |
||||||
|
this.hide() |
||||||
|
break |
||||||
|
|
||||||
|
default: |
||||||
|
this.lookup() |
||||||
|
} |
||||||
|
|
||||||
|
e.stopPropagation() |
||||||
|
e.preventDefault() |
||||||
|
} |
||||||
|
|
||||||
|
, focus: function (e) { |
||||||
|
this.focused = true |
||||||
|
} |
||||||
|
|
||||||
|
, blur: function (e) { |
||||||
|
this.focused = false |
||||||
|
if (!this.mousedover && this.shown) this.hide() |
||||||
|
} |
||||||
|
|
||||||
|
, click: function (e) { |
||||||
|
e.stopPropagation() |
||||||
|
e.preventDefault() |
||||||
|
this.select() |
||||||
|
this.$element.focus() |
||||||
|
} |
||||||
|
|
||||||
|
, mouseenter: function (e) { |
||||||
|
this.mousedover = true |
||||||
|
this.$menu.find('.active').removeClass('active') |
||||||
|
$(e.currentTarget).addClass('active') |
||||||
|
} |
||||||
|
|
||||||
|
, mouseleave: function (e) { |
||||||
|
this.mousedover = false |
||||||
|
if (!this.focused && this.shown) this.hide() |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* TYPEAHEAD PLUGIN DEFINITION |
||||||
|
* =========================== */ |
||||||
|
|
||||||
|
var old = $.fn.typeahead |
||||||
|
|
||||||
|
$.fn.typeahead = function (option) { |
||||||
|
return this.each(function () { |
||||||
|
var $this = $(this) |
||||||
|
, data = $this.data('typeahead') |
||||||
|
, options = typeof option == 'object' && option |
||||||
|
if (!data) $this.data('typeahead', (data = new Typeahead(this, options))) |
||||||
|
if (typeof option == 'string') data[option]() |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
$.fn.typeahead.defaults = { |
||||||
|
source: [] |
||||||
|
, items: 8 |
||||||
|
, menu: '<ul class="typeahead dropdown-menu"></ul>' |
||||||
|
, item: '<li><a href="#"></a></li>' |
||||||
|
, minLength: 1 |
||||||
|
} |
||||||
|
|
||||||
|
$.fn.typeahead.Constructor = Typeahead |
||||||
|
|
||||||
|
|
||||||
|
/* TYPEAHEAD NO CONFLICT |
||||||
|
* =================== */ |
||||||
|
|
||||||
|
$.fn.typeahead.noConflict = function () { |
||||||
|
$.fn.typeahead = old |
||||||
|
return this |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* TYPEAHEAD DATA-API |
||||||
|
* ================== */ |
||||||
|
|
||||||
|
$(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) { |
||||||
|
var $this = $(this) |
||||||
|
if ($this.data('typeahead')) return |
||||||
|
$this.typeahead($this.data()) |
||||||
|
}) |
||||||
|
|
||||||
|
}(window.jQuery); |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue