2015-07-12 11:51:06 +00:00
function gup ( e ) { e = e . replace ( /[\[]/ , "\\[" ) . replace ( /[\]]/ , "\\]" ) ; var t = "[\\?&]" + e + "=([^&#]*)" , n = new RegExp ( t ) , i = n . exec ( window . location . href ) ; return null === i ? "" : i [ 1 ] } ! function ( e , t ) { "object" == typeof module && "object" == typeof module . exports ? module . exports = e . document ? t ( e , ! 0 ) : function ( e ) { if ( ! e . document ) throw new Error ( "jQuery requires a window with a document" ) ; return t ( e ) } : t ( e ) } ( "undefined" != typeof window ? window : this , function ( e , t ) { function n ( e ) { var t = "length" in e && e . length , n = Z . type ( e ) ; return "function" === n || Z . isWindow ( e ) ? ! 1 : 1 === e . nodeType && t ? ! 0 : "array" === n || 0 === t || "number" == typeof t && t > 0 && t - 1 in e } function i ( e , t , n ) { if ( Z . isFunction ( t ) ) return Z . grep ( e , function ( e , i ) { return ! ! t . call ( e , i , e ) !== n } ) ; if ( t . nodeType ) return Z . grep ( e , function ( e ) { return e === t !== n } ) ; if ( "string" == typeof t ) { if ( se . test ( t ) ) return Z . filter ( t , e , n ) ; t = Z . filter ( t , e ) } return Z . grep ( e , function ( e ) { return X . call ( t , e ) >= 0 !== n } ) } function r ( e , t ) { for ( ; ( e = e [ t ] ) && 1 !== e . nodeType ; ) ; return e } function o ( e ) { var t = he [ e ] = { } ; return Z . each ( e . match ( pe ) || [ ] , function ( e , n ) { t [ n ] = ! 0 } ) , t } function a ( ) { Q . removeEventListener ( "DOMContentLoaded" , a , ! 1 ) , e . removeEventListener ( "load" , a , ! 1 ) , Z . ready ( ) } function s ( ) { Object . defineProperty ( this . cache = { } , 0 , { get : function ( ) { return { } } } ) , this . expando = Z . expando + s . uid ++ } function u ( e , t , n ) { var i ; if ( void 0 === n && 1 === e . nodeType ) if ( i = "data-" + t . replace ( xe , "-$1" ) . toLowerCase ( ) , n = e . getAttribute ( i ) , "string" == typeof n ) { try { n = "true" === n ? ! 0 : "false" === n ? ! 1 : "null" === n ? null : + n + "" === n ? + n : be . test ( n ) ? Z . parseJSON ( n ) : n } catch ( r ) { } ye . set ( e , t , n ) } else n = void 0 ; return n } function l ( ) { return ! 0 } function c ( ) { return ! 1 } function d ( ) { try { return Q . activeElement } catch ( e ) { } } function f ( e , t ) { return Z . nodeName ( e , "table" ) && Z . nodeName ( 11 !== t . nodeType ? t : t . firstChild , "tr" ) ? e . getElementsByTagName ( "tbody" ) [ 0 ] || e . appendChild ( e . ownerDocument . createElement ( "tbody" ) ) : e } function p ( e ) { return e . type = ( null !== e . getAttribute ( "type" ) ) + "/" + e . type , e } function h ( e ) { var t = Me . exec ( e . type ) ; return t ? e . type = t [ 1 ] : e . removeAttribute ( "type" ) , e } function g ( e , t ) { for ( var n = 0 , i = e . length ; i > n ; n ++ ) ve . set ( e [ n ] , "globalEval" , ! t || ve . get ( t [ n ] , "globalEval" ) ) } function m ( e , t ) { var n , i , r , o , a , s , u , l ; if ( 1 === t . nodeType ) { if ( ve . hasData ( e ) && ( o = ve . access ( e ) , a = ve . set ( t , o ) , l = o . events ) ) { delete a . handle , a . events = { } ; for ( r in l ) for ( n = 0 , i = l [ r ] . length ; i > n ; n ++ ) Z . event . add ( t , r , l [ r ] [ n ] ) } ye . hasData ( e ) && ( s = ye . access ( e ) , u = Z . extend ( { } , s ) , ye . set ( t , u ) ) } } function v ( e , t ) { var n = e . getElementsByTagName ? e . getElementsByTagName ( t || "*" ) : e . querySelectorAll ? e . querySelectorAll ( t || "*" ) : [ ] ; return void 0 === t || t && Z . nodeName ( e , t ) ? Z . merge ( [ e ] , n ) : n } function y ( e , t ) { var n = t . nodeName . toLowerCase ( ) ; "input" === n && ke . test ( e . type ) ? t . checked = e . checked : ( "input" === n || "textarea" === n ) && ( t . defaultValue = e . defaultValue ) } function b ( t , n ) { var i , r = Z ( n . createElement ( t ) ) . appendTo ( n . body ) , o = e . getDefaultComputedStyle && ( i = e . getDefaultComputedStyle ( r [ 0 ] ) ) ? i . display : Z . css ( r [ 0 ] , "display" ) ; return r . detach ( ) , o } function x ( e ) { var t = Q , n = Oe [ e ] ; return n || ( n = b ( e , t ) , "none" !== n && n || ( Ie = ( Ie || Z ( "<iframe frameborder='0' width='0' height='0'/>" ) ) . appendTo ( t . documentElement ) , t = Ie [ 0 ] . contentDocument , t . write ( ) , t . close ( ) , n = b ( e , t ) , Ie . detach ( ) ) , Oe [ e ] = n ) , n } function w ( e , t , n ) { var i , r , o , a , s = e . style ; return n = n || Be ( e ) , n && ( a = n . getPropertyValue ( t ) || n [ t ] ) , n && ( "" !== a || Z . contains ( e . ownerDocument , e ) || ( a = Z . style ( e , t ) ) , We . test ( a ) && Re . test ( t ) && ( i = s . width , r = s . minWidth , o = s . maxWidth , s . minWidth = s . maxWidth = s . width = a , a = n . width , s . width = i , s . minWidth = r , s . maxWidth = o ) ) , void 0 !== a ? a + "" : a } function T ( e , t ) { return { get : function ( ) { return e ( ) ? void delete this . get : ( this . get = t ) . apply ( this , arguments ) } } } function C ( e , t ) { if ( t in e ) return t ; for ( var n = t [ 0 ] . toUpperCase ( ) + t . slice ( 1 ) , i = t , r = Ge . length ; r -- ; ) if ( t = Ge [ r ] + n , t in e ) return t ; return i } function k ( e , t , n ) { var i = Ue . exec ( t ) ; return i ? Math . max ( 0 , i [ 1 ] - ( n || 0 ) ) + ( i [ 2 ] || "px" ) : t } function N ( e , t , n , i , r ) { for ( var o = n === ( i ? "border" : "content" ) ? 4 : "width" === t ? 1 : 0 , a = 0 ; 4 > o ; o += 2 ) "margin" === n && ( a += Z . css ( e , n + Te [ o ] , ! 0 , r ) ) , i ? ( "content" === n && ( a -= Z . css ( e , "padding" + Te [ o ] , ! 0 , r ) ) , "margin" !== n && ( a -= Z . css ( e , "border" + Te [ o ] + "Width" , ! 0 , r ) ) ) : ( a += Z . css ( e , "padding" + Te [ o ] , ! 0 , r ) , "padding" !== n && ( a += Z . css ( e , "border" + Te [ o ] + "Width" , ! 0 , r ) ) ) ; return a } function D ( e , t , n ) { var i = ! 0 , r =
return 1 === e . nodeType } ) ) } , Z . fn . extend ( { find : function ( e ) { var t , n = this . length , i = [ ] , r = this ; if ( "string" != typeof e ) return this . pushStack ( Z ( e ) . filter ( function ( ) { for ( t = 0 ; n > t ; t ++ ) if ( Z . contains ( r [ t ] , this ) ) return ! 0 } ) ) ; for ( t = 0 ; n > t ; t ++ ) Z . find ( e , r [ t ] , i ) ; return i = this . pushStack ( n > 1 ? Z . unique ( i ) : i ) , i . selector = this . selector ? this . selector + " " + e : e , i } , filter : function ( e ) { return this . pushStack ( i ( this , e || [ ] , ! 1 ) ) } , not : function ( e ) { return this . pushStack ( i ( this , e || [ ] , ! 0 ) ) } , is : function ( e ) { return ! ! i ( this , "string" == typeof e && oe . test ( e ) ? Z ( e ) : e || [ ] , ! 1 ) . length } } ) ; var ue , le = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/ , ce = Z . fn . init = function ( e , t ) { var n , i ; if ( ! e ) return this ; if ( "string" == typeof e ) { if ( n = "<" === e [ 0 ] && ">" === e [ e . length - 1 ] && e . length >= 3 ? [ null , e , null ] : le . exec ( e ) , ! n || ! n [ 1 ] && t ) return ! t || t . jquery ? ( t || ue ) . find ( e ) : this . constructor ( t ) . find ( e ) ; if ( n [ 1 ] ) { if ( t = t instanceof Z ? t [ 0 ] : t , Z . merge ( this , Z . parseHTML ( n [ 1 ] , t && t . nodeType ? t . ownerDocument || t : Q , ! 0 ) ) , ae . test ( n [ 1 ] ) && Z . isPlainObject ( t ) ) for ( n in t ) Z . isFunction ( this [ n ] ) ? this [ n ] ( t [ n ] ) : this . attr ( n , t [ n ] ) ; return this } return i = Q . getElementById ( n [ 2 ] ) , i && i . parentNode && ( this . length = 1 , this [ 0 ] = i ) , this . context = Q , this . selector = e , this } return e . nodeType ? ( this . context = this [ 0 ] = e , this . length = 1 , this ) : Z . isFunction ( e ) ? "undefined" != typeof ue . ready ? ue . ready ( e ) : e ( Z ) : ( void 0 !== e . selector && ( this . selector = e . selector , this . context = e . context ) , Z . makeArray ( e , this ) ) } ; ce . prototype = Z . fn , ue = Z ( Q ) ; var de = /^(?:parents|prev(?:Until|All))/ , fe = { children : ! 0 , contents : ! 0 , next : ! 0 , prev : ! 0 } ; Z . extend ( { dir : function ( e , t , n ) { for ( var i = [ ] , r = void 0 !== n ; ( e = e [ t ] ) && 9 !== e . nodeType ; ) if ( 1 === e . nodeType ) { if ( r && Z ( e ) . is ( n ) ) break ; i . push ( e ) } return i } , sibling : function ( e , t ) { for ( var n = [ ] ; e ; e = e . nextSibling ) 1 === e . nodeType && e !== t && n . push ( e ) ; return n } } ) , Z . fn . extend ( { has : function ( e ) { var t = Z ( e , this ) , n = t . length ; return this . filter ( function ( ) { for ( var e = 0 ; n > e ; e ++ ) if ( Z . contains ( this , t [ e ] ) ) return ! 0 } ) } , closest : function ( e , t ) { for ( var n , i = 0 , r = this . length , o = [ ] , a = oe . test ( e ) || "string" != typeof e ? Z ( e , t || this . context ) : 0 ; r > i ; i ++ ) for ( n = this [ i ] ; n && n !== t ; n = n . parentNode ) if ( n . nodeType < 11 && ( a ? a . index ( n ) > - 1 : 1 === n . nodeType && Z . find . matchesSelector ( n , e ) ) ) { o . push ( n ) ; break } return this . pushStack ( o . length > 1 ? Z . unique ( o ) : o ) } , index : function ( e ) { return e ? "string" == typeof e ? X . call ( Z ( e ) , this [ 0 ] ) : X . call ( this , e . jquery ? e [ 0 ] : e ) : this [ 0 ] && this [ 0 ] . parentNode ? this . first ( ) . prevAll ( ) . length : - 1 } , add : function ( e , t ) { return this . pushStack ( Z . unique ( Z . merge ( this . get ( ) , Z ( e , t ) ) ) ) } , addBack : function ( e ) { return this . add ( null == e ? this . prevObject : this . prevObject . filter ( e ) ) } } ) , Z . each ( { parent : function ( e ) { var t = e . parentNode ; return t && 11 !== t . nodeType ? t : null } , parents : function ( e ) { return Z . dir ( e , "parentNode" ) } , parentsUntil : function ( e , t , n ) { return Z . dir ( e , "parentNode" , n ) } , next : function ( e ) { return r ( e , "nextSibling" ) } , prev : function ( e ) { return r ( e , "previousSibling" ) } , nextAll : function ( e ) { return Z . dir ( e , "nextSibling" ) } , prevAll : function ( e ) { return Z . dir ( e , "previousSibling" ) } , nextUntil : function ( e , t , n ) { return Z . dir ( e , "nextSibling" , n ) } , prevUntil : function ( e , t , n ) { return Z . dir ( e , "previousSibling" , n ) } , siblings : function ( e ) { return Z . sibling ( ( e . parentNode || { } ) . firstChild , e ) } , children : function ( e ) { return Z . sibling ( e . firstChild ) } , contents : function ( e ) { return e . contentDocument || Z . merge ( [ ] , e . childNodes ) } } , function ( e , t ) { Z . fn [ e ] = function ( n , i ) { var r = Z . map ( this , t , n ) ; return "Until" !== e . slice ( - 5 ) && ( i = n ) , i && "string" == typeof i && ( r = Z . filter ( i , r ) ) , this . length > 1 && ( fe [ e ] || Z . unique ( r ) , de . test ( e ) && r . reverse ( ) ) , this . pushStack ( r ) } } ) ; var pe = /\S+/g , he = { } ; Z . Callbacks = function ( e ) { e = "string" == typeof e ? he [ e ] || o ( e ) : Z . extend ( { } , e ) ; var t , n , i , r , a , s , u = [ ] , l = ! e . once && [ ] , c = function ( o ) { for ( t = e . memory && o , n = ! 0 , s = r || 0 , r = 0 , a = u . length , i = ! 0 ; u && a > s ; s ++ ) if ( u [ s ] . apply ( o [ 0 ] , o [ 1 ] ) === ! 1 && e . stopOnFalse ) { t = ! 1 ; break } i = ! 1 , u && ( l ? l . length && c ( l . shift ( ) ) : t ? u = [ ] : d . disable ( ) ) } , d = { add : function ( ) { if ( u ) { var n = u . length ; ! function o ( t ) { Z . each ( t , function ( t , n ) { var i = Z . type ( n ) ; "function" === i ? e . unique && d . has ( n ) || u . push ( n ) : n && n . length && "string" !== i && o ( n ) } ) } ( arguments ) , i ? a = u . length : t && ( r = n , c ( t ) ) } return this } , remove : function ( ) { return u && Z . each ( arguments , function ( e , t ) { for ( var n ; ( n = Z . inArray ( t , u , n ) ) > - 1 ; ) u . splice ( n , 1 ) , i && ( a >= n && a -- , s >= n && s -- ) } ) , this } , has : fun
2015-04-11 15:26:50 +00:00
2015-07-13 12:29:06 +00:00
for ( n . finish = ! 0 , Z . queue ( this , e , [ ] ) , r && r . stop && r . stop . call ( this , ! 0 ) , t = o . length ; t -- ; ) o [ t ] . elem === this && o [ t ] . queue === e && ( o [ t ] . anim . stop ( ! 0 ) , o . splice ( t , 1 ) ) ; for ( t = 0 ; a > t ; t ++ ) i [ t ] && i [ t ] . finish && i [ t ] . finish . call ( this ) ; delete n . finish } ) } } ) , Z . each ( [ "toggle" , "show" , "hide" ] , function ( e , t ) { var n = Z . fn [ t ] ; Z . fn [ t ] = function ( e , i , r ) { return null == e || "boolean" == typeof e ? n . apply ( this , arguments ) : this . animate ( A ( t , ! 0 ) , e , i , r ) } } ) , Z . each ( { slideDown : A ( "show" ) , slideUp : A ( "hide" ) , slideToggle : A ( "toggle" ) , fadeIn : { opacity : "show" } , fadeOut : { opacity : "hide" } , fadeToggle : { opacity : "toggle" } } , function ( e , t ) { Z . fn [ e ] = function ( e , n , i ) { return this . animate ( t , e , n , i ) } } ) , Z . timers = [ ] , Z . fx . tick = function ( ) { var e , t = 0 , n = Z . timers ; for ( Je = Z . now ( ) ; t < n . length ; t ++ ) e = n [ t ] , e ( ) || n [ t ] !== e || n . splice ( t -- , 1 ) ; n . length || Z . fx . stop ( ) , Je = void 0 } , Z . fx . timer = function ( e ) { Z . timers . push ( e ) , e ( ) ? Z . fx . start ( ) : Z . timers . pop ( ) } , Z . fx . interval = 13 , Z . fx . start = function ( ) { Qe || ( Qe = setInterval ( Z . fx . tick , Z . fx . interval ) ) } , Z . fx . stop = function ( ) { clearInterval ( Qe ) , Qe = null } , Z . fx . speeds = { slow : 600 , fast : 200 , _default : 400 } , Z . fn . delay = function ( e , t ) { return e = Z . fx ? Z . fx . speeds [ e ] || e : e , t = t || "fx" , this . queue ( t , function ( t , n ) { var i = setTimeout ( t , e ) ; n . stop = function ( ) { clearTimeout ( i ) } } ) } , function ( ) { var e = Q . createElement ( "input" ) , t = Q . createElement ( "select" ) , n = t . appendChild ( Q . createElement ( "option" ) ) ; e . type = "checkbox" , J . checkOn = "" !== e . value , J . optSelected = n . selected , t . disabled = ! 0 , J . optDisabled = ! n . disabled , e = Q . createElement ( "input" ) , e . value = "t" , e . type = "radio" , J . radioValue = "t" === e . value } ( ) ; var it , rt , ot = Z . expr . attrHandle ; Z . fn . extend ( { attr : function ( e , t ) { return me ( this , Z . attr , e , t , arguments . length > 1 ) } , removeAttr : function ( e ) { return this . each ( function ( ) { Z . removeAttr ( this , e ) } ) } } ) , Z . extend ( { attr : function ( e , t , n ) { var i , r , o = e . nodeType ; return e && 3 !== o && 8 !== o && 2 !== o ? typeof e . getAttribute === Ne ? Z . prop ( e , t , n ) : ( 1 === o && Z . isXMLDoc ( e ) || ( t = t . toLowerCase ( ) , i = Z . attrHooks [ t ] || ( Z . expr . match . bool . test ( t ) ? rt : it ) ) , void 0 === n ? i && "get" in i && null !== ( r = i . get ( e , t ) ) ? r : ( r = Z . find . attr ( e , t ) , null == r ? void 0 : r ) : null !== n ? i && "set" in i && void 0 !== ( r = i . set ( e , n , t ) ) ? r : ( e . setAttribute ( t , n + "" ) , n ) : void Z . removeAttr ( e , t ) ) : void 0 } , removeAttr : function ( e , t ) { var n , i , r = 0 , o = t && t . match ( pe ) ; if ( o && 1 === e . nodeType ) for ( ; n = o [ r ++ ] ; ) i = Z . propFix [ n ] || n , Z . expr . match . bool . test ( n ) && ( e [ i ] = ! 1 ) , e . removeAttribute ( n ) } , attrHooks : { type : { set : function ( e , t ) { if ( ! J . radioValue && "radio" === t && Z . nodeName ( e , "input" ) ) { var n = e . value ; return e . setAttribute ( "type" , t ) , n && ( e . value = n ) , t } } } } } ) , rt = { set : function ( e , t , n ) { return t === ! 1 ? Z . removeAttr ( e , n ) : e . setAttribute ( n , n ) , n } } , Z . each ( Z . expr . match . bool . source . match ( /\w+/g ) , function ( e , t ) { var n = ot [ t ] || Z . find . attr ; ot [ t ] = function ( e , t , i ) { var r , o ; return i || ( o = ot [ t ] , ot [ t ] = r , r = null != n ( e , t , i ) ? t . toLowerCase ( ) : null , ot [ t ] = o ) , r } } ) ; var at = /^(?:input|select|textarea|button)$/i ; Z . fn . extend ( { prop : function ( e , t ) { return me ( this , Z . prop , e , t , arguments . length > 1 ) } , removeProp : function ( e ) { return this . each ( function ( ) { delete this [ Z . propFix [ e ] || e ] } ) } } ) , Z . extend ( { propFix : { "for" : "htmlFor" , "class" : "className" } , prop : function ( e , t , n ) { var i , r , o , a = e . nodeType ; return e && 3 !== a && 8 !== a && 2 !== a ? ( o = 1 !== a || ! Z . isXMLDoc ( e ) , o && ( t = Z . propFix [ t ] || t , r = Z . propHooks [ t ] ) , void 0 !== n ? r && "set" in r && void 0 !== ( i = r . set ( e , n , t ) ) ? i : e [ t ] = n : r && "get" in r && null !== ( i = r . get ( e , t ) ) ? i : e [ t ] ) : void 0 } , propHooks : { tabIndex : { get : function ( e ) { return e . hasAttribute ( "tabindex" ) || at . test ( e . nodeName ) || e . href ? e . tabIndex : - 1 } } } } ) , J . optSelected || ( Z . propHooks . selected = { get : function ( e ) { var t = e . parentNode ; return t && t . parentNode && t . parentNode . selectedIndex , null } } ) , Z . each ( [ "tabIndex" , "readOnly" , "maxLength" , "cellSpacing" , "cellPadding" , "rowSpan" , "colSpan" , "useMap" , "frameBorder" , "contentEditable" ] , function ( ) { Z . propFix [ this . toLowerCase ( ) ] = this } ) ; var st = /[\t\r\n\f]/g ; Z . fn . extend ( { addClass : function ( e ) { var t , n , i , r , o , a , s = "string" == typeof e && e , u = 0 , l = this . length ; if ( Z . isFunction ( e ) ) return this . each ( function ( t ) { Z ( this ) . addClass ( e . call ( this , t , this . className ) ) } ) ; if ( s ) for ( t = ( e || "" ) . match ( pe ) || [ ] ; l > u ; u ++ ) if ( n = this [ u ] , i = 1 === n . nodeType && ( n . className ? ( " " + n . className + " " ) . replace ( st , " " ) : " " ) ) { for ( o = 0 ; r = t [ o ++ ] ; ) i . indexOf ( " " + r + " " ) < 0 && ( i += r + " " ) ; a = Z . trim ( i ) , n . className !== a && ( n . className = a ) } return this } , remo
} , { title : "Format" , value : e . type } , { title : "Resolution" , value : e . width + " x " + e . height } ] } , i . tags = lychee . publicMode === ! 1 ? { title : "Tags" , type : sidebar . types . TAGS , value : build . tags ( e . tags ) , editable : t } : { } , i . exif = "0" !== n ? { title : "Camera" , type : sidebar . types . DEFAULT , rows : [ { title : "Captured" , value : e . takedate } , { title : "Make" , value : e . make } , { title : "Type/Model" , value : e . model } , { title : "Shutter Speed" , value : e . shutter } , { title : "Aperture" , value : e . aperture } , { title : "Focal Length" , value : e . focal } , { title : "ISO" , value : e . iso } ] } : { } , i . sharing = { title : "Sharing" , type : sidebar . types . DEFAULT , rows : [ { title : "Public" , value : r } ] } , i = [ i . basics , i . image , i . tags , i . exif , i . sharing ] } , sidebar . createStructure . album = function ( e ) { if ( null == e || "" === e ) return ! 1 ; var t = ! 1 , n = { } , i = "" , r = "" , o = "" , a = "" ; switch ( lychee . publicMode === ! 1 && ( t = ! 0 ) , e [ "public" ] ) { case "0" : i = "No" ; break ; case "1" : i = "Yes" ; break ; default : i = "-" } switch ( e . visible ) { case "0" : r = "No" ; break ; case "1" : r = "Yes" ; break ; default : r = "-" } switch ( e . downloadable ) { case "0" : o = "No" ; break ; case "1" : o = "Yes" ; break ; default : o = "-" } switch ( e . password ) { case "0" : a = "No" ; break ; case "1" : a = "Yes" ; break ; default : a = "-" } return n . basics = { title : "Basics" , type : sidebar . types . DEFAULT , rows : [ { title : "Title" , value : e . title , editable : t } , { title : "Description" , value : e . description , editable : t } ] } , n . album = { title : "Album" , type : sidebar . types . DEFAULT , rows : [ { title : "Created" , value : e . sysdate } , { title : "Images" , value : e . num } ] } , n . share = { title : "Share" , type : sidebar . types . DEFAULT , rows : [ { title : "Public" , value : i } , { title : "Visible" , value : r } , { title : "Downloadable" , value : o } , { title : "Password" , value : a } ] } , n = [ n . basics , n . album , n . share ] } , sidebar . render = function ( e ) { if ( null == e || "" === e ) return ! 1 ; var t = "" , n = function ( e ) { var t = "" ; return t += "\n <div class='divider'>\n <h1>" + e . title + "</h1>\n </div>\n <table>\n " , e . rows . forEach ( function ( e ) { var n = e . value ; ( "" === n || null == n ) && ( n = "-" ) , n = "<span class='attr_" + e . title . toLowerCase ( ) + "'>" + n + "</span>" , e . editable === ! 0 && ( n += " " + build . editIcon ( "edit_" + e . title . toLowerCase ( ) ) ) , t += "\n <tr>\n <td>" + e . title + "</td>\n <td>" + n + "</td>\n </tr>\n " } ) , t += "\n </table>\n " } , i = function ( e ) { var t = "" ; return t += "\n <div class='divider'>\n <h1>" + e . title + "</h1>\n </div>\n <div id='tags'>\n <div class='attr_" + e . title . toLowerCase ( ) + "'>" + e . value + "</div>\n " , e . editable === ! 0 && ( t += build . editIcon ( "edit_tags" ) ) , t += "\n </div>\n " } ; return e . forEach ( function ( e ) { e . type === sidebar . types . DEFAULT ? t += n ( e ) : e . type === sidebar . types . TAGS && ( t += i ( e ) ) } ) , t } ; var lychee = { content : $ ( "#content" ) } , loadingBar = { show : function ( ) { } , hide : function ( ) { } } ; imageview = $ ( "#imageview" ) , $ ( document ) . ready ( function ( ) { var e = /Android|iPhone|iPad|iPod/i . test ( navigator . userAgent || navigator . vendor || window . opera ) && "ontouchend" in document . documentElement , t = e === ! 0 ? "touchend" : "click" ; api . onError = error , header . dom ( "#button_info" ) . on ( t , sidebar . toggle ) , header . dom ( "#button_direct" ) . on ( t , function ( ) { var e = $ ( "#imageview #image" ) . css ( "background-image" ) . replace ( /"/g , "" ) . replace ( /url\(|\)$/gi , "" ) ; window . open ( e , "_newtab" ) } ) , loadPhotoInfo ( gup ( "p" ) ) } ) ; var getPhotoSize = function ( e ) { var t = "big" , n = ! 1 , i = "" !== e . medium , r = window . devicePixelRatio , o = { width : $ ( window ) . width ( ) - 60 , height : $ ( window ) . height ( ) - 100 } ; return ( e . json . width > o . width || e . json . height > o . height ) && ( n = ! 0 ) , null != r && r > 1 && ( o . width = o . width * r , o . height = o . height * r ) , i === ! 0 && 1920 > o . width && 1080 > o . height && ( t = "medium" ) , n === ! 1 && e . json . width < o . width && e . json . width < o . height && ( t = "small" ) , t } , loadPhotoInfo = function ( e ) { var t = { photoID : e , albumID : 0 , password : "" } ; api . post ( "Photo::get" , t , function ( e ) { if ( "Warning: Photo private!" === e || "Warning: Wrong password!" === e ) return $ ( "body" ) . append ( build . no _content ( "question-mark" ) ) , $ ( "body" ) . removeClass ( "view" ) , header . dom ( ) . remove ( ) , ! 1 ; e . title || ( e . title = "Untitled" ) , document . title = "Lychee - " + e . title , header . dom ( "#title" ) . html ( e . title ) ; var t = getPhotoSize ( e ) ; imageview . html ( build . imageview ( e , t , ! 0 ) ) , imageview . find ( ".arrow_wrapper" ) . remove ( ) , imageview . addClass ( "fadeIn" ) . show ( ) ; var n = sidebar . createStructure . photo ( e