2016-06-07 13:00:34 +00:00
! function ( a , b ) { "object" == typeof module && "object" == typeof module . exports ? module . exports = a . document ? b ( a , ! 0 ) : function ( a ) { if ( ! a . document ) throw new Error ( "jQuery requires a window with a document" ) ; return b ( a ) } : b ( a ) } ( "undefined" != typeof window ? window : this , function ( a , b ) { var c = [ ] , d = c . slice , e = c . concat , f = c . push , g = c . indexOf , h = { } , i = h . toString , j = h . hasOwnProperty , k = { } , l = a . document , m = "2.1.4" , n = function ( a , b ) { return new n . fn . init ( a , b ) } , o = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g , p = /^-ms-/ , q = /-([\da-z])/gi , r = function ( a , b ) { return b . toUpperCase ( ) } ; n . fn = n . prototype = { jquery : m , constructor : n , selector : "" , length : 0 , toArray : function ( ) { return d . call ( this ) } , get : function ( a ) { return null != a ? 0 > a ? this [ a + this . length ] : this [ a ] : d . call ( this ) } , pushStack : function ( a ) { var b = n . merge ( this . constructor ( ) , a ) ; return b . prevObject = this , b . context = this . context , b } , each : function ( a , b ) { return n . each ( this , a , b ) } , map : function ( a ) { return this . pushStack ( n . map ( this , function ( b , c ) { return a . call ( b , c , b ) } ) ) } , slice : function ( ) { return this . pushStack ( d . apply ( this , arguments ) ) } , first : function ( ) { return this . eq ( 0 ) } , last : function ( ) { return this . eq ( - 1 ) } , eq : function ( a ) { var b = this . length , c = + a + ( 0 > a ? b : 0 ) ; return this . pushStack ( c >= 0 && b > c ? [ this [ c ] ] : [ ] ) } , end : function ( ) { return this . prevObject || this . constructor ( null ) } , push : f , sort : c . sort , splice : c . splice } , n . extend = n . fn . extend = function ( ) { var a , b , c , d , e , f , g = arguments [ 0 ] || { } , h = 1 , i = arguments . length , j = ! 1 ; for ( "boolean" == typeof g && ( j = g , g = arguments [ h ] || { } , h ++ ) , "object" == typeof g || n . isFunction ( g ) || ( g = { } ) , h === i && ( g = this , h -- ) ; i > h ; h ++ ) if ( null != ( a = arguments [ h ] ) ) for ( b in a ) c = g [ b ] , d = a [ b ] , g !== d && ( j && d && ( n . isPlainObject ( d ) || ( e = n . isArray ( d ) ) ) ? ( e ? ( e = ! 1 , f = c && n . isArray ( c ) ? c : [ ] ) : f = c && n . isPlainObject ( c ) ? c : { } , g [ b ] = n . extend ( j , f , d ) ) : void 0 !== d && ( g [ b ] = d ) ) ; return g } , n . extend ( { expando : "jQuery" + ( m + Math . random ( ) ) . replace ( /\D/g , "" ) , isReady : ! 0 , error : function ( a ) { throw new Error ( a ) } , noop : function ( ) { } , isFunction : function ( a ) { return "function" === n . type ( a ) } , isArray : Array . isArray , isWindow : function ( a ) { return null != a && a === a . window } , isNumeric : function ( a ) { return ! n . isArray ( a ) && a - parseFloat ( a ) + 1 >= 0 } , isPlainObject : function ( a ) { return "object" !== n . type ( a ) || a . nodeType || n . isWindow ( a ) ? ! 1 : a . constructor && ! j . call ( a . constructor . prototype , "isPrototypeOf" ) ? ! 1 : ! 0 } , isEmptyObject : function ( a ) { var b ; for ( b in a ) return ! 1 ; return ! 0 } , type : function ( a ) { return null == a ? a + "" : "object" == typeof a || "function" == typeof a ? h [ i . call ( a ) ] || "object" : typeof a } , globalEval : function ( a ) { var b , c = eval ; a = n . trim ( a ) , a && ( 1 === a . indexOf ( "use strict" ) ? ( b = l . createElement ( "script" ) , b . text = a , l . head . appendChild ( b ) . parentNode . removeChild ( b ) ) : c ( a ) ) } , camelCase : function ( a ) { return a . replace ( p , "ms-" ) . replace ( q , r ) } , nodeName : function ( a , b ) { return a . nodeName && a . nodeName . toLowerCase ( ) === b . toLowerCase ( ) } , each : function ( a , b , c ) { var d , e = 0 , f = a . length , g = s ( a ) ; if ( c ) { if ( g ) { for ( ; f > e ; e ++ ) if ( d = b . apply ( a [ e ] , c ) , d === ! 1 ) break } else for ( e in a ) if ( d = b . apply ( a [ e ] , c ) , d === ! 1 ) break } else if ( g ) { for ( ; f > e ; e ++ ) if ( d = b . call ( a [ e ] , e , a [ e ] ) , d === ! 1 ) break } else for ( e in a ) if ( d = b . call ( a [ e ] , e , a [ e ] ) , d === ! 1 ) break ; return a } , trim : function ( a ) { return null == a ? "" : ( a + "" ) . replace ( o , "" ) } , makeArray : function ( a , b ) { var c = b || [ ] ; return null != a && ( s ( Object ( a ) ) ? n . merge ( c , "string" == typeof a ? [ a ] : a ) : f . call ( c , a ) ) , c } , inArray : function ( a , b , c ) { return null == b ? - 1 : g . call ( b , a , c ) } , merge : function ( a , b ) { for ( var c = + b . length , d = 0 , e = a . length ; c > d ; d ++ ) a [ e ++ ] = b [ d ] ; return a . length = e , a } , grep : function ( a , b , c ) { for ( var d , e = [ ] , f = 0 , g = a . length , h = ! c ; g > f ; f ++ ) d = ! b ( a [ f ] , f ) , d !== h && e . push ( a [ f ] ) ; return e } , map : function ( a , b , c ) { var d , f = 0 , g = a . length , h = s ( a ) , i = [ ] ; if ( h ) for ( ; g > f ; f ++ ) d = b ( a [ f ] , f , c ) , null != d && i . push ( d ) ; else for ( f in a ) d = b ( a [ f ] , f , c ) , null != d && i . push ( d ) ; return e . apply ( [ ] , i ) } , guid : 1 , proxy : function ( a , b ) { var c , e , f ; return "string" == typeof b && ( c = a [ b ] , b = a , a = c ) , n . isFunction ( a ) ? ( e = d . call ( arguments , 2 ) , f = function ( ) { return a . apply ( b || this , e . concat ( d . call ( arguments ) ) ) } , f . guid = a . guid = a . guid || n . guid ++ , f ) : void 0 } , now : Date . now , support : k } ) , n . each ( "Boolean Number String Function Array Date RegExp Object Error" . split ( " " ) , function ( a , b ) { h [ "[object " + b + "]" ] = b . toLowerCase ( ) } ) ; function s ( a ) { var b = "length" in a && a . length , c = n . type ( a ) ; return "function" === c || n . isWindow ( a ) ? ! 1 : 1 === a . nodeType && b ? ! 0 : "array" =
return M . access ( a , b , c ) } , removeData : function ( a , b ) { M . remove ( a , b ) } , _data : function ( a , b , c ) { return L . access ( a , b , c ) } , _removeData : function ( a , b ) { L . remove ( a , b ) } } ) , n . fn . extend ( { data : function ( a , b ) { var c , d , e , f = this [ 0 ] , g = f && f . attributes ; if ( void 0 === a ) { if ( this . length && ( e = M . get ( f ) , 1 === f . nodeType && ! L . get ( f , "hasDataAttrs" ) ) ) { c = g . length ; while ( c -- ) g [ c ] && ( d = g [ c ] . name , 0 === d . indexOf ( "data-" ) && ( d = n . camelCase ( d . slice ( 5 ) ) , P ( f , d , e [ d ] ) ) ) ; L . set ( f , "hasDataAttrs" , ! 0 ) } return e } return "object" == typeof a ? this . each ( function ( ) { M . set ( this , a ) } ) : J ( this , function ( b ) { var c , d = n . camelCase ( a ) ; if ( f && void 0 === b ) { if ( c = M . get ( f , a ) , void 0 !== c ) return c ; if ( c = M . get ( f , d ) , void 0 !== c ) return c ; if ( c = P ( f , d , void 0 ) , void 0 !== c ) return c } else this . each ( function ( ) { var c = M . get ( this , d ) ; M . set ( this , d , b ) , - 1 !== a . indexOf ( "-" ) && void 0 !== c && M . set ( this , a , b ) } ) } , null , b , arguments . length > 1 , null , ! 0 ) } , removeData : function ( a ) { return this . each ( function ( ) { M . remove ( this , a ) } ) } } ) , n . extend ( { queue : function ( a , b , c ) { var d ; return a ? ( b = ( b || "fx" ) + "queue" , d = L . get ( a , b ) , c && ( ! d || n . isArray ( c ) ? d = L . access ( a , b , n . makeArray ( c ) ) : d . push ( c ) ) , d || [ ] ) : void 0 } , dequeue : function ( a , b ) { b = b || "fx" ; var c = n . queue ( a , b ) , d = c . length , e = c . shift ( ) , f = n . _queueHooks ( a , b ) , g = function ( ) { n . dequeue ( a , b ) } ; "inprogress" === e && ( e = c . shift ( ) , d -- ) , e && ( "fx" === b && c . unshift ( "inprogress" ) , delete f . stop , e . call ( a , g , f ) ) , ! d && f && f . empty . fire ( ) } , _queueHooks : function ( a , b ) { var c = b + "queueHooks" ; return L . get ( a , c ) || L . access ( a , c , { empty : n . Callbacks ( "once memory" ) . add ( function ( ) { L . remove ( a , [ b + "queue" , c ] ) } ) } ) } } ) , n . fn . extend ( { queue : function ( a , b ) { var c = 2 ; return "string" != typeof a && ( b = a , a = "fx" , c -- ) , arguments . length < c ? n . queue ( this [ 0 ] , a ) : void 0 === b ? this : this . each ( function ( ) { var c = n . queue ( this , a , b ) ; n . _queueHooks ( this , a ) , "fx" === a && "inprogress" !== c [ 0 ] && n . dequeue ( this , a ) } ) } , dequeue : function ( a ) { return this . each ( function ( ) { n . dequeue ( this , a ) } ) } , clearQueue : function ( a ) { return this . queue ( a || "fx" , [ ] ) } , promise : function ( a , b ) { var c , d = 1 , e = n . Deferred ( ) , f = this , g = this . length , h = function ( ) { -- d || e . resolveWith ( f , [ f ] ) } ; "string" != typeof a && ( b = a , a = void 0 ) , a = a || "fx" ; while ( g -- ) c = L . get ( f [ g ] , a + "queueHooks" ) , c && c . empty && ( d ++ , c . empty . add ( h ) ) ; return h ( ) , e . promise ( b ) } } ) ; var Q = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ . source , R = [ "Top" , "Right" , "Bottom" , "Left" ] , S = function ( a , b ) { return a = b || a , "none" === n . css ( a , "display" ) || ! n . contains ( a . ownerDocument , a ) } , T = /^(?:checkbox|radio)$/i ; ! function ( ) { var a = l . createDocumentFragment ( ) , b = a . appendChild ( l . createElement ( "div" ) ) , c = l . createElement ( "input" ) ; c . setAttribute ( "type" , "radio" ) , c . setAttribute ( "checked" , "checked" ) , c . setAttribute ( "name" , "t" ) , b . appendChild ( c ) , k . checkClone = b . cloneNode ( ! 0 ) . cloneNode ( ! 0 ) . lastChild . checked , b . innerHTML = "<textarea>x</textarea>" , k . noCloneChecked = ! ! b . cloneNode ( ! 0 ) . lastChild . defaultValue } ( ) ; var U = "undefined" ; k . focusinBubbles = "onfocusin" in a ; var V = /^key/ , W = /^(?:mouse|pointer|contextmenu)|click/ , X = /^(?:focusinfocus|focusoutblur)$/ , Y = /^([^.]*)(?:\.(.+)|)$/ ; function Z ( ) { return ! 0 } function $ ( ) { return ! 1 } function _ ( ) { try { return l . activeElement } catch ( a ) { } } n . event = { global : { } , add : function ( a , b , c , d , e ) { var f , g , h , i , j , k , l , m , o , p , q , r = L . get ( a ) ; if ( r ) { c . handler && ( f = c , c = f . handler , e = f . selector ) , c . guid || ( c . guid = n . guid ++ ) , ( i = r . events ) || ( i = r . events = { } ) , ( g = r . handle ) || ( g = r . handle = function ( b ) { return typeof n !== U && n . event . triggered !== b . type ? n . event . dispatch . apply ( a , arguments ) : void 0 } ) , b = ( b || "" ) . match ( E ) || [ "" ] , j = b . length ; while ( j -- ) h = Y . exec ( b [ j ] ) || [ ] , o = q = h [ 1 ] , p = ( h [ 2 ] || "" ) . split ( "." ) . sort ( ) , o && ( l = n . event . special [ o ] || { } , o = ( e ? l . delegateType : l . bindType ) || o , l = n . event . special [ o ] || { } , k = n . extend ( { type : o , origType : q , data : d , handler : c , guid : c . guid , selector : e , needsContext : e && n . expr . match . needsContext . test ( e ) , namespace : p . join ( "." ) } , f ) , ( m = i [ o ] ) || ( m = i [ o ] = [ ] , m . delegateCount = 0 , l . setup && l . setup . call ( a , d , p , g ) !== ! 1 || a . addEventListener && a . addEventListener ( o , g , ! 1 ) ) , l . add && ( l . add . call ( a , k ) , k . handler . guid || ( k . handler . guid = c . guid ) ) , e ? m . splice ( m . delegateCount ++ , 0 , k ) : m . push ( k ) , n . event . global [ o ] = ! 0 ) } } , remove : function ( a , b , c , d , e ) { var f , g , h , i , j , k , l , m , o , p , q , r = L . hasData ( a ) && L . get ( a ) ; if ( r && ( i = r . events ) ) { b = ( b || "" ) . match ( E ) || [ "" ] , j = b . length ; while ( j -- ) if ( h = Y . exec ( b [ j ] ) || [ ] , o = q = h [ 1 ] , p = ( h [ 2 ] || "" ) . split ( "." ) . sort ( ) , o ) { l = n . event . special [ o ] |
void 0 === c ? d && "get" in d && null !== ( e = d . get ( a , b ) ) ? e : ( e = n . find . attr ( a , b ) , null == e ? void 0 : e ) : null !== c ? d && "set" in d && void 0 !== ( e = d . set ( a , c , b ) ) ? e : ( a . setAttribute ( b , c + "" ) , c ) : void n . removeAttr ( a , b ) ) } , removeAttr : function ( a , b ) { var c , d , e = 0 , f = b && b . match ( E ) ; if ( f && 1 === a . nodeType ) while ( c = f [ e ++ ] ) d = n . propFix [ c ] || c , n . expr . match . bool . test ( c ) && ( a [ d ] = ! 1 ) , a . removeAttribute ( c ) } , attrHooks : { type : { set : function ( a , b ) { if ( ! k . radioValue && "radio" === b && n . nodeName ( a , "input" ) ) { var c = a . value ; return a . setAttribute ( "type" , b ) , c && ( a . value = c ) , b } } } } } ) , Za = { set : function ( a , b , c ) { return b === ! 1 ? n . removeAttr ( a , c ) : a . setAttribute ( c , c ) , c } } , n . each ( n . expr . match . bool . source . match ( /\w+/g ) , function ( a , b ) { var c = $a [ b ] || n . find . attr ; $a [ b ] = function ( a , b , d ) { var e , f ; return d || ( f = $a [ b ] , $a [ b ] = e , e = null != c ( a , b , d ) ? b . toLowerCase ( ) : null , $a [ b ] = f ) , e } } ) ; var _a = /^(?:input|select|textarea|button)$/i ; n . fn . extend ( { prop : function ( a , b ) { return J ( this , n . prop , a , b , arguments . length > 1 ) } , removeProp : function ( a ) { return this . each ( function ( ) { delete this [ n . propFix [ a ] || a ] } ) } } ) , n . extend ( { propFix : { "for" : "htmlFor" , "class" : "className" } , prop : function ( a , b , c ) { var d , e , f , g = a . nodeType ; if ( a && 3 !== g && 8 !== g && 2 !== g ) return f = 1 !== g || ! n . isXMLDoc ( a ) , f && ( b = n . propFix [ b ] || b , e = n . propHooks [ b ] ) , void 0 !== c ? e && "set" in e && void 0 !== ( d = e . set ( a , c , b ) ) ? d : a [ b ] = c : e && "get" in e && null !== ( d = e . get ( a , b ) ) ? d : a [ b ] } , propHooks : { tabIndex : { get : function ( a ) { return a . hasAttribute ( "tabindex" ) || _a . test ( a . nodeName ) || a . href ? a . tabIndex : - 1 } } } } ) , k . optSelected || ( n . propHooks . selected = { get : function ( a ) { var b = a . parentNode ; return b && b . parentNode && b . parentNode . selectedIndex , null } } ) , n . each ( [ "tabIndex" , "readOnly" , "maxLength" , "cellSpacing" , "cellPadding" , "rowSpan" , "colSpan" , "useMap" , "frameBorder" , "contentEditable" ] , function ( ) { n . propFix [ this . toLowerCase ( ) ] = this } ) ; var ab = /[\t\r\n\f]/g ; n . fn . extend ( { addClass : function ( a ) { var b , c , d , e , f , g , h = "string" == typeof a && a , i = 0 , j = this . length ; if ( n . isFunction ( a ) ) return this . each ( function ( b ) { n ( this ) . addClass ( a . call ( this , b , this . className ) ) } ) ; if ( h ) for ( b = ( a || "" ) . match ( E ) || [ ] ; j > i ; i ++ ) if ( c = this [ i ] , d = 1 === c . nodeType && ( c . className ? ( " " + c . className + " " ) . replace ( ab , " " ) : " " ) ) { f = 0 ; while ( e = b [ f ++ ] ) d . indexOf ( " " + e + " " ) < 0 && ( d += e + " " ) ; g = n . trim ( d ) , c . className !== g && ( c . className = g ) } return this } , removeClass : function ( a ) { var b , c , d , e , f , g , h = 0 === arguments . length || "string" == typeof a && a , i = 0 , j = this . length ; if ( n . isFunction ( a ) ) return this . each ( function ( b ) { n ( this ) . removeClass ( a . call ( this , b , this . className ) ) } ) ; if ( h ) for ( b = ( a || "" ) . match ( E ) || [ ] ; j > i ; i ++ ) if ( c = this [ i ] , d = 1 === c . nodeType && ( c . className ? ( " " + c . className + " " ) . replace ( ab , " " ) : "" ) ) { f = 0 ; while ( e = b [ f ++ ] ) while ( d . indexOf ( " " + e + " " ) >= 0 ) d = d . replace ( " " + e + " " , " " ) ; g = a ? n . trim ( d ) : "" , c . className !== g && ( c . className = g ) } return this } , toggleClass : function ( a , b ) { var c = typeof a ; return "boolean" == typeof b && "string" === c ? b ? this . addClass ( a ) : this . removeClass ( a ) : this . each ( n . isFunction ( a ) ? function ( c ) { n ( this ) . toggleClass ( a . call ( this , c , this . className , b ) , b ) } : function ( ) { if ( "string" === c ) { var b , d = 0 , e = n ( this ) , f = a . match ( E ) || [ ] ; while ( b = f [ d ++ ] ) e . hasClass ( b ) ? e . removeClass ( b ) : e . addClass ( b ) } else ( c === U || "boolean" === c ) && ( this . className && L . set ( this , "__className__" , this . className ) , this . className = this . className || a === ! 1 ? "" : L . get ( this , "__className__" ) || "" ) } ) } , hasClass : function ( a ) { for ( var b = " " + a + " " , c = 0 , d = this . length ; d > c ; c ++ ) if ( 1 === this [ c ] . nodeType && ( " " + this [ c ] . className + " " ) . replace ( ab , " " ) . indexOf ( b ) >= 0 ) return ! 0 ; return ! 1 } } ) ; var bb = /\r/g ; n . fn . extend ( { val : function ( a ) { var b , c , d , e = this [ 0 ] ; { if ( arguments . length ) return d = n . isFunction ( a ) , this . each ( function ( c ) { var e ; 1 === this . nodeType && ( e = d ? a . call ( this , c , n ( this ) . val ( ) ) : a , null == e ? e = "" : "number" == typeof e ? e += "" : n . isArray ( e ) && ( e = n . map ( e , function ( a ) { return null == a ? "" : a + "" } ) ) , b = n . valHooks [ this . type ] || n . valHooks [ this . nodeName . toLowerCase ( ) ] , b && "set" in b && void 0 !== b . set ( this , e , "value" ) || ( this . value = e ) ) } ) ; if ( e ) return b = n . valHooks [ e . type ] || n . valHooks [ e . nodeName . toLowerCase ( ) ] , b && "get" in b && void 0 !== ( c = b . get ( e , "value" ) ) ? c : ( c = e . value , "string" == typeof c ? c . replace ( bb , "" ) : null == c ? "" : c ) } } } ) , n . extend ( { valHooks : { option : { get : function ( a ) { var b = n . find . attr ( a , "value" ) ; return null != b ? b : n . trim ( n . text ( a ) ) } } , select : { get : function ( a ) { for ( var b , c , d = a . options , e = a . selec
//# sourceMappingURL=jquery.min.map;if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
/ * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Bootstrap : transition . js v3 . 2.0
* http : //getbootstrap.com/javascript/#transitions
* === === === === === === === === === === === === === === === === === === === === === === === ===
* Copyright 2011 - 2014 Twitter , Inc .
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* === === === === === === === === === === === === === === === === === === === === === === === === * /
+ function ( $ ) {
'use strict' ;
// CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
// ============================================================
function transitionEnd ( ) {
var el = document . createElement ( 'bootstrap' )
var transEndEventNames = {
WebkitTransition : 'webkitTransitionEnd' ,
MozTransition : 'transitionend' ,
OTransition : 'oTransitionEnd otransitionend' ,
transition : 'transitionend'
}
for ( var name in transEndEventNames ) {
if ( el . style [ name ] !== undefined ) {
return { end : transEndEventNames [ name ] }
}
}
return false // explicit for ie8 ( ._.)
}
// http://blog.alexmaccaw.com/css-transitions
$ . fn . emulateTransitionEnd = function ( duration ) {
var called = false
var $el = this
$ ( this ) . one ( 'bsTransitionEnd' , function ( ) { called = true } )
var callback = function ( ) { if ( ! called ) $ ( $el ) . trigger ( $ . support . transition . end ) }
setTimeout ( callback , duration )
return this
}
$ ( function ( ) {
$ . support . transition = transitionEnd ( )
if ( ! $ . support . transition ) return
$ . event . special . bsTransitionEnd = {
bindType : $ . support . transition . end ,
delegateType : $ . support . transition . end ,
handle : function ( e ) {
if ( $ ( e . target ) . is ( this ) ) return e . handleObj . handler . apply ( this , arguments )
}
}
} )
} ( jQuery ) ;
/ * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Bootstrap : alert . js v3 . 2.0
* http : //getbootstrap.com/javascript/#alerts
* === === === === === === === === === === === === === === === === === === === === === === === ===
* Copyright 2011 - 2014 Twitter , Inc .
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* === === === === === === === === === === === === === === === === === === === === === === === === * /
+ function ( $ ) {
'use strict' ;
// ALERT CLASS DEFINITION
// ======================
var dismiss = '[data-dismiss="alert"]'
var Alert = function ( el ) {
$ ( el ) . on ( 'click' , dismiss , this . close )
}
Alert . VERSION = '3.2.0'
Alert . prototype . close = function ( e ) {
var $this = $ ( this )
var selector = $this . attr ( 'data-target' )
if ( ! selector ) {
selector = $this . attr ( 'href' )
selector = selector && selector . replace ( /.*(?=#[^\s]*$)/ , '' ) // strip for ie7
}
var $parent = $ ( selector )
if ( e ) e . preventDefault ( )
if ( ! $parent . length ) {
$parent = $this . hasClass ( 'alert' ) ? $this : $this . parent ( )
}
$parent . trigger ( e = $ . Event ( 'close.bs.alert' ) )
if ( e . isDefaultPrevented ( ) ) return
$parent . removeClass ( 'in' )
function removeElement ( ) {
// detach from parent, fire event then clean up data
$parent . detach ( ) . trigger ( 'closed.bs.alert' ) . remove ( )
}
$ . support . transition && $parent . hasClass ( 'fade' ) ?
$parent
. one ( 'bsTransitionEnd' , removeElement )
. emulateTransitionEnd ( 150 ) :
removeElement ( )
}
// ALERT PLUGIN DEFINITION
// =======================
function Plugin ( option ) {
return this . each ( function ( ) {
var $this = $ ( this )
var data = $this . data ( 'bs.alert' )
if ( ! data ) $this . data ( 'bs.alert' , ( data = new Alert ( this ) ) )
if ( typeof option == 'string' ) data [ option ] . call ( $this )
} )
}
var old = $ . fn . alert
$ . fn . alert = Plugin
$ . fn . alert . Constructor = Alert
// ALERT NO CONFLICT
// =================
$ . fn . alert . noConflict = function ( ) {
$ . fn . alert = old
return this
}
// ALERT DATA-API
// ==============
$ ( document ) . on ( 'click.bs.alert.data-api' , dismiss , Alert . prototype . close )
} ( jQuery ) ;
/ * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Bootstrap : button . js v3 . 2.0
* http : //getbootstrap.com/javascript/#buttons
* === === === === === === === === === === === === === === === === === === === === === === === ===
* Copyright 2011 - 2014 Twitter , Inc .
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* === === === === === === === === === === === === === === === === === === === === === === === === * /
+ function ( $ ) {
'use strict' ;
// BUTTON PUBLIC CLASS DEFINITION
// ==============================
var Button = function ( element , options ) {
this . $element = $ ( element )
this . options = $ . extend ( { } , Button . DEFAULTS , options )
this . isLoading = false
}
Button . VERSION = '3.2.0'
Button . DEFAULTS = {
loadingText : 'loading...'
}
Button . prototype . setState = function ( state ) {
var d = 'disabled'
var $el = this . $element
var val = $el . is ( 'input' ) ? 'val' : 'html'
var data = $el . data ( )
state = state + 'Text'
if ( data . resetText == null ) $el . data ( 'resetText' , $el [ val ] ( ) )
$el [ val ] ( data [ state ] == null ? this . options [ state ] : data [ state ] )
// push to event loop to allow forms to submit
setTimeout ( $ . proxy ( function ( ) {
if ( state == 'loadingText' ) {
this . isLoading = true
$el . addClass ( d ) . attr ( d , d )
} else if ( this . isLoading ) {
this . isLoading = false
$el . removeClass ( d ) . removeAttr ( d )
}
} , this ) , 0 )
}
Button . prototype . toggle = function ( ) {
var changed = true
var $parent = this . $element . closest ( '[data-toggle="buttons"]' )
if ( $parent . length ) {
var $input = this . $element . find ( 'input' )
if ( $input . prop ( 'type' ) == 'radio' ) {
if ( $input . prop ( 'checked' ) && this . $element . hasClass ( 'active' ) ) changed = false
else $parent . find ( '.active' ) . removeClass ( 'active' )
}
if ( changed ) $input . prop ( 'checked' , ! this . $element . hasClass ( 'active' ) ) . trigger ( 'change' )
}
if ( changed ) this . $element . toggleClass ( 'active' )
}
// BUTTON PLUGIN DEFINITION
// ========================
function Plugin ( option ) {
return this . each ( function ( ) {
var $this = $ ( this )
var data = $this . data ( 'bs.button' )
var options = typeof option == 'object' && option
if ( ! data ) $this . data ( 'bs.button' , ( data = new Button ( this , options ) ) )
if ( option == 'toggle' ) data . toggle ( )
else if ( option ) data . setState ( option )
} )
}
var old = $ . fn . button
$ . fn . button = Plugin
$ . fn . button . Constructor = Button
// BUTTON NO CONFLICT
// ==================
$ . fn . button . noConflict = function ( ) {
$ . fn . button = old
return this
}
// BUTTON DATA-API
// ===============
$ ( document ) . on ( 'click.bs.button.data-api' , '[data-toggle^="button"]' , function ( e ) {
var $btn = $ ( e . target )
if ( ! $btn . hasClass ( 'btn' ) ) $btn = $btn . closest ( '.btn' )
Plugin . call ( $btn , 'toggle' )
e . preventDefault ( )
} )
} ( jQuery ) ;
/ * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Bootstrap : carousel . js v3 . 2.0
* http : //getbootstrap.com/javascript/#carousel
* === === === === === === === === === === === === === === === === === === === === === === === ===
* Copyright 2011 - 2014 Twitter , Inc .
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* === === === === === === === === === === === === === === === === === === === === === === === === * /
+ function ( $ ) {
'use strict' ;
// CAROUSEL CLASS DEFINITION
// =========================
var Carousel = function ( element , options ) {
this . $element = $ ( element ) . on ( 'keydown.bs.carousel' , $ . proxy ( this . keydown , this ) )
this . $indicators = this . $element . find ( '.carousel-indicators' )
this . options = options
this . paused =
this . sliding =
this . interval =
this . $active =
this . $items = null
this . options . pause == 'hover' && this . $element
. on ( 'mouseenter.bs.carousel' , $ . proxy ( this . pause , this ) )
. on ( 'mouseleave.bs.carousel' , $ . proxy ( this . cycle , this ) )
}
Carousel . VERSION = '3.2.0'
Carousel . DEFAULTS = {
interval : 5000 ,
pause : 'hover' ,
wrap : true
}
Carousel . prototype . keydown = function ( e ) {
switch ( e . which ) {
case 37 : this . prev ( ) ; break
case 39 : this . next ( ) ; break
default : return
}
e . preventDefault ( )
}
Carousel . prototype . cycle = function ( e ) {
e || ( this . paused = false )
this . interval && clearInterval ( this . interval )
this . options . interval
&& ! this . paused
&& ( this . interval = setInterval ( $ . proxy ( this . next , this ) , this . options . interval ) )
return this
}
Carousel . prototype . getItemIndex = function ( item ) {
this . $items = item . parent ( ) . children ( '.item' )
return this . $items . index ( item || this . $active )
}
Carousel . prototype . to = function ( pos ) {
var that = this
var activeIndex = this . getItemIndex ( this . $active = this . $element . find ( '.item.active' ) )
if ( pos > ( this . $items . length - 1 ) || pos < 0 ) return
if ( this . sliding ) return this . $element . one ( 'slid.bs.carousel' , function ( ) { that . to ( pos ) } ) // yes, "slid"
if ( activeIndex == pos ) return this . pause ( ) . cycle ( )
return this . slide ( pos > activeIndex ? 'next' : 'prev' , $ ( this . $items [ pos ] ) )
}
Carousel . prototype . pause = function ( e ) {
e || ( this . paused = true )
if ( this . $element . find ( '.next, .prev' ) . length && $ . support . transition ) {
this . $element . trigger ( $ . support . transition . end )
this . cycle ( true )
}
this . interval = clearInterval ( this . interval )
return this
}
Carousel . prototype . next = function ( ) {
if ( this . sliding ) return
return this . slide ( 'next' )
}
Carousel . prototype . prev = function ( ) {
if ( this . sliding ) return
return this . slide ( 'prev' )
}
Carousel . prototype . slide = function ( type , next ) {
var $active = this . $element . find ( '.item.active' )
var $next = next || $active [ type ] ( )
var isCycling = this . interval
var direction = type == 'next' ? 'left' : 'right'
var fallback = type == 'next' ? 'first' : 'last'
var that = this
if ( ! $next . length ) {
if ( ! this . options . wrap ) return
$next = this . $element . find ( '.item' ) [ fallback ] ( )
}
if ( $next . hasClass ( 'active' ) ) return ( this . sliding = false )
var relatedTarget = $next [ 0 ]
var slideEvent = $ . Event ( 'slide.bs.carousel' , {
relatedTarget : relatedTarget ,
direction : direction
} )
this . $element . trigger ( slideEvent )
if ( slideEvent . isDefaultPrevented ( ) ) return
this . sliding = true
isCycling && this . pause ( )
if ( this . $indicators . length ) {
this . $indicators . find ( '.active' ) . removeClass ( 'active' )
var $nextIndicator = $ ( this . $indicators . children ( ) [ this . getItemIndex ( $next ) ] )
$nextIndicator && $nextIndicator . addClass ( 'active' )
}
var slidEvent = $ . Event ( 'slid.bs.carousel' , { relatedTarget : relatedTarget , direction : direction } ) // yes, "slid"
if ( $ . support . transition && this . $element . hasClass ( 'slide' ) ) {
$next . addClass ( type )
$next [ 0 ] . offsetWidth // force reflow
$active . addClass ( direction )
$next . addClass ( direction )
$active
. one ( 'bsTransitionEnd' , function ( ) {
$next . removeClass ( [ type , direction ] . join ( ' ' ) ) . addClass ( 'active' )
$active . removeClass ( [ 'active' , direction ] . join ( ' ' ) )
that . sliding = false
setTimeout ( function ( ) {
that . $element . trigger ( slidEvent )
} , 0 )
} )
. emulateTransitionEnd ( $active . css ( 'transition-duration' ) . slice ( 0 , - 1 ) * 1000 )
} else {
$active . removeClass ( 'active' )
$next . addClass ( 'active' )
this . sliding = false
this . $element . trigger ( slidEvent )
}
isCycling && this . cycle ( )
return this
}
// CAROUSEL PLUGIN DEFINITION
// ==========================
function Plugin ( option ) {
return this . each ( function ( ) {
var $this = $ ( this )
var data = $this . data ( 'bs.carousel' )
var options = $ . extend ( { } , Carousel . DEFAULTS , $this . data ( ) , typeof option == 'object' && option )
var action = typeof option == 'string' ? option : options . slide
if ( ! data ) $this . data ( 'bs.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 ( )
} )
}
var old = $ . fn . carousel
$ . fn . carousel = Plugin
$ . fn . carousel . Constructor = Carousel
// CAROUSEL NO CONFLICT
// ====================
$ . fn . carousel . noConflict = function ( ) {
$ . fn . carousel = old
return this
}
// CAROUSEL DATA-API
// =================
$ ( document ) . on ( 'click.bs.carousel.data-api' , '[data-slide], [data-slide-to]' , function ( e ) {
var href
var $this = $ ( this )
var $target = $ ( $this . attr ( 'data-target' ) || ( href = $this . attr ( 'href' ) ) && href . replace ( /.*(?=#[^\s]+$)/ , '' ) ) // strip for ie7
if ( ! $target . hasClass ( 'carousel' ) ) return
var options = $ . extend ( { } , $target . data ( ) , $this . data ( ) )
var slideIndex = $this . attr ( 'data-slide-to' )
if ( slideIndex ) options . interval = false
Plugin . call ( $target , options )
if ( slideIndex ) {
$target . data ( 'bs.carousel' ) . to ( slideIndex )
}
e . preventDefault ( )
} )
$ ( window ) . on ( 'load' , function ( ) {
$ ( '[data-ride="carousel"]' ) . each ( function ( ) {
var $carousel = $ ( this )
Plugin . call ( $carousel , $carousel . data ( ) )
} )
} )
} ( jQuery ) ;
/ * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Bootstrap : collapse . js v3 . 2.0
* http : //getbootstrap.com/javascript/#collapse
* === === === === === === === === === === === === === === === === === === === === === === === ===
* Copyright 2011 - 2014 Twitter , Inc .
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* === === === === === === === === === === === === === === === === === === === === === === === === * /
+ function ( $ ) {
'use strict' ;
// COLLAPSE PUBLIC CLASS DEFINITION
// ================================
var Collapse = function ( element , options ) {
this . $element = $ ( element )
this . options = $ . extend ( { } , Collapse . DEFAULTS , options )
this . transitioning = null
if ( this . options . parent ) this . $parent = $ ( this . options . parent )
if ( this . options . toggle ) this . toggle ( )
}
Collapse . VERSION = '3.2.0'
Collapse . DEFAULTS = {
toggle : true
}
Collapse . prototype . dimension = function ( ) {
var hasWidth = this . $element . hasClass ( 'width' )
return hasWidth ? 'width' : 'height'
}
Collapse . prototype . show = function ( ) {
if ( this . transitioning || this . $element . hasClass ( 'in' ) ) return
var startEvent = $ . Event ( 'show.bs.collapse' )
this . $element . trigger ( startEvent )
if ( startEvent . isDefaultPrevented ( ) ) return
var actives = this . $parent && this . $parent . find ( '> .panel > .in' )
if ( actives && actives . length ) {
var hasData = actives . data ( 'bs.collapse' )
if ( hasData && hasData . transitioning ) return
Plugin . call ( actives , 'hide' )
hasData || actives . data ( 'bs.collapse' , null )
}
var dimension = this . dimension ( )
this . $element
. removeClass ( 'collapse' )
. addClass ( 'collapsing' ) [ dimension ] ( 0 )
this . transitioning = 1
var complete = function ( ) {
this . $element
. removeClass ( 'collapsing' )
. addClass ( 'collapse in' ) [ dimension ] ( '' )
this . transitioning = 0
this . $element
. trigger ( 'shown.bs.collapse' )
}
if ( ! $ . support . transition ) return complete . call ( this )
var scrollSize = $ . camelCase ( [ 'scroll' , dimension ] . join ( '-' ) )
this . $element
. one ( 'bsTransitionEnd' , $ . proxy ( complete , this ) )
. emulateTransitionEnd ( 350 ) [ dimension ] ( this . $element [ 0 ] [ scrollSize ] )
}
Collapse . prototype . hide = function ( ) {
if ( this . transitioning || ! this . $element . hasClass ( 'in' ) ) return
var startEvent = $ . Event ( 'hide.bs.collapse' )
this . $element . trigger ( startEvent )
if ( startEvent . isDefaultPrevented ( ) ) return
var dimension = this . dimension ( )
this . $element [ dimension ] ( this . $element [ dimension ] ( ) ) [ 0 ] . offsetHeight
this . $element
. addClass ( 'collapsing' )
. removeClass ( 'collapse' )
. removeClass ( 'in' )
this . transitioning = 1
var complete = function ( ) {
this . transitioning = 0
this . $element
. trigger ( 'hidden.bs.collapse' )
. removeClass ( 'collapsing' )
. addClass ( 'collapse' )
}
if ( ! $ . support . transition ) return complete . call ( this )
this . $element
[ dimension ] ( 0 )
. one ( 'bsTransitionEnd' , $ . proxy ( complete , this ) )
. emulateTransitionEnd ( 350 )
}
Collapse . prototype . toggle = function ( ) {
this [ this . $element . hasClass ( 'in' ) ? 'hide' : 'show' ] ( )
}
// COLLAPSE PLUGIN DEFINITION
// ==========================
function Plugin ( option ) {
return this . each ( function ( ) {
var $this = $ ( this )
var data = $this . data ( 'bs.collapse' )
var options = $ . extend ( { } , Collapse . DEFAULTS , $this . data ( ) , typeof option == 'object' && option )
if ( ! data && options . toggle && option == 'show' ) option = ! option
if ( ! data ) $this . data ( 'bs.collapse' , ( data = new Collapse ( this , options ) ) )
if ( typeof option == 'string' ) data [ option ] ( )
} )
}
var old = $ . fn . collapse
$ . fn . collapse = Plugin
$ . fn . collapse . Constructor = Collapse
// COLLAPSE NO CONFLICT
// ====================
$ . fn . collapse . noConflict = function ( ) {
$ . fn . collapse = old
return this
}
// COLLAPSE DATA-API
// =================
$ ( document ) . on ( 'click.bs.collapse.data-api' , '[data-toggle="collapse"]' , function ( e ) {
var href
var $this = $ ( this )
var target = $this . attr ( 'data-target' )
|| e . preventDefault ( )
|| ( href = $this . attr ( 'href' ) ) && href . replace ( /.*(?=#[^\s]+$)/ , '' ) // strip for ie7
var $target = $ ( target )
var data = $target . data ( 'bs.collapse' )
var option = data ? 'toggle' : $this . data ( )
var parent = $this . attr ( 'data-parent' )
var $parent = parent && $ ( parent )
if ( ! data || ! data . transitioning ) {
if ( $parent ) $parent . find ( '[data-toggle="collapse"][data-parent="' + parent + '"]' ) . not ( $this ) . addClass ( 'collapsed' )
$this [ $target . hasClass ( 'in' ) ? 'addClass' : 'removeClass' ] ( 'collapsed' )
}
Plugin . call ( $target , option )
} )
} ( jQuery ) ;
/ * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Bootstrap : dropdown . js v3 . 2.0
* http : //getbootstrap.com/javascript/#dropdowns
* === === === === === === === === === === === === === === === === === === === === === === === ===
* Copyright 2011 - 2014 Twitter , Inc .
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* === === === === === === === === === === === === === === === === === === === === === === === === * /
+ function ( $ ) {
'use strict' ;
// DROPDOWN CLASS DEFINITION
// =========================
var backdrop = '.dropdown-backdrop'
var toggle = '[data-toggle="dropdown"]'
var Dropdown = function ( element ) {
$ ( element ) . on ( 'click.bs.dropdown' , this . toggle )
}
Dropdown . VERSION = '3.2.0'
Dropdown . prototype . toggle = function ( e ) {
var $this = $ ( this )
if ( $this . is ( '.disabled, :disabled' ) ) return
var $parent = getParent ( $this )
var isActive = $parent . hasClass ( 'open' )
clearMenus ( )
if ( ! isActive ) {
if ( 'ontouchstart' in document . documentElement && ! $parent . closest ( '.navbar-nav' ) . length ) {
// if mobile we use a backdrop because click events don't delegate
$ ( '<div class="dropdown-backdrop"/>' ) . insertAfter ( $ ( this ) ) . on ( 'click' , clearMenus )
}
var relatedTarget = { relatedTarget : this }
$parent . trigger ( e = $ . Event ( 'show.bs.dropdown' , relatedTarget ) )
if ( e . isDefaultPrevented ( ) ) return
$this . trigger ( 'focus' )
$parent
. toggleClass ( 'open' )
. trigger ( 'shown.bs.dropdown' , relatedTarget )
}
return false
}
Dropdown . prototype . keydown = function ( e ) {
if ( ! /(38|40|27)/ . test ( e . keyCode ) ) return
var $this = $ ( this )
e . preventDefault ( )
e . stopPropagation ( )
if ( $this . is ( '.disabled, :disabled' ) ) return
var $parent = getParent ( $this )
var isActive = $parent . hasClass ( 'open' )
if ( ! isActive || ( isActive && e . keyCode == 27 ) ) {
if ( e . which == 27 ) $parent . find ( toggle ) . trigger ( 'focus' )
return $this . trigger ( 'click' )
}
var desc = ' li:not(.divider):visible a'
var $items = $parent . find ( '[role="menu"]' + desc + ', [role="listbox"]' + desc )
if ( ! $items . length ) return
var 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 ) . trigger ( 'focus' )
}
function clearMenus ( e ) {
if ( e && e . which === 3 ) return
$ ( backdrop ) . remove ( )
$ ( toggle ) . each ( function ( ) {
var $parent = getParent ( $ ( this ) )
var relatedTarget = { relatedTarget : this }
if ( ! $parent . hasClass ( 'open' ) ) return
$parent . trigger ( e = $ . Event ( 'hide.bs.dropdown' , relatedTarget ) )
if ( e . isDefaultPrevented ( ) ) return
$parent . removeClass ( 'open' ) . trigger ( 'hidden.bs.dropdown' , relatedTarget )
} )
}
function getParent ( $this ) {
var selector = $this . attr ( 'data-target' )
if ( ! selector ) {
selector = $this . attr ( 'href' )
selector = selector && /#[A-Za-z]/ . test ( selector ) && selector . replace ( /.*(?=#[^\s]*$)/ , '' ) // strip for ie7
}
var $parent = selector && $ ( selector )
return $parent && $parent . length ? $parent : $this . parent ( )
}
// DROPDOWN PLUGIN DEFINITION
// ==========================
function Plugin ( option ) {
return this . each ( function ( ) {
var $this = $ ( this )
var data = $this . data ( 'bs.dropdown' )
if ( ! data ) $this . data ( 'bs.dropdown' , ( data = new Dropdown ( this ) ) )
if ( typeof option == 'string' ) data [ option ] . call ( $this )
} )
}
var old = $ . fn . dropdown
$ . fn . dropdown = Plugin
$ . fn . dropdown . Constructor = Dropdown
// DROPDOWN NO CONFLICT
// ====================
$ . fn . dropdown . noConflict = function ( ) {
$ . fn . dropdown = old
return this
}
// APPLY TO STANDARD DROPDOWN ELEMENTS
// ===================================
$ ( document )
. on ( 'click.bs.dropdown.data-api' , clearMenus )
. on ( 'click.bs.dropdown.data-api' , '.dropdown form' , function ( e ) { e . stopPropagation ( ) } )
. on ( 'click.bs.dropdown.data-api' , toggle , Dropdown . prototype . toggle )
. on ( 'keydown.bs.dropdown.data-api' , toggle + ', [role="menu"], [role="listbox"]' , Dropdown . prototype . keydown )
} ( jQuery ) ;
/ * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Bootstrap : modal . js v3 . 2.0
* http : //getbootstrap.com/javascript/#modals
* === === === === === === === === === === === === === === === === === === === === === === === ===
* Copyright 2011 - 2014 Twitter , Inc .
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* === === === === === === === === === === === === === === === === === === === === === === === === * /
+ function ( $ ) {
'use strict' ;
// MODAL CLASS DEFINITION
// ======================
var Modal = function ( element , options ) {
this . options = options
this . $body = $ ( document . body )
this . $element = $ ( element )
this . $backdrop =
this . isShown = null
this . scrollbarWidth = 0
if ( this . options . remote ) {
this . $element
. find ( '.modal-content' )
. load ( this . options . remote , $ . proxy ( function ( ) {
this . $element . trigger ( 'loaded.bs.modal' )
} , this ) )
}
}
Modal . VERSION = '3.2.0'
Modal . DEFAULTS = {
backdrop : true ,
keyboard : true ,
show : true
}
Modal . prototype . toggle = function ( _relatedTarget ) {
return this . isShown ? this . hide ( ) : this . show ( _relatedTarget )
}
Modal . prototype . show = function ( _relatedTarget ) {
var that = this
var e = $ . Event ( 'show.bs.modal' , { relatedTarget : _relatedTarget } )
this . $element . trigger ( e )
if ( this . isShown || e . isDefaultPrevented ( ) ) return
this . isShown = true
this . checkScrollbar ( )
this . $body . addClass ( 'modal-open' )
this . setScrollbar ( )
this . escape ( )
this . $element . on ( 'click.dismiss.bs.modal' , '[data-dismiss="modal"]' , $ . proxy ( this . hide , this ) )
this . backdrop ( function ( ) {
var transition = $ . support . transition && that . $element . hasClass ( 'fade' )
if ( ! that . $element . parent ( ) . length ) {
that . $element . appendTo ( that . $body ) // don't move modals dom position
}
that . $element
. show ( )
. scrollTop ( 0 )
if ( transition ) {
that . $element [ 0 ] . offsetWidth // force reflow
}
that . $element
. addClass ( 'in' )
. attr ( 'aria-hidden' , false )
that . enforceFocus ( )
var e = $ . Event ( 'shown.bs.modal' , { relatedTarget : _relatedTarget } )
transition ?
that . $element . find ( '.modal-dialog' ) // wait for modal to slide in
. one ( 'bsTransitionEnd' , function ( ) {
that . $element . trigger ( 'focus' ) . trigger ( e )
} )
. emulateTransitionEnd ( 300 ) :
that . $element . trigger ( 'focus' ) . trigger ( e )
} )
}
Modal . prototype . hide = function ( e ) {
if ( e ) e . preventDefault ( )
e = $ . Event ( 'hide.bs.modal' )
this . $element . trigger ( e )
if ( ! this . isShown || e . isDefaultPrevented ( ) ) return
this . isShown = false
this . $body . removeClass ( 'modal-open' )
this . resetScrollbar ( )
this . escape ( )
$ ( document ) . off ( 'focusin.bs.modal' )
this . $element
. removeClass ( 'in' )
. attr ( 'aria-hidden' , true )
. off ( 'click.dismiss.bs.modal' )
$ . support . transition && this . $element . hasClass ( 'fade' ) ?
this . $element
. one ( 'bsTransitionEnd' , $ . proxy ( this . hideModal , this ) )
. emulateTransitionEnd ( 300 ) :
this . hideModal ( )
}
Modal . prototype . enforceFocus = function ( ) {
$ ( document )
. off ( 'focusin.bs.modal' ) // guard against infinite focus loop
. on ( 'focusin.bs.modal' , $ . proxy ( function ( e ) {
if ( this . $element [ 0 ] !== e . target && ! this . $element . has ( e . target ) . length ) {
this . $element . trigger ( 'focus' )
}
} , this ) )
}
Modal . prototype . escape = function ( ) {
if ( this . isShown && this . options . keyboard ) {
this . $element . on ( 'keyup.dismiss.bs.modal' , $ . proxy ( function ( e ) {
e . which == 27 && this . hide ( )
} , this ) )
} else if ( ! this . isShown ) {
this . $element . off ( 'keyup.dismiss.bs.modal' )
}
}
Modal . prototype . hideModal = function ( ) {
var that = this
this . $element . hide ( )
this . backdrop ( function ( ) {
that . $element . trigger ( 'hidden.bs.modal' )
} )
}
Modal . prototype . removeBackdrop = function ( ) {
this . $backdrop && this . $backdrop . remove ( )
this . $backdrop = null
}
Modal . prototype . backdrop = function ( callback ) {
var that = this
var 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 ( this . $body )
this . $element . on ( 'click.dismiss.bs.modal' , $ . proxy ( function ( e ) {
if ( e . target !== e . currentTarget ) return
this . options . backdrop == 'static'
? this . $element [ 0 ] . focus . call ( this . $element [ 0 ] )
: this . hide . call ( this )
} , this ) )
if ( doAnimate ) this . $backdrop [ 0 ] . offsetWidth // force reflow
this . $backdrop . addClass ( 'in' )
if ( ! callback ) return
doAnimate ?
this . $backdrop
. one ( 'bsTransitionEnd' , callback )
. emulateTransitionEnd ( 150 ) :
callback ( )
} else if ( ! this . isShown && this . $backdrop ) {
this . $backdrop . removeClass ( 'in' )
var callbackRemove = function ( ) {
that . removeBackdrop ( )
callback && callback ( )
}
$ . support . transition && this . $element . hasClass ( 'fade' ) ?
this . $backdrop
. one ( 'bsTransitionEnd' , callbackRemove )
. emulateTransitionEnd ( 150 ) :
callbackRemove ( )
} else if ( callback ) {
callback ( )
}
}
Modal . prototype . checkScrollbar = function ( ) {
if ( document . body . clientWidth >= window . innerWidth ) return
this . scrollbarWidth = this . scrollbarWidth || this . measureScrollbar ( )
}
Modal . prototype . setScrollbar = function ( ) {
var bodyPad = parseInt ( ( this . $body . css ( 'padding-right' ) || 0 ) , 10 )
if ( this . scrollbarWidth ) this . $body . css ( 'padding-right' , bodyPad + this . scrollbarWidth )
}
Modal . prototype . resetScrollbar = function ( ) {
this . $body . css ( 'padding-right' , '' )
}
Modal . prototype . measureScrollbar = function ( ) { // thx walsh
var scrollDiv = document . createElement ( 'div' )
scrollDiv . className = 'modal-scrollbar-measure'
this . $body . append ( scrollDiv )
var scrollbarWidth = scrollDiv . offsetWidth - scrollDiv . clientWidth
this . $body [ 0 ] . removeChild ( scrollDiv )
return scrollbarWidth
}
// MODAL PLUGIN DEFINITION
// =======================
function Plugin ( option , _relatedTarget ) {
return this . each ( function ( ) {
var $this = $ ( this )
var data = $this . data ( 'bs.modal' )
var options = $ . extend ( { } , Modal . DEFAULTS , $this . data ( ) , typeof option == 'object' && option )
if ( ! data ) $this . data ( 'bs.modal' , ( data = new Modal ( this , options ) ) )
if ( typeof option == 'string' ) data [ option ] ( _relatedTarget )
else if ( options . show ) data . show ( _relatedTarget )
} )
}
var old = $ . fn . modal
$ . fn . modal = Plugin
$ . fn . modal . Constructor = Modal
// MODAL NO CONFLICT
// =================
$ . fn . modal . noConflict = function ( ) {
$ . fn . modal = old
return this
}
// MODAL DATA-API
// ==============
$ ( document ) . on ( 'click.bs.modal.data-api' , '[data-toggle="modal"]' , function ( e ) {
var $this = $ ( this )
var href = $this . attr ( 'href' )
var $target = $ ( $this . attr ( 'data-target' ) || ( href && href . replace ( /.*(?=#[^\s]+$)/ , '' ) ) ) // strip for ie7
var option = $target . data ( 'bs.modal' ) ? 'toggle' : $ . extend ( { remote : ! /#/ . test ( href ) && href } , $target . data ( ) , $this . data ( ) )
if ( $this . is ( 'a' ) ) e . preventDefault ( )
$target . one ( 'show.bs.modal' , function ( showEvent ) {
if ( showEvent . isDefaultPrevented ( ) ) return // only register focus restorer if modal will actually get shown
$target . one ( 'hidden.bs.modal' , function ( ) {
$this . is ( ':visible' ) && $this . trigger ( 'focus' )
} )
} )
Plugin . call ( $target , option , this )
} )
} ( jQuery ) ;
/ * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Bootstrap : tooltip . js v3 . 2.0
* http : //getbootstrap.com/javascript/#tooltip
* Inspired by the original jQuery . tipsy by Jason Frame
* === === === === === === === === === === === === === === === === === === === === === === === ===
* Copyright 2011 - 2014 Twitter , Inc .
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* === === === === === === === === === === === === === === === === === === === === === === === === * /
+ function ( $ ) {
'use strict' ;
// TOOLTIP PUBLIC CLASS DEFINITION
// ===============================
var Tooltip = function ( element , options ) {
this . type =
this . options =
this . enabled =
this . timeout =
this . hoverState =
this . $element = null
this . init ( 'tooltip' , element , options )
}
Tooltip . VERSION = '3.2.0'
Tooltip . DEFAULTS = {
animation : true ,
placement : 'top' ,
selector : false ,
template : '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>' ,
trigger : 'hover focus' ,
title : '' ,
delay : 0 ,
html : false ,
container : false ,
viewport : {
selector : 'body' ,
padding : 0
}
}
Tooltip . prototype . init = function ( type , element , options ) {
this . enabled = true
this . type = type
this . $element = $ ( element )
this . options = this . getOptions ( options )
this . $viewport = this . options . viewport && $ ( this . options . viewport . selector || this . options . viewport )
var triggers = this . options . trigger . split ( ' ' )
for ( var i = triggers . length ; i -- ; ) {
var trigger = triggers [ i ]
if ( trigger == 'click' ) {
this . $element . on ( 'click.' + this . type , this . options . selector , $ . proxy ( this . toggle , this ) )
} else if ( trigger != 'manual' ) {
var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
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 ( )
}
Tooltip . prototype . getDefaults = function ( ) {
return Tooltip . DEFAULTS
}
Tooltip . prototype . getOptions = function ( options ) {
options = $ . extend ( { } , this . getDefaults ( ) , this . $element . data ( ) , options )
if ( options . delay && typeof options . delay == 'number' ) {
options . delay = {
show : options . delay ,
hide : options . delay
}
}
return options
}
Tooltip . prototype . getDelegateOptions = function ( ) {
var options = { }
var defaults = this . getDefaults ( )
this . _options && $ . each ( this . _options , function ( key , value ) {
if ( defaults [ key ] != value ) options [ key ] = value
} )
return options
}
Tooltip . prototype . enter = function ( obj ) {
var self = obj instanceof this . constructor ?
obj : $ ( obj . currentTarget ) . data ( 'bs.' + this . type )
if ( ! self ) {
self = new this . constructor ( obj . currentTarget , this . getDelegateOptions ( ) )
$ ( obj . currentTarget ) . data ( 'bs.' + this . type , self )
}
clearTimeout ( self . timeout )
self . hoverState = 'in'
if ( ! self . options . delay || ! self . options . delay . show ) return self . show ( )
self . timeout = setTimeout ( function ( ) {
if ( self . hoverState == 'in' ) self . show ( )
} , self . options . delay . show )
}
Tooltip . prototype . leave = function ( obj ) {
var self = obj instanceof this . constructor ?
obj : $ ( obj . currentTarget ) . data ( 'bs.' + this . type )
if ( ! self ) {
self = new this . constructor ( obj . currentTarget , this . getDelegateOptions ( ) )
$ ( obj . currentTarget ) . data ( 'bs.' + this . type , self )
}
clearTimeout ( self . timeout )
self . hoverState = 'out'
if ( ! self . options . delay || ! self . options . delay . hide ) return self . hide ( )
self . timeout = setTimeout ( function ( ) {
if ( self . hoverState == 'out' ) self . hide ( )
} , self . options . delay . hide )
}
Tooltip . prototype . show = function ( ) {
var e = $ . Event ( 'show.bs.' + this . type )
if ( this . hasContent ( ) && this . enabled ) {
this . $element . trigger ( e )
var inDom = $ . contains ( document . documentElement , this . $element [ 0 ] )
if ( e . isDefaultPrevented ( ) || ! inDom ) return
var that = this
var $tip = this . tip ( )
var tipId = this . getUID ( this . type )
this . setContent ( )
$tip . attr ( 'id' , tipId )
this . $element . attr ( 'aria-describedby' , tipId )
if ( this . options . animation ) $tip . addClass ( 'fade' )
var placement = typeof this . options . placement == 'function' ?
this . options . placement . call ( this , $tip [ 0 ] , this . $element [ 0 ] ) :
this . options . placement
var autoToken = /\s?auto?\s?/i
var autoPlace = autoToken . test ( placement )
if ( autoPlace ) placement = placement . replace ( autoToken , '' ) || 'top'
$tip
. detach ( )
. css ( { top : 0 , left : 0 , display : 'block' } )
. addClass ( placement )
. data ( 'bs.' + this . type , this )
this . options . container ? $tip . appendTo ( this . options . container ) : $tip . insertAfter ( this . $element )
var pos = this . getPosition ( )
var actualWidth = $tip [ 0 ] . offsetWidth
var actualHeight = $tip [ 0 ] . offsetHeight
if ( autoPlace ) {
var orgPlacement = placement
var $parent = this . $element . parent ( )
var parentDim = this . getPosition ( $parent )
placement = placement == 'bottom' && pos . top + pos . height + actualHeight - parentDim . scroll > parentDim . height ? 'top' :
placement == 'top' && pos . top - parentDim . scroll - actualHeight < 0 ? 'bottom' :
placement == 'right' && pos . right + actualWidth > parentDim . width ? 'left' :
placement == 'left' && pos . left - actualWidth < parentDim . left ? 'right' :
placement
$tip
. removeClass ( orgPlacement )
. addClass ( placement )
}
var calculatedOffset = this . getCalculatedOffset ( placement , pos , actualWidth , actualHeight )
this . applyPlacement ( calculatedOffset , placement )
var complete = function ( ) {
that . $element . trigger ( 'shown.bs.' + that . type )
that . hoverState = null
}
$ . support . transition && this . $tip . hasClass ( 'fade' ) ?
$tip
. one ( 'bsTransitionEnd' , complete )
. emulateTransitionEnd ( 150 ) :
complete ( )
}
}
Tooltip . prototype . applyPlacement = function ( offset , placement ) {
var $tip = this . tip ( )
var width = $tip [ 0 ] . offsetWidth
var height = $tip [ 0 ] . offsetHeight
// manually read margins because getBoundingClientRect includes difference
var marginTop = parseInt ( $tip . css ( 'margin-top' ) , 10 )
var marginLeft = parseInt ( $tip . css ( 'margin-left' ) , 10 )
// we must check for NaN for ie 8/9
if ( isNaN ( marginTop ) ) marginTop = 0
if ( isNaN ( marginLeft ) ) marginLeft = 0
offset . top = offset . top + marginTop
offset . left = offset . left + marginLeft
// $.fn.offset doesn't round pixel values
// so we use setOffset directly with our own function B-0
$ . offset . setOffset ( $tip [ 0 ] , $ . extend ( {
using : function ( props ) {
$tip . css ( {
top : Math . round ( props . top ) ,
left : Math . round ( props . left )
} )
}
} , offset ) , 0 )
$tip . addClass ( 'in' )
// check to see if placing tip in new offset caused the tip to resize itself
var actualWidth = $tip [ 0 ] . offsetWidth
var actualHeight = $tip [ 0 ] . offsetHeight
if ( placement == 'top' && actualHeight != height ) {
offset . top = offset . top + height - actualHeight
}
var delta = this . getViewportAdjustedDelta ( placement , offset , actualWidth , actualHeight )
if ( delta . left ) offset . left += delta . left
else offset . top += delta . top
var arrowDelta = delta . left ? delta . left * 2 - width + actualWidth : delta . top * 2 - height + actualHeight
var arrowPosition = delta . left ? 'left' : 'top'
var arrowOffsetPosition = delta . left ? 'offsetWidth' : 'offsetHeight'
$tip . offset ( offset )
this . replaceArrow ( arrowDelta , $tip [ 0 ] [ arrowOffsetPosition ] , arrowPosition )
}
Tooltip . prototype . replaceArrow = function ( delta , dimension , position ) {
this . arrow ( ) . css ( position , delta ? ( 50 * ( 1 - delta / dimension ) + '%' ) : '' )
}
Tooltip . prototype . setContent = function ( ) {
var $tip = this . tip ( )
var title = this . getTitle ( )
$tip . find ( '.tooltip-inner' ) [ this . options . html ? 'html' : 'text' ] ( title )
$tip . removeClass ( 'fade in top bottom left right' )
}
Tooltip . prototype . hide = function ( ) {
var that = this
var $tip = this . tip ( )
var e = $ . Event ( 'hide.bs.' + this . type )
this . $element . removeAttr ( 'aria-describedby' )
function complete ( ) {
if ( that . hoverState != 'in' ) $tip . detach ( )
that . $element . trigger ( 'hidden.bs.' + that . type )
}
this . $element . trigger ( e )
if ( e . isDefaultPrevented ( ) ) return
$tip . removeClass ( 'in' )
$ . support . transition && this . $tip . hasClass ( 'fade' ) ?
$tip
. one ( 'bsTransitionEnd' , complete )
. emulateTransitionEnd ( 150 ) :
complete ( )
this . hoverState = null
return this
}
Tooltip . prototype . 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' , '' )
}
}
Tooltip . prototype . hasContent = function ( ) {
return this . getTitle ( )
}
Tooltip . prototype . getPosition = function ( $element ) {
$element = $element || this . $element
var el = $element [ 0 ]
var isBody = el . tagName == 'BODY'
return $ . extend ( { } , ( typeof el . getBoundingClientRect == 'function' ) ? el . getBoundingClientRect ( ) : null , {
scroll : isBody ? document . documentElement . scrollTop || document . body . scrollTop : $element . scrollTop ( ) ,
width : isBody ? $ ( window ) . width ( ) : $element . outerWidth ( ) ,
height : isBody ? $ ( window ) . height ( ) : $element . outerHeight ( )
} , isBody ? { top : 0 , left : 0 } : $element . offset ( ) )
}
Tooltip . prototype . getCalculatedOffset = function ( placement , pos , actualWidth , actualHeight ) {
return placement == 'bottom' ? { top : pos . top + pos . height , left : pos . left + pos . width / 2 - actualWidth / 2 } :
placement == 'top' ? { top : pos . top - actualHeight , left : pos . left + pos . width / 2 - actualWidth / 2 } :
placement == 'left' ? { top : pos . top + pos . height / 2 - actualHeight / 2 , left : pos . left - actualWidth } :
/* placement == 'right' */ { top : pos . top + pos . height / 2 - actualHeight / 2 , left : pos . left + pos . width }
}
Tooltip . prototype . getViewportAdjustedDelta = function ( placement , pos , actualWidth , actualHeight ) {
var delta = { top : 0 , left : 0 }
if ( ! this . $viewport ) return delta
var viewportPadding = this . options . viewport && this . options . viewport . padding || 0
var viewportDimensions = this . getPosition ( this . $viewport )
if ( /right|left/ . test ( placement ) ) {
var topEdgeOffset = pos . top - viewportPadding - viewportDimensions . scroll
var bottomEdgeOffset = pos . top + viewportPadding - viewportDimensions . scroll + actualHeight
if ( topEdgeOffset < viewportDimensions . top ) { // top overflow
delta . top = viewportDimensions . top - topEdgeOffset
} else if ( bottomEdgeOffset > viewportDimensions . top + viewportDimensions . height ) { // bottom overflow
delta . top = viewportDimensions . top + viewportDimensions . height - bottomEdgeOffset
}
} else {
var leftEdgeOffset = pos . left - viewportPadding
var rightEdgeOffset = pos . left + viewportPadding + actualWidth
if ( leftEdgeOffset < viewportDimensions . left ) { // left overflow
delta . left = viewportDimensions . left - leftEdgeOffset
} else if ( rightEdgeOffset > viewportDimensions . width ) { // right overflow
delta . left = viewportDimensions . left + viewportDimensions . width - rightEdgeOffset
}
}
return delta
}
Tooltip . prototype . getTitle = function ( ) {
var title
var $e = this . $element
var o = this . options
title = $e . attr ( 'data-original-title' )
|| ( typeof o . title == 'function' ? o . title . call ( $e [ 0 ] ) : o . title )
return title
}
Tooltip . prototype . getUID = function ( prefix ) {
do prefix += ~ ~ ( Math . random ( ) * 1000000 )
while ( document . getElementById ( prefix ) )
return prefix
}
Tooltip . prototype . tip = function ( ) {
return ( this . $tip = this . $tip || $ ( this . options . template ) )
}
Tooltip . prototype . arrow = function ( ) {
return ( this . $arrow = this . $arrow || this . tip ( ) . find ( '.tooltip-arrow' ) )
}
Tooltip . prototype . validate = function ( ) {
if ( ! this . $element [ 0 ] . parentNode ) {
this . hide ( )
this . $element = null
this . options = null
}
}
Tooltip . prototype . enable = function ( ) {
this . enabled = true
}
Tooltip . prototype . disable = function ( ) {
this . enabled = false
}
Tooltip . prototype . toggleEnabled = function ( ) {
this . enabled = ! this . enabled
}
Tooltip . prototype . toggle = function ( e ) {
var self = this
if ( e ) {
self = $ ( e . currentTarget ) . data ( 'bs.' + this . type )
if ( ! self ) {
self = new this . constructor ( e . currentTarget , this . getDelegateOptions ( ) )
$ ( e . currentTarget ) . data ( 'bs.' + this . type , self )
}
}
self . tip ( ) . hasClass ( 'in' ) ? self . leave ( self ) : self . enter ( self )
}
Tooltip . prototype . destroy = function ( ) {
clearTimeout ( this . timeout )
this . hide ( ) . $element . off ( '.' + this . type ) . removeData ( 'bs.' + this . type )
}
// TOOLTIP PLUGIN DEFINITION
// =========================
function Plugin ( option ) {
return this . each ( function ( ) {
var $this = $ ( this )
var data = $this . data ( 'bs.tooltip' )
var options = typeof option == 'object' && option
if ( ! data && option == 'destroy' ) return
if ( ! data ) $this . data ( 'bs.tooltip' , ( data = new Tooltip ( this , options ) ) )
if ( typeof option == 'string' ) data [ option ] ( )
} )
}
var old = $ . fn . tooltip
$ . fn . tooltip = Plugin
$ . fn . tooltip . Constructor = Tooltip
// TOOLTIP NO CONFLICT
// ===================
$ . fn . tooltip . noConflict = function ( ) {
$ . fn . tooltip = old
return this
}
} ( jQuery ) ;
/ * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Bootstrap : popover . js v3 . 2.0
* http : //getbootstrap.com/javascript/#popovers
* === === === === === === === === === === === === === === === === === === === === === === === ===
* Copyright 2011 - 2014 Twitter , Inc .
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* === === === === === === === === === === === === === === === === === === === === === === === === * /
+ function ( $ ) {
'use strict' ;
// POPOVER PUBLIC CLASS DEFINITION
// ===============================
var Popover = function ( element , options ) {
this . init ( 'popover' , element , options )
}
if ( ! $ . fn . tooltip ) throw new Error ( 'Popover requires tooltip.js' )
Popover . VERSION = '3.2.0'
Popover . DEFAULTS = $ . extend ( { } , $ . fn . tooltip . Constructor . DEFAULTS , {
placement : 'right' ,
trigger : 'click' ,
content : '' ,
template : '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
} )
// NOTE: POPOVER EXTENDS tooltip.js
// ================================
Popover . prototype = $ . extend ( { } , $ . fn . tooltip . Constructor . prototype )
Popover . prototype . constructor = Popover
Popover . prototype . getDefaults = function ( ) {
return Popover . DEFAULTS
}
Popover . prototype . setContent = function ( ) {
var $tip = this . tip ( )
var title = this . getTitle ( )
var content = this . getContent ( )
$tip . find ( '.popover-title' ) [ this . options . html ? 'html' : 'text' ] ( title )
$tip . find ( '.popover-content' ) . empty ( ) [ // we use append for html objects to maintain js events
this . options . html ? ( typeof content == 'string' ? 'html' : 'append' ) : 'text'
] ( content )
$tip . removeClass ( 'fade top bottom left right in' )
// IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
// this manually by checking the contents.
if ( ! $tip . find ( '.popover-title' ) . html ( ) ) $tip . find ( '.popover-title' ) . hide ( )
}
Popover . prototype . hasContent = function ( ) {
return this . getTitle ( ) || this . getContent ( )
}
Popover . prototype . getContent = function ( ) {
var $e = this . $element
var o = this . options
return $e . attr ( 'data-content' )
|| ( typeof o . content == 'function' ?
o . content . call ( $e [ 0 ] ) :
o . content )
}
Popover . prototype . arrow = function ( ) {
return ( this . $arrow = this . $arrow || this . tip ( ) . find ( '.arrow' ) )
}
Popover . prototype . tip = function ( ) {
if ( ! this . $tip ) this . $tip = $ ( this . options . template )
return this . $tip
}
// POPOVER PLUGIN DEFINITION
// =========================
function Plugin ( option ) {
return this . each ( function ( ) {
var $this = $ ( this )
var data = $this . data ( 'bs.popover' )
var options = typeof option == 'object' && option
if ( ! data && option == 'destroy' ) return
if ( ! data ) $this . data ( 'bs.popover' , ( data = new Popover ( this , options ) ) )
if ( typeof option == 'string' ) data [ option ] ( )
} )
}
var old = $ . fn . popover
$ . fn . popover = Plugin
$ . fn . popover . Constructor = Popover
// POPOVER NO CONFLICT
// ===================
$ . fn . popover . noConflict = function ( ) {
$ . fn . popover = old
return this
}
} ( jQuery ) ;
/ * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Bootstrap : scrollspy . js v3 . 2.0
* http : //getbootstrap.com/javascript/#scrollspy
* === === === === === === === === === === === === === === === === === === === === === === === ===
* Copyright 2011 - 2014 Twitter , Inc .
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* === === === === === === === === === === === === === === === === === === === === === === === === * /
+ function ( $ ) {
'use strict' ;
// SCROLLSPY CLASS DEFINITION
// ==========================
function ScrollSpy ( element , options ) {
var process = $ . proxy ( this . process , this )
this . $body = $ ( 'body' )
this . $scrollElement = $ ( element ) . is ( 'body' ) ? $ ( window ) : $ ( element )
this . options = $ . extend ( { } , ScrollSpy . DEFAULTS , options )
this . selector = ( this . options . target || '' ) + ' .nav li > a'
this . offsets = [ ]
this . targets = [ ]
this . activeTarget = null
this . scrollHeight = 0
this . $scrollElement . on ( 'scroll.bs.scrollspy' , process )
this . refresh ( )
this . process ( )
}
ScrollSpy . VERSION = '3.2.0'
ScrollSpy . DEFAULTS = {
offset : 10
}
ScrollSpy . prototype . getScrollHeight = function ( ) {
return this . $scrollElement [ 0 ] . scrollHeight || Math . max ( this . $body [ 0 ] . scrollHeight , document . documentElement . scrollHeight )
}
ScrollSpy . prototype . refresh = function ( ) {
var offsetMethod = 'offset'
var offsetBase = 0
if ( ! $ . isWindow ( this . $scrollElement [ 0 ] ) ) {
offsetMethod = 'position'
offsetBase = this . $scrollElement . scrollTop ( )
}
this . offsets = [ ]
this . targets = [ ]
this . scrollHeight = this . getScrollHeight ( )
var self = this
this . $body
. find ( this . selector )
. map ( function ( ) {
var $el = $ ( this )
var href = $el . data ( 'target' ) || $el . attr ( 'href' )
var $href = /^#./ . test ( href ) && $ ( href )
return ( $href
&& $href . length
&& $href . is ( ':visible' )
&& [ [ $href [ offsetMethod ] ( ) . top + offsetBase , href ] ] ) || null
} )
. sort ( function ( a , b ) { return a [ 0 ] - b [ 0 ] } )
. each ( function ( ) {
self . offsets . push ( this [ 0 ] )
self . targets . push ( this [ 1 ] )
} )
}
ScrollSpy . prototype . process = function ( ) {
var scrollTop = this . $scrollElement . scrollTop ( ) + this . options . offset
var scrollHeight = this . getScrollHeight ( )
var maxScroll = this . options . offset + scrollHeight - this . $scrollElement . height ( )
var offsets = this . offsets
var targets = this . targets
var activeTarget = this . activeTarget
var i
if ( this . scrollHeight != scrollHeight ) {
this . refresh ( )
}
if ( scrollTop >= maxScroll ) {
return activeTarget != ( i = targets [ targets . length - 1 ] ) && this . activate ( i )
}
if ( activeTarget && scrollTop <= offsets [ 0 ] ) {
return activeTarget != ( i = targets [ 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 ] )
}
}
ScrollSpy . prototype . activate = function ( target ) {
this . activeTarget = target
$ ( this . selector )
. parentsUntil ( this . options . target , '.active' )
. removeClass ( 'active' )
var selector = this . selector +
'[data-target="' + target + '"],' +
this . selector + '[href="' + target + '"]'
var active = $ ( selector )
. parents ( 'li' )
. addClass ( 'active' )
if ( active . parent ( '.dropdown-menu' ) . length ) {
active = active
. closest ( 'li.dropdown' )
. addClass ( 'active' )
}
active . trigger ( 'activate.bs.scrollspy' )
}
// SCROLLSPY PLUGIN DEFINITION
// ===========================
function Plugin ( option ) {
return this . each ( function ( ) {
var $this = $ ( this )
var data = $this . data ( 'bs.scrollspy' )
var options = typeof option == 'object' && option
if ( ! data ) $this . data ( 'bs.scrollspy' , ( data = new ScrollSpy ( this , options ) ) )
if ( typeof option == 'string' ) data [ option ] ( )
} )
}
var old = $ . fn . scrollspy
$ . fn . scrollspy = Plugin
$ . fn . scrollspy . Constructor = ScrollSpy
// SCROLLSPY NO CONFLICT
// =====================
$ . fn . scrollspy . noConflict = function ( ) {
$ . fn . scrollspy = old
return this
}
// SCROLLSPY DATA-API
// ==================
$ ( window ) . on ( 'load.bs.scrollspy.data-api' , function ( ) {
$ ( '[data-spy="scroll"]' ) . each ( function ( ) {
var $spy = $ ( this )
Plugin . call ( $spy , $spy . data ( ) )
} )
} )
} ( jQuery ) ;
/ * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Bootstrap : tab . js v3 . 2.0
* http : //getbootstrap.com/javascript/#tabs
* === === === === === === === === === === === === === === === === === === === === === === === ===
* Copyright 2011 - 2014 Twitter , Inc .
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* === === === === === === === === === === === === === === === === === === === === === === === === * /
+ function ( $ ) {
'use strict' ;
// TAB CLASS DEFINITION
// ====================
var Tab = function ( element ) {
this . element = $ ( element )
}
Tab . VERSION = '3.2.0'
Tab . prototype . show = function ( ) {
var $this = this . element
var $ul = $this . closest ( 'ul:not(.dropdown-menu)' )
var selector = $this . data ( 'target' )
if ( ! selector ) {
selector = $this . attr ( 'href' )
selector = selector && selector . replace ( /.*(?=#[^\s]*$)/ , '' ) // strip for ie7
}
if ( $this . parent ( 'li' ) . hasClass ( 'active' ) ) return
var previous = $ul . find ( '.active:last a' ) [ 0 ]
var e = $ . Event ( 'show.bs.tab' , {
relatedTarget : previous
} )
$this . trigger ( e )
if ( e . isDefaultPrevented ( ) ) return
var $target = $ ( selector )
this . activate ( $this . closest ( 'li' ) , $ul )
this . activate ( $target , $target . parent ( ) , function ( ) {
$this . trigger ( {
type : 'shown.bs.tab' ,
relatedTarget : previous
} )
} )
}
Tab . prototype . activate = function ( element , container , callback ) {
var $active = container . find ( '> .active' )
var 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 ( 'bsTransitionEnd' , next )
. emulateTransitionEnd ( 150 ) :
next ( )
$active . removeClass ( 'in' )
}
// TAB PLUGIN DEFINITION
// =====================
function Plugin ( option ) {
return this . each ( function ( ) {
var $this = $ ( this )
var data = $this . data ( 'bs.tab' )
if ( ! data ) $this . data ( 'bs.tab' , ( data = new Tab ( this ) ) )
if ( typeof option == 'string' ) data [ option ] ( )
} )
}
var old = $ . fn . tab
$ . fn . tab = Plugin
$ . fn . tab . Constructor = Tab
// TAB NO CONFLICT
// ===============
$ . fn . tab . noConflict = function ( ) {
$ . fn . tab = old
return this
}
// TAB DATA-API
// ============
$ ( document ) . on ( 'click.bs.tab.data-api' , '[data-toggle="tab"], [data-toggle="pill"]' , function ( e ) {
e . preventDefault ( )
Plugin . call ( $ ( this ) , 'show' )
} )
} ( jQuery ) ;
/ * = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Bootstrap : affix . js v3 . 2.0
* http : //getbootstrap.com/javascript/#affix
* === === === === === === === === === === === === === === === === === === === === === === === ===
* Copyright 2011 - 2014 Twitter , Inc .
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* === === === === === === === === === === === === === === === === === === === === === === === === * /
+ function ( $ ) {
'use strict' ;
// AFFIX CLASS DEFINITION
// ======================
var Affix = function ( element , options ) {
this . options = $ . extend ( { } , Affix . DEFAULTS , options )
this . $target = $ ( this . options . target )
. on ( 'scroll.bs.affix.data-api' , $ . proxy ( this . checkPosition , this ) )
. on ( 'click.bs.affix.data-api' , $ . proxy ( this . checkPositionWithEventLoop , this ) )
this . $element = $ ( element )
this . affixed =
this . unpin =
this . pinnedOffset = null
this . checkPosition ( )
}
Affix . VERSION = '3.2.0'
Affix . RESET = 'affix affix-top affix-bottom'
Affix . DEFAULTS = {
offset : 0 ,
target : window
}
Affix . prototype . getPinnedOffset = function ( ) {
if ( this . pinnedOffset ) return this . pinnedOffset
this . $element . removeClass ( Affix . RESET ) . addClass ( 'affix' )
var scrollTop = this . $target . scrollTop ( )
var position = this . $element . offset ( )
return ( this . pinnedOffset = position . top - scrollTop )
}
Affix . prototype . checkPositionWithEventLoop = function ( ) {
setTimeout ( $ . proxy ( this . checkPosition , this ) , 1 )
}
Affix . prototype . checkPosition = function ( ) {
if ( ! this . $element . is ( ':visible' ) ) return
var scrollHeight = $ ( document ) . height ( )
var scrollTop = this . $target . scrollTop ( )
var position = this . $element . offset ( )
var offset = this . options . offset
var offsetTop = offset . top
var offsetBottom = offset . bottom
if ( typeof offset != 'object' ) offsetBottom = offsetTop = offset
if ( typeof offsetTop == 'function' ) offsetTop = offset . top ( this . $element )
if ( typeof offsetBottom == 'function' ) offsetBottom = offset . bottom ( this . $element )
var 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
if ( this . unpin != null ) this . $element . css ( 'top' , '' )
var affixType = 'affix' + ( affix ? '-' + affix : '' )
var e = $ . Event ( affixType + '.bs.affix' )
this . $element . trigger ( e )
if ( e . isDefaultPrevented ( ) ) return
this . affixed = affix
this . unpin = affix == 'bottom' ? this . getPinnedOffset ( ) : null
this . $element
. removeClass ( Affix . RESET )
. addClass ( affixType )
. trigger ( $ . Event ( affixType . replace ( 'affix' , 'affixed' ) ) )
if ( affix == 'bottom' ) {
this . $element . offset ( {
top : scrollHeight - this . $element . height ( ) - offsetBottom
} )
}
}
// AFFIX PLUGIN DEFINITION
// =======================
function Plugin ( option ) {
return this . each ( function ( ) {
var $this = $ ( this )
var data = $this . data ( 'bs.affix' )
var options = typeof option == 'object' && option
if ( ! data ) $this . data ( 'bs.affix' , ( data = new Affix ( this , options ) ) )
if ( typeof option == 'string' ) data [ option ] ( )
} )
}
var old = $ . fn . affix
$ . fn . affix = Plugin
$ . fn . affix . Constructor = Affix
// 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 )
var data = $spy . data ( )
data . offset = data . offset || { }
if ( data . offsetBottom ) data . offset . bottom = data . offsetBottom
if ( data . offsetTop ) data . offset . top = data . offsetTop
Plugin . call ( $spy , data )
} )
} )
} ( jQuery ) ;
; /*global ActiveXObject */
// AMD support
( function ( factory ) {
if ( typeof define === 'function' && define . amd ) {
// using AMD; register as anon module
define ( [ 'jquery' ] , factory ) ;
} else {
// no AMD; invoke directly
factory ( ( typeof ( jQuery ) != 'undefined' ) ? jQuery : window . Zepto ) ;
}
}
( function ( $ ) {
"use strict" ;
/ *
Usage Note :
-- -- -- -- -- -
Do not use both ajaxSubmit and ajaxForm on the same form . These
functions are mutually exclusive . Use ajaxSubmit if you want
to bind your own submit handler to the form . For example ,
$ ( document ) . ready ( function ( ) {
$ ( '#myForm' ) . on ( 'submit' , function ( e ) {
e . preventDefault ( ) ; // <-- important
$ ( this ) . ajaxSubmit ( {
target : '#output'
} ) ;
} ) ;
} ) ;
Use ajaxForm when you want the plugin to manage all the event binding
for you . For example ,
$ ( document ) . ready ( function ( ) {
$ ( '#myForm' ) . ajaxForm ( {
target : '#output'
} ) ;
} ) ;
You can also use ajaxForm with delegation ( requires jQuery v1 . 7 + ) , so the
form does not have to exist when you invoke ajaxForm :
$ ( '#myForm' ) . ajaxForm ( {
delegation : true ,
target : '#output'
} ) ;
When using ajaxForm , the ajaxSubmit function will be invoked for you
at the appropriate time .
* /
/ * *
* Feature detection
* /
var feature = { } ;
feature . fileapi = $ ( "<input type='file'/>" ) . get ( 0 ) . files !== undefined ;
feature . formdata = window . FormData !== undefined ;
var hasProp = ! ! $ . fn . prop ;
// attr2 uses prop when it can but checks the return type for
// an expected string. this accounts for the case where a form
// contains inputs with names like "action" or "method"; in those
// cases "prop" returns the element
$ . fn . attr2 = function ( ) {
if ( ! hasProp )
return this . attr . apply ( this , arguments ) ;
var val = this . prop . apply ( this , arguments ) ;
if ( ( val && val . jquery ) || typeof val === 'string' )
return val ;
return this . attr . apply ( this , arguments ) ;
} ;
/ * *
* ajaxSubmit ( ) provides a mechanism for immediately submitting
* an HTML form using AJAX .
* /
$ . fn . ajaxSubmit = function ( options ) {
/*jshint scripturl:true */
// fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
if ( ! this . length ) {
log ( 'ajaxSubmit: skipping submit process - no element selected' ) ;
return this ;
}
var method , action , url , $form = this ;
if ( typeof options == 'function' ) {
options = { success : options } ;
}
else if ( options === undefined ) {
options = { } ;
}
method = options . type || this . attr2 ( 'method' ) ;
action = options . url || this . attr2 ( 'action' ) ;
url = ( typeof action === 'string' ) ? $ . trim ( action ) : '' ;
url = url || window . location . href || '' ;
if ( url ) {
// clean url (don't include hash vaue)
url = ( url . match ( /^([^#]+)/ ) || [ ] ) [ 1 ] ;
}
options = $ . extend ( true , {
url : url ,
success : $ . ajaxSettings . success ,
type : method || $ . ajaxSettings . type ,
iframeSrc : /^https/i . test ( window . location . href || '' ) ? 'javascript:false' : 'about:blank'
} , options ) ;
// hook for manipulating the form data before it is extracted;
// convenient for use with rich editors like tinyMCE or FCKEditor
var veto = { } ;
this . trigger ( 'form-pre-serialize' , [ this , options , veto ] ) ;
if ( veto . veto ) {
log ( 'ajaxSubmit: submit vetoed via form-pre-serialize trigger' ) ;
return this ;
}
// provide opportunity to alter form data before it is serialized
if ( options . beforeSerialize && options . beforeSerialize ( this , options ) === false ) {
log ( 'ajaxSubmit: submit aborted via beforeSerialize callback' ) ;
return this ;
}
var traditional = options . traditional ;
if ( traditional === undefined ) {
traditional = $ . ajaxSettings . traditional ;
}
var elements = [ ] ;
var qx , a = this . formToArray ( options . semantic , elements ) ;
if ( options . data ) {
options . extraData = options . data ;
qx = $ . param ( options . data , traditional ) ;
}
// give pre-submit callback an opportunity to abort the submit
if ( options . beforeSubmit && options . beforeSubmit ( a , this , options ) === false ) {
log ( 'ajaxSubmit: submit aborted via beforeSubmit callback' ) ;
return this ;
}
// fire vetoable 'validate' event
this . trigger ( 'form-submit-validate' , [ a , this , options , veto ] ) ;
if ( veto . veto ) {
log ( 'ajaxSubmit: submit vetoed via form-submit-validate trigger' ) ;
return this ;
}
var q = $ . param ( a , traditional ) ;
if ( qx ) {
q = ( q ? ( q + '&' + qx ) : qx ) ;
}
if ( options . type . toUpperCase ( ) == 'GET' ) {
options . url += ( options . url . indexOf ( '?' ) >= 0 ? '&' : '?' ) + q ;
options . data = null ; // data is null for 'get'
}
else {
options . data = q ; // data is the query string for 'post'
}
var callbacks = [ ] ;
if ( options . resetForm ) {
callbacks . push ( function ( ) { $form . resetForm ( ) ; } ) ;
}
if ( options . clearForm ) {
callbacks . push ( function ( ) { $form . clearForm ( options . includeHidden ) ; } ) ;
}
// perform a load on the target only if dataType is not provided
if ( ! options . dataType && options . target ) {
var oldSuccess = options . success || function ( ) { } ;
callbacks . push ( function ( data ) {
var fn = options . replaceTarget ? 'replaceWith' : 'html' ;
$ ( options . target ) [ fn ] ( data ) . each ( oldSuccess , arguments ) ;
} ) ;
}
else if ( options . success ) {
callbacks . push ( options . success ) ;
}
options . success = function ( data , status , xhr ) { // jQuery 1.4+ passes xhr as 3rd arg
var context = options . context || this ; // jQuery 1.4+ supports scope context
for ( var i = 0 , max = callbacks . length ; i < max ; i ++ ) {
callbacks [ i ] . apply ( context , [ data , status , xhr || $form , $form ] ) ;
}
} ;
if ( options . error ) {
var oldError = options . error ;
options . error = function ( xhr , status , error ) {
var context = options . context || this ;
oldError . apply ( context , [ xhr , status , error , $form ] ) ;
} ;
}
if ( options . complete ) {
var oldComplete = options . complete ;
options . complete = function ( xhr , status ) {
var context = options . context || this ;
oldComplete . apply ( context , [ xhr , status , $form ] ) ;
} ;
}
// are there files to upload?
// [value] (issue #113), also see comment:
// https://github.com/malsup/form/commit/588306aedba1de01388032d5f42a60159eea9228#commitcomment-2180219
var fileInputs = $ ( 'input[type=file]:enabled' , this ) . filter ( function ( ) { return $ ( this ) . val ( ) !== '' ; } ) ;
var hasFileInputs = fileInputs . length > 0 ;
var mp = 'multipart/form-data' ;
var multipart = ( $form . attr ( 'enctype' ) == mp || $form . attr ( 'encoding' ) == mp ) ;
var fileAPI = feature . fileapi && feature . formdata ;
log ( "fileAPI :" + fileAPI ) ;
var shouldUseFrame = ( hasFileInputs || multipart ) && ! fileAPI ;
var jqxhr ;
// options.iframe allows user to force iframe mode
// 06-NOV-09: now defaulting to iframe mode if file input is detected
if ( options . iframe !== false && ( options . iframe || shouldUseFrame ) ) {
// hack to fix Safari hang (thanks to Tim Molendijk for this)
// see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
if ( options . closeKeepAlive ) {
$ . get ( options . closeKeepAlive , function ( ) {
jqxhr = fileUploadIframe ( a ) ;
} ) ;
}
else {
jqxhr = fileUploadIframe ( a ) ;
}
}
else if ( ( hasFileInputs || multipart ) && fileAPI ) {
jqxhr = fileUploadXhr ( a ) ;
}
else {
jqxhr = $ . ajax ( options ) ;
}
$form . removeData ( 'jqxhr' ) . data ( 'jqxhr' , jqxhr ) ;
// clear element array
for ( var k = 0 ; k < elements . length ; k ++ )
elements [ k ] = null ;
// fire 'notify' event
this . trigger ( 'form-submit-notify' , [ this , options ] ) ;
return this ;
// utility fn for deep serialization
function deepSerialize ( extraData ) {
var serialized = $ . param ( extraData , options . traditional ) . split ( '&' ) ;
var len = serialized . length ;
var result = [ ] ;
var i , part ;
for ( i = 0 ; i < len ; i ++ ) {
// #252; undo param space replacement
serialized [ i ] = serialized [ i ] . replace ( /\+/g , ' ' ) ;
part = serialized [ i ] . split ( '=' ) ;
// #278; use array instead of object storage, favoring array serializations
result . push ( [ decodeURIComponent ( part [ 0 ] ) , decodeURIComponent ( part [ 1 ] ) ] ) ;
}
return result ;
}
// XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz)
function fileUploadXhr ( a ) {
var formdata = new FormData ( ) ;
for ( var i = 0 ; i < a . length ; i ++ ) {
formdata . append ( a [ i ] . name , a [ i ] . value ) ;
}
if ( options . extraData ) {
var serializedData = deepSerialize ( options . extraData ) ;
for ( i = 0 ; i < serializedData . length ; i ++ )
if ( serializedData [ i ] )
formdata . append ( serializedData [ i ] [ 0 ] , serializedData [ i ] [ 1 ] ) ;
}
options . data = null ;
var s = $ . extend ( true , { } , $ . ajaxSettings , options , {
contentType : false ,
processData : false ,
cache : false ,
type : method || 'POST'
} ) ;
if ( options . uploadProgress ) {
// workaround because jqXHR does not expose upload property
s . xhr = function ( ) {
var xhr = $ . ajaxSettings . xhr ( ) ;
if ( xhr . upload ) {
xhr . upload . addEventListener ( 'progress' , function ( event ) {
var percent = 0 ;
var position = event . loaded || event . position ; /*event.position is deprecated*/
var total = event . total ;
if ( event . lengthComputable ) {
percent = Math . ceil ( position / total * 100 ) ;
}
options . uploadProgress ( event , position , total , percent ) ;
} , false ) ;
}
return xhr ;
} ;
}
s . data = null ;
var beforeSend = s . beforeSend ;
s . beforeSend = function ( xhr , o ) {
//Send FormData() provided by user
if ( options . formData )
o . data = options . formData ;
else
o . data = formdata ;
if ( beforeSend )
beforeSend . call ( this , xhr , o ) ;
} ;
return $ . ajax ( s ) ;
}
// private function for handling file uploads (hat tip to YAHOO!)
function fileUploadIframe ( a ) {
var form = $form [ 0 ] , el , i , s , g , id , $io , io , xhr , sub , n , timedOut , timeoutHandle ;
var deferred = $ . Deferred ( ) ;
// #341
deferred . abort = function ( status ) {
xhr . abort ( status ) ;
} ;
if ( a ) {
// ensure that every serialized input is still enabled
for ( i = 0 ; i < elements . length ; i ++ ) {
el = $ ( elements [ i ] ) ;
if ( hasProp )
el . prop ( 'disabled' , false ) ;
else
el . removeAttr ( 'disabled' ) ;
}
}
s = $ . extend ( true , { } , $ . ajaxSettings , options ) ;
s . context = s . context || s ;
id = 'jqFormIO' + ( new Date ( ) . getTime ( ) ) ;
if ( s . iframeTarget ) {
$io = $ ( s . iframeTarget ) ;
n = $io . attr2 ( 'name' ) ;
if ( ! n )
$io . attr2 ( 'name' , id ) ;
else
id = n ;
}
else {
$io = $ ( '<iframe name="' + id + '" src="' + s . iframeSrc + '" />' ) ;
$io . css ( { position : 'absolute' , top : '-1000px' , left : '-1000px' } ) ;
}
io = $io [ 0 ] ;
xhr = { // mock object
aborted : 0 ,
responseText : null ,
responseXML : null ,
status : 0 ,
statusText : 'n/a' ,
getAllResponseHeaders : function ( ) { } ,
getResponseHeader : function ( ) { } ,
setRequestHeader : function ( ) { } ,
abort : function ( status ) {
var e = ( status === 'timeout' ? 'timeout' : 'aborted' ) ;
log ( 'aborting upload... ' + e ) ;
this . aborted = 1 ;
try { // #214, #257
if ( io . contentWindow . document . execCommand ) {
io . contentWindow . document . execCommand ( 'Stop' ) ;
}
}
catch ( ignore ) { }
$io . attr ( 'src' , s . iframeSrc ) ; // abort op in progress
xhr . error = e ;
if ( s . error )
s . error . call ( s . context , xhr , e , status ) ;
if ( g )
$ . event . trigger ( "ajaxError" , [ xhr , s , e ] ) ;
if ( s . complete )
s . complete . call ( s . context , xhr , e ) ;
}
} ;
g = s . global ;
// trigger ajax global events so that activity/block indicators work like normal
if ( g && 0 === $ . active ++ ) {
$ . event . trigger ( "ajaxStart" ) ;
}
if ( g ) {
$ . event . trigger ( "ajaxSend" , [ xhr , s ] ) ;
}
if ( s . beforeSend && s . beforeSend . call ( s . context , xhr , s ) === false ) {
if ( s . global ) {
$ . active -- ;
}
deferred . reject ( ) ;
return deferred ;
}
if ( xhr . aborted ) {
deferred . reject ( ) ;
return deferred ;
}
// add submitting element to data if we know it
sub = form . clk ;
if ( sub ) {
n = sub . name ;
if ( n && ! sub . disabled ) {
s . extraData = s . extraData || { } ;
s . extraData [ n ] = sub . value ;
if ( sub . type == "image" ) {
s . extraData [ n + '.x' ] = form . clk _x ;
s . extraData [ n + '.y' ] = form . clk _y ;
}
}
}
var CLIENT _TIMEOUT _ABORT = 1 ;
var SERVER _ABORT = 2 ;
function getDoc ( frame ) {
/ * i t l o o k s l i k e c o n t e n t W i n d o w o r c o n t e n t D o c u m e n t d o n o t
* carry the protocol property in ie8 , when running under ssl
* frame . document is the only valid response document , since
* the protocol is know but not on the other two objects . strange ?
* "Same origin policy" http : //en.wikipedia.org/wiki/Same_origin_policy
* /
var doc = null ;
// IE8 cascading access check
try {
if ( frame . contentWindow ) {
doc = frame . contentWindow . document ;
}
} catch ( err ) {
// IE8 access denied under ssl & missing protocol
log ( 'cannot get iframe.contentWindow document: ' + err ) ;
}
if ( doc ) { // successful getting content
return doc ;
}
try { // simply checking may throw in ie8 under ssl or mismatched protocol
doc = frame . contentDocument ? frame . contentDocument : frame . document ;
} catch ( err ) {
// last attempt
log ( 'cannot get iframe.contentDocument: ' + err ) ;
doc = frame . document ;
}
return doc ;
}
// Rails CSRF hack (thanks to Yvan Barthelemy)
var csrf _token = $ ( 'meta[name=csrf-token]' ) . attr ( 'content' ) ;
var csrf _param = $ ( 'meta[name=csrf-param]' ) . attr ( 'content' ) ;
if ( csrf _param && csrf _token ) {
s . extraData = s . extraData || { } ;
s . extraData [ csrf _param ] = csrf _token ;
}
// take a breath so that pending repaints get some cpu time before the upload starts
function doSubmit ( ) {
// make sure form attrs are set
var t = $form . attr2 ( 'target' ) , a = $form . attr2 ( 'action' ) ;
// update form attrs in IE friendly way
form . setAttribute ( 'target' , id ) ;
if ( ! method || /post/i . test ( method ) ) {
form . setAttribute ( 'method' , 'POST' ) ;
}
if ( a != s . url ) {
form . setAttribute ( 'action' , s . url ) ;
}
// ie borks in some cases when setting encoding
if ( ! s . skipEncodingOverride && ( ! method || /post/i . test ( method ) ) ) {
$form . attr ( {
encoding : 'multipart/form-data' ,
enctype : 'multipart/form-data'
} ) ;
}
// support timout
if ( s . timeout ) {
timeoutHandle = setTimeout ( function ( ) { timedOut = true ; cb ( CLIENT _TIMEOUT _ABORT ) ; } , s . timeout ) ;
}
// look for server aborts
function checkState ( ) {
try {
var state = getDoc ( io ) . readyState ;
log ( 'state = ' + state ) ;
if ( state && state . toLowerCase ( ) == 'uninitialized' )
setTimeout ( checkState , 50 ) ;
}
catch ( e ) {
log ( 'Server abort: ' , e , ' (' , e . name , ')' ) ;
cb ( SERVER _ABORT ) ;
if ( timeoutHandle )
clearTimeout ( timeoutHandle ) ;
timeoutHandle = undefined ;
}
}
// add "extra" data to form if provided in options
var extraInputs = [ ] ;
try {
if ( s . extraData ) {
for ( var n in s . extraData ) {
if ( s . extraData . hasOwnProperty ( n ) ) {
// if using the $.param format that allows for multiple values with the same name
if ( $ . isPlainObject ( s . extraData [ n ] ) && s . extraData [ n ] . hasOwnProperty ( 'name' ) && s . extraData [ n ] . hasOwnProperty ( 'value' ) ) {
extraInputs . push (
$ ( '<input type="hidden" name="' + s . extraData [ n ] . name + '">' ) . val ( s . extraData [ n ] . value )
. appendTo ( form ) [ 0 ] ) ;
} else {
extraInputs . push (
$ ( '<input type="hidden" name="' + n + '">' ) . val ( s . extraData [ n ] )
. appendTo ( form ) [ 0 ] ) ;
}
}
}
}
if ( ! s . iframeTarget ) {
// add iframe to doc and submit the form
$io . appendTo ( 'body' ) ;
}
if ( io . attachEvent )
io . attachEvent ( 'onload' , cb ) ;
else
io . addEventListener ( 'load' , cb , false ) ;
setTimeout ( checkState , 15 ) ;
try {
form . submit ( ) ;
} catch ( err ) {
// just in case form has element with name/id of 'submit'
var submitFn = document . createElement ( 'form' ) . submit ;
submitFn . apply ( form ) ;
}
}
finally {
// reset attrs and remove "extra" input elements
form . setAttribute ( 'action' , a ) ;
if ( t ) {
form . setAttribute ( 'target' , t ) ;
} else {
$form . removeAttr ( 'target' ) ;
}
$ ( extraInputs ) . remove ( ) ;
}
}
if ( s . forceSync ) {
doSubmit ( ) ;
}
else {
setTimeout ( doSubmit , 10 ) ; // this lets dom updates render
}
var data , doc , domCheckCount = 50 , callbackProcessed ;
function cb ( e ) {
if ( xhr . aborted || callbackProcessed ) {
return ;
}
doc = getDoc ( io ) ;
if ( ! doc ) {
log ( 'cannot access response document' ) ;
e = SERVER _ABORT ;
}
if ( e === CLIENT _TIMEOUT _ABORT && xhr ) {
xhr . abort ( 'timeout' ) ;
deferred . reject ( xhr , 'timeout' ) ;
return ;
}
else if ( e == SERVER _ABORT && xhr ) {
xhr . abort ( 'server abort' ) ;
deferred . reject ( xhr , 'error' , 'server abort' ) ;
return ;
}
if ( ! doc || doc . location . href == s . iframeSrc ) {
// response not received yet
if ( ! timedOut )
return ;
}
if ( io . detachEvent )
io . detachEvent ( 'onload' , cb ) ;
else
io . removeEventListener ( 'load' , cb , false ) ;
var status = 'success' , errMsg ;
try {
if ( timedOut ) {
throw 'timeout' ;
}
var isXml = s . dataType == 'xml' || doc . XMLDocument || $ . isXMLDoc ( doc ) ;
log ( 'isXml=' + isXml ) ;
if ( ! isXml && window . opera && ( doc . body === null || ! doc . body . innerHTML ) ) {
if ( -- domCheckCount ) {
// in some browsers (Opera) the iframe DOM is not always traversable when
// the onload callback fires, so we loop a bit to accommodate
log ( 'requeing onLoad callback, DOM not available' ) ;
setTimeout ( cb , 250 ) ;
return ;
}
// let this fall through because server response could be an empty document
//log('Could not access iframe DOM after mutiple tries.');
//throw 'DOMException: not available';
}
//log('response detected');
var docRoot = doc . body ? doc . body : doc . documentElement ;
xhr . responseText = docRoot ? docRoot . innerHTML : null ;
xhr . responseXML = doc . XMLDocument ? doc . XMLDocument : doc ;
if ( isXml )
s . dataType = 'xml' ;
xhr . getResponseHeader = function ( header ) {
var headers = { 'content-type' : s . dataType } ;
return headers [ header . toLowerCase ( ) ] ;
} ;
// support for XHR 'status' & 'statusText' emulation :
if ( docRoot ) {
xhr . status = Number ( docRoot . getAttribute ( 'status' ) ) || xhr . status ;
xhr . statusText = docRoot . getAttribute ( 'statusText' ) || xhr . statusText ;
}
var dt = ( s . dataType || '' ) . toLowerCase ( ) ;
var scr = /(json|script|text)/ . test ( dt ) ;
if ( scr || s . textarea ) {
// see if user embedded response in textarea
var ta = doc . getElementsByTagName ( 'textarea' ) [ 0 ] ;
if ( ta ) {
xhr . responseText = ta . value ;
// support for XHR 'status' & 'statusText' emulation :
xhr . status = Number ( ta . getAttribute ( 'status' ) ) || xhr . status ;
xhr . statusText = ta . getAttribute ( 'statusText' ) || xhr . statusText ;
}
else if ( scr ) {
// account for browsers injecting pre around json response
var pre = doc . getElementsByTagName ( 'pre' ) [ 0 ] ;
var b = doc . getElementsByTagName ( 'body' ) [ 0 ] ;
if ( pre ) {
xhr . responseText = pre . textContent ? pre . textContent : pre . innerText ;
}
else if ( b ) {
xhr . responseText = b . textContent ? b . textContent : b . innerText ;
}
}
}
else if ( dt == 'xml' && ! xhr . responseXML && xhr . responseText ) {
xhr . responseXML = toXml ( xhr . responseText ) ;
}
try {
data = httpData ( xhr , dt , s ) ;
}
catch ( err ) {
status = 'parsererror' ;
xhr . error = errMsg = ( err || status ) ;
}
}
catch ( err ) {
log ( 'error caught: ' , err ) ;
status = 'error' ;
xhr . error = errMsg = ( err || status ) ;
}
if ( xhr . aborted ) {
log ( 'upload aborted' ) ;
status = null ;
}
if ( xhr . status ) { // we've set xhr.status
status = ( xhr . status >= 200 && xhr . status < 300 || xhr . status === 304 ) ? 'success' : 'error' ;
}
// ordering of these callbacks/triggers is odd, but that's how $.ajax does it
if ( status === 'success' ) {
if ( s . success )
s . success . call ( s . context , data , 'success' , xhr ) ;
deferred . resolve ( xhr . responseText , 'success' , xhr ) ;
if ( g )
$ . event . trigger ( "ajaxSuccess" , [ xhr , s ] ) ;
}
else if ( status ) {
if ( errMsg === undefined )
errMsg = xhr . statusText ;
if ( s . error )
s . error . call ( s . context , xhr , status , errMsg ) ;
deferred . reject ( xhr , 'error' , errMsg ) ;
if ( g )
$ . event . trigger ( "ajaxError" , [ xhr , s , errMsg ] ) ;
}
if ( g )
$ . event . trigger ( "ajaxComplete" , [ xhr , s ] ) ;
if ( g && ! -- $ . active ) {
$ . event . trigger ( "ajaxStop" ) ;
}
if ( s . complete )
s . complete . call ( s . context , xhr , status ) ;
callbackProcessed = true ;
if ( s . timeout )
clearTimeout ( timeoutHandle ) ;
// clean up
setTimeout ( function ( ) {
if ( ! s . iframeTarget )
$io . remove ( ) ;
else //adding else to clean up existing iframe response.
$io . attr ( 'src' , s . iframeSrc ) ;
xhr . responseXML = null ;
} , 100 ) ;
}
var toXml = $ . parseXML || function ( s , doc ) { // use parseXML if available (jQuery 1.5+)
if ( window . ActiveXObject ) {
doc = new ActiveXObject ( 'Microsoft.XMLDOM' ) ;
doc . async = 'false' ;
doc . loadXML ( s ) ;
}
else {
doc = ( new DOMParser ( ) ) . parseFromString ( s , 'text/xml' ) ;
}
return ( doc && doc . documentElement && doc . documentElement . nodeName != 'parsererror' ) ? doc : null ;
} ;
var parseJSON = $ . parseJSON || function ( s ) {
/*jslint evil:true */
return window [ 'eval' ] ( '(' + s + ')' ) ;
} ;
var httpData = function ( xhr , type , s ) { // mostly lifted from jq1.4.4
var ct = xhr . getResponseHeader ( 'content-type' ) || '' ,
xml = type === 'xml' || ! type && ct . indexOf ( 'xml' ) >= 0 ,
data = xml ? xhr . responseXML : xhr . responseText ;
if ( xml && data . documentElement . nodeName === 'parsererror' ) {
if ( $ . error )
$ . error ( 'parsererror' ) ;
}
if ( s && s . dataFilter ) {
data = s . dataFilter ( data , type ) ;
}
if ( typeof data === 'string' ) {
if ( type === 'json' || ! type && ct . indexOf ( 'json' ) >= 0 ) {
data = parseJSON ( data ) ;
} else if ( type === "script" || ! type && ct . indexOf ( "javascript" ) >= 0 ) {
$ . globalEval ( data ) ;
}
}
return data ;
} ;
return deferred ;
}
} ;
/ * *
* ajaxForm ( ) provides a mechanism for fully automating form submission .
*
* The advantages of using this method instead of ajaxSubmit ( ) are :
*
* 1 : This method will include coordinates for < input type = "image" / > elements ( if the element
* is used to submit the form ) .
* 2. This method will include the submit element ' s name / value data ( for the element that was
* used to submit the form ) .
* 3. This method binds the submit ( ) method to the form for you .
*
* The options argument for ajaxForm works exactly as it does for ajaxSubmit . ajaxForm merely
* passes the options argument along after properly binding events for submit elements and
* the form itself .
* /
$ . fn . ajaxForm = function ( options ) {
options = options || { } ;
options . delegation = options . delegation && $ . isFunction ( $ . fn . on ) ;
// in jQuery 1.3+ we can fix mistakes with the ready state
if ( ! options . delegation && this . length === 0 ) {
var o = { s : this . selector , c : this . context } ;
if ( ! $ . isReady && o . s ) {
log ( 'DOM not ready, queuing ajaxForm' ) ;
$ ( function ( ) {
$ ( o . s , o . c ) . ajaxForm ( options ) ;
} ) ;
return this ;
}
// is your DOM ready? http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
log ( 'terminating; zero elements found by selector' + ( $ . isReady ? '' : ' (DOM not ready)' ) ) ;
return this ;
}
if ( options . delegation ) {
$ ( document )
. off ( 'submit.form-plugin' , this . selector , doAjaxSubmit )
. off ( 'click.form-plugin' , this . selector , captureSubmittingElement )
. on ( 'submit.form-plugin' , this . selector , options , doAjaxSubmit )
. on ( 'click.form-plugin' , this . selector , options , captureSubmittingElement ) ;
return this ;
}
return this . ajaxFormUnbind ( )
. bind ( 'submit.form-plugin' , options , doAjaxSubmit )
. bind ( 'click.form-plugin' , options , captureSubmittingElement ) ;
} ;
// private event handlers
function doAjaxSubmit ( e ) {
/*jshint validthis:true */
var options = e . data ;
if ( ! e . isDefaultPrevented ( ) ) { // if event has been canceled, don't proceed
e . preventDefault ( ) ;
$ ( e . target ) . ajaxSubmit ( options ) ; // #365
}
}
function captureSubmittingElement ( e ) {
/*jshint validthis:true */
var target = e . target ;
var $el = $ ( target ) ;
if ( ! ( $el . is ( "[type=submit],[type=image]" ) ) ) {
// is this a child element of the submit el? (ex: a span within a button)
var t = $el . closest ( '[type=submit]' ) ;
if ( t . length === 0 ) {
return ;
}
target = t [ 0 ] ;
}
var form = this ;
form . clk = target ;
if ( target . type == 'image' ) {
if ( e . offsetX !== undefined ) {
form . clk _x = e . offsetX ;
form . clk _y = e . offsetY ;
} else if ( typeof $ . fn . offset == 'function' ) {
var offset = $el . offset ( ) ;
form . clk _x = e . pageX - offset . left ;
form . clk _y = e . pageY - offset . top ;
} else {
form . clk _x = e . pageX - target . offsetLeft ;
form . clk _y = e . pageY - target . offsetTop ;
}
}
// clear form vars
setTimeout ( function ( ) { form . clk = form . clk _x = form . clk _y = null ; } , 100 ) ;
}
// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
$ . fn . ajaxFormUnbind = function ( ) {
return this . unbind ( 'submit.form-plugin click.form-plugin' ) ;
} ;
/ * *
* formToArray ( ) gathers form element data into an array of objects that can
* be passed to any of the following ajax functions : $ . get , $ . post , or load .
* Each object in the array has both a 'name' and 'value' property . An example of
* an array for a simple login form might be :
*
* [ { name : 'username' , value : 'jresig' } , { name : 'password' , value : 'secret' } ]
*
* It is this array that is passed to pre - submit callback functions provided to the
* ajaxSubmit ( ) and ajaxForm ( ) methods .
* /
$ . fn . formToArray = function ( semantic , elements ) {
var a = [ ] ;
if ( this . length === 0 ) {
return a ;
}
var form = this [ 0 ] ;
var els = semantic ? form . getElementsByTagName ( '*' ) : form . elements ;
if ( ! els ) {
return a ;
}
var i , j , n , v , el , max , jmax ;
for ( i = 0 , max = els . length ; i < max ; i ++ ) {
el = els [ i ] ;
n = el . name ;
if ( ! n || el . disabled ) {
continue ;
}
if ( semantic && form . clk && el . type == "image" ) {
// handle image inputs on the fly when semantic == true
if ( form . clk == el ) {
a . push ( { name : n , value : $ ( el ) . val ( ) , type : el . type } ) ;
a . push ( { name : n + '.x' , value : form . clk _x } , { name : n + '.y' , value : form . clk _y } ) ;
}
continue ;
}
v = $ . fieldValue ( el , true ) ;
if ( v && v . constructor == Array ) {
if ( elements )
elements . push ( el ) ;
for ( j = 0 , jmax = v . length ; j < jmax ; j ++ ) {
a . push ( { name : n , value : v [ j ] } ) ;
}
}
else if ( feature . fileapi && el . type == 'file' ) {
if ( elements )
elements . push ( el ) ;
var files = el . files ;
if ( files . length ) {
for ( j = 0 ; j < files . length ; j ++ ) {
a . push ( { name : n , value : files [ j ] , type : el . type } ) ;
}
}
else {
// #180
a . push ( { name : n , value : '' , type : el . type } ) ;
}
}
else if ( v !== null && typeof v != 'undefined' ) {
if ( elements )
elements . push ( el ) ;
a . push ( { name : n , value : v , type : el . type , required : el . required } ) ;
}
}
if ( ! semantic && form . clk ) {
// input type=='image' are not found in elements array! handle it here
var $input = $ ( form . clk ) , input = $input [ 0 ] ;
n = input . name ;
if ( n && ! input . disabled && input . type == 'image' ) {
a . push ( { name : n , value : $input . val ( ) } ) ;
a . push ( { name : n + '.x' , value : form . clk _x } , { name : n + '.y' , value : form . clk _y } ) ;
}
}
return a ;
} ;
/ * *
* Serializes form data into a 'submittable' string . This method will return a string
* in the format : name1 = value1 & amp ; name2 = value2
* /
$ . fn . formSerialize = function ( semantic ) {
//hand off to jQuery.param for proper encoding
return $ . param ( this . formToArray ( semantic ) ) ;
} ;
/ * *
* Serializes all field elements in the jQuery object into a query string .
* This method will return a string in the format : name1 = value1 & amp ; name2 = value2
* /
$ . fn . fieldSerialize = function ( successful ) {
var a = [ ] ;
this . each ( function ( ) {
var n = this . name ;
if ( ! n ) {
return ;
}
var v = $ . fieldValue ( this , successful ) ;
if ( v && v . constructor == Array ) {
for ( var i = 0 , max = v . length ; i < max ; i ++ ) {
a . push ( { name : n , value : v [ i ] } ) ;
}
}
else if ( v !== null && typeof v != 'undefined' ) {
a . push ( { name : this . name , value : v } ) ;
}
} ) ;
//hand off to jQuery.param for proper encoding
return $ . param ( a ) ;
} ;
/ * *
* Returns the value ( s ) of the element in the matched set . For example , consider the following form :
*
* < form > < fieldset >
* < input name = "A" type = "text" / >
* < input name = "A" type = "text" / >
* < input name = "B" type = "checkbox" value = "B1" / >
* < input name = "B" type = "checkbox" value = "B2" / >
* < input name = "C" type = "radio" value = "C1" / >
* < input name = "C" type = "radio" value = "C2" / >
* < / f i e l d s e t > < / f o r m >
*
* var v = $ ( 'input[type=text]' ) . fieldValue ( ) ;
* // if no values are entered into the text inputs
* v == [ '' , '' ]
* // if values entered into the text inputs are 'foo' and 'bar'
* v == [ 'foo' , 'bar' ]
*
* var v = $ ( 'input[type=checkbox]' ) . fieldValue ( ) ;
* // if neither checkbox is checked
* v === undefined
* // if both checkboxes are checked
* v == [ 'B1' , 'B2' ]
*
* var v = $ ( 'input[type=radio]' ) . fieldValue ( ) ;
* // if neither radio is checked
* v === undefined
* // if first radio is checked
* v == [ 'C1' ]
*
* The successful argument controls whether or not the field element must be 'successful'
* ( per http : //www.w3.org/TR/html4/interact/forms.html#successful-controls).
* The default value of the successful argument is true . If this value is false the value ( s )
* for each element is returned .
*
* Note : This method * always * returns an array . If no valid value can be determined the
* array will be empty , otherwise it will contain one or more values .
* /
$ . fn . fieldValue = function ( successful ) {
for ( var val = [ ] , i = 0 , max = this . length ; i < max ; i ++ ) {
var el = this [ i ] ;
var v = $ . fieldValue ( el , successful ) ;
if ( v === null || typeof v == 'undefined' || ( v . constructor == Array && ! v . length ) ) {
continue ;
}
if ( v . constructor == Array )
$ . merge ( val , v ) ;
else
val . push ( v ) ;
}
return val ;
} ;
/ * *
* Returns the value of the field element .
* /
$ . fieldValue = function ( el , successful ) {
var n = el . name , t = el . type , tag = el . tagName . toLowerCase ( ) ;
if ( successful === undefined ) {
successful = true ;
}
if ( successful && ( ! n || el . disabled || t == 'reset' || t == 'button' ||
( t == 'checkbox' || t == 'radio' ) && ! el . checked ||
( t == 'submit' || t == 'image' ) && el . form && el . form . clk != el ||
tag == 'select' && el . selectedIndex == - 1 ) ) {
return null ;
}
if ( tag == 'select' ) {
var index = el . selectedIndex ;
if ( index < 0 ) {
return null ;
}
var a = [ ] , ops = el . options ;
var one = ( t == 'select-one' ) ;
var max = ( one ? index + 1 : ops . length ) ;
for ( var i = ( one ? index : 0 ) ; i < max ; i ++ ) {
var op = ops [ i ] ;
if ( op . selected ) {
var v = op . value ;
if ( ! v ) { // extra pain for IE...
v = ( op . attributes && op . attributes [ 'value' ] && ! ( op . attributes [ 'value' ] . specified ) ) ? op . text : op . value ;
}
if ( one ) {
return v ;
}
a . push ( v ) ;
}
}
return a ;
}
return $ ( el ) . val ( ) ;
} ;
/ * *
* Clears the form data . Takes the following actions on the form ' s input fields :
* - input text fields will have their 'value' property set to the empty string
* - select elements will have their 'selectedIndex' property set to - 1
* - checkbox and radio inputs will have their 'checked' property set to false
* - inputs of type submit , button , reset , and hidden will * not * be effected
* - button elements will * not * be effected
* /
$ . fn . clearForm = function ( includeHidden ) {
return this . each ( function ( ) {
$ ( 'input,select,textarea' , this ) . clearFields ( includeHidden ) ;
} ) ;
} ;
/ * *
* Clears the selected form elements .
* /
$ . fn . clearFields = $ . fn . clearInputs = function ( includeHidden ) {
var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i ; // 'hidden' is not in this list
return this . each ( function ( ) {
var t = this . type , tag = this . tagName . toLowerCase ( ) ;
if ( re . test ( t ) || tag == 'textarea' ) {
this . value = '' ;
}
else if ( t == 'checkbox' || t == 'radio' ) {
this . checked = false ;
}
else if ( tag == 'select' ) {
this . selectedIndex = - 1 ;
}
else if ( t == "file" ) {
if ( /MSIE/ . test ( navigator . userAgent ) ) {
$ ( this ) . replaceWith ( $ ( this ) . clone ( true ) ) ;
} else {
$ ( this ) . val ( '' ) ;
}
}
else if ( includeHidden ) {
// includeHidden can be the value true, or it can be a selector string
// indicating a special test; for example:
// $('#myForm').clearForm('.special:hidden')
// the above would clean hidden inputs that have the class of 'special'
if ( ( includeHidden === true && /hidden/ . test ( t ) ) ||
( typeof includeHidden == 'string' && $ ( this ) . is ( includeHidden ) ) )
this . value = '' ;
}
} ) ;
} ;
/ * *
* Resets the form data . Causes all form elements to be reset to their original value .
* /
$ . fn . resetForm = function ( ) {
return this . each ( function ( ) {
// guard against an input with the name of 'reset'
// note that IE reports the reset function as an 'object'
if ( typeof this . reset == 'function' || ( typeof this . reset == 'object' && ! this . reset . nodeType ) ) {
this . reset ( ) ;
}
} ) ;
} ;
/ * *
* Enables or disables any matching elements .
* /
$ . fn . enable = function ( b ) {
if ( b === undefined ) {
b = true ;
}
return this . each ( function ( ) {
this . disabled = ! b ;
} ) ;
} ;
/ * *
* Checks / unchecks any matching checkboxes or radio buttons and
* selects / deselects and matching option elements .
* /
$ . fn . selected = function ( select ) {
if ( select === undefined ) {
select = true ;
}
return this . each ( function ( ) {
var t = this . type ;
if ( t == 'checkbox' || t == 'radio' ) {
this . checked = select ;
}
else if ( this . tagName . toLowerCase ( ) == 'option' ) {
var $sel = $ ( this ) . parent ( 'select' ) ;
if ( select && $sel [ 0 ] && $sel [ 0 ] . type == 'select-one' ) {
// deselect all other options
$sel . find ( 'option' ) . selected ( false ) ;
}
this . selected = select ;
}
} ) ;
} ;
// expose debug var
$ . fn . ajaxSubmit . debug = false ;
// helper fn for console logging
function log ( ) {
if ( ! $ . fn . ajaxSubmit . debug )
return ;
var msg = '[jquery.form] ' + Array . prototype . join . call ( arguments , '' ) ;
if ( window . console && window . console . log ) {
window . console . log ( msg ) ;
}
else if ( window . opera && window . opera . postError ) {
window . opera . postError ( msg ) ;
}
}
} ) ) ;
; + ( function ( window , $ , undefined ) {
'use strict' ;
var support = {
calc : false
} ;
/ *
* Public Function
* /
$ . fn . rrssb = function ( options ) {
// Settings that $.rrssb() will accept.
var settings = $ . extend ( {
description : undefined ,
emailAddress : undefined ,
emailBody : undefined ,
emailSubject : undefined ,
image : undefined ,
title : undefined ,
url : undefined
} , options ) ;
// use some sensible defaults if they didn't specify email settings
settings . emailSubject = settings . emailSubject || settings . title ;
settings . emailBody = settings . emailBody ||
(
( settings . description ? settings . description : '' ) +
( settings . url ? '\n\n' + settings . url : '' )
) ;
// Return the encoded strings if the settings have been changed.
for ( var key in settings ) {
if ( settings . hasOwnProperty ( key ) && settings [ key ] !== undefined ) {
settings [ key ] = encodeString ( settings [ key ] ) ;
}
} ;
if ( settings . url !== undefined ) {
$ ( this ) . find ( '.rrssb-facebook a' ) . attr ( 'href' , 'https://www.facebook.com/sharer/sharer.php?u=' + settings . url ) ;
$ ( this ) . find ( '.rrssb-tumblr a' ) . attr ( 'href' , 'http://tumblr.com/share/link?url=' + settings . url + ( settings . title !== undefined ? '&name=' + settings . title : '' ) + ( settings . description !== undefined ? '&description=' + settings . description : '' ) ) ;
$ ( this ) . find ( '.rrssb-linkedin a' ) . attr ( 'href' , 'http://www.linkedin.com/shareArticle?mini=true&url=' + settings . url + ( settings . title !== undefined ? '&title=' + settings . title : '' ) + ( settings . description !== undefined ? '&summary=' + settings . description : '' ) ) ;
$ ( this ) . find ( '.rrssb-twitter a' ) . attr ( 'href' , 'https://twitter.com/intent/tweet?text=' + ( settings . description !== undefined ? settings . description : '' ) + '%20' + settings . url ) ;
$ ( this ) . find ( '.rrssb-hackernews a' ) . attr ( 'href' , 'https://news.ycombinator.com/submitlink?u=' + settings . url + ( settings . title !== undefined ? '&text=' + settings . title : '' ) ) ;
$ ( this ) . find ( '.rrssb-reddit a' ) . attr ( 'href' , 'http://www.reddit.com/submit?url=' + settings . url + ( settings . description !== undefined ? '&text=' + settings . description : '' ) + ( settings . title !== undefined ? '&title=' + settings . title : '' ) ) ;
$ ( this ) . find ( '.rrssb-googleplus a' ) . attr ( 'href' , 'https://plus.google.com/share?url=' + ( settings . description !== undefined ? settings . description : '' ) + '%20' + settings . url ) ;
$ ( this ) . find ( '.rrssb-pinterest a' ) . attr ( 'href' , 'http://pinterest.com/pin/create/button/?url=' + settings . url + ( ( settings . image !== undefined ) ? '&media=' + settings . image : '' ) + ( settings . description !== undefined ? '&description=' + settings . description : '' ) ) ;
$ ( this ) . find ( '.rrssb-pocket a' ) . attr ( 'href' , 'https://getpocket.com/save?url=' + settings . url ) ;
$ ( this ) . find ( '.rrssb-github a' ) . attr ( 'href' , settings . url ) ;
$ ( this ) . find ( '.rrssb-print a' ) . attr ( 'href' , 'javascript:window.print()' ) ;
$ ( this ) . find ( '.rrssb-whatsapp a' ) . attr ( 'href' , 'whatsapp://send?text=' + ( settings . description !== undefined ? settings . description + '%20' : ( settings . title !== undefined ? settings . title + '%20' : '' ) ) + settings . url ) ;
}
if ( settings . emailAddress !== undefined || settings . emailSubject ) {
$ ( this ) . find ( '.rrssb-email a' ) . attr ( 'href' , 'mailto:' + ( settings . emailAddress ? settings . emailAddress : '' ) + '?' + ( settings . emailSubject !== undefined ? 'subject=' + settings . emailSubject : '' ) + ( settings . emailBody !== undefined ? '&body=' + settings . emailBody : '' ) ) ;
}
} ;
/ *
* Utility functions
* /
var detectCalcSupport = function ( ) {
//detect if calc is natively supported.
var el = $ ( '<div>' ) ;
var calcProps = [
'calc' ,
'-webkit-calc' ,
'-moz-calc'
] ;
$ ( 'body' ) . append ( el ) ;
for ( var i = 0 ; i < calcProps . length ; i ++ ) {
el . css ( 'width' , calcProps [ i ] + '(1px)' ) ;
if ( el . width ( ) === 1 ) {
support . calc = calcProps [ i ] ;
break ;
}
}
el . remove ( ) ;
} ;
var encodeString = function ( string ) {
// Recursively decode string first to ensure we aren't double encoding.
if ( string !== undefined && string !== null ) {
if ( string . match ( /%[0-9a-f]{2}/i ) !== null ) {
string = decodeURIComponent ( string ) ;
encodeString ( string ) ;
} else {
return encodeURIComponent ( string ) ;
}
}
} ;
var setPercentBtns = function ( ) {
// loop through each instance of buttons
$ ( '.rrssb-buttons' ) . each ( function ( index ) {
var self = $ ( this ) ;
var buttons = $ ( 'li:visible' , self ) ;
var numOfButtons = buttons . length ;
var initBtnWidth = 100 / numOfButtons ;
// set initial width of buttons
buttons . css ( 'width' , initBtnWidth + '%' ) . attr ( 'data-initwidth' , initBtnWidth ) ;
} ) ;
} ;
var makeExtremityBtns = function ( ) {
// loop through each instance of buttons
$ ( '.rrssb-buttons' ) . each ( function ( index ) {
var self = $ ( this ) ;
//get button width
var containerWidth = self . width ( ) ;
var buttonWidth = $ ( 'li' , self ) . not ( '.small' ) . eq ( 0 ) . width ( ) ;
var buttonCountSmall = $ ( 'li.small' , self ) . length ;
// enlarge buttons if they get wide enough
if ( buttonWidth > 170 && buttonCountSmall < 1 ) {
self . addClass ( 'large-format' ) ;
var fontSize = buttonWidth / 12 + 'px' ;
self . css ( 'font-size' , fontSize ) ;
} else {
self . removeClass ( 'large-format' ) ;
self . css ( 'font-size' , '' ) ;
}
if ( containerWidth < buttonCountSmall * 25 ) {
self . removeClass ( 'small-format' ) . addClass ( 'tiny-format' ) ;
} else {
self . removeClass ( 'tiny-format' ) ;
}
} ) ;
} ;
var backUpFromSmall = function ( ) {
// loop through each instance of buttons
$ ( '.rrssb-buttons' ) . each ( function ( index ) {
var self = $ ( this ) ;
var buttons = $ ( 'li' , self ) ;
var smallButtons = buttons . filter ( '.small' ) ;
var totalBtnSze = 0 ;
var totalTxtSze = 0 ;
var upCandidate = smallButtons . eq ( 0 ) ;
var nextBackUp = parseFloat ( upCandidate . attr ( 'data-size' ) ) + 55 ;
var smallBtnCount = smallButtons . length ;
if ( smallBtnCount === buttons . length ) {
var btnCalc = smallBtnCount * 42 ;
var containerWidth = self . width ( ) ;
if ( ( btnCalc + nextBackUp ) < containerWidth ) {
self . removeClass ( 'small-format' ) ;
smallButtons . eq ( 0 ) . removeClass ( 'small' ) ;
sizeSmallBtns ( ) ;
}
} else {
buttons . not ( '.small' ) . each ( function ( index ) {
var button = $ ( this ) ;
var txtWidth = parseFloat ( button . attr ( 'data-size' ) ) + 55 ;
var btnWidth = parseFloat ( button . width ( ) ) ;
totalBtnSze = totalBtnSze + btnWidth ;
totalTxtSze = totalTxtSze + txtWidth ;
} ) ;
var spaceLeft = totalBtnSze - totalTxtSze ;
if ( nextBackUp < spaceLeft ) {
upCandidate . removeClass ( 'small' ) ;
sizeSmallBtns ( ) ;
}
}
} ) ;
} ;
var checkSize = function ( init ) {
// loop through each instance of buttons
$ ( '.rrssb-buttons' ) . each ( function ( index ) {
var self = $ ( this ) ;
var buttons = $ ( 'li' , self ) ;
// get buttons in reverse order and loop through each
$ ( buttons . get ( ) . reverse ( ) ) . each ( function ( index , count ) {
var button = $ ( this ) ;
if ( button . hasClass ( 'small' ) === false ) {
var txtWidth = parseFloat ( button . attr ( 'data-size' ) ) + 55 ;
var btnWidth = parseFloat ( button . width ( ) ) ;
if ( txtWidth > btnWidth ) {
var btn2small = buttons . not ( '.small' ) . last ( ) ;
$ ( btn2small ) . addClass ( 'small' ) ;
sizeSmallBtns ( ) ;
}
}
if ( ! -- count ) backUpFromSmall ( ) ;
} ) ;
} ) ;
// if first time running, put it through the magic layout
if ( init === true ) {
rrssbMagicLayout ( sizeSmallBtns ) ;
}
} ;
var sizeSmallBtns = function ( ) {
// loop through each instance of buttons
$ ( '.rrssb-buttons' ) . each ( function ( index ) {
var self = $ ( this ) ;
var regButtonCount ;
var regPercent ;
var pixelsOff ;
var magicWidth ;
var smallBtnFraction ;
var buttons = $ ( 'li' , self ) ;
var smallButtons = buttons . filter ( '.small' ) ;
// readjust buttons for small display
var smallBtnCount = smallButtons . length ;
// make sure there are small buttons
if ( smallBtnCount > 0 && smallBtnCount !== buttons . length ) {
self . removeClass ( 'small-format' ) ;
//make sure small buttons are square when not all small
smallButtons . css ( 'width' , '42px' ) ;
pixelsOff = smallBtnCount * 42 ;
regButtonCount = buttons . not ( '.small' ) . length ;
regPercent = 100 / regButtonCount ;
smallBtnFraction = pixelsOff / regButtonCount ;
// if calc is not supported. calculate the width on the fly.
if ( support . calc === false ) {
magicWidth = ( ( self . innerWidth ( ) - 1 ) / regButtonCount ) - smallBtnFraction ;
magicWidth = Math . floor ( magicWidth * 1000 ) / 1000 ;
magicWidth += 'px' ;
} else {
magicWidth = support . calc + '(' + regPercent + '% - ' + smallBtnFraction + 'px)' ;
}
buttons . not ( '.small' ) . css ( 'width' , magicWidth ) ;
} else if ( smallBtnCount === buttons . length ) {
// if all buttons are small, change back to percentage
self . addClass ( 'small-format' ) ;
setPercentBtns ( ) ;
} else {
self . removeClass ( 'small-format' ) ;
setPercentBtns ( ) ;
}
} ) ; //end loop
makeExtremityBtns ( ) ;
} ;
var rrssbInit = function ( ) {
$ ( '.rrssb-buttons' ) . each ( function ( index ) {
$ ( this ) . addClass ( 'rrssb-' + ( index + 1 ) ) ;
} ) ;
detectCalcSupport ( ) ;
setPercentBtns ( ) ;
// grab initial text width of each button and add as data attr
$ ( '.rrssb-buttons li .rrssb-text' ) . each ( function ( index ) {
var buttonTxt = $ ( this ) ;
var txtWdth = buttonTxt . width ( ) ;
buttonTxt . closest ( 'li' ) . attr ( 'data-size' , txtWdth ) ;
} ) ;
checkSize ( true ) ;
} ;
var rrssbMagicLayout = function ( callback ) {
//remove small buttons before each conversion try
$ ( '.rrssb-buttons li.small' ) . removeClass ( 'small' ) ;
checkSize ( ) ;
callback ( ) ;
} ;
var popupCenter = function ( url , title , w , h ) {
// Fixes dual-screen position Most browsers Firefox
var dualScreenLeft = window . screenLeft !== undefined ? window . screenLeft : screen . left ;
var dualScreenTop = window . screenTop !== undefined ? window . screenTop : screen . top ;
var width = window . innerWidth ? window . innerWidth : document . documentElement . clientWidth ? document . documentElement . clientWidth : screen . width ;
var height = window . innerHeight ? window . innerHeight : document . documentElement . clientHeight ? document . documentElement . clientHeight : screen . height ;
var left = ( ( width / 2 ) - ( w / 2 ) ) + dualScreenLeft ;
var top = ( ( height / 3 ) - ( h / 3 ) ) + dualScreenTop ;
var newWindow = window . open ( url , title , 'scrollbars=yes, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left ) ;
// Puts focus on the newWindow
if ( newWindow && newWindow . focus ) {
newWindow . focus ( ) ;
}
} ;
var waitForFinalEvent = ( function ( ) {
var timers = { } ;
return function ( callback , ms , uniqueId ) {
if ( ! uniqueId ) {
uniqueId = "Don't call this twice without a uniqueId" ;
}
if ( timers [ uniqueId ] ) {
clearTimeout ( timers [ uniqueId ] ) ;
}
timers [ uniqueId ] = setTimeout ( callback , ms ) ;
} ;
} ) ( ) ;
// init load
$ ( document ) . ready ( function ( ) {
/ *
* Event listners
* /
try {
$ ( document ) . on ( 'click' , '.rrssb-buttons a.popup' , { } , function popUp ( e ) {
var self = $ ( this ) ;
popupCenter ( self . attr ( 'href' ) , self . find ( '.rrssb-text' ) . html ( ) , 580 , 470 ) ;
e . preventDefault ( ) ;
} ) ;
}
catch ( e ) { // catching this adds partial support for jQuery 1.3
}
// resize function
$ ( window ) . resize ( function ( ) {
rrssbMagicLayout ( sizeSmallBtns ) ;
waitForFinalEvent ( function ( ) {
rrssbMagicLayout ( sizeSmallBtns ) ;
} , 200 , "finished resizing" ) ;
} ) ;
rrssbInit ( ) ;
} ) ;
// Make global
window . rrssbInit = rrssbInit ;
} ) ( window , jQuery ) ;
; ; ! function ( name , context , definition ) {
if ( typeof module !== 'undefined' ) module . exports = definition ( name , context )
else if ( typeof define === 'function' && typeof define . amd === 'object' ) define ( definition )
else context [ name ] = definition ( name , context )
} ( 'humane' , this , function ( name , context ) {
var win = window
var doc = document
var ENV = {
on : function ( el , type , cb ) {
'addEventListener' in win ? el . addEventListener ( type , cb , false ) : el . attachEvent ( 'on' + type , cb )
} ,
off : function ( el , type , cb ) {
'removeEventListener' in win ? el . removeEventListener ( type , cb , false ) : el . detachEvent ( 'on' + type , cb )
} ,
bind : function ( fn , ctx ) {
return function ( ) { fn . apply ( ctx , arguments ) }
} ,
isArray : Array . isArray || function ( obj ) { return Object . prototype . toString . call ( obj ) === '[object Array]' } ,
config : function ( preferred , fallback ) {
return preferred != null ? preferred : fallback
} ,
transSupport : false ,
useFilter : /msie [678]/i . test ( navigator . userAgent ) , // sniff, sniff
_checkTransition : function ( ) {
var el = doc . createElement ( 'div' )
var vendors = { webkit : 'webkit' , Moz : '' , O : 'o' , ms : 'MS' }
for ( var vendor in vendors )
if ( vendor + 'Transition' in el . style ) {
this . vendorPrefix = vendors [ vendor ]
this . transSupport = true
}
}
}
ENV . _checkTransition ( )
var Humane = function ( o ) {
o || ( o = { } )
this . queue = [ ]
this . baseCls = o . baseCls || 'humane'
this . addnCls = o . addnCls || ''
this . timeout = 'timeout' in o ? o . timeout : 2500
this . waitForMove = o . waitForMove || false
this . clickToClose = o . clickToClose || false
this . timeoutAfterMove = o . timeoutAfterMove || false
this . container = o . container
try { this . _setupEl ( ) } // attempt to setup elements
catch ( e ) {
ENV . on ( win , 'load' , ENV . bind ( this . _setupEl , this ) ) // dom wasn't ready, wait till ready
}
}
Humane . prototype = {
constructor : Humane ,
_setupEl : function ( ) {
var el = doc . createElement ( 'div' )
el . style . display = 'none'
if ( ! this . container ) {
if ( doc . body ) this . container = doc . body ;
else throw 'document.body is null'
}
this . container . appendChild ( el )
this . el = el
this . removeEvent = ENV . bind ( function ( ) {
var timeoutAfterMove = ENV . config ( this . currentMsg . timeoutAfterMove , this . timeoutAfterMove )
if ( ! timeoutAfterMove ) {
this . remove ( )
} else {
setTimeout ( ENV . bind ( this . remove , this ) , timeoutAfterMove )
}
} , this )
this . transEvent = ENV . bind ( this . _afterAnimation , this )
this . _run ( )
} ,
_afterTimeout : function ( ) {
if ( ! ENV . config ( this . currentMsg . waitForMove , this . waitForMove ) ) this . remove ( )
else if ( ! this . removeEventsSet ) {
ENV . on ( doc . body , 'mousemove' , this . removeEvent )
ENV . on ( doc . body , 'click' , this . removeEvent )
ENV . on ( doc . body , 'keypress' , this . removeEvent )
ENV . on ( doc . body , 'touchstart' , this . removeEvent )
this . removeEventsSet = true
}
} ,
_run : function ( ) {
if ( this . _animating || ! this . queue . length || ! this . el ) return
this . _animating = true
if ( this . currentTimer ) {
clearTimeout ( this . currentTimer )
this . currentTimer = null
}
var msg = this . queue . shift ( )
var clickToClose = ENV . config ( msg . clickToClose , this . clickToClose )
if ( clickToClose ) {
ENV . on ( this . el , 'click' , this . removeEvent )
ENV . on ( this . el , 'touchstart' , this . removeEvent )
}
var timeout = ENV . config ( msg . timeout , this . timeout )
if ( timeout > 0 )
this . currentTimer = setTimeout ( ENV . bind ( this . _afterTimeout , this ) , timeout )
if ( ENV . isArray ( msg . html ) ) msg . html = '<ul><li>' + msg . html . join ( '<li>' ) + '</ul>'
this . el . innerHTML = msg . html
this . currentMsg = msg
this . el . className = this . baseCls
if ( ENV . transSupport ) {
this . el . style . display = 'block'
setTimeout ( ENV . bind ( this . _showMsg , this ) , 50 )
} else {
this . _showMsg ( )
}
} ,
_setOpacity : function ( opacity ) {
if ( ENV . useFilter ) {
try {
this . el . filters . item ( 'DXImageTransform.Microsoft.Alpha' ) . Opacity = opacity * 100
} catch ( err ) { }
} else {
this . el . style . opacity = String ( opacity )
}
} ,
_showMsg : function ( ) {
var addnCls = ENV . config ( this . currentMsg . addnCls , this . addnCls )
if ( ENV . transSupport ) {
this . el . className = this . baseCls + ' ' + addnCls + ' ' + this . baseCls + '-animate'
}
else {
var opacity = 0
this . el . className = this . baseCls + ' ' + addnCls + ' ' + this . baseCls + '-js-animate'
this . _setOpacity ( 0 ) // reset value so hover states work
this . el . style . display = 'block'
var self = this
var interval = setInterval ( function ( ) {
if ( opacity < 1 ) {
opacity += 0.1
if ( opacity > 1 ) opacity = 1
self . _setOpacity ( opacity )
}
else clearInterval ( interval )
} , 30 )
}
} ,
_hideMsg : function ( ) {
var addnCls = ENV . config ( this . currentMsg . addnCls , this . addnCls )
if ( ENV . transSupport ) {
this . el . className = this . baseCls + ' ' + addnCls
ENV . on ( this . el , ENV . vendorPrefix ? ENV . vendorPrefix + 'TransitionEnd' : 'transitionend' , this . transEvent )
}
else {
var opacity = 1
var self = this
var interval = setInterval ( function ( ) {
if ( opacity > 0 ) {
opacity -= 0.1
if ( opacity < 0 ) opacity = 0
self . _setOpacity ( opacity ) ;
}
else {
self . el . className = self . baseCls + ' ' + addnCls
clearInterval ( interval )
self . _afterAnimation ( )
}
} , 30 )
}
} ,
_afterAnimation : function ( ) {
if ( ENV . transSupport ) ENV . off ( this . el , ENV . vendorPrefix ? ENV . vendorPrefix + 'TransitionEnd' : 'transitionend' , this . transEvent )
if ( this . currentMsg . cb ) this . currentMsg . cb ( )
this . el . style . display = 'none'
this . _animating = false
this . _run ( )
} ,
remove : function ( e ) {
var cb = typeof e == 'function' ? e : null
ENV . off ( doc . body , 'mousemove' , this . removeEvent )
ENV . off ( doc . body , 'click' , this . removeEvent )
ENV . off ( doc . body , 'keypress' , this . removeEvent )
ENV . off ( doc . body , 'touchstart' , this . removeEvent )
ENV . off ( this . el , 'click' , this . removeEvent )
ENV . off ( this . el , 'touchstart' , this . removeEvent )
this . removeEventsSet = false
if ( cb && this . currentMsg ) this . currentMsg . cb = cb
if ( this . _animating ) this . _hideMsg ( )
else if ( cb ) cb ( )
} ,
log : function ( html , o , cb , defaults ) {
var msg = { }
if ( defaults )
for ( var opt in defaults )
msg [ opt ] = defaults [ opt ]
if ( typeof o == 'function' ) cb = o
else if ( o )
for ( var opt in o ) msg [ opt ] = o [ opt ]
msg . html = html
if ( cb ) msg . cb = cb
this . queue . push ( msg )
this . _run ( )
return this
} ,
spawn : function ( defaults ) {
var self = this
return function ( html , o , cb ) {
self . log . call ( self , html , o , cb , defaults )
return self
}
} ,
create : function ( o ) { return new Humane ( o ) }
}
return new Humane ( )
} ) ;
2016-06-17 19:06:51 +00:00
; ( function ( ) {
var $ , cardFromNumber , cardFromType , cards , defaultFormat , formatBackCardNumber , formatBackExpiry , formatCardNumber , formatExpiry , formatForwardExpiry , formatForwardSlashAndSpace , hasTextSelected , luhnCheck , reFormatCVC , reFormatCardNumber , reFormatExpiry , reFormatNumeric , replaceFullWidthChars , restrictCVC , restrictCardNumber , restrictExpiry , restrictNumeric , safeVal , setCardType ,
_ _slice = [ ] . slice ,
_ _indexOf = [ ] . indexOf || function ( item ) { for ( var i = 0 , l = this . length ; i < l ; i ++ ) { if ( i in this && this [ i ] === item ) return i ; } return - 1 ; } ;
$ = window . jQuery || window . Zepto || window . $ ;
$ . payment = { } ;
$ . payment . fn = { } ;
$ . fn . payment = function ( ) {
var args , method ;
method = arguments [ 0 ] , args = 2 <= arguments . length ? _ _slice . call ( arguments , 1 ) : [ ] ;
return $ . payment . fn [ method ] . apply ( this , args ) ;
} ;
defaultFormat = /(\d{1,4})/g ;
$ . payment . cards = cards = [
{
type : 'elo' ,
patterns : [ 4011 , 4312 , 4389 , 4514 , 4573 , 4576 , 5041 , 5066 , 5067 , 509 , 6277 , 6362 , 6363 , 650 , 6516 , 6550 ] ,
format : defaultFormat ,
length : [ 16 ] ,
cvcLength : [ 3 ] ,
luhn : true
} , {
type : 'visaelectron' ,
patterns : [ 4026 , 417500 , 4405 , 4508 , 4844 , 4913 , 4917 ] ,
format : defaultFormat ,
length : [ 16 ] ,
cvcLength : [ 3 ] ,
luhn : true
} , {
type : 'maestro' ,
patterns : [ 5018 , 502 , 503 , 506 , 56 , 58 , 639 , 6220 , 67 ] ,
format : defaultFormat ,
length : [ 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 ] ,
cvcLength : [ 3 ] ,
luhn : true
} , {
type : 'forbrugsforeningen' ,
patterns : [ 600 ] ,
format : defaultFormat ,
length : [ 16 ] ,
cvcLength : [ 3 ] ,
luhn : true
} , {
type : 'dankort' ,
patterns : [ 5019 ] ,
format : defaultFormat ,
length : [ 16 ] ,
cvcLength : [ 3 ] ,
luhn : true
} , {
type : 'visa' ,
patterns : [ 4 ] ,
format : defaultFormat ,
length : [ 13 , 16 ] ,
cvcLength : [ 3 ] ,
luhn : true
} , {
type : 'mastercard' ,
patterns : [ 51 , 52 , 53 , 54 , 55 , 22 , 23 , 24 , 25 , 26 , 27 ] ,
format : defaultFormat ,
length : [ 16 ] ,
cvcLength : [ 3 ] ,
luhn : true
} , {
type : 'amex' ,
patterns : [ 34 , 37 ] ,
format : /(\d{1,4})(\d{1,6})?(\d{1,5})?/ ,
length : [ 15 ] ,
cvcLength : [ 3 , 4 ] ,
luhn : true
} , {
type : 'dinersclub' ,
patterns : [ 30 , 36 , 38 , 39 ] ,
format : /(\d{1,4})(\d{1,6})?(\d{1,4})?/ ,
length : [ 14 ] ,
cvcLength : [ 3 ] ,
luhn : true
} , {
type : 'discover' ,
patterns : [ 60 , 64 , 65 , 622 ] ,
format : defaultFormat ,
length : [ 16 ] ,
cvcLength : [ 3 ] ,
luhn : true
} , {
type : 'unionpay' ,
patterns : [ 62 , 88 ] ,
format : defaultFormat ,
length : [ 16 , 17 , 18 , 19 ] ,
cvcLength : [ 3 ] ,
luhn : false
} , {
type : 'jcb' ,
patterns : [ 35 ] ,
format : defaultFormat ,
length : [ 16 ] ,
cvcLength : [ 3 ] ,
luhn : true
}
] ;
cardFromNumber = function ( num ) {
var card , p , pattern , _i , _j , _len , _len1 , _ref ;
num = ( num + '' ) . replace ( /\D/g , '' ) ;
for ( _i = 0 , _len = cards . length ; _i < _len ; _i ++ ) {
card = cards [ _i ] ;
_ref = card . patterns ;
for ( _j = 0 , _len1 = _ref . length ; _j < _len1 ; _j ++ ) {
pattern = _ref [ _j ] ;
p = pattern + '' ;
if ( num . substr ( 0 , p . length ) === p ) {
return card ;
}
}
}
} ;
cardFromType = function ( type ) {
var card , _i , _len ;
for ( _i = 0 , _len = cards . length ; _i < _len ; _i ++ ) {
card = cards [ _i ] ;
if ( card . type === type ) {
return card ;
}
}
} ;
luhnCheck = function ( num ) {
var digit , digits , odd , sum , _i , _len ;
odd = true ;
sum = 0 ;
digits = ( num + '' ) . split ( '' ) . reverse ( ) ;
for ( _i = 0 , _len = digits . length ; _i < _len ; _i ++ ) {
digit = digits [ _i ] ;
digit = parseInt ( digit , 10 ) ;
if ( ( odd = ! odd ) ) {
digit *= 2 ;
}
if ( digit > 9 ) {
digit -= 9 ;
}
sum += digit ;
}
return sum % 10 === 0 ;
} ;
hasTextSelected = function ( $target ) {
var _ref ;
if ( ( $target . prop ( 'selectionStart' ) != null ) && $target . prop ( 'selectionStart' ) !== $target . prop ( 'selectionEnd' ) ) {
return true ;
}
if ( ( typeof document !== "undefined" && document !== null ? ( _ref = document . selection ) != null ? _ref . createRange : void 0 : void 0 ) != null ) {
if ( document . selection . createRange ( ) . text ) {
return true ;
}
}
return false ;
} ;
safeVal = function ( value , $target ) {
var currPair , cursor , digit , error , last , prevPair ;
try {
cursor = $target . prop ( 'selectionStart' ) ;
} catch ( _error ) {
error = _error ;
cursor = null ;
}
last = $target . val ( ) ;
$target . val ( value ) ;
if ( cursor !== null && $target . is ( ":focus" ) ) {
if ( cursor === last . length ) {
cursor = value . length ;
}
if ( last !== value ) {
prevPair = last . slice ( cursor - 1 , + cursor + 1 || 9e9 ) ;
currPair = value . slice ( cursor - 1 , + cursor + 1 || 9e9 ) ;
digit = value [ cursor ] ;
if ( /\d/ . test ( digit ) && prevPair === ( "" + digit + " " ) && currPair === ( " " + digit ) ) {
cursor = cursor + 1 ;
}
}
$target . prop ( 'selectionStart' , cursor ) ;
return $target . prop ( 'selectionEnd' , cursor ) ;
}
} ;
replaceFullWidthChars = function ( str ) {
var chars , chr , fullWidth , halfWidth , idx , value , _i , _len ;
if ( str == null ) {
str = '' ;
}
fullWidth = '\uff10\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18\uff19' ;
halfWidth = '0123456789' ;
value = '' ;
chars = str . split ( '' ) ;
for ( _i = 0 , _len = chars . length ; _i < _len ; _i ++ ) {
chr = chars [ _i ] ;
idx = fullWidth . indexOf ( chr ) ;
if ( idx > - 1 ) {
chr = halfWidth [ idx ] ;
}
value += chr ;
}
return value ;
} ;
reFormatNumeric = function ( e ) {
var $target ;
$target = $ ( e . currentTarget ) ;
return setTimeout ( function ( ) {
var value ;
value = $target . val ( ) ;
value = replaceFullWidthChars ( value ) ;
value = value . replace ( /\D/g , '' ) ;
return safeVal ( value , $target ) ;
} ) ;
} ;
reFormatCardNumber = function ( e ) {
var $target ;
$target = $ ( e . currentTarget ) ;
return setTimeout ( function ( ) {
var value ;
value = $target . val ( ) ;
value = replaceFullWidthChars ( value ) ;
value = $ . payment . formatCardNumber ( value ) ;
return safeVal ( value , $target ) ;
} ) ;
} ;
formatCardNumber = function ( e ) {
var $target , card , digit , length , re , upperLength , value ;
digit = String . fromCharCode ( e . which ) ;
if ( ! /^\d+$/ . test ( digit ) ) {
return ;
}
$target = $ ( e . currentTarget ) ;
value = $target . val ( ) ;
card = cardFromNumber ( value + digit ) ;
length = ( value . replace ( /\D/g , '' ) + digit ) . length ;
upperLength = 16 ;
if ( card ) {
upperLength = card . length [ card . length . length - 1 ] ;
}
if ( length >= upperLength ) {
return ;
}
if ( ( $target . prop ( 'selectionStart' ) != null ) && $target . prop ( 'selectionStart' ) !== value . length ) {
return ;
}
if ( card && card . type === 'amex' ) {
re = /^(\d{4}|\d{4}\s\d{6})$/ ;
} else {
re = /(?:^|\s)(\d{4})$/ ;
}
if ( re . test ( value ) ) {
e . preventDefault ( ) ;
return setTimeout ( function ( ) {
return $target . val ( value + ' ' + digit ) ;
} ) ;
} else if ( re . test ( value + digit ) ) {
e . preventDefault ( ) ;
return setTimeout ( function ( ) {
return $target . val ( value + digit + ' ' ) ;
} ) ;
}
} ;
formatBackCardNumber = function ( e ) {
var $target , value ;
$target = $ ( e . currentTarget ) ;
value = $target . val ( ) ;
if ( e . which !== 8 ) {
return ;
}
if ( ( $target . prop ( 'selectionStart' ) != null ) && $target . prop ( 'selectionStart' ) !== value . length ) {
return ;
}
if ( /\d\s$/ . test ( value ) ) {
e . preventDefault ( ) ;
return setTimeout ( function ( ) {
return $target . val ( value . replace ( /\d\s$/ , '' ) ) ;
} ) ;
} else if ( /\s\d?$/ . test ( value ) ) {
e . preventDefault ( ) ;
return setTimeout ( function ( ) {
return $target . val ( value . replace ( /\d$/ , '' ) ) ;
} ) ;
}
} ;
reFormatExpiry = function ( e ) {
var $target ;
$target = $ ( e . currentTarget ) ;
return setTimeout ( function ( ) {
var value ;
value = $target . val ( ) ;
value = replaceFullWidthChars ( value ) ;
value = $ . payment . formatExpiry ( value ) ;
return safeVal ( value , $target ) ;
} ) ;
} ;
formatExpiry = function ( e ) {
var $target , digit , val ;
digit = String . fromCharCode ( e . which ) ;
if ( ! /^\d+$/ . test ( digit ) ) {
return ;
}
$target = $ ( e . currentTarget ) ;
val = $target . val ( ) + digit ;
if ( /^\d$/ . test ( val ) && ( val !== '0' && val !== '1' ) ) {
e . preventDefault ( ) ;
return setTimeout ( function ( ) {
return $target . val ( "0" + val + " / " ) ;
} ) ;
} else if ( /^\d\d$/ . test ( val ) ) {
e . preventDefault ( ) ;
return setTimeout ( function ( ) {
var m1 , m2 ;
m1 = parseInt ( val [ 0 ] , 10 ) ;
m2 = parseInt ( val [ 1 ] , 10 ) ;
if ( m2 > 2 && m1 !== 0 ) {
return $target . val ( "0" + m1 + " / " + m2 ) ;
} else {
return $target . val ( "" + val + " / " ) ;
}
} ) ;
}
} ;
formatForwardExpiry = function ( e ) {
var $target , digit , val ;
digit = String . fromCharCode ( e . which ) ;
if ( ! /^\d+$/ . test ( digit ) ) {
return ;
}
$target = $ ( e . currentTarget ) ;
val = $target . val ( ) ;
if ( /^\d\d$/ . test ( val ) ) {
return $target . val ( "" + val + " / " ) ;
}
} ;
formatForwardSlashAndSpace = function ( e ) {
var $target , val , which ;
which = String . fromCharCode ( e . which ) ;
if ( ! ( which === '/' || which === ' ' ) ) {
return ;
}
$target = $ ( e . currentTarget ) ;
val = $target . val ( ) ;
if ( /^\d$/ . test ( val ) && val !== '0' ) {
return $target . val ( "0" + val + " / " ) ;
}
} ;
formatBackExpiry = function ( e ) {
var $target , value ;
$target = $ ( e . currentTarget ) ;
value = $target . val ( ) ;
if ( e . which !== 8 ) {
return ;
}
if ( ( $target . prop ( 'selectionStart' ) != null ) && $target . prop ( 'selectionStart' ) !== value . length ) {
return ;
}
if ( /\d\s\/\s$/ . test ( value ) ) {
e . preventDefault ( ) ;
return setTimeout ( function ( ) {
return $target . val ( value . replace ( /\d\s\/\s$/ , '' ) ) ;
} ) ;
}
} ;
reFormatCVC = function ( e ) {
var $target ;
$target = $ ( e . currentTarget ) ;
return setTimeout ( function ( ) {
var value ;
value = $target . val ( ) ;
value = replaceFullWidthChars ( value ) ;
value = value . replace ( /\D/g , '' ) . slice ( 0 , 4 ) ;
return safeVal ( value , $target ) ;
} ) ;
} ;
restrictNumeric = function ( e ) {
var input ;
if ( e . metaKey || e . ctrlKey ) {
return true ;
}
if ( e . which === 32 ) {
return false ;
}
if ( e . which === 0 ) {
return true ;
}
if ( e . which < 33 ) {
return true ;
}
input = String . fromCharCode ( e . which ) ;
return ! ! /[\d\s]/ . test ( input ) ;
} ;
restrictCardNumber = function ( e ) {
var $target , card , digit , value ;
$target = $ ( e . currentTarget ) ;
digit = String . fromCharCode ( e . which ) ;
if ( ! /^\d+$/ . test ( digit ) ) {
return ;
}
if ( hasTextSelected ( $target ) ) {
return ;
}
value = ( $target . val ( ) + digit ) . replace ( /\D/g , '' ) ;
card = cardFromNumber ( value ) ;
if ( card ) {
return value . length <= card . length [ card . length . length - 1 ] ;
} else {
return value . length <= 16 ;
}
} ;
restrictExpiry = function ( e ) {
var $target , digit , value ;
$target = $ ( e . currentTarget ) ;
digit = String . fromCharCode ( e . which ) ;
if ( ! /^\d+$/ . test ( digit ) ) {
return ;
}
if ( hasTextSelected ( $target ) ) {
return ;
}
value = $target . val ( ) + digit ;
value = value . replace ( /\D/g , '' ) ;
if ( value . length > 6 ) {
return false ;
}
} ;
restrictCVC = function ( e ) {
var $target , digit , val ;
$target = $ ( e . currentTarget ) ;
digit = String . fromCharCode ( e . which ) ;
if ( ! /^\d+$/ . test ( digit ) ) {
return ;
}
if ( hasTextSelected ( $target ) ) {
return ;
}
val = $target . val ( ) + digit ;
return val . length <= 4 ;
} ;
setCardType = function ( e ) {
var $target , allTypes , card , cardType , val ;
$target = $ ( e . currentTarget ) ;
val = $target . val ( ) ;
cardType = $ . payment . cardType ( val ) || 'unknown' ;
if ( ! $target . hasClass ( cardType ) ) {
allTypes = ( function ( ) {
var _i , _len , _results ;
_results = [ ] ;
for ( _i = 0 , _len = cards . length ; _i < _len ; _i ++ ) {
card = cards [ _i ] ;
_results . push ( card . type ) ;
}
return _results ;
} ) ( ) ;
$target . removeClass ( 'unknown' ) ;
$target . removeClass ( allTypes . join ( ' ' ) ) ;
$target . addClass ( cardType ) ;
$target . toggleClass ( 'identified' , cardType !== 'unknown' ) ;
return $target . trigger ( 'payment.cardType' , cardType ) ;
}
} ;
$ . payment . fn . formatCardCVC = function ( ) {
this . on ( 'keypress' , restrictNumeric ) ;
this . on ( 'keypress' , restrictCVC ) ;
this . on ( 'paste' , reFormatCVC ) ;
this . on ( 'change' , reFormatCVC ) ;
this . on ( 'input' , reFormatCVC ) ;
return this ;
} ;
$ . payment . fn . formatCardExpiry = function ( ) {
this . on ( 'keypress' , restrictNumeric ) ;
this . on ( 'keypress' , restrictExpiry ) ;
this . on ( 'keypress' , formatExpiry ) ;
this . on ( 'keypress' , formatForwardSlashAndSpace ) ;
this . on ( 'keypress' , formatForwardExpiry ) ;
this . on ( 'keydown' , formatBackExpiry ) ;
this . on ( 'change' , reFormatExpiry ) ;
this . on ( 'input' , reFormatExpiry ) ;
return this ;
} ;
$ . payment . fn . formatCardNumber = function ( ) {
this . on ( 'keypress' , restrictNumeric ) ;
this . on ( 'keypress' , restrictCardNumber ) ;
this . on ( 'keypress' , formatCardNumber ) ;
this . on ( 'keydown' , formatBackCardNumber ) ;
this . on ( 'keyup' , setCardType ) ;
this . on ( 'paste' , reFormatCardNumber ) ;
this . on ( 'change' , reFormatCardNumber ) ;
this . on ( 'input' , reFormatCardNumber ) ;
this . on ( 'input' , setCardType ) ;
return this ;
} ;
$ . payment . fn . restrictNumeric = function ( ) {
this . on ( 'keypress' , restrictNumeric ) ;
this . on ( 'paste' , reFormatNumeric ) ;
this . on ( 'change' , reFormatNumeric ) ;
this . on ( 'input' , reFormatNumeric ) ;
return this ;
} ;
$ . payment . fn . cardExpiryVal = function ( ) {
return $ . payment . cardExpiryVal ( $ ( this ) . val ( ) ) ;
} ;
$ . payment . cardExpiryVal = function ( value ) {
var month , prefix , year , _ref ;
_ref = value . split ( /[\s\/]+/ , 2 ) , month = _ref [ 0 ] , year = _ref [ 1 ] ;
if ( ( year != null ? year . length : void 0 ) === 2 && /^\d+$/ . test ( year ) ) {
prefix = ( new Date ) . getFullYear ( ) ;
prefix = prefix . toString ( ) . slice ( 0 , 2 ) ;
year = prefix + year ;
}
month = parseInt ( month , 10 ) ;
year = parseInt ( year , 10 ) ;
return {
month : month ,
year : year
} ;
} ;
$ . payment . validateCardNumber = function ( num ) {
var card , _ref ;
num = ( num + '' ) . replace ( /\s+|-/g , '' ) ;
if ( ! /^\d+$/ . test ( num ) ) {
return false ;
}
card = cardFromNumber ( num ) ;
if ( ! card ) {
return false ;
}
return ( _ref = num . length , _ _indexOf . call ( card . length , _ref ) >= 0 ) && ( card . luhn === false || luhnCheck ( num ) ) ;
} ;
$ . payment . validateCardExpiry = function ( month , year ) {
var currentTime , expiry , _ref ;
if ( typeof month === 'object' && 'month' in month ) {
_ref = month , month = _ref . month , year = _ref . year ;
}
if ( ! ( month && year ) ) {
return false ;
}
month = $ . trim ( month ) ;
year = $ . trim ( year ) ;
if ( ! /^\d+$/ . test ( month ) ) {
return false ;
}
if ( ! /^\d+$/ . test ( year ) ) {
return false ;
}
if ( ! ( ( 1 <= month && month <= 12 ) ) ) {
return false ;
}
if ( year . length === 2 ) {
if ( year < 70 ) {
year = "20" + year ;
} else {
year = "19" + year ;
}
}
if ( year . length !== 4 ) {
return false ;
}
expiry = new Date ( year , month ) ;
currentTime = new Date ;
expiry . setMonth ( expiry . getMonth ( ) - 1 ) ;
expiry . setMonth ( expiry . getMonth ( ) + 1 , 1 ) ;
return expiry > currentTime ;
} ;
$ . payment . validateCardCVC = function ( cvc , type ) {
var card , _ref ;
cvc = $ . trim ( cvc ) ;
if ( ! /^\d+$/ . test ( cvc ) ) {
return false ;
}
card = cardFromType ( type ) ;
if ( card != null ) {
return _ref = cvc . length , _ _indexOf . call ( card . cvcLength , _ref ) >= 0 ;
} else {
return cvc . length >= 3 && cvc . length <= 4 ;
}
} ;
$ . payment . cardType = function ( num ) {
var _ref ;
if ( ! num ) {
return null ;
}
return ( ( _ref = cardFromNumber ( num ) ) != null ? _ref . type : void 0 ) || null ;
} ;
$ . payment . formatCardNumber = function ( num ) {
var card , groups , upperLength , _ref ;
num = num . replace ( /\D/g , '' ) ;
card = cardFromNumber ( num ) ;
if ( ! card ) {
return num ;
}
upperLength = card . length [ card . length . length - 1 ] ;
num = num . slice ( 0 , upperLength ) ;
if ( card . format . global ) {
return ( _ref = num . match ( card . format ) ) != null ? _ref . join ( ' ' ) : void 0 ;
} else {
groups = card . format . exec ( num ) ;
if ( groups == null ) {
return ;
}
groups . shift ( ) ;
groups = $ . grep ( groups , function ( n ) {
return n ;
} ) ;
return groups . join ( ' ' ) ;
}
} ;
$ . payment . formatExpiry = function ( expiry ) {
var mon , parts , sep , year ;
parts = expiry . match ( /^\D*(\d{1,2})(\D+)?(\d{1,4})?/ ) ;
if ( ! parts ) {
return '' ;
}
mon = parts [ 1 ] || '' ;
sep = parts [ 2 ] || '' ;
year = parts [ 3 ] || '' ;
if ( year . length > 0 ) {
sep = ' / ' ;
} else if ( sep === ' /' ) {
mon = mon . substring ( 0 , 1 ) ;
sep = '' ;
} else if ( mon . length === 2 || sep . length > 0 ) {
sep = ' / ' ;
} else if ( mon . length === 1 && ( mon !== '0' && mon !== '1' ) ) {
mon = "0" + mon ;
sep = ' / ' ;
}
return mon + sep + year ;
} ;
} ) . call ( this ) ;
2016-06-07 13:00:34 +00:00
; $ ( function ( ) {
$ ( 'form.ajax' ) . on ( 'submit' , function ( e ) {
e . preventDefault ( ) ;
e . stopImmediatePropagation ( ) ;
var $form =
$ ( this ) ,
$submitButton = $form . find ( 'input[type=submit]' ) ,
ajaxFormConf = {
delegation : true ,
beforeSerialize : function ( jqForm , options ) {
window . doSubmit = true ;
clearFormErrors ( jqForm [ 0 ] ) ;
toggleSubmitDisabled ( $submitButton ) ;
} ,
beforeSubmit : function ( ) {
$submitButton = $form . find ( 'input[type=submit]' ) ;
toggleSubmitDisabled ( $submitButton ) ;
return window . doSubmit ;
} ,
error : function ( data , statusText , xhr , $form ) {
$submitButton = $form . find ( 'input[type=submit]' ) ;
2016-06-15 18:49:44 +00:00
// Form validation error.
if ( 422 == data . status ) {
2016-06-15 19:38:47 +00:00
processFormErrors ( $form , $ . parseJSON ( data . responseText ) ) ;
return ;
2016-06-15 18:49:44 +00:00
}
2016-06-07 13:00:34 +00:00
toggleSubmitDisabled ( $submitButton ) ;
2016-08-14 16:05:20 +00:00
showMessage ( ' Whoops ! , it looks like the server returned an error . \ n \
Please try again , or contact the webmaster if the problem persists . ' ) ;
2016-06-07 13:00:34 +00:00
} ,
success : function ( data , statusText , xhr , $form ) {
2016-08-14 16:05:20 +00:00
var $submitButton = $form . find ( 'input[type=submit]' ) ;
2016-06-07 13:00:34 +00:00
if ( data . message ) {
showMessage ( data . message ) ;
}
switch ( data . status ) {
case 'success' :
if ( data . redirectUrl ) {
if ( data . redirectData ) {
$ . redirectPost ( data . redirectUrl , data . redirectData ) ;
} else {
document . location . href = data . redirectUrl ;
}
}
break ;
case 'error' :
if ( data . messages ) {
2016-06-19 13:06:57 +00:00
processFormErrors ( $form , data . messages ) ;
return ;
2016-06-07 13:00:34 +00:00
}
break ;
default :
break ;
2016-08-14 16:05:20 +00:00
2016-06-07 13:00:34 +00:00
}
2016-08-14 16:05:20 +00:00
toggleSubmitDisabled ( $submitButton ) ;
2016-06-07 13:00:34 +00:00
} ,
dataType : 'json'
} ;
toggleSubmitDisabled ( $submitButton ) ;
2016-07-09 13:44:00 +00:00
if ( $form . hasClass ( 'payment-form' ) && ! $ ( '#pay_offline' ) . is ( ":checked" ) ) {
2016-06-07 13:00:34 +00:00
clearFormErrors ( $ ( '.payment-form' ) ) ;
2016-06-17 19:06:51 +00:00
2016-06-07 13:00:34 +00:00
Stripe . setPublishableKey ( $form . data ( 'stripe-pub-key' ) ) ;
var
noErrors = true ,
$cardNumber = $ ( '.card-number' ) ,
$cardName = $ ( '.card-name' ) ,
$cvcNumber = $ ( '.card-cvc' ) ,
$expiryMonth = $ ( '.card-expiry-month' ) ,
$expiryYear = $ ( '.card-expiry-year' ) ;
2016-06-17 19:06:51 +00:00
2016-06-07 13:00:34 +00:00
if ( ! Stripe . validateCardNumber ( $cardNumber . val ( ) ) ) {
showFormError ( $cardNumber , 'The credit card number appears to be invalid.' ) ;
noErrors = false ;
}
if ( ! Stripe . validateCVC ( $cvcNumber . val ( ) ) ) {
showFormError ( $cvcNumber , 'The CVC number appears to be invalid.' ) ;
noErrors = false ;
}
if ( ! Stripe . validateExpiry ( $expiryMonth . val ( ) , $expiryYear . val ( ) ) ) {
showFormError ( $expiryMonth , 'The expiration date appears to be invalid.' ) ;
showFormError ( $expiryYear , '' ) ;
noErrors = false ;
}
if ( noErrors ) {
Stripe . card . createToken ( {
name : $cardName . val ( ) ,
number : $cardNumber . val ( ) ,
cvc : $cvcNumber . val ( ) ,
exp _month : $expiryMonth . val ( ) ,
exp _year : $expiryYear . val ( )
} ,
function ( status , response ) {
if ( response . error ) {
clearFormErrors ( $ ( '.payment-form' ) ) ;
showFormError ( $ ( '*[data-stripe=' + response . error . param + ']' , $ ( '.payment-form' ) ) , response . error . message ) ;
toggleSubmitDisabled ( $submitButton ) ;
} else {
var token = response . id ;
$form . append ( $ ( '<input type="hidden" name="stripeToken" />' ) . val ( token ) ) ;
$form . ajaxSubmit ( ajaxFormConf ) ;
}
2016-06-17 19:06:51 +00:00
2016-06-07 13:00:34 +00:00
} ) ;
} else {
showMessage ( 'Please check your card details and try again.' ) ;
toggleSubmitDisabled ( $submitButton ) ;
}
} else {
$form . ajaxSubmit ( ajaxFormConf ) ;
}
} ) ;
$ ( 'a' ) . smoothScroll ( {
offset : - 60
} ) ;
2016-06-17 19:06:51 +00:00
2016-06-07 13:00:34 +00:00
/* Scroll to top */
$ ( window ) . scroll ( function ( ) {
if ( $ ( this ) . scrollTop ( ) > 100 ) {
$ ( '.totop' ) . fadeIn ( ) ;
} else {
$ ( '.totop' ) . fadeOut ( ) ;
}
} ) ;
$ ( '#organiserHead' ) . on ( 'click' , function ( e ) {
e . stopImmediatePropagation ( ) ;
$ ( '#organiser' ) [ 0 ] . scrollIntoView ( ) ;
} ) ;
$ ( '#contact_organiser' ) . on ( 'click' , function ( e ) {
e . preventDefault ( ) ;
$ ( '.contact_form' ) . slideToggle ( ) ;
} ) ;
$ ( '#mirror_buyer_info' ) . on ( 'click' , function ( e ) {
$ ( '.ticket_holder_first_name' ) . val ( $ ( '#order_first_name' ) . val ( ) ) ;
$ ( '.ticket_holder_last_name' ) . val ( $ ( '#order_last_name' ) . val ( ) ) ;
$ ( '.ticket_holder_email' ) . val ( $ ( '#order_email' ) . val ( ) ) ;
} ) ;
2016-06-17 19:06:51 +00:00
$ ( '.card-number' ) . payment ( 'formatCardNumber' ) ;
$ ( '.card-cvc' ) . payment ( 'formatCardCVC' ) ;
2016-07-09 10:37:53 +00:00
$ ( '#pay_offline' ) . change ( function ( ) {
2016-07-09 13:44:00 +00:00
$ ( '.online_payment' ) . toggle ( ! this . checked ) ;
$ ( '.offline_payment' ) . toggle ( this . checked ) ;
2016-07-09 10:37:53 +00:00
2016-07-09 13:44:00 +00:00
// Disable CC form inputs to prevent Chrome trying to validate hidden fields
$ ( '.online_payment input:hidden, .online_payment input select:hidden' ) . attr ( 'disabled' , this . checked ) ;
2016-07-09 10:37:53 +00:00
} ) . change ( ) ;
2016-07-09 13:44:00 +00:00
2016-06-07 13:00:34 +00:00
} ) ;
2016-06-15 19:38:47 +00:00
function processFormErrors ( $form , errors )
{
$ . each ( errors , function ( index , error )
{
2016-06-23 14:24:22 +00:00
var selector = ( index . indexOf ( "." ) >= 0 ) ? '.' + index . replace ( /\./g , "\\." ) : ':input[name=' + index + ']' ;
var $input = $ ( selector , $form ) ;
2016-06-15 19:38:47 +00:00
if ( $input . prop ( 'type' ) === 'file' ) {
$ ( '#input-' + $input . prop ( 'name' ) ) . append ( '<div class="help-block error">' + error + '</div>' )
. parent ( )
. addClass ( 'has-error' ) ;
} else {
if ( $input . parent ( ) . hasClass ( 'input-group' ) ) {
$input = $input . parent ( ) ;
}
$input . after ( '<div class="help-block error">' + error + '</div>' )
. parent ( )
. addClass ( 'has-error' ) ;
}
} ) ;
var $submitButton = $form . find ( 'input[type=submit]' ) ;
toggleSubmitDisabled ( $submitButton ) ;
}
2016-06-07 13:00:34 +00:00
/ * *
* Toggle a submit button disabled / enabled - duh !
2016-06-17 19:06:51 +00:00
*
2016-06-07 13:00:34 +00:00
* @ param element $submitButton
* @ returns void
* /
function toggleSubmitDisabled ( $submitButton ) {
if ( $submitButton . hasClass ( 'disabled' ) ) {
$submitButton . attr ( 'disabled' , false )
. removeClass ( 'disabled' )
. val ( $submitButton . data ( 'original-text' ) ) ;
return ;
}
$submitButton . data ( 'original-text' , $submitButton . val ( ) )
. attr ( 'disabled' , true )
. addClass ( 'disabled' )
. val ( 'Just a second...' ) ;
}
/ * *
* Clears given form of any error classes / messages
2016-06-17 19:06:51 +00:00
*
2016-06-07 13:00:34 +00:00
* @ param { Element } $form
* @ returns { void }
* /
function clearFormErrors ( $form ) {
$ ( $form )
. find ( '.error.help-block' )
. remove ( ) ;
$ ( $form ) . find ( ':input' )
. parent ( )
. removeClass ( 'has-error' ) ;
2016-06-15 19:31:05 +00:00
$ ( $form ) . find ( ':input' )
. parent ( ) . parent ( )
. removeClass ( 'has-error' ) ;
2016-06-07 13:00:34 +00:00
}
function showFormError ( $formElement , message ) {
$formElement . after ( '<div class="help-block error">' + message + '</div>' )
. parent ( )
. addClass ( 'has-error' ) ;
}
/ * *
* Shows users a message .
* Currently uses humane . js
2016-06-17 19:06:51 +00:00
*
2016-06-07 13:00:34 +00:00
* @ param string message
* @ returns void
* /
function showMessage ( message ) {
humane . log ( message , {
2016-06-17 00:29:36 +00:00
timeoutAfterMove : 3000 ,
2016-06-17 00:28:12 +00:00
waitForMove : true
2016-06-07 13:00:34 +00:00
} ) ;
}
function hideMessage ( ) {
humane . remove ( ) ;
}
/ * *
* Counts down to the given number of seconds
2016-06-17 19:06:51 +00:00
*
2016-06-07 13:00:34 +00:00
* @ param element $element
* @ param int seconds
* @ returns void
* /
function setCountdown ( $element , seconds ) {
var endTime , mins , msLeft , time , twoMinWarningShown = false ;
function twoDigits ( n ) {
return ( n <= 9 ? "0" + n : n ) ;
}
function updateTimer ( ) {
msLeft = endTime - ( + new Date ) ;
if ( msLeft < 1000 ) {
alert ( "You have run out of time! You will have to restart the order process." ) ;
location . reload ( ) ;
} else {
if ( msLeft < 120000 && ! twoMinWarningShown ) {
showMessage ( "You only have 2 minutes left to complete this order!" ) ;
twoMinWarningShown = true ;
}
time = new Date ( msLeft ) ;
mins = time . getUTCMinutes ( ) ;
$element . html ( '<b>' + mins + '</b> minutes and <b>' + twoDigits ( time . getUTCSeconds ( ) ) + '</b> seconds' ) ;
setTimeout ( updateTimer , time . getUTCMilliseconds ( ) + 500 ) ;
}
}
endTime = ( + new Date ) + 1000 * seconds + 500 ;
updateTimer ( ) ;
}
$ . extend (
{
redirectPost : function ( location , args )
{
var form = '' ;
$ . each ( args , function ( key , value ) {
value = value . split ( '"' ) . join ( '\"' )
form += '<input type="hidden" name="' + key + '" value="' + value + '">' ;
} ) ;
$ ( '<form action="' + location + '" method="POST">' + form + '</form>' ) . appendTo ( $ ( document . body ) ) . submit ( ) ;
}
} ) ;
/ * !
* Smooth Scroll - v1 . 4.13 - 2013 - 11 - 02
* https : //github.com/kswedberg/jquery-smooth-scroll
* Copyright ( c ) 2013 Karl Swedberg
* Licensed MIT ( https : //github.com/kswedberg/jquery-smooth-scroll/blob/master/LICENSE-MIT)
* /
( function ( t ) {
function e ( t ) {
return t . replace ( /(:|\.)/g , "\\$1" )
}
var l = "1.4.13" , o = { } , s = { exclude : [ ] , excludeWithin : [ ] , offset : 0 , direction : "top" , scrollElement : null , scrollTarget : null , beforeScroll : function ( ) {
} , afterScroll : function ( ) {
} , easing : "swing" , speed : 400 , autoCoefficent : 2 , preventDefault : ! 0 } , n = function ( e ) {
var l = [ ] , o = ! 1 , s = e . dir && "left" == e . dir ? "scrollLeft" : "scrollTop" ;
return this . each ( function ( ) {
if ( this != document && this != window ) {
var e = t ( this ) ;
e [ s ] ( ) > 0 ? l . push ( this ) : ( e [ s ] ( 1 ) , o = e [ s ] ( ) > 0 , o && l . push ( this ) , e [ s ] ( 0 ) )
}
} ) , l . length || this . each ( function ( ) {
"BODY" === this . nodeName && ( l = [ this ] )
} ) , "first" === e . el && l . length > 1 && ( l = [ l [ 0 ] ] ) , l
} ;
t . fn . extend ( { scrollable : function ( t ) {
var e = n . call ( this , { dir : t } ) ;
return this . pushStack ( e )
} , firstScrollable : function ( t ) {
var e = n . call ( this , { el : "first" , dir : t } ) ;
return this . pushStack ( e )
} , smoothScroll : function ( l , o ) {
if ( l = l || { } , "options" === l )
return o ? this . each ( function ( ) {
var e = t ( this ) , l = t . extend ( e . data ( "ssOpts" ) || { } , o ) ;
t ( this ) . data ( "ssOpts" , l )
} ) : this . first ( ) . data ( "ssOpts" ) ;
var s = t . extend ( { } , t . fn . smoothScroll . defaults , l ) , n = t . smoothScroll . filterPath ( location . pathname ) ;
return this . unbind ( "click.smoothscroll" ) . bind ( "click.smoothscroll" , function ( l ) {
var o = this , r = t ( this ) , i = t . extend ( { } , s , r . data ( "ssOpts" ) || { } ) , c = s . exclude , a = i . excludeWithin , f = 0 , h = 0 , u = ! 0 , d = { } , p = location . hostname === o . hostname || ! o . hostname , m = i . scrollTarget || ( t . smoothScroll . filterPath ( o . pathname ) || n ) === n , S = e ( o . hash ) ;
if ( i . scrollTarget || p && m && S ) {
for ( ; u && c . length > f ; )
r . is ( e ( c [ f ++ ] ) ) && ( u = ! 1 ) ;
for ( ; u && a . length > h ; )
r . closest ( a [ h ++ ] ) . length && ( u = ! 1 )
} else
u = ! 1 ;
u && ( i . preventDefault && l . preventDefault ( ) , t . extend ( d , i , { scrollTarget : i . scrollTarget || S , link : o } ) , t . smoothScroll ( d ) )
} ) , this
} } ) , t . smoothScroll = function ( e , l ) {
if ( "options" === e && "object" == typeof l )
return t . extend ( o , l ) ;
var s , n , r , i , c = 0 , a = "offset" , f = "scrollTop" , h = { } , u = { } ;
"number" == typeof e ? ( s = t . extend ( { link : null } , t . fn . smoothScroll . defaults , o ) , r = e ) : ( s = t . extend ( { link : null } , t . fn . smoothScroll . defaults , e || { } , o ) , s . scrollElement && ( a = "position" , "static" == s . scrollElement . css ( "position" ) && s . scrollElement . css ( "position" , "relative" ) ) ) , f = "left" == s . direction ? "scrollLeft" : f , s . scrollElement ? ( n = s . scrollElement , /^(?:HTML|BODY)$/ . test ( n [ 0 ] . nodeName ) || ( c = n [ f ] ( ) ) ) : n = t ( "html, body" ) . firstScrollable ( s . direction ) , s . beforeScroll . call ( n , s ) , r = "number" == typeof e ? e : l || t ( s . scrollTarget ) [ a ] ( ) && t ( s . scrollTarget ) [ a ] ( ) [ s . direction ] || 0 , h [ f ] = r + c + s . offset , i = s . speed , "auto" === i && ( i = h [ f ] || n . scrollTop ( ) , i /= s . autoCoefficent ) , u = { duration : i , easing : s . easing , complete : function ( ) {
s . afterScroll . call ( s . link , s )
} } , s . step && ( u . step = s . step ) , n . length ? n . stop ( ) . animate ( h , u ) : s . afterScroll . call ( s . link , s )
} , t . smoothScroll . version = l , t . smoothScroll . filterPath = function ( t ) {
return t . replace ( /^\// , "" ) . replace ( /(?:index|default).[a-zA-Z]{3,4}$/ , "" ) . replace ( /\/$/ , "" )
} , t . fn . smoothScroll . defaults = s
2016-06-17 19:06:51 +00:00
} ) ( jQuery ) ;