import Ġorg . w 3 c . dom . Element Ċ import Ġorg . w 3 c . dom . events . Event Ċ import Ġkotlin . browser . document Ċ import Ġkotlin . browser . window Ċ Ċ class ĠView Elements ( ĊĠĠĠ Ġprivate Ġval Ġcallback : Ġ( id : ĠInt ) Ġ-> ĠUnit , ĊĠĠĠ Ġprivate Ġval Ġx E ps : ĠInt Ġ= Ġ 3 0 0 , ĊĠĠĠ Ġprivate Ġval Ġy E ps : ĠInt Ġ= Ġ 1 2 0 0 Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġid To Element Ġ= ĠHashMap < Int , ĠElement >() ĊĠĠĠ Ġprivate Ġval Ġelement To Id Ġ= ĠHashMap < Element , ĠInt >() ĊĊĠĠĠ Ġprivate Ġvar Ġwindow Rect : ĠRectangle Ġ= ĠRectangle ( 0 , Ġ 0 , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġprivate Ġvar Ġjust Res ized : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġresize Dirty : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġjust Sc rolled : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġscroll Dirty : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġemb ark () Ġ{ ĊĠĠĠĠĠĠĠ Ġwindow . addEventListener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" resize ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis :: on Resize , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpassive Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġdocument . addEventListener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" scroll ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis :: on Scroll , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpassive Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġthis . on Resize ( null ) Ġ// Ġinitialize Ġwindow Ġrectangle ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdise mb ark () Ġ{ ĊĠĠĠĠĠĠĠ Ġwindow . removeEventListener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" resize ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis :: on Resize ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġdocument . removeEventListener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" scroll ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis :: on Scroll ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġthis . id To Element . clear () ĊĠĠĠĠĠĠĠ Ġthis . element To Id . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġput ( id : ĠInt , Ġelement : ĠElement ) Ġ{ ĊĠĠĠĠĠĠĠ Ġelement To Id [ element ] Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġid To Element [ id ] Ġ= Ġelement ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove ( id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! id To Element . containsKey ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" id Ġ$ id Ġis Ġnot Ġregistered Ġin Ġthis ĠView Elements ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelement To Id . remove ( id To Element [ id ]) ĊĠĠĠĠĠĠĠ Ġid To Element . remove ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġforce Update () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . on Resize ( null ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Resize ( event : ĠEvent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . just Res ized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . resize Dirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . just Res ized Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġthis . resize Dirty Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġdocument Element Ġ= Ġdocument . documentElement !! ĊĠĠĠĠĠĠĠ Ġwindow Rect Ġ= ĠRectangle ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Start Ġ= Ġdocument Element . client Left , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Start Ġ= Ġdocument Element . client Top , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx End Ġ= Ġdocument Element . client Left Ġ+ Ġdocument Element . client Width , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy End Ġ= Ġdocument Element . client Top Ġ+ Ġdocument Element . client Height ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġthis . on Scroll ( null ) ĊĊĠĠĠĠĠĠĠ Ġwindow . setTimeout ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . just Res ized Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . resize Dirty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . on Resize ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 2 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Scroll ( event : ĠEvent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . just Sc rolled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . scroll Dirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . just Sc rolled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġthis . scroll Dirty Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġelement To Id . keys . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ filter Ġwindow Rect . contains ( it , Ġx E ps , Ġy E ps ) ĊĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . callback ( element To Id [ it ] !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwindow . setTimeout ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . just Sc rolled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . scroll Dirty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . on Scroll ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 1 5 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠRectangle . contains ( elem : ĠElement , Ġx E ps : ĠInt , Ġy E ps : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdom Rect Ġ= Ġelem . getBoundingClientRect () ĊĠĠĠĠĠĠĠ Ġreturn Ġ( this . x Start Ġ- Ġx E ps ) Ġ< Ġdom Rect . right Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this . x End Ġ+ Ġx E ps ) Ġ> Ġdom Rect . left Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this . y Start Ġ- Ġy E ps ) Ġ< Ġdom Rect . bottom Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this . y End Ġ+ Ġy E ps ) Ġ> Ġdom Rect . top ĊĠĠĠ Ġ} Ċ } Ċ