2014-08-23 09:43:47 +02:00
// Underscore.js 1.3.1
// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
// Underscore is freely distributable under the MIT license.
// Portions of Underscore are inspired or borrowed from Prototype,
2013-04-26 21:01:39 +02:00
// Oliver Steele's Functional, and John Resig's Micro-Templating.
// For all details and documentation:
2014-08-23 09:43:47 +02:00
// http://documentcloud.github.com/underscore
( function ( ) { function q ( a , c , d ) { if ( a === c ) return a !== 0 || 1 / a == 1 / c ; if ( a == null || c == null ) return a === c ; if ( a . _chain ) a = a . _wrapped ; if ( c . _chain ) c = c . _wrapped ; if ( a . isEqual && b . isFunction ( a . isEqual ) ) return a . isEqual ( c ) ; if ( c . isEqual && b . isFunction ( c . isEqual ) ) return c . isEqual ( a ) ; var e = l . call ( a ) ; if ( e != l . call ( c ) ) return false ; switch ( e ) { case "[object String]" : return a == String ( c ) ; case "[object Number]" : return a != + a ? c != + c : a == 0 ? 1 / a == 1 / c : a == + c ; case "[object Date]" : case "[object Boolean]" : return + a == + c ; case "[object RegExp]" : return a . source ==
c . source && a . global == c . global && a . multiline == c . multiline && a . ignoreCase == c . ignoreCase } if ( typeof a != "object" || typeof c != "object" ) return false ; for ( var f = d . length ; f -- ; ) if ( d [ f ] == a ) return true ; d . push ( a ) ; var f = 0 , g = true ; if ( e == "[object Array]" ) { if ( f = a . length , g = f == c . length ) for ( ; f -- ; ) if ( ! ( g = f in a == f in c && q ( a [ f ] , c [ f ] , d ) ) ) break } else { if ( "constructor" in a != "constructor" in c || a . constructor != c . constructor ) return false ; for ( var h in a ) if ( b . has ( a , h ) && ( f ++ , ! ( g = b . has ( c , h ) && q ( a [ h ] , c [ h ] , d ) ) ) ) break ; if ( g ) { for ( h in c ) if ( b . has ( c ,
h ) && ! f -- ) break ; g = ! f } } d . pop ( ) ; return g } var r = this , G = r . _ , n = { } , k = Array . prototype , o = Object . prototype , i = k . slice , H = k . unshift , l = o . toString , I = o . hasOwnProperty , w = k . forEach , x = k . map , y = k . reduce , z = k . reduceRight , A = k . filter , B = k . every , C = k . some , p = k . indexOf , D = k . lastIndexOf , o = Array . isArray , J = Object . keys , s = Function . prototype . bind , b = function ( a ) { return new m ( a ) } ; if ( typeof exports !== "undefined" ) { if ( typeof module !== "undefined" && module . exports ) exports = module . exports = b ; exports . _ = b } else r . _ = b ; b . VERSION = "1.3.1" ; var j = b . each =
b . forEach = function ( a , c , d ) { if ( a != null ) if ( w && a . forEach === w ) a . forEach ( c , d ) ; else if ( a . length === + a . length ) for ( var e = 0 , f = a . length ; e < f ; e ++ ) { if ( e in a && c . call ( d , a [ e ] , e , a ) === n ) break } else for ( e in a ) if ( b . has ( a , e ) && c . call ( d , a [ e ] , e , a ) === n ) break } ; b . map = b . collect = function ( a , c , b ) { var e = [ ] ; if ( a == null ) return e ; if ( x && a . map === x ) return a . map ( c , b ) ; j ( a , function ( a , g , h ) { e [ e . length ] = c . call ( b , a , g , h ) } ) ; if ( a . length === + a . length ) e . length = a . length ; return e } ; b . reduce = b . foldl = b . inject = function ( a , c , d , e ) { var f = arguments . length > 2 ; a ==
null && ( a = [ ] ) ; if ( y && a . reduce === y ) return e && ( c = b . bind ( c , e ) ) , f ? a . reduce ( c , d ) : a . reduce ( c ) ; j ( a , function ( a , b , i ) { f ? d = c . call ( e , d , a , b , i ) : ( d = a , f = true ) } ) ; if ( ! f ) throw new TypeError ( "Reduce of empty array with no initial value" ) ; return d } ; b . reduceRight = b . foldr = function ( a , c , d , e ) { var f = arguments . length > 2 ; a == null && ( a = [ ] ) ; if ( z && a . reduceRight === z ) return e && ( c = b . bind ( c , e ) ) , f ? a . reduceRight ( c , d ) : a . reduceRight ( c ) ; var g = b . toArray ( a ) . reverse ( ) ; e && ! f && ( c = b . bind ( c , e ) ) ; return f ? b . reduce ( g , c , d , e ) : b . reduce ( g , c ) } ; b . find = b . detect =
function ( a , c , b ) { var e ; E ( a , function ( a , g , h ) { if ( c . call ( b , a , g , h ) ) return e = a , true } ) ; return e } ; b . filter = b . select = function ( a , c , b ) { var e = [ ] ; if ( a == null ) return e ; if ( A && a . filter === A ) return a . filter ( c , b ) ; j ( a , function ( a , g , h ) { c . call ( b , a , g , h ) && ( e [ e . length ] = a ) } ) ; return e } ; b . reject = function ( a , c , b ) { var e = [ ] ; if ( a == null ) return e ; j ( a , function ( a , g , h ) { c . call ( b , a , g , h ) || ( e [ e . length ] = a ) } ) ; return e } ; b . every = b . all = function ( a , c , b ) { var e = true ; if ( a == null ) return e ; if ( B && a . every === B ) return a . every ( c , b ) ; j ( a , function ( a , g , h ) { if ( ! ( e =
e && c . call ( b , a , g , h ) ) ) return n } ) ; return e } ; var E = b . some = b . any = function ( a , c , d ) { c || ( c = b . identity ) ; var e = false ; if ( a == null ) return e ; if ( C && a . some === C ) return a . some ( c , d ) ; j ( a , function ( a , b , h ) { if ( e || ( e = c . call ( d , a , b , h ) ) ) return n } ) ; return ! ! e } ; b . include = b . contains = function ( a , c ) { var b = false ; if ( a == null ) return b ; return p && a . indexOf === p ? a . indexOf ( c ) != - 1 : b = E ( a , function ( a ) { return a === c } ) } ; b . invoke = function ( a , c ) { var d = i . call ( arguments , 2 ) ; return b . map ( a , function ( a ) { return ( b . isFunction ( c ) ? c || a : a [ c ] ) . apply ( a , d ) } ) } ; b . pluck =
function ( a , c ) { return b . map ( a , function ( a ) { return a [ c ] } ) } ; b . max = function ( a , c , d ) { if ( ! c && b . isArray ( a ) ) return Math . max . apply ( Math , a ) ; if ( ! c && b . isEmpty ( a ) ) return - Infinity ; var e = { computed : - Infinity } ; j ( a , function ( a , b , h ) { b = c ? c . call ( d , a , b , h ) : a ; b >= e . computed && ( e = { value : a , computed : b } ) } ) ; return e . value } ; b . min = function ( a , c , d ) { if ( ! c && b . isArray ( a ) ) return Math . min . apply ( Math , a ) ; if ( ! c && b . isEmpty ( a ) ) return Infinity ; var e = { computed : Infinity } ; j ( a , function ( a , b , h ) { b = c ? c . call ( d , a , b , h ) : a ; b < e . computed && ( e = { value : a , computed : b } ) } ) ;
return e . value } ; b . shuffle = function ( a ) { var b = [ ] , d ; j ( a , function ( a , f ) { f == 0 ? b [ 0 ] = a : ( d = Math . floor ( Math . random ( ) * ( f + 1 ) ) , b [ f ] = b [ d ] , b [ d ] = a ) } ) ; return b } ; b . sortBy = function ( a , c , d ) { return b . pluck ( b . map ( a , function ( a , b , g ) { return { value : a , criteria : c . call ( d , a , b , g ) } } ) . sort ( function ( a , b ) { var c = a . criteria , d = b . criteria ; return c < d ? - 1 : c > d ? 1 : 0 } ) , "value" ) } ; b . groupBy = function ( a , c ) { var d = { } , e = b . isFunction ( c ) ? c : function ( a ) { return a [ c ] } ; j ( a , function ( a , b ) { var c = e ( a , b ) ; ( d [ c ] || ( d [ c ] = [ ] ) ) . push ( a ) } ) ; return d } ; b . sortedIndex = function ( a ,
c , d ) { d || ( d = b . identity ) ; for ( var e = 0 , f = a . length ; e < f ; ) { var g = e + f >> 1 ; d ( a [ g ] ) < d ( c ) ? e = g + 1 : f = g } return e } ; b . toArray = function ( a ) { return ! a ? [ ] : a . toArray ? a . toArray ( ) : b . isArray ( a ) ? i . call ( a ) : b . isArguments ( a ) ? i . call ( a ) : b . values ( a ) } ; b . size = function ( a ) { return b . toArray ( a ) . length } ; b . first = b . head = function ( a , b , d ) { return b != null && ! d ? i . call ( a , 0 , b ) : a [ 0 ] } ; b . initial = function ( a , b , d ) { return i . call ( a , 0 , a . length - ( b == null || d ? 1 : b ) ) } ; b . last = function ( a , b , d ) { return b != null && ! d ? i . call ( a , Math . max ( a . length - b , 0 ) ) : a [ a . length - 1 ] } ; b . rest =
b . tail = function ( a , b , d ) { return i . call ( a , b == null || d ? 1 : b ) } ; b . compact = function ( a ) { return b . filter ( a , function ( a ) { return ! ! a } ) } ; b . flatten = function ( a , c ) { return b . reduce ( a , function ( a , e ) { if ( b . isArray ( e ) ) return a . concat ( c ? e : b . flatten ( e ) ) ; a [ a . length ] = e ; return a } , [ ] ) } ; b . without = function ( a ) { return b . difference ( a , i . call ( arguments , 1 ) ) } ; b . uniq = b . unique = function ( a , c , d ) { var d = d ? b . map ( a , d ) : a , e = [ ] ; b . reduce ( d , function ( d , g , h ) { if ( 0 == h || ( c === true ? b . last ( d ) != g : ! b . include ( d , g ) ) ) d [ d . length ] = g , e [ e . length ] = a [ h ] ; return d } , [ ] ) ;
return e } ; b . union = function ( ) { return b . uniq ( b . flatten ( arguments , true ) ) } ; b . intersection = b . intersect = function ( a ) { var c = i . call ( arguments , 1 ) ; return b . filter ( b . uniq ( a ) , function ( a ) { return b . every ( c , function ( c ) { return b . indexOf ( c , a ) >= 0 } ) } ) } ; b . difference = function ( a ) { var c = b . flatten ( i . call ( arguments , 1 ) ) ; return b . filter ( a , function ( a ) { return ! b . include ( c , a ) } ) } ; b . zip = function ( ) { for ( var a = i . call ( arguments ) , c = b . max ( b . pluck ( a , "length" ) ) , d = Array ( c ) , e = 0 ; e < c ; e ++ ) d [ e ] = b . pluck ( a , "" + e ) ; return d } ; b . indexOf = function ( a , c ,
d ) { if ( a == null ) return - 1 ; var e ; if ( d ) return d = b . sortedIndex ( a , c ) , a [ d ] === c ? d : - 1 ; if ( p && a . indexOf === p ) return a . indexOf ( c ) ; for ( d = 0 , e = a . length ; d < e ; d ++ ) if ( d in a && a [ d ] === c ) return d ; return - 1 } ; b . lastIndexOf = function ( a , b ) { if ( a == null ) return - 1 ; if ( D && a . lastIndexOf === D ) return a . lastIndexOf ( b ) ; for ( var d = a . length ; d -- ; ) if ( d in a && a [ d ] === b ) return d ; return - 1 } ; b . range = function ( a , b , d ) { arguments . length <= 1 && ( b = a || 0 , a = 0 ) ; for ( var d = arguments [ 2 ] || 1 , e = Math . max ( Math . ceil ( ( b - a ) / d ) , 0 ) , f = 0 , g = Array ( e ) ; f < e ; ) g [ f ++ ] = a , a += d ; return g } ;
var F = function ( ) { } ; b . bind = function ( a , c ) { var d , e ; if ( a . bind === s && s ) return s . apply ( a , i . call ( arguments , 1 ) ) ; if ( ! b . isFunction ( a ) ) throw new TypeError ; e = i . call ( arguments , 2 ) ; return d = function ( ) { if ( ! ( this instanceof d ) ) return a . apply ( c , e . concat ( i . call ( arguments ) ) ) ; F . prototype = a . prototype ; var b = new F , g = a . apply ( b , e . concat ( i . call ( arguments ) ) ) ; return Object ( g ) === g ? g : b } } ; b . bindAll = function ( a ) { var c = i . call ( arguments , 1 ) ; c . length == 0 && ( c = b . functions ( a ) ) ; j ( c , function ( c ) { a [ c ] = b . bind ( a [ c ] , a ) } ) ; return a } ; b . memoize = function ( a ,
c ) { var d = { } ; c || ( c = b . identity ) ; return function ( ) { var e = c . apply ( this , arguments ) ; return b . has ( d , e ) ? d [ e ] : d [ e ] = a . apply ( this , arguments ) } } ; b . delay = function ( a , b ) { var d = i . call ( arguments , 2 ) ; return setTimeout ( function ( ) { return a . apply ( a , d ) } , b ) } ; b . defer = function ( a ) { return b . delay . apply ( b , [ a , 1 ] . concat ( i . call ( arguments , 1 ) ) ) } ; b . throttle = function ( a , c ) { var d , e , f , g , h , i = b . debounce ( function ( ) { h = g = false } , c ) ; return function ( ) { d = this ; e = arguments ; var b ; f || ( f = setTimeout ( function ( ) { f = null ; h && a . apply ( d , e ) ; i ( ) } , c ) ) ; g ? h = true :
a . apply ( d , e ) ; i ( ) ; g = true } } ; b . debounce = function ( a , b ) { var d ; return function ( ) { var e = this , f = arguments ; clearTimeout ( d ) ; d = setTimeout ( function ( ) { d = null ; a . apply ( e , f ) } , b ) } } ; b . once = function ( a ) { var b = false , d ; return function ( ) { if ( b ) return d ; b = true ; return d = a . apply ( this , arguments ) } } ; b . wrap = function ( a , b ) { return function ( ) { var d = [ a ] . concat ( i . call ( arguments , 0 ) ) ; return b . apply ( this , d ) } } ; b . compose = function ( ) { var a = arguments ; return function ( ) { for ( var b = arguments , d = a . length - 1 ; d >= 0 ; d -- ) b = [ a [ d ] . apply ( this , b ) ] ; return b [ 0 ] } } ;
b . after = function ( a , b ) { return a <= 0 ? b ( ) : function ( ) { if ( -- a < 1 ) return b . apply ( this , arguments ) } } ; b . keys = J || function ( a ) { if ( a !== Object ( a ) ) throw new TypeError ( "Invalid object" ) ; var c = [ ] , d ; for ( d in a ) b . has ( a , d ) && ( c [ c . length ] = d ) ; return c } ; b . values = function ( a ) { return b . map ( a , b . identity ) } ; b . functions = b . methods = function ( a ) { var c = [ ] , d ; for ( d in a ) b . isFunction ( a [ d ] ) && c . push ( d ) ; return c . sort ( ) } ; b . extend = function ( a ) { j ( i . call ( arguments , 1 ) , function ( b ) { for ( var d in b ) a [ d ] = b [ d ] } ) ; return a } ; b . defaults = function ( a ) { j ( i . call ( arguments ,
1 ) , function ( b ) { for ( var d in b ) a [ d ] == null && ( a [ d ] = b [ d ] ) } ) ; return a } ; b . clone = function ( a ) { return ! b . isObject ( a ) ? a : b . isArray ( a ) ? a . slice ( ) : b . extend ( { } , a ) } ; b . tap = function ( a , b ) { b ( a ) ; return a } ; b . isEqual = function ( a , b ) { return q ( a , b , [ ] ) } ; b . isEmpty = function ( a ) { if ( b . isArray ( a ) || b . isString ( a ) ) return a . length === 0 ; for ( var c in a ) if ( b . has ( a , c ) ) return false ; return true } ; b . isElement = function ( a ) { return ! ! ( a && a . nodeType == 1 ) } ; b . isArray = o || function ( a ) { return l . call ( a ) == "[object Array]" } ; b . isObject = function ( a ) { return a === Object ( a ) } ;
b . isArguments = function ( a ) { return l . call ( a ) == "[object Arguments]" } ; if ( ! b . isArguments ( arguments ) ) b . isArguments = function ( a ) { return ! ( ! a || ! b . has ( a , "callee" ) ) } ; b . isFunction = function ( a ) { return l . call ( a ) == "[object Function]" } ; b . isString = function ( a ) { return l . call ( a ) == "[object String]" } ; b . isNumber = function ( a ) { return l . call ( a ) == "[object Number]" } ; b . isNaN = function ( a ) { return a !== a } ; b . isBoolean = function ( a ) { return a === true || a === false || l . call ( a ) == "[object Boolean]" } ; b . isDate = function ( a ) { return l . call ( a ) == "[object Date]" } ;
b . isRegExp = function ( a ) { return l . call ( a ) == "[object RegExp]" } ; b . isNull = function ( a ) { return a === null } ; b . isUndefined = function ( a ) { return a === void 0 } ; b . has = function ( a , b ) { return I . call ( a , b ) } ; b . noConflict = function ( ) { r . _ = G ; return this } ; b . identity = function ( a ) { return a } ; b . times = function ( a , b , d ) { for ( var e = 0 ; e < a ; e ++ ) b . call ( d , e ) } ; b . escape = function ( a ) { return ( "" + a ) . replace ( /&/g , "&" ) . replace ( /</g , "<" ) . replace ( />/g , ">" ) . replace ( /"/g , """ ) . replace ( /'/g , "'" ) . replace ( /\//g , "/" ) } ; b . mixin = function ( a ) { j ( b . functions ( a ) ,
function ( c ) { K ( c , b [ c ] = a [ c ] ) } ) } ; var L = 0 ; b . uniqueId = function ( a ) { var b = L ++ ; return a ? a + b : b } ; b . templateSettings = { evaluate : /<%([\s\S]+?)%>/g , interpolate : /<%=([\s\S]+?)%>/g , escape : /<%-([\s\S]+?)%>/g } ; var t = /.^/ , u = function ( a ) { return a . replace ( /\\\\/g , "\\" ) . replace ( /\\'/g , "'" ) } ; b . template = function ( a , c ) { var d = b . templateSettings , d = "var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('" + a . replace ( /\\/g , "\\\\" ) . replace ( /'/g , "\\'" ) . replace ( d . escape || t , function ( a , b ) { return "',_.escape(" +
u ( b ) + "),'" } ) . replace ( d . interpolate || t , function ( a , b ) { return "'," + u ( b ) + ",'" } ) . replace ( d . evaluate || t , function ( a , b ) { return "');" + u ( b ) . replace ( /[\r\n\t]/g , " " ) + ";__p.push('" } ) . replace ( /\r/g , "\\r" ) . replace ( /\n/g , "\\n" ) . replace ( /\t/g , "\\t" ) + "');}return __p.join('');" , e = new Function ( "obj" , "_" , d ) ; return c ? e ( c , b ) : function ( a ) { return e . call ( this , a , b ) } } ; b . chain = function ( a ) { return b ( a ) . chain ( ) } ; var m = function ( a ) { this . _wrapped = a } ; b . prototype = m . prototype ; var v = function ( a , c ) { return c ? b ( a ) . chain ( ) : a } , K = function ( a , c ) { m . prototype [ a ] =
function ( ) { var a = i . call ( arguments ) ; H . call ( a , this . _wrapped ) ; return v ( c . apply ( b , a ) , this . _chain ) } } ; b . mixin ( b ) ; j ( "pop,push,reverse,shift,sort,splice,unshift" . split ( "," ) , function ( a ) { var b = k [ a ] ; m . prototype [ a ] = function ( ) { var d = this . _wrapped ; b . apply ( d , arguments ) ; var e = d . length ; ( a == "shift" || a == "splice" ) && e === 0 && delete d [ 0 ] ; return v ( d , this . _chain ) } } ) ; j ( [ "concat" , "join" , "slice" ] , function ( a ) { var b = k [ a ] ; m . prototype [ a ] = function ( ) { return v ( b . apply ( this . _wrapped , arguments ) , this . _chain ) } } ) ; m . prototype . chain = function ( ) { this . _chain =
true ; return this } ; m . prototype . value = function ( ) { return this . _wrapped } } ) . call ( this ) ;