2014-12-22 19:15:38 +01:00
/* DO NOT EDIT: auto-generated file */
/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
! 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 = "1.11.1" , m = function ( a , b ) { return new m . fn . init ( a , b ) } , n = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g , o = /^-ms-/ , p = /-([\da-z])/gi , q = function ( a , b ) { return b . toUpperCase ( ) } ; m . fn = m . prototype = { jquery : l , constructor : m , 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 = m . merge ( this . constructor ( ) , a ) ; return b . prevObject = this , b . context = this . context , b } , each : function ( a , b ) { return m . each ( this , a , b ) } , map : function ( a ) { return this . pushStack ( m . 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 } , m . extend = m . 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 || m . isFunction ( g ) || ( g = { } ) , h === i && ( g = this , h -- ) ; i > h ; h ++ ) if ( null != ( e = arguments [ h ] ) ) for ( d in e ) a = g [ d ] , c = e [ d ] , g !== c && ( j && c && ( m . isPlainObject ( c ) || ( b = m . isArray ( c ) ) ) ? ( b ? ( b = ! 1 , f = a && m . isArray ( a ) ? a : [ ] ) : f = a && m . isPlainObject ( a ) ? a : { } , g [ d ] = m . extend ( j , f , c ) ) : void 0 !== c && ( g [ d ] = c ) ) ; return g } , m . extend ( { expando : "jQuery" + ( l + Math . random ( ) ) . replace ( /\D/g , "" ) , isReady : ! 0 , error : function ( a ) { throw new Error ( a ) } , noop : function ( ) { } , isFunction : function ( a ) { return "function" === m . type ( a ) } , isArray : Array . isArray || function ( a ) { return "array" === m . type ( a ) } , isWindow : function ( a ) { return null != a && a == a . window } , isNumeric : function ( a ) { return ! m . isArray ( a ) && a - parseFloat ( a ) >= 0 } , isEmptyObject : function ( a ) { var b ; for ( b in a ) return ! 1 ; return ! 0 } , isPlainObject : function ( a ) { var b ; if ( ! a || "object" !== m . type ( a ) || a . nodeType || m . isWindow ( a ) ) return ! 1 ; try { if ( a . constructor && ! j . call ( a , "constructor" ) && ! j . call ( a . constructor . prototype , "isPrototypeOf" ) ) return ! 1 } catch ( c ) { return ! 1 } if ( k . ownLast ) for ( b in a ) return j . call ( a , b ) ; for ( b in a ) ; return void 0 === b || j . call ( a , b ) } , type : function ( a ) { return null == a ? a + "" : "object" == typeof a || "function" == typeof a ? h [ i . call ( a ) ] || "object" : typeof a } , globalEval : function ( b ) { b && m . trim ( b ) && ( a . execScript || function ( b ) { a . eval . call ( a , b ) } ) ( b ) } , camelCase : function ( a ) { return a . replace ( o , "ms-" ) . replace ( p , q ) } , 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 = r ( 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 ( n , "" ) } , makeArray : function ( a , b ) { var c = b || [ ] ; return null != a && ( r ( Object ( a ) ) ? m . merge ( c , "string" == typeof a ? [ a ] : a ) : f . call ( c , a ) ) , c } , inArray : function ( a , b , c ) { var d ; if ( b ) { if ( g ) return g . call ( b , a , c ) ; for ( d = b . length , c = c ? 0 > c ? Math . max ( 0 , d + c ) : c : 0 ; d > c ; c ++ ) if ( c in b && b [ c ] === a ) return c } return - 1 } , merge : function ( a , b ) { var c = + b . length , d = 0 , e = a . length ; while ( c > d ) a [ e ++ ] = b [ d ++ ] ; if ( c !== c ) while ( void 0 !== b [ 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 = r ( 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 && ( f = a [ b ] , b = a , a = f ) , m . isFunction ( a ) ? ( c = d . call ( arguments , 2 ) , e = function ( ) { return a . apply ( b || this , c . concat ( d . call ( arguments ) ) ) } , e . guid = a . guid = a . guid || m . guid ++ , e ) : void 0 } , now : function ( ) { return + new Date } , support : k } ) , m . each ( " B
if ( k && j [ k ] && ( e || j [ k ] . data ) || void 0 !== d || "string" != typeof b ) return k || ( k = i ? a [ h ] = c . pop ( ) || m . guid ++ : h ) , j [ k ] || ( j [ k ] = i ? { } : { toJSON : m . noop } ) , ( "object" == typeof b || "function" == typeof b ) && ( e ? j [ k ] = m . extend ( j [ k ] , b ) : j [ k ] . data = m . extend ( j [ k ] . data , b ) ) , g = j [ k ] , e || ( g . data || ( g . data = { } ) , g = g . data ) , void 0 !== d && ( g [ m . camelCase ( b ) ] = d ) , "string" == typeof b ? ( f = g [ b ] , null == f && ( f = g [ m . camelCase ( b ) ] ) ) : f = g , f } } function R ( a , b , c ) { if ( m . acceptData ( a ) ) { var d , e , f = a . nodeType , g = f ? m . cache : a , h = f ? a [ m . expando ] : m . expando ; if ( g [ h ] ) { if ( b && ( d = c ? g [ h ] : g [ h ] . data ) ) { m . isArray ( b ) ? b = b . concat ( m . map ( b , m . camelCase ) ) : b in d ? b = [ b ] : ( b = m . camelCase ( b ) , b = b in d ? [ b ] : b . split ( " " ) ) , e = b . length ; while ( e -- ) delete d [ b [ e ] ] ; if ( c ? ! P ( d ) : ! m . isEmptyObject ( d ) ) return } ( c || ( delete g [ h ] . data , P ( g [ h ] ) ) ) && ( f ? m . cleanData ( [ a ] , ! 0 ) : k . deleteExpando || g != g . window ? delete g [ h ] : g [ h ] = null ) } } } m . extend ( { cache : { } , noData : { "applet " : ! 0 , "embed " : ! 0 , "object " : "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" } , hasData : function ( a ) { return a = a . nodeType ? m . cache [ a [ m . expando ] ] : a [ m . expando ] , ! ! a && ! P ( a ) } , data : function ( a , b , c ) { return Q ( a , b , c ) } , removeData : function ( a , b ) { return R ( a , b ) } , _data : function ( a , b , c ) { return Q ( a , b , c , ! 0 ) } , _removeData : function ( a , b ) { return R ( a , b , ! 0 ) } } ) , m . 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 . data ( f ) , 1 === f . nodeType && ! m . _data ( f , "parsedAttrs" ) ) ) { c = g . length ; while ( c -- ) g [ c ] && ( d = g [ c ] . name , 0 === d . indexOf ( "data-" ) && ( d = m . camelCase ( d . slice ( 5 ) ) , O ( f , d , e [ d ] ) ) ) ; m . _data ( f , "parsedAttrs" , ! 0 ) } return e } return "object" == typeof a ? this . each ( function ( ) { m . data ( this , a ) } ) : arguments . length > 1 ? this . each ( function ( ) { m . data ( this , a , b ) } ) : f ? O ( f , a , m . data ( f , a ) ) : void 0 } , removeData : function ( a ) { return this . each ( function ( ) { m . removeData ( this , a ) } ) } } ) , m . extend ( { queue : function ( a , b , c ) { var d ; return a ? ( b = ( b || "fx" ) + "queue" , d = m . _data ( a , b ) , c && ( ! d || m . isArray ( c ) ? d = m . _data ( a , b , m . makeArray ( c ) ) : d . push ( c ) ) , d || [ ] ) : void 0 } , dequeue : function ( a , b ) { b = b || "fx" ; var c = m . queue ( a , b ) , d = c . length , e = c . shift ( ) , f = m . _queueHooks ( a , b ) , g = function ( ) { m . 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 m . _data ( a , c ) || m . _data ( a , c , { empty : m . Callbacks ( "once memory" ) . add ( function ( ) { m . _removeData ( a , b + "queue" ) , m . _removeData ( a , c ) } ) } ) } } ) , m . fn . extend ( { queue : function ( a , b ) { var c = 2 ; return "string" != typeof a && ( b = a , a = "fx" , c -- ) , arguments . length < c ? m . queue ( this [ 0 ] , a ) : void 0 === b ? this : this . each ( function ( ) { var c = m . queue ( this , a , b ) ; m . _queueHooks ( this , a ) , "fx" === a && "inprogress" !== c [ 0 ] && m . dequeue ( this , a ) } ) } , dequeue : function ( a ) { return this . each ( function ( ) { m . dequeue ( this , a ) } ) } , clearQueue : function ( a ) { return this . queue ( a || "fx" , [ ] ) } , promise : function ( a , b ) { var c , d = 1 , e = m . 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 = m . _data ( f [ g ] , a + "queueHooks" ) , c && c . empty && ( d ++ , c . empty . add ( h ) ) ; return h ( ) , e . promise ( b ) } } ) ; var S = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ . source , T = [ "Top" , "Right" , "Bottom" , "Left" ] , U = function ( a , b ) { return a = b || a , "none" === m . css ( a , "display" ) || ! m . contains ( a . ownerDocument , a ) } , V = m . access = function ( a , b , c , d , e , f , g ) { var h = 0 , i = a . length , j = null == c ; if ( "object" === m . type ( c ) ) { e = ! 0 ; for ( h in c ) m . access ( a , b , h , c [ h ] , ! 0 , f , g ) } else if ( void 0 !== d && ( e = ! 0 , m . isFunction ( d ) || ( g = ! 0 ) , j && ( g ? ( b . call ( a , d ) , b = null ) : ( j = b , b = function ( a , b , c ) { return j . call ( m ( a ) , c ) } ) ) , b ) ) for ( ; i > h ; h ++ ) b ( a [ h ] , c , g ? d : d . call ( a [ h ] , h , b ( a [ h ] , c ) ) ) ; return e ? a : j ? b . call ( a ) : i ? b ( a [ 0 ] , c ) : f } , W = /^(?:checkbox|radio)$/i ; ! function ( ) { var a = y . createElement ( "input" ) , b = y . createElement ( "div" ) , c = y . createDocumentFragment ( ) ; if ( b . innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>" , k . leadingWhitespace = 3 === b . firstChild . nodeType , k . tbody = ! b . getElementsByTagName ( "tbody" ) . length , k . htmlSerialize = ! ! b . getElementsByTagName ( "link" ) . length , k . html5Clone = "<:nav></:nav>" !== y . createElement ( "nav" ) . cloneNode ( ! 0 ) . outerHTML , a . type = "checkbox" , a . checked = ! 0 , c . appendChild ( a ) , k . appendChecked = a . checked , b . innerHTML = "<textarea>x</textarea>" , k . noCloneChecked = ! ! b . cloneNode ( ! 0 ) . lastChild . defaultValue , c . appendChild ( b ) , b . innerHTML = " < input type = ' radi
} , cur : function ( ) { var a = Zb . propHooks [ this . prop ] ; return a && a . get ? a . get ( this ) : Zb . propHooks . _default . get ( this ) } , run : function ( a ) { var b , c = Zb . propHooks [ this . prop ] ; return this . pos = b = this . options . duration ? m . easing [ this . easing ] ( a , this . options . duration * a , 0 , 1 , this . options . duration ) : a , this . now = ( this . end - this . start ) * b + this . start , this . options . step && this . options . step . call ( this . elem , this . now , this ) , c && c . set ? c . set ( this ) : Zb . propHooks . _default . set ( this ) , this } } , Zb . prototype . init . prototype = Zb . prototype , Zb . propHooks = { _default : { get : function ( a ) { var b ; return null == a . elem [ a . prop ] || a . elem . style && null != a . elem . style [ a . prop ] ? ( b = m . css ( a . elem , a . prop , "" ) , b && "auto" !== b ? b : 0 ) : a . elem [ a . prop ] } , set : function ( a ) { m . fx . step [ a . prop ] ? m . fx . step [ a . prop ] ( a ) : a . elem . style && ( null != a . elem . style [ m . cssProps [ a . prop ] ] || m . cssHooks [ a . prop ] ) ? m . style ( a . elem , a . prop , a . now + a . unit ) : a . elem [ a . prop ] = a . now } } } , Zb . propHooks . scrollTop = Zb . propHooks . scrollLeft = { set : function ( a ) { a . elem . nodeType && a . elem . parentNode && ( a . elem [ a . prop ] = a . now ) } } , m . easing = { linear : function ( a ) { return a } , swing : function ( a ) { return . 5 - Math . cos ( a * Math . PI ) / 2 } } , m . fx = Zb . prototype . init , m . fx . step = { } ; var $b , _b , ac = /^(?:toggle|show|hide)$/ , bc = new RegExp ( "^(?:([+-])=|)(" + S + ")([a-z%]*)$" , "i" ) , cc = /queueHooks$/ , dc = [ ic ] , ec = { "*" : [ function ( a , b ) { var c = this . createTween ( a , b ) , d = c . cur ( ) , e = bc . exec ( b ) , f = e && e [ 3 ] || ( m . cssNumber [ a ] ? "" : "px" ) , g = ( m . cssNumber [ a ] || "px" !== f && + d ) && bc . exec ( m . css ( c . elem , a ) ) , h = 1 , i = 20 ; if ( g && g [ 3 ] !== f ) { f = f || g [ 3 ] , e = e || [ ] , g = + d || 1 ; do h = h || ".5" , g /= h , m . style ( c . elem , a , g + f ) ; while ( h !== ( h = c . cur ( ) / d ) && 1 !== h && -- i ) } return e && ( g = c . start = + g || + d || 0 , c . unit = f , c . end = e [ 1 ] ? g + ( e [ 1 ] + 1 ) * e [ 2 ] : + e [ 2 ] ) , c } ] } ; function fc ( ) { return setTimeout ( function ( ) { $b = void 0 } ) , $b = m . now ( ) } function gc ( a , b ) { var c , d = { height : a } , e = 0 ; for ( b = b ? 1 : 0 ; 4 > e ; e += 2 - b ) c = T [ e ] , d [ "margin" + c ] = d [ "padding" + c ] = a ; return b && ( d . opacity = d . width = a ) , d } function hc ( a , b , c ) { for ( var d , e = ( ec [ b ] || [ ] ) . concat ( ec [ "*" ] ) , f = 0 , g = e . length ; g > f ; f ++ ) if ( d = e [ f ] . call ( c , b , a ) ) return d } function ic ( a , b , c ) { var d , e , f , g , h , i , j , l , n = this , o = { } , p = a . style , q = a . nodeType && U ( a ) , r = m . _data ( a , "fxshow" ) ; c . queue || ( h = m . _queueHooks ( a , "fx" ) , null == h . unqueued && ( h . unqueued = 0 , i = h . empty . fire , h . empty . fire = function ( ) { h . unqueued || i ( ) } ) , h . unqueued ++ , n . always ( function ( ) { n . always ( function ( ) { h . unqueued -- , m . queue ( a , "fx" ) . length || h . empty . fire ( ) } ) } ) ) , 1 === a . nodeType && ( "height" in b || "width" in b ) && ( c . overflow = [ p . overflow , p . overflowX , p . overflowY ] , j = m . css ( a , "display" ) , l = "none" === j ? m . _data ( a , "olddisplay" ) || Fb ( a . nodeName ) : j , "inline" === l && "none" === m . css ( a , "float" ) && ( k . inlineBlockNeedsLayout && "inline" !== Fb ( a . nodeName ) ? p . zoom = 1 : p . display = "inline-block" ) ) , c . overflow && ( p . overflow = "hidden" , k . shrinkWrapBlocks ( ) || n . always ( function ( ) { p . overflow = c . overflow [ 0 ] , p . overflowX = c . overflow [ 1 ] , p . overflowY = c . overflow [ 2 ] } ) ) ; for ( d in b ) if ( e = b [ d ] , ac . exec ( e ) ) { if ( delete b [ d ] , f = f || "toggle" === e , e === ( q ? "hide" : "show" ) ) { if ( "show" !== e || ! r || void 0 === r [ d ] ) continue ; q = ! 0 } o [ d ] = r && r [ d ] || m . style ( a , d ) } else j = void 0 ; if ( m . isEmptyObject ( o ) ) "inline" === ( "none" === j ? Fb ( a . nodeName ) : j ) && ( p . display = j ) ; else { r ? "hidden" in r && ( q = r . hidden ) : r = m . _data ( a , "fxshow" , { } ) , f && ( r . hidden = ! q ) , q ? m ( a ) . show ( ) : n . done ( function ( ) { m ( a ) . hide ( ) } ) , n . done ( function ( ) { var b ; m . _removeData ( a , "fxshow" ) ; for ( b in o ) m . style ( a , b , o [ b ] ) } ) ; for ( d in o ) g = hc ( q ? r [ d ] : 0 , d , n ) , d in r || ( r [ d ] = g . start , q && ( g . end = g . start , g . start = "width" === d || "height" === d ? 1 : 0 ) ) } } function jc ( a , b ) { var c , d , e , f , g ; for ( c in a ) if ( d = m . camelCase ( c ) , e = b [ d ] , f = a [ c ] , m . isArray ( f ) && ( e = f [ 1 ] , f = a [ c ] = f [ 0 ] ) , c !== d && ( a [ d ] = f , delete a [ c ] ) , g = m . cssHooks [ d ] , g && "expand" in g ) { f = g . expand ( f ) , delete a [ d ] ; for ( c in f ) c in a || ( a [ c ] = f [ c ] , b [ c ] = e ) } else b [ d ] = e } function kc ( a , b , c ) { var d , e , f = 0 , g = dc . length , h = m . Deferred ( ) . always ( function ( ) { delete i . elem } ) , i = function ( ) { if ( e ) return ! 1 ; for ( var b = $b || fc ( ) , c = Math . max ( 0 , j . startTime + j . duration - b ) , d = c / j . duration || 0 , f = 1 - d , g = 0 , i = j . tweens . length ; i > g ; g ++ ) j . tweens [ g ] . run ( f ) ; return h . notifyWith ( a , [ j , f , c ] ) , 1 > f && i ? c : ( h . resolveWith ( a , [ j ] ) , ! 1 ) } , j = h . promise ( { elem : a , props : m . extend ( { } , b ) , opts : m . extend ( ! 0 , { specialEasing : { } } , c ) , originalProperties : b , originalOptions : c , startTime : $b || fc ( ) , duration : c . duration , tweens : [ ] , createTween : function ( b , c ) { var d = m . Tween ( a , j . opts , b , c , j . opts . specialEasing [ b ] || j . opts . easing ) ; r
/ * ! j Q u e r y U I - v 1 . 1 0 . 4 - 2 0 1 4 - 0 6 - 3 0
* http : //jqueryui.com
* Includes : jquery . ui . core . js , jquery . ui . widget . js , jquery . ui . mouse . js , jquery . ui . position . js , jquery . ui . sortable . js , jquery . ui . datepicker . js , jquery . ui . tooltip . js
* Copyright 2014 jQuery Foundation and other contributors ; Licensed MIT * /
( function ( e , t ) { function i ( t , i ) { var a , n , o , r = t . nodeName . toLowerCase ( ) ; return "area" === r ? ( a = t . parentNode , n = a . name , t . href && n && "map" === a . nodeName . toLowerCase ( ) ? ( o = e ( "img[usemap=#" + n + "]" ) [ 0 ] , ! ! o && s ( o ) ) : ! 1 ) : ( /input|select|textarea|button|object/ . test ( r ) ? ! t . disabled : "a" === r ? t . href || i : i ) && s ( t ) } function s ( t ) { return e . expr . filters . visible ( t ) && ! e ( t ) . parents ( ) . addBack ( ) . filter ( function ( ) { return "hidden" === e . css ( this , "visibility" ) } ) . length } var a = 0 , n = /^ui-id-\d+$/ ; e . ui = e . ui || { } , e . extend ( e . ui , { version : "1.10.4" , keyCode : { BACKSPACE : 8 , COMMA : 188 , DELETE : 46 , DOWN : 40 , END : 35 , ENTER : 13 , ESCAPE : 27 , HOME : 36 , LEFT : 37 , NUMPAD _ADD : 107 , NUMPAD _DECIMAL : 110 , NUMPAD _DIVIDE : 111 , NUMPAD _ENTER : 108 , NUMPAD _MULTIPLY : 106 , NUMPAD _SUBTRACT : 109 , PAGE _DOWN : 34 , PAGE _UP : 33 , PERIOD : 190 , RIGHT : 39 , SPACE : 32 , TAB : 9 , UP : 38 } } ) , e . fn . extend ( { focus : function ( t ) { return function ( i , s ) { return "number" == typeof i ? this . each ( function ( ) { var t = this ; setTimeout ( function ( ) { e ( t ) . focus ( ) , s && s . call ( t ) } , i ) } ) : t . apply ( this , arguments ) } } ( e . fn . focus ) , scrollParent : function ( ) { var t ; return t = e . ui . ie && /(static|relative)/ . test ( this . css ( "position" ) ) || /absolute/ . test ( this . css ( "position" ) ) ? this . parents ( ) . filter ( function ( ) { return /(relative|absolute|fixed)/ . test ( e . css ( this , "position" ) ) && /(auto|scroll)/ . test ( e . css ( this , "overflow" ) + e . css ( this , "overflow-y" ) + e . css ( this , "overflow-x" ) ) } ) . eq ( 0 ) : this . parents ( ) . filter ( function ( ) { return /(auto|scroll)/ . test ( e . css ( this , "overflow" ) + e . css ( this , "overflow-y" ) + e . css ( this , "overflow-x" ) ) } ) . eq ( 0 ) , /fixed/ . test ( this . css ( "position" ) ) || ! t . length ? e ( document ) : t } , zIndex : function ( i ) { if ( i !== t ) return this . css ( "zIndex" , i ) ; if ( this . length ) for ( var s , a , n = e ( this [ 0 ] ) ; n . length && n [ 0 ] !== document ; ) { if ( s = n . css ( "position" ) , ( "absolute" === s || "relative" === s || "fixed" === s ) && ( a = parseInt ( n . css ( "zIndex" ) , 10 ) , ! isNaN ( a ) && 0 !== a ) ) return a ; n = n . parent ( ) } return 0 } , uniqueId : function ( ) { return this . each ( function ( ) { this . id || ( this . id = "ui-id-" + ++ a ) } ) } , removeUniqueId : function ( ) { return this . each ( function ( ) { n . test ( this . id ) && e ( this ) . removeAttr ( "id" ) } ) } } ) , e . extend ( e . expr [ ":" ] , { data : e . expr . createPseudo ? e . expr . createPseudo ( function ( t ) { return function ( i ) { return ! ! e . data ( i , t ) } } ) : function ( t , i , s ) { return ! ! e . data ( t , s [ 3 ] ) } , focusable : function ( t ) { return i ( t , ! isNaN ( e . attr ( t , "tabindex" ) ) ) } , tabbable : function ( t ) { var s = e . attr ( t , "tabindex" ) , a = isNaN ( s ) ; return ( a || s >= 0 ) && i ( t , ! a ) } } ) , e ( "<a>" ) . outerWidth ( 1 ) . jquery || e . each ( [ "Width" , "Height" ] , function ( i , s ) { function a ( t , i , s , a ) { return e . each ( n , function ( ) { i -= parseFloat ( e . css ( t , "padding" + this ) ) || 0 , s && ( i -= parseFloat ( e . css ( t , "border" + this + "Width" ) ) || 0 ) , a && ( i -= parseFloat ( e . css ( t , "margin" + this ) ) || 0 ) } ) , i } var n = "Width" === s ? [ "Left" , "Right" ] : [ "Top" , "Bottom" ] , o = s . toLowerCase ( ) , r = { innerWidth : e . fn . innerWidth , innerHeight : e . fn . innerHeight , outerWidth : e . fn . outerWidth , outerHeight : e . fn . outerHeight } ; e . fn [ "inner" + s ] = function ( i ) { return i === t ? r [ "inner" + s ] . call ( this ) : this . each ( function ( ) { e ( this ) . css ( o , a ( this , i ) + "px" ) } ) } , e . fn [ "outer" + s ] = function ( t , i ) { return "number" != typeof t ? r [ "outer" + s ] . call ( this , t ) : this . each ( function ( ) { e ( this ) . css ( o , a ( this , t , ! 0 , i ) + "px" ) } ) } } ) , e . fn . addBack || ( e . fn . addBack = function ( e ) { return this . add ( null == e ? this . prevObject : this . prevObject . filter ( e ) ) } ) , e ( "<a>" ) . data ( "a-b" , "a" ) . removeData ( "a-b" ) . data ( "a-b" ) && ( e . fn . removeData = function ( t ) { return function ( i ) { return arguments . length ? t . call ( this , e . camelCase ( i ) ) : t . call ( this ) } } ( e . fn . removeData ) ) , e . ui . ie = ! ! /msie [\w.]+/ . exec ( navigator . userAgent . toLowerCase ( ) ) , e . support . selectstart = "onselectstart" in document . createElement ( "div" ) , e . fn . extend ( { disableSelection : function ( ) { return this . bind ( ( e . support . selectstart ? "selectstart" : "mousedown" ) + ".ui-disableSelection" , function ( e ) { e . preventDefault ( ) } ) } , enableSelection : function ( ) { return this . unbind ( ".ui-disableSelection" ) } } ) , e . extend ( e . ui , { plugin : { add : function ( t , i , s ) { var a , n = e . ui [ t ] . prototype ; for ( a in s ) n . plugins [ a ] = n . plugins [ a ] || [ ] , n . plugins [ a ] . push ( [ i , s [ a ] ] ) } , call : function ( e , t , i ) { var s , a = e . plugins [ t ] ; if ( a && e . element [ 0 ] . parentNode && 11 !== e . element [ 0 ] . parentNode . nodeType ) for ( s = 0 ; a . length > s ; s ++ ) e . options [ a [ s ] [ 0 ] ] && a [ s ] [ 1 ] . apply ( e . element , i ) } } , hasScroll : function ( t , i ) { if ( "hidden" === e ( t ) . css ( "overflow" ) ) return ! 1 ; var s = i && "left" === i ? "scrollLeft" : "scrollTop" , a =
return isNaN ( t ) ? c : t } , f = p ( d [ 0 ] ) , m = Math . max ( f , p ( d [ 1 ] || "" ) ) , f = s ? Math . max ( f , s . getFullYear ( ) ) : f , m = a ? Math . min ( m , a . getFullYear ( ) ) : m , e . yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>" ; m >= f ; f ++ ) e . yearshtml += "<option value='" + f + "'" + ( f === i ? " selected='selected'" : "" ) + ">" + f + "</option>" ; e . yearshtml += "</select>" , b += e . yearshtml , e . yearshtml = null } return b += this . _get ( e , "yearSuffix" ) , y && ( b += ( ! n && g && v ? "" : " " ) + _ ) , b += "</div>" } , _adjustInstDate : function ( e , t , i ) { var s = e . drawYear + ( "Y" === i ? t : 0 ) , a = e . drawMonth + ( "M" === i ? t : 0 ) , n = Math . min ( e . selectedDay , this . _getDaysInMonth ( s , a ) ) + ( "D" === i ? t : 0 ) , o = this . _restrictMinMax ( e , this . _daylightSavingAdjust ( new Date ( s , a , n ) ) ) ; e . selectedDay = o . getDate ( ) , e . drawMonth = e . selectedMonth = o . getMonth ( ) , e . drawYear = e . selectedYear = o . getFullYear ( ) , ( "M" === i || "Y" === i ) && this . _notifyChange ( e ) } , _restrictMinMax : function ( e , t ) { var i = this . _getMinMaxDate ( e , "min" ) , s = this . _getMinMaxDate ( e , "max" ) , a = i && i > t ? i : t ; return s && a > s ? s : a } , _notifyChange : function ( e ) { var t = this . _get ( e , "onChangeMonthYear" ) ; t && t . apply ( e . input ? e . input [ 0 ] : null , [ e . selectedYear , e . selectedMonth + 1 , e ] ) } , _getNumberOfMonths : function ( e ) { var t = this . _get ( e , "numberOfMonths" ) ; return null == t ? [ 1 , 1 ] : "number" == typeof t ? [ 1 , t ] : t } , _getMinMaxDate : function ( e , t ) { return this . _determineDate ( e , this . _get ( e , t + "Date" ) , null ) } , _getDaysInMonth : function ( e , t ) { return 32 - this . _daylightSavingAdjust ( new Date ( e , t , 32 ) ) . getDate ( ) } , _getFirstDayOfMonth : function ( e , t ) { return new Date ( e , t , 1 ) . getDay ( ) } , _canAdjustMonth : function ( e , t , i , s ) { var a = this . _getNumberOfMonths ( e ) , n = this . _daylightSavingAdjust ( new Date ( i , s + ( 0 > t ? t : a [ 0 ] * a [ 1 ] ) , 1 ) ) ; return 0 > t && n . setDate ( this . _getDaysInMonth ( n . getFullYear ( ) , n . getMonth ( ) ) ) , this . _isInRange ( e , n ) } , _isInRange : function ( e , t ) { var i , s , a = this . _getMinMaxDate ( e , "min" ) , n = this . _getMinMaxDate ( e , "max" ) , o = null , r = null , h = this . _get ( e , "yearRange" ) ; return h && ( i = h . split ( ":" ) , s = ( new Date ) . getFullYear ( ) , o = parseInt ( i [ 0 ] , 10 ) , r = parseInt ( i [ 1 ] , 10 ) , i [ 0 ] . match ( /[+\-].*/ ) && ( o += s ) , i [ 1 ] . match ( /[+\-].*/ ) && ( r += s ) ) , ( ! a || t . getTime ( ) >= a . getTime ( ) ) && ( ! n || t . getTime ( ) <= n . getTime ( ) ) && ( ! o || t . getFullYear ( ) >= o ) && ( ! r || r >= t . getFullYear ( ) ) } , _getFormatConfig : function ( e ) { var t = this . _get ( e , "shortYearCutoff" ) ; return t = "string" != typeof t ? t : ( new Date ) . getFullYear ( ) % 100 + parseInt ( t , 10 ) , { shortYearCutoff : t , dayNamesShort : this . _get ( e , "dayNamesShort" ) , dayNames : this . _get ( e , "dayNames" ) , monthNamesShort : this . _get ( e , "monthNamesShort" ) , monthNames : this . _get ( e , "monthNames" ) } } , _formatDate : function ( e , t , i , s ) { t || ( e . currentDay = e . selectedDay , e . currentMonth = e . selectedMonth , e . currentYear = e . selectedYear ) ; var a = t ? "object" == typeof t ? t : this . _daylightSavingAdjust ( new Date ( s , i , t ) ) : this . _daylightSavingAdjust ( new Date ( e . currentYear , e . currentMonth , e . currentDay ) ) ; return this . formatDate ( this . _get ( e , "dateFormat" ) , a , this . _getFormatConfig ( e ) ) } } ) , e . fn . datepicker = function ( t ) { if ( ! this . length ) return this ; e . datepicker . initialized || ( e ( document ) . mousedown ( e . datepicker . _checkExternalClick ) , e . datepicker . initialized = ! 0 ) , 0 === e ( "#" + e . datepicker . _mainDivId ) . length && e ( "body" ) . append ( e . datepicker . dpDiv ) ; var i = Array . prototype . slice . call ( arguments , 1 ) ; return "string" != typeof t || "isDisabled" !== t && "getDate" !== t && "widget" !== t ? "option" === t && 2 === arguments . length && "string" == typeof arguments [ 1 ] ? e . datepicker [ "_" + t + "Datepicker" ] . apply ( e . datepicker , [ this [ 0 ] ] . concat ( i ) ) : this . each ( function ( ) { "string" == typeof t ? e . datepicker [ "_" + t + "Datepicker" ] . apply ( e . datepicker , [ this ] . concat ( i ) ) : e . datepicker . _attachDatepicker ( this , t ) } ) : e . datepicker [ "_" + t + "Datepicker" ] . apply ( e . datepicker , [ this [ 0 ] ] . concat ( i ) ) } , e . datepicker = new i , e . datepicker . initialized = ! 1 , e . datepicker . uuid = ( new Date ) . getTime ( ) , e . datepicker . version = "1.10.4" } ) ( jQuery ) ; ( function ( e ) { function t ( t , i ) { var s = ( t . attr ( "aria-describedby" ) || "" ) . split ( /\s+/ ) ; s . push ( i ) , t . data ( "ui-tooltip-id" , i ) . attr ( "aria-describedby" , e . trim ( s . join ( " " ) ) ) } function i ( t ) { var i = t . data ( "ui-tooltip-id" ) , s = ( t . attr ( "aria-describedby" ) || "" ) . split ( /\s+/ ) , a = e . inArray ( i , s ) ; - 1 !== a && s . splice ( a , 1 ) , t . removeData ( "ui-tooltip-id" ) , s = e . trim ( s . join ( " " ) ) , s ? t . attr ( "aria-describedby" , s ) : t . removeAttr ( "aria-describedby" ) } var s = 0 ; e . widget ( "ui.tooltip" , { version : "1.10.4" , op
function ( a ) { ! e && this . _mouseCapture ( a . originalEvent . changedTouches [ 0 ] ) && ( e = ! 0 , f = ! 1 , g = + new Date , c ( a , "mouseover" ) , c ( a , "mousemove" ) , c ( a , "mousedown" ) ) } ; d . _touchMove = function ( a ) { e && ( f = ! 0 , c ( a , "mousemove" ) ) } ; d . _touchEnd = function ( a ) { e && ( h = + new Date , c ( a , "mouseup" ) , c ( a , "mouseout" ) , ( ! f || 300 > h - g ) && c ( a , "click" ) , e = ! 1 ) } ; d . _mouseInit = function ( ) { b . support . mspointer && ( this . element [ 0 ] . style . msTouchAction = "none" ) ; this . element . bind ( { touchstart : b . proxy ( this , "_touchStart" ) , touchmove : b . proxy ( this , "_touchMove" ) , touchend : b . proxy ( this ,
"_touchEnd" ) } ) ; k . call ( this ) } ; d . _mouseDestroy = function ( ) { this . element . unbind ( { touchstart : b . proxy ( this , "_touchStart" ) , touchmove : b . proxy ( this , "_touchMove" ) , touchend : b . proxy ( this , "_touchEnd" ) } ) ; l . call ( this ) } } } ) ( jQuery ) ;
/* Chosen v1.1.0 | (c) 2011-2013 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */
! function ( ) { var a , AbstractChosen , Chosen , SelectParser , b , c = { } . hasOwnProperty , d = function ( a , b ) { function d ( ) { this . constructor = a } for ( var e in b ) c . call ( b , e ) && ( a [ e ] = b [ e ] ) ; return d . prototype = b . prototype , a . prototype = new d , a . _ _super _ _ = b . prototype , a } ; SelectParser = function ( ) { function SelectParser ( ) { this . options _index = 0 , this . parsed = [ ] } return SelectParser . prototype . add _node = function ( a ) { return "OPTGROUP" === a . nodeName . toUpperCase ( ) ? this . add _group ( a ) : this . add _option ( a ) } , SelectParser . prototype . add _group = function ( a ) { var b , c , d , e , f , g ; for ( b = this . parsed . length , this . parsed . push ( { array _index : b , group : ! 0 , label : this . escapeExpression ( a . label ) , children : 0 , disabled : a . disabled } ) , f = a . childNodes , g = [ ] , d = 0 , e = f . length ; e > d ; d ++ ) c = f [ d ] , g . push ( this . add _option ( c , b , a . disabled ) ) ; return g } , SelectParser . prototype . add _option = function ( a , b , c ) { return "OPTION" === a . nodeName . toUpperCase ( ) ? ( "" !== a . text ? ( null != b && ( this . parsed [ b ] . children += 1 ) , this . parsed . push ( { array _index : this . parsed . length , options _index : this . options _index , value : a . value , text : a . text , html : a . innerHTML , selected : a . selected , disabled : c === ! 0 ? c : a . disabled , group _array _index : b , classes : a . className , style : a . style . cssText } ) ) : this . parsed . push ( { array _index : this . parsed . length , options _index : this . options _index , empty : ! 0 } ) , this . options _index += 1 ) : void 0 } , SelectParser . prototype . escapeExpression = function ( a ) { var b , c ; return null == a || a === ! 1 ? "" : /[\&\<\>\"\'\`]/ . test ( a ) ? ( b = { "<" : "<" , ">" : ">" , '"' : """ , "'" : "'" , "`" : "`" } , c = /&(?!\w+;)|[\<\>\"\'\`]/g , a . replace ( c , function ( a ) { return b [ a ] || "&" } ) ) : a } , SelectParser } ( ) , SelectParser . select _to _array = function ( a ) { var b , c , d , e , f ; for ( c = new SelectParser , f = a . childNodes , d = 0 , e = f . length ; e > d ; d ++ ) b = f [ d ] , c . add _node ( b ) ; return c . parsed } , AbstractChosen = function ( ) { function AbstractChosen ( a , b ) { this . form _field = a , this . options = null != b ? b : { } , AbstractChosen . browser _is _supported ( ) && ( this . is _multiple = this . form _field . multiple , this . set _default _text ( ) , this . set _default _values ( ) , this . setup ( ) , this . set _up _html ( ) , this . register _observers ( ) ) } return AbstractChosen . prototype . set _default _values = function ( ) { var a = this ; return this . click _test _action = function ( b ) { return a . test _active _click ( b ) } , this . activate _action = function ( b ) { return a . activate _field ( b ) } , this . active _field = ! 1 , this . mouse _on _container = ! 1 , this . results _showing = ! 1 , this . result _highlighted = null , this . allow _single _deselect = null != this . options . allow _single _deselect && null != this . form _field . options [ 0 ] && "" === this . form _field . options [ 0 ] . text ? this . options . allow _single _deselect : ! 1 , this . disable _search _threshold = this . options . disable _search _threshold || 0 , this . disable _search = this . options . disable _search || ! 1 , this . enable _split _word _search = null != this . options . enable _split _word _search ? this . options . enable _split _word _search : ! 0 , this . group _search = null != this . options . group _search ? this . options . group _search : ! 0 , this . search _contains = this . options . search _contains || ! 1 , this . single _backstroke _delete = null != this . options . single _backstroke _delete ? this . options . single _backstroke _delete : ! 0 , this . max _selected _options = this . options . max _selected _options || 1 / 0 , this . inherit _select _classes = this . options . inherit _select _classes || ! 1 , this . display _selected _options = null != this . options . display _selected _options ? this . options . display _selected _options : ! 0 , this . display _disabled _options = null != this . options . display _disabled _options ? this . options . display _disabled _options : ! 0 } , AbstractChosen . prototype . set _default _text = function ( ) { return this . default _text = this . form _field . getAttribute ( "data-placeholder" ) ? this . form _field . getAttribute ( "data-placeholder" ) : this . is _multiple ? this . options . placeholder _text _multiple || this . options . placeholder _text || AbstractChosen . default _multiple _text : this . options . placeholder _text _single || this . options . placeholder _text || AbstractChosen . default _single _text , this . results _none _found = this . form _field . getAttribute ( "data-no_results_text" ) || this . options . no _results _text || AbstractChosen . default _no _result _text } , AbstractChosen . prototype . mouse _enter = function ( ) { return this . mouse _on _container = ! 0 } , AbstractChosen . prototype . mouse _leave = function ( ) { return this . mouse _on _container = ! 1 } , AbstractChosen . prototype . input _focus = function ( ) { var a = this ; if ( thi
2014-07-20 12:26:15 +02:00
var Kanboard = ( function ( ) {
return {
2014-12-22 19:15:38 +01:00
// Return true if the element#id exists
Exists : function ( id ) {
if ( document . getElementById ( id ) ) {
return true ;
}
return false ;
} ,
2014-07-20 12:26:15 +02:00
// Display a popup
Popover : function ( e , callback ) {
e . preventDefault ( ) ;
e . stopPropagation ( ) ;
2014-10-22 19:59:09 +02:00
var link = e . target . getAttribute ( "href" ) ;
2014-07-20 12:26:15 +02:00
2014-10-22 19:59:09 +02:00
if ( ! link ) {
link = e . target . getAttribute ( "data-href" ) ;
}
2014-07-20 12:26:15 +02:00
2014-10-22 19:59:09 +02:00
if ( link ) {
$ . get ( link , function ( content ) {
2014-07-20 12:26:15 +02:00
2014-10-22 19:59:09 +02:00
$ ( "body" ) . append ( '<div id="popover-container"><div id="popover-content">' + content + '</div></div>' ) ;
2014-07-20 12:26:15 +02:00
2014-10-22 19:59:09 +02:00
$ ( "#popover-container" ) . click ( function ( ) {
$ ( this ) . remove ( ) ;
} ) ;
$ ( "#popover-content" ) . click ( function ( e ) {
e . stopPropagation ( ) ;
} ) ;
if ( callback ) {
callback ( ) ;
}
} ) ;
}
2014-07-20 12:26:15 +02:00
} ,
// Return true if the page is visible
2014-10-22 19:59:09 +02:00
IsVisible : function ( ) {
2014-07-20 12:26:15 +02:00
var property = "" ;
if ( typeof document . hidden !== "undefined" ) {
property = "visibilityState" ;
} else if ( typeof document . mozHidden !== "undefined" ) {
property = "mozVisibilityState" ;
} else if ( typeof document . msHidden !== "undefined" ) {
property = "msVisibilityState" ;
} else if ( typeof document . webkitHidden !== "undefined" ) {
property = "webkitVisibilityState" ;
}
if ( property != "" ) {
return document [ property ] == "visible" ;
}
return true ;
2014-10-22 19:59:09 +02:00
} ,
2014-12-22 19:15:38 +01:00
// Generate Markdown preview
MarkdownPreview : function ( e ) {
e . preventDefault ( ) ;
var link = $ ( this ) ;
var nav = $ ( this ) . closest ( "ul" ) ;
var write = $ ( ".write-area" ) ;
var preview = $ ( ".preview-area" ) ;
var textarea = $ ( "textarea" ) ;
var request = $ . ajax ( {
url : "?controller=app&action=preview" ,
contentType : "application/json" ,
type : "POST" ,
processData : false ,
dataType : "html" ,
data : JSON . stringify ( {
"text" : textarea . val ( )
} ) ,
} ) ;
request . done ( function ( data ) {
nav . find ( "li" ) . removeClass ( "form-tab-selected" ) ;
link . parent ( ) . addClass ( "form-tab-selected" ) ;
preview . find ( ".markdown" ) . html ( data )
preview . css ( "height" , textarea . css ( "height" ) ) ;
preview . css ( "width" , textarea . css ( "width" ) ) ;
write . hide ( ) ;
preview . show ( ) ;
} ) ;
} ,
// Show the Markdown textarea
MarkdownWriter : function ( e ) {
e . preventDefault ( ) ;
$ ( this ) . closest ( "ul" ) . find ( "li" ) . removeClass ( "form-tab-selected" )
$ ( this ) . parent ( ) . addClass ( "form-tab-selected" ) ;
$ ( ".write-area" ) . show ( ) ;
$ ( ".preview-area" ) . hide ( ) ;
} ,
// Check session and redirect to the login page if not logged
CheckSession : function ( ) {
if ( ! $ ( ".form-login" ) . length ) {
$ . ajax ( {
cache : false ,
url : $ ( "body" ) . data ( "status-url" ) ,
statusCode : {
401 : function ( data ) {
window . location = $ ( "body" ) . data ( "login-url" ) ;
}
}
} ) ;
}
} ,
2014-10-22 19:59:09 +02:00
// Common init
2014-12-22 19:15:38 +01:00
Init : function ( ) {
2014-10-22 19:59:09 +02:00
// Datepicker
$ ( ".form-date" ) . datepicker ( {
showOtherMonths : true ,
selectOtherMonths : true ,
2014-11-23 20:13:38 +01:00
dateFormat : 'yy-mm-dd' ,
constrainInput : false
} ) ;
// Project select box
$ ( "#board-selector" ) . chosen ( {
width : 180
} ) ;
$ ( "#board-selector" ) . change ( function ( ) {
2014-12-22 19:15:38 +01:00
window . location = $ ( this ) . attr ( "data-board-url" ) . replace ( /%d/g , $ ( this ) . val ( ) ) ;
} ) ;
// Markdown Preview for textareas
$ ( "#markdown-preview" ) . click ( Kanboard . MarkdownPreview ) ;
$ ( "#markdown-write" ) . click ( Kanboard . MarkdownWriter ) ;
// Check the session every 60s
window . setInterval ( Kanboard . CheckSession , 60000 ) ;
// Auto-select input fields
$ ( ".auto-select" ) . focus ( function ( ) {
$ ( this ) . select ( ) ;
2014-10-22 19:59:09 +02:00
} ) ;
2014-07-20 12:26:15 +02:00
}
} ;
} ) ( ) ;
// Board related functions
Kanboard . Board = ( function ( ) {
var checkInterval = null ;
2014-12-22 19:15:38 +01:00
function on _popover ( e )
{
Kanboard . Popover ( e , Kanboard . Init ) ;
}
2014-07-20 12:26:15 +02:00
// Setup the board
function board _load _events ( )
{
// Drag and drop
$ ( ".column" ) . sortable ( {
2014-10-22 19:59:09 +02:00
delay : 300 ,
distance : 5 ,
2014-07-20 12:26:15 +02:00
connectWith : ".column" ,
placeholder : "draggable-placeholder" ,
stop : function ( event , ui ) {
2014-10-22 19:59:09 +02:00
board _save (
ui . item . attr ( 'data-task-id' ) ,
ui . item . parent ( ) . attr ( "data-column-id" ) ,
ui . item . index ( ) + 1
) ;
2014-07-20 12:26:15 +02:00
}
} ) ;
// Assignee change
$ ( ".assignee-popover" ) . click ( Kanboard . Popover ) ;
2014-10-22 19:59:09 +02:00
// Category change
$ ( ".category-popover" ) . click ( Kanboard . Popover ) ;
2014-07-20 12:26:15 +02:00
// Task edit popover
2014-12-22 19:15:38 +01:00
$ ( ".task-edit-popover" ) . click ( on _popover ) ;
$ ( ".task-creation-popover" ) . click ( on _popover ) ;
2014-07-20 12:26:15 +02:00
2014-10-22 19:59:09 +02:00
// Description popover
2014-12-22 19:15:38 +01:00
$ ( ".task-description-popover" ) . click ( on _popover ) ;
// Tooltips
$ ( ".task-board-tooltip" ) . tooltip ( {
track : false ,
position : {
my : 'left-20 top' ,
at : 'center bottom+9' ,
using : function ( position , feedback ) {
$ ( this ) . css ( position ) ;
var arrow _pos = feedback . target . left + feedback . target . width / 2 - feedback . element . left - 20 ;
$ ( "<div>" )
. addClass ( "tooltip-arrow" )
. addClass ( feedback . vertical )
. addClass ( arrow _pos == 0 ? "align-left" : "align-right" )
. appendTo ( this ) ;
}
} ,
content : function ( e ) {
var href = $ ( this ) . attr ( 'data-href' ) ;
if ( ! href ) {
return ;
}
var _this = this ;
$ . get ( href , function setTooltipContent ( data ) {
$ ( '.ui-tooltip-content:visible' ) . html ( data ) ;
var tooltip = $ ( '.ui-tooltip:visible' ) ;
// Clear previous position, it interferes with the updated position computation
tooltip . css ( { top : '' , left : '' } ) ;
// Remove arrow, it will be added when repositionning
tooltip . children ( '.tooltip-arrow' ) . remove ( ) ;
// Reposition the tooltip
var position = $ ( _this ) . tooltip ( "option" , "position" ) ;
position . of = $ ( _this ) ;
tooltip . position ( position ) ;
// Toggle subtasks status
$ ( '#tooltip-subtasks a' ) . click ( function ( e ) {
e . preventDefault ( ) ;
e . stopPropagation ( ) ;
$ . get ( $ ( this ) . attr ( 'href' ) , setTooltipContent ) ;
} ) ;
} ) ;
return '<i class="fa fa-refresh fa-spin fa-2x"></i>' ;
}
} ) . on ( "mouseenter" , function ( ) {
var _this = this ;
$ ( this ) . tooltip ( "open" ) ;
$ ( ".ui-tooltip" ) . on ( "mouseleave" , function ( ) {
$ ( _this ) . tooltip ( 'close' ) ;
} ) ;
} ) . on ( "mouseleave focusout" , function ( e ) {
e . stopImmediatePropagation ( ) ;
var _this = this ;
setTimeout ( function ( ) {
if ( ! $ ( ".ui-tooltip:hover" ) . length ) {
$ ( _this ) . tooltip ( "close" ) ;
}
} , 100 ) ;
} ) ;
2014-10-22 19:59:09 +02:00
2014-07-20 12:26:15 +02:00
// Redirect to the task details page
2014-12-22 19:15:38 +01:00
$ ( "[data-task-url]" ) . each ( function ( ) {
2014-07-20 12:26:15 +02:00
$ ( this ) . click ( function ( ) {
2014-12-22 19:15:38 +01:00
window . location = $ ( this ) . attr ( "data-task-url" ) ;
2014-07-20 12:26:15 +02:00
} ) ;
} ) ;
// Automatic refresh
var interval = parseInt ( $ ( "#board" ) . attr ( "data-check-interval" ) ) ;
if ( interval > 0 ) {
checkInterval = window . setInterval ( board _check , interval * 1000 ) ;
}
}
// Stop events
function board _unload _events ( )
{
2014-12-22 19:15:38 +01:00
$ ( "[data-task-url]" ) . off ( ) ;
2014-07-20 12:26:15 +02:00
clearInterval ( checkInterval ) ;
}
// Save and refresh the board
2014-10-22 19:59:09 +02:00
function board _save ( taskId , columnId , position )
2014-07-20 12:26:15 +02:00
{
board _unload _events ( ) ;
$ . ajax ( {
cache : false ,
2014-12-22 19:15:38 +01:00
url : $ ( "#board" ) . attr ( "data-save-url" ) ,
contentType : "application/json" ,
type : "POST" ,
processData : false ,
data : JSON . stringify ( {
2014-10-22 19:59:09 +02:00
"task_id" : taskId ,
"column_id" : columnId ,
"position" : position ,
2014-12-22 19:15:38 +01:00
} ) ,
2014-07-20 12:26:15 +02:00
success : function ( data ) {
$ ( "#board" ) . remove ( ) ;
$ ( "#main" ) . append ( data ) ;
board _load _events ( ) ;
filter _apply ( ) ;
}
} ) ;
}
// Check if a board have been changed by someone else
function board _check ( )
{
2014-12-22 19:15:38 +01:00
if ( Kanboard . IsVisible ( ) ) {
2014-07-20 12:26:15 +02:00
$ . ajax ( {
cache : false ,
2014-12-22 19:15:38 +01:00
url : $ ( "#board" ) . attr ( "data-check-url" ) ,
2014-07-20 12:26:15 +02:00
statusCode : {
200 : function ( data ) {
2014-12-22 19:15:38 +01:00
$ ( "#board" ) . remove ( ) ;
2014-07-20 12:26:15 +02:00
$ ( "#main" ) . append ( data ) ;
board _unload _events ( ) ;
board _load _events ( ) ;
filter _apply ( ) ;
}
}
} ) ;
}
}
// Apply user or date filter (change tasks opacity)
function filter _apply ( )
{
var selectedUserId = $ ( "#form-user_id" ) . val ( ) ;
var selectedCategoryId = $ ( "#form-category_id" ) . val ( ) ;
var filterDueDate = $ ( "#filter-due-date" ) . hasClass ( "filter-on" ) ;
$ ( "[data-task-id]" ) . each ( function ( index , item ) {
var ownerId = item . getAttribute ( "data-owner-id" ) ;
var dueDate = item . getAttribute ( "data-due-date" ) ;
var categoryId = item . getAttribute ( "data-category-id" ) ;
if ( ownerId != selectedUserId && selectedUserId != - 1 ) {
item . style . opacity = "0.2" ;
}
else {
item . style . opacity = "1.0" ;
}
if ( filterDueDate && ( dueDate == "" || dueDate == "0" ) ) {
item . style . opacity = "0.2" ;
}
if ( categoryId != selectedCategoryId && selectedCategoryId != - 1 ) {
item . style . opacity = "0.2" ;
}
} ) ;
}
// Load filter events
function filter _load _events ( )
{
$ ( "#form-user_id" ) . change ( filter _apply ) ;
$ ( "#form-category_id" ) . change ( filter _apply ) ;
$ ( "#filter-due-date" ) . click ( function ( e ) {
$ ( this ) . toggleClass ( "filter-on" ) ;
filter _apply ( ) ;
e . preventDefault ( ) ;
} ) ;
}
return {
Init : function ( ) {
2014-11-23 20:13:38 +01:00
board _load _events ( ) ;
filter _load _events ( ) ;
2014-07-20 12:26:15 +02:00
}
} ;
} ) ( ) ;
// Task related functions
Kanboard . Task = ( function ( ) {
return {
2014-12-22 19:15:38 +01:00
Init : function ( ) {
2014-07-20 12:26:15 +02:00
// Image preview for attachments
$ ( ".file-popover" ) . click ( Kanboard . Popover ) ;
}
} ;
} ) ( ) ;
2014-12-22 19:15:38 +01:00
Kanboard . Analytic = ( function ( ) {
2014-10-22 19:59:09 +02:00
return {
Init : function ( ) {
2014-12-22 19:15:38 +01:00
if ( Kanboard . Exists ( "analytic-task-repartition" ) ) {
Kanboard . Analytic . TaskRepartition . Init ( ) ;
}
else if ( Kanboard . Exists ( "analytic-user-repartition" ) ) {
Kanboard . Analytic . UserRepartition . Init ( ) ;
}
else if ( Kanboard . Exists ( "analytic-cfd" ) ) {
Kanboard . Analytic . CFD . Init ( ) ;
}
2014-10-22 19:59:09 +02:00
}
} ;
} ) ( ) ;
2014-12-22 19:15:38 +01:00
Kanboard . Analytic . CFD = ( function ( ) {
2014-10-22 19:59:09 +02:00
2014-12-22 19:15:38 +01:00
function fetchData ( )
{
jQuery . getJSON ( $ ( "#chart" ) . attr ( "data-url" ) , function ( data ) {
drawGraph ( data . metrics , data . labels , data . columns ) ;
} ) ;
}
function drawGraph ( metrics , labels , columns )
{
var series = prepareSeries ( metrics , labels ) ;
var svg = dimple . newSvg ( "#chart" , "100%" , 380 ) ;
var chart = new dimple . chart ( svg , series ) ;
var x = chart . addCategoryAxis ( "x" , labels [ 'day' ] ) ;
x . addOrderRule ( "Date" ) ;
chart . addMeasureAxis ( "y" , labels [ 'total' ] ) ;
var s = chart . addSeries ( labels [ 'column' ] , dimple . plot . area ) ;
s . addOrderRule ( columns . reverse ( ) ) ;
chart . addLegend ( 10 , 10 , 500 , 30 , "left" ) ;
chart . draw ( ) ;
}
function prepareSeries ( metrics , labels )
{
var series = [ ] ;
for ( var i = 0 ; i < metrics . length ; i ++ ) {
var row = { } ;
row [ labels [ 'column' ] ] = metrics [ i ] [ 'column_title' ] ;
row [ labels [ 'day' ] ] = metrics [ i ] [ 'day' ] ;
row [ labels [ 'total' ] ] = metrics [ i ] [ 'total' ] ;
series . push ( row ) ;
}
return series ;
}
2014-11-23 20:13:38 +01:00
return {
2014-12-22 19:15:38 +01:00
Init : fetchData
} ;
} ) ( ) ;
Kanboard . Analytic . TaskRepartition = ( function ( ) {
function fetchData ( )
{
jQuery . getJSON ( $ ( "#chart" ) . attr ( "data-url" ) , function ( data ) {
drawGraph ( data . metrics , data . labels ) ;
} ) ;
}
function drawGraph ( metrics , labels )
{
var series = prepareSeries ( metrics , labels ) ;
var svg = dimple . newSvg ( "#chart" , "100%" , 350 ) ;
var chart = new dimple . chart ( svg , series ) ;
chart . addMeasureAxis ( "p" , labels [ "nb_tasks" ] ) ;
var ring = chart . addSeries ( labels [ "column_title" ] , dimple . plot . pie ) ;
ring . innerRadius = "50%" ;
chart . addLegend ( 0 , 0 , 100 , "100%" , "left" ) ;
chart . draw ( ) ;
}
function prepareSeries ( metrics , labels )
{
var series = [ ] ;
for ( var i = 0 ; i < metrics . length ; i ++ ) {
var serie = { } ;
serie [ labels [ "nb_tasks" ] ] = metrics [ i ] [ "nb_tasks" ] ;
serie [ labels [ "column_title" ] ] = metrics [ i ] [ "column_title" ] ;
series . push ( serie ) ;
2014-11-23 20:13:38 +01:00
}
2014-12-22 19:15:38 +01:00
return series ;
}
return {
Init : fetchData
2014-11-23 20:13:38 +01:00
} ;
} ) ( ) ;
2014-12-22 19:15:38 +01:00
Kanboard . Analytic . UserRepartition = ( function ( ) {
function fetchData ( )
{
jQuery . getJSON ( $ ( "#chart" ) . attr ( "data-url" ) , function ( data ) {
drawGraph ( data . metrics , data . labels ) ;
} ) ;
}
function drawGraph ( metrics , labels )
{
var series = prepareSeries ( metrics , labels ) ;
2014-11-23 20:13:38 +01:00
2014-12-22 19:15:38 +01:00
var svg = dimple . newSvg ( "#chart" , "100%" , 350 ) ;
var chart = new dimple . chart ( svg , series ) ;
chart . addMeasureAxis ( "p" , labels [ "nb_tasks" ] ) ;
var ring = chart . addSeries ( labels [ "user" ] , dimple . plot . pie ) ;
ring . innerRadius = "50%" ;
chart . addLegend ( 0 , 0 , 100 , "100%" , "left" ) ;
chart . draw ( ) ;
}
function prepareSeries ( metrics , labels )
{
var series = [ ] ;
for ( var i = 0 ; i < metrics . length ; i ++ ) {
var serie = { } ;
serie [ labels [ "nb_tasks" ] ] = metrics [ i ] [ "nb_tasks" ] ;
serie [ labels [ "user" ] ] = metrics [ i ] [ "user" ] ;
series . push ( serie ) ;
}
return series ;
}
return {
Init : fetchData
} ;
} ) ( ) ;
2014-07-20 12:26:15 +02:00
// Initialization
$ ( function ( ) {
2014-12-22 19:15:38 +01:00
Kanboard . Init ( ) ;
if ( Kanboard . Exists ( "board" ) ) {
2014-07-20 12:26:15 +02:00
Kanboard . Board . Init ( ) ;
}
2014-12-22 19:15:38 +01:00
else if ( Kanboard . Exists ( "task-section" ) ) {
2014-07-20 12:26:15 +02:00
Kanboard . Task . Init ( ) ;
}
2014-12-22 19:15:38 +01:00
else if ( Kanboard . Exists ( "analytic-section" ) ) {
Kanboard . Analytic . Init ( ) ;
2014-10-22 19:59:09 +02:00
}
2014-12-22 19:15:38 +01:00
} ) ;