package Ġorg . mo ong lass . ui . widgets Ċ Ċ import Ġkotlinx . browser . window Ċ import Ġkotlinx . css . Css Builder Ċ import Ġkotlinx . css . bottom Ċ import Ġkotlinx . css . left Ċ import Ġkotlinx . css . px Ċ import Ġkotlinx . css . right Ċ import Ġkotlinx . css . top Ċ import Ġkotlinx . serialization . Serializable Ċ import Ġorg . w 3 c . dom . HTMLElement Ċ import Ġkotlin . math . abs Ċ Ċ /** Ċ Ġ* ĠA Ġclass Ġrepresenting Ġa Ġscreen Ġposition Ġof Ġan Ġelement . Ċ Ġ* ĠNegative Ġvalues Ġrepresent Ġdisplacement s Ġfrom Ġright Ġor Ġbottom , Ġpositive Ġfrom Ġtop Ġor Ġleft . Ċ Ġ* ĠThe Ġposition Ġcan Ġbe Ġnormal ised , Ġi . e . Ġeach Ġof Ġx Ġand Ġy Ġshould Ġhave Ġan Ġabsolute Ġvalue Ġwhich Ġis Ċ Ġ* Ġthe Ġminimum Ġrequired Ġto Ġspecify Ġthe Ġlocation , Ġso Ġthat Ġas Ġthe Ġelement Ġmoves Ġacross Ġthe Ġwindow Ġcentre Ġit Ċ Ġ* Ġf lips Ġbetween Ġpositive Ġand Ġnegative Ġdisplacement s . Ċ Ġ* Ċ Ġ*/ Ċ @ Serializable Ċ data Ġclass ĠScreen Position ( val Ġx : ĠInt , Ġval Ġy : ĠInt ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġmove Ġfrom Ġthis Ġposition Ġof Ġthe Ġspecified Ġelement , Ġcompute Ġa Ġnew Ġposition , Ġsuch Ġthat Ġthe ĊĠĠĠĠ Ġ* Ġelement Ġis Ġcompletely Ġcontained Ġwithin Ġthe Ġwindow Ġbounds ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTODO Ġ- Ġallow Ġspecification Ġof Ġbounds Ġrather Ġthan Ġusing Ġthe Ġwindow Ġbounds ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate ( element : ĠHTMLElement , Ġdelta X : ĠInt , Ġdelta Y : ĠInt ): ĠScreen Position Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġthe Ġrange Ġis Ġinvalid Ġ( lower bound Ġgreater Ġthan Ġhigher Ġbound ) Ġjust Ġfix Ġthe Ġelement Ġto Ġtop / left Ġcorner ĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġcould Ġoccur Ġif Ġthe Ġelement Ġwon 't Ġfit Ġinside Ġthe Ġwindow Ġbounds ĊĠĠĠĠĠĠĠ Ġval Ġnew X Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( x Ġ+ Ġdelta X ). coerce In ( 0 , Ġwindow . innerWidth Ġ- Ġelement . client Width ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Y Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( y Ġ+ Ġdelta Y ). coerce In ( 0 , Ġwindow . innerHeight Ġ- Ġelement . client Height ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠScreen Position ( new X , Ġnew Y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġa Ġversion Ġthat Ġis Ġguaranteed Ġto Ġbe Ġcontained Ġon screen ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġfun Ġon Screen ( element : ĠHTMLElement ): ĠScreen Position Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( x Ġin Ġ( 0 .. window . innerWidth Ġ- Ġelement . client Width ) Ġ&& Ġy Ġin Ġ( 0 .. window . innerHeight Ġ- Ġelement . client Height )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġreturn ĠScreen Position ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx . coerce In ( 0 , Ġwindow . innerWidth Ġ- Ġelement . client Width Ġ- Ġ 1 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy . coerce In ( 0 , Ġwindow . innerHeight Ġ- Ġelement . client Height Ġ- Ġ 1 0 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġa Ġnormal ised Ġversion Ġof Ġthe Ġposition . ĠThis Ġworks Ġonly Ġif Ġthe Ġelement Ġis Ġinside Ġthe Ġwindow ĊĠĠĠĠ Ġ* ĠA Ġnormalized Ġversion Ġis Ġrelative Ġto Ġthe Ġnearest Ġborder . ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġfun Ġnormal ise ( element : ĠHTMLElement ): ĠScreen Position Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġfirst Ġmake Ġsure Ġit 's Ġinside . ĊĠĠĠĠĠĠĠ Ġreturn Ġupdate ( element , Ġ 0 , Ġ 0 ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġelement . offsetHeight ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġelement . offset Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw Width Ġ= Ġwindow . innerWidth ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw Height Ġ= Ġwindow . innerHeight ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright X Ġ= Ġw Width Ġ- Ġx Ġ- Ġwidth Ġ// Ġright Ġmargin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbottom Y Ġ= Ġw Height Ġ- Ġy Ġ- Ġheight Ġ// Ġbottom Ġmargin ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScreen Position ( if Ġ( x Ġ< Ġabs ( right X )) Ġx Ġelse Ġ- right X , Ġif Ġ( y Ġ< Ġabs ( bottom Y )) Ġy Ġelse Ġ- bottom Y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvert Ġa Ġnormal ised Ġversion Ġto Ġabsolute ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġfun Ġde Normal ise ( element : ĠHTMLElement ): ĠScreen Position Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( x Ġ>= Ġ 0 Ġ&& Ġy Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġreturn ĠScreen Position ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ>= Ġ 0 ) Ġx Ġelse Ġwindow . innerWidth Ġ+ Ġx Ġ- Ġelement . client Width , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y Ġ>= Ġ 0 ) Ġy Ġelse Ġwindow . innerHeight Ġ+ Ġy Ġ- Ġelement . client Height ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMove Ġan Ġelement Ġto Ġthis Ġposition ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġfun ĠCss Builder . moveTo () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( x Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġ= Ġ- x . px ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġx . px ĊĠĠĠĠĠĠĠ Ġif Ġ( y Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ= Ġ- y . px ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġy . px ĊĠĠĠ Ġ} Ċ } Ċ