{"version":3,"file":"iframeResizer.min.js","sources":["../src/iframeResizer.js"],"names":["window","addEventListener","obj","evt","func","attachEvent","setupRequestAnimationFrame","x","vendors","length","requestAnimationFrame","log","getMyID","retStr","top","self","parentIFrame","getId","formatLogMsg","msg","msgId","logEnabled","console","warn","iFrameListener","event","resizeIFrame","resize","setSize","messageData","setPagePosition","ensureInRange","syncResize","closeIFrame","iframe","iframeId","id","parentNode","removeChild","settings","closedCallback","processMsg","data","substr","msgIdLen","split","height","width","type","Dimension","max","Number","min","dimension","toLowerCase","size","Error","isMessageFromIFrame","checkAllowedOrigin","checkList","checkOrigin","i","origin","checkSingle","remoteHost","constructor","Array","isMessageForUs","isMessageFromMetaParent","retCode","true","false","undefined","getMsgBody","offset","indexOf","msgHeaderLen","forwardMsgFromIFrame","msgBody","messageCallback","message","JSON","parse","checkIFrameExists","getElementPosition","target","iFramePosition","getBoundingClientRect","getPagePosition","parseInt","left","pagePosition","y","scrollRequestFromChild","addOffset","reposition","newPosition","scrollTo","calcOffset","scrollCallback","findTarget","location","jumpToTarget","jumpPosition","hash","hashData","decodeURIComponent","document","getElementById","getElementsByName","moveToAnchor","actionMsg","firstRun","resetIFrame","initCallback","resizedCallback","hasSettings","retBool","Function","prototype","bind","iFrameResizer","close","trigger","anchor","sendMessage","stringify","pageXOffset","documentElement","scrollLeft","pageYOffset","scrollTop","reset","setDimension","style","sizeHeight","sizeWidth","doNotSync","calleeMsg","contentWindow","postMessage","targetOrigin","setupIFrame","options","setLimits","addStyle","Infinity","ensureHasId","count","src","setScrolling","scrolling","overflow","setupBodyMarginValues","bodyMargin","bodyMarginV1","createOutgoingMsg","interval","enablePublicMethods","autoResize","heightCalculationMethod","bodyBackground","bodyPadding","tolerance","inPageLinks","resizeFrom","widthCalculationMethod","checkReset","restRequertMethod","resetRequiredMethods","init","iFrameLoaded","checkOptions","TypeError","copyOptions","option","defaults","hasOwnProperty","getTargetOrigin","processOptions","slice","join","beenHere","throttle","fn","time","timer","setTimeout","setupEventListeners","resizeIFrames","sendTriggerMsg","tabVisible","visibilityState","eventName","isIFrameResizeEnabled","factory","element","tagName","toUpperCase","forEach","call","querySelectorAll","createJQueryPublicMethod","$","iFrameResize","this","filter","each","index","end","msgHeader","scroll","bodyScroll","documentElementScroll","maxHeight","maxWidth","minHeight","minWidth","jQuery","define","amd","module","exports"],"mappings":";;;;;;;CASC,SAAUA,GACV,YA4CA,SAASC,GAAiBC,EAAIC,EAAIC,GAC7B,oBAAsBJ,GACzBE,EAAID,iBAAiBE,EAAIC,GAAM,GACrB,eAAiBJ,IAC3BE,EAAIG,YAAY,KAAKF,EAAIC,GAI3B,QAASE,KACR,GAECC,GADAC,GAAW,MAAO,SAAU,IAAK,KAIlC,KAAKD,EAAI,EAAGA,EAAIC,EAAQC,SAAWC,EAAuBH,GAAK,EAC9DG,EAAwBV,EAAOQ,EAAQD,GAAK,wBAGxC,IACJI,EAAI,wCAIN,QAASC,KACR,GAAIC,GAAS,WAUb,OARIb,GAAOc,MAAMd,EAAOe,OAEtBF,EADGb,EAAOgB,aACDhB,EAAOgB,aAAaC,QAEpB,oBAIJJ,EAGR,QAASK,GAAaC,GACrB,MAAOC,GAAQ,IAAMR,IAAY,IAAMO,EAGxC,QAASR,GAAIQ,GACRE,GAAe,gBAAoBrB,GAAOsB,SAC7CA,QAAQX,IAAIO,EAAaC,IAI3B,QAASI,GAAKJ,GACT,gBAAoBnB,GAAOsB,SAC9BA,QAAQC,KAAKL,EAAaC,IAI5B,QAASK,GAAeC,GACvB,QAASC,KACR,QAASC,KACRC,EAAQC,GACRC,IAGDC,EAAc,UACdA,EAAc,SAEdC,EAAWL,EAAOE,EAAY,aAG/B,QAASI,GAAYC,GACpB,GAAIC,GAAWD,EAAOE,EAEtBzB,GAAI,qBAAqBwB,GACzBD,EAAOG,WAAWC,YAAYJ,GAC9BK,EAASJ,GAAUK,eAAeL,SAC3BI,GAASJ,GAChBxB,EAAI,OAGL,QAAS8B,KACR,GAAIC,GAAOvB,EAAIwB,OAAOC,GAAUC,MAAM,IAEtC,QACCX,OAAQK,EAASG,EAAK,IAAIR,OAC1BE,GAAQM,EAAK,GACbI,OAAQJ,EAAK,GACbK,MAAQL,EAAK,GACbM,KAAQN,EAAK,IAIf,QAASX,GAAckB,GACtB,GACCC,GAAOC,OAAOZ,EAASJ,GAAU,MAAMc,IACvCG,EAAOD,OAAOZ,EAASJ,GAAU,MAAMc,IACvCI,EAAYJ,EAAUK,cACtBC,EAAOJ,OAAOtB,EAAYwB,GAE3B,IAAID,EAAIF,EACP,KAAM,IAAIM,OAAM,gBAAgBP,EAAU,+BAA+BA,EAG1EtC,GAAI,aAAa0C,EAAU,gBAAgBD,EAAI,IAAIF,GAE1CE,EAALG,IACHA,EAAKH,EACLzC,EAAI,QAAQ0C,EAAU,kBAGnBE,EAAKL,IACRK,EAAKL,EACLvC,EAAI,QAAQ0C,EAAU,kBAGvBxB,EAAYwB,GAAW,GAAGE,EAI3B,QAASE,KACR,QAASC,KACR,QAASC,KACRhD,EAAI,yDAA2DiD,EAC/D,IAAIC,EACJ,KAAKA,EAAI,EAAGA,EAAID,EAAYnD,OAAQoD,IACnC,GAAID,EAAYC,KAAOC,EACtB,OAAO,CAGT,QAAO,EAGR,QAASC,KACR,GAAIC,GAAczB,EAASJ,GAAU6B,UAErC,OADArD,GAAI,iCAAiCqD,GAC9BF,IAAWE,EAGnB,MAAOJ,GAAYK,cAAgBC,MAAQP,IAAcI,IAG1D,GACCD,GAAcrC,EAAMqC,OACpBF,EAAcrB,EAASJ,GAAUyB,WAElC,IAAIA,GACE,GAAGE,GAAW,SAAYJ,IAC9B,KAAM,IAAIF,OACT,qCAAuCM,EACvC,QAAUjC,EAAYK,OAAOE,GAC7B,kBAAoBX,EAAMiB,KAC1B,qHAKH,QAAO,EAGR,QAASyB,KACR,MAAO/C,MAAY,GAAKD,GAAKwB,OAAO,EAAEC,IAAezB,EAAIwB,OAAOC,GAAUC,MAAM,KAAK,IAAMN,GAG5F,QAAS6B,KAGR,GAAIC,GAAUxC,EAAYmB,QAASsB,OAAO,EAAEC,QAAQ,EAAEC,UAAY,EAMlE,OAJIH,IACH1D,EAAI,gDAGE0D,EAGR,QAASI,GAAWC,GACnB,MAAOvD,GAAIwB,OAAOxB,EAAIwD,QAAQ,KAAKC,EAAaF,GAGjD,QAASG,GAAqBC,GAC7BnE,EAAI,qCAAsCkB,EAAYK,OAAOE,GAAK,cAAgB0C,EAAU,KAC5FvC,EAASJ,GAAU4C,iBAClB7C,OAAQL,EAAYK,OACpB8C,QAASC,KAAKC,MAAMJ,KAErBnE,EAAI,OAGL,QAASwE,KACR,MAAI,QAAStD,EAAYK,QACxBX,EAAK,YAAYM,EAAYO,GAAG,gBACzB,IAED,EAGR,QAASgD,GAAmBC,GAC3B,GAAIC,GAAiBD,EAAOE,uBAI5B,OAFAC,MAGCjF,EAAGkF,SAASH,EAAeI,KAAM,IAAMD,SAASE,EAAapF,EAAG,IAChEqF,EAAGH,SAASH,EAAexE,IAAK,IAAO2E,SAASE,EAAaC,EAAG,KAIlE,QAASC,GAAuBC,GAC/B,QAASC,KACRJ,EAAeK,EACfC,IACAtF,EAAI,OAGL,QAASuF,KACR,OACC3F,EAAG4C,OAAOtB,EAAYkB,OAAS2B,EAAOnE,EACtCqF,EAAGzC,OAAOtB,EAAYiB,QAAU4B,EAAOkB,GAIzC,GACClB,GAASoB,EAAYV,EAAmBvD,EAAYK,SAAW3B,EAAE,EAAEqF,EAAE,GACrEI,EAAcE,GAEfvF,GAAI,+CAA+C+D,EAAOnE,EAAE,MAAMmE,EAAOkB,EAAE,KAExE5F,EAAOc,MAAMd,EAAOe,KAClBf,EAAOgB,aACVhB,EAAOgB,aAAa,YAAY8E,EAAU,SAAS,KAAKE,EAAYzF,EAAEyF,EAAYJ,GAElFrE,EAAK,0EAGNwE,IAKF,QAASE,MACJ,IAAU1D,EAASJ,GAAUgE,eAAeR,IAC/C7D,IAIF,QAASsE,GAAWC,GACnB,QAASC,GAAajB,GACrB,GAAIkB,GAAenB,EAAmBC,EAEtC1E,GAAI,6BAA6B6F,EAAK,WAAWD,EAAahG,EAAE,OAAOgG,EAAaX,GACpFD,GACCpF,EAAGgG,EAAahG,EAChBqF,EAAGW,EAAaX,GAGjBK,IACAtF,EAAI,OAGL,GACC6F,GAAWH,EAASxD,MAAM,KAAK,IAAM,GACrC4D,EAAWC,mBAAmBF,GAC9BnB,EAAWsB,SAASC,eAAeH,IAAaE,SAASE,kBAAkBJ,GAAU,EAEnFzG,GAAOc,MAAMd,EAAOe,KAClBf,EAAOgB,aACVhB,EAAOgB,aAAa8F,aAAaN,GAEjC7F,EAAI,kBAAkB6F,EAAK,gDAElBnB,EACViB,EAAajB,GAEb1E,EAAI,kBAAkB6F,EAAK,cAI7B,QAASO,KAIR,OAFGxE,EAASJ,GAAU6E,UAAUA,IAEzBnF,EAAYmB,MACnB,IAAK,QACJf,EAAYJ,EAAYK,OACxB,MACD,KAAK,UACJ2C,EAAqBJ,EAAW,GAChC,MACD,KAAK,WACJoB,GAAuB,EACvB,MACD,KAAK,iBACJA,GAAuB,EACvB,MACD,KAAK,aACJO,EAAW3B,EAAW,GACtB,MACD,KAAK,QACJwC,EAAYpF,EACZ,MACD,KAAK,OACJH,IACAa,EAASJ,GAAU+E,aAAarF,EAAYK,QAC5CK,EAASJ,GAAUgF,gBAAgBtF,EACnC,MACD,SACCH,IACAa,EAASJ,GAAUgF,gBAAgBtF,IAIrC,QAASuF,GAAYjF,GACpB,GAAIkF,IAAU,CAOd,OALK9E,GAASJ,KACbkF,GAAU,EACV9F,EAAKM,EAAYmB,KAAO,oBAAsBb,EAAW,kBAAoBhB,IAGvEkG,EAGR,QAASL,KACRzE,EAASJ,GAAU6E,UAAW,EAE3BM,SAASC,UAAUC,OACrBjF,EAASJ,GAAUD,OAAOuF,eAEzBC,MAAezF,EAAYuF,KAAK,KAAKjF,EAASJ,GAAUD,QAExDP,OAAegG,EAAQH,KAAK,KAAK,gBAAiB,SAAUjF,EAASJ,GAAUD,QAE/E4E,aAAe,SAASc,GACvBD,EAAQ,iBAAiB,cAAcC,EAAQrF,EAASJ,GAAUD,OAAOC,IAG1E0F,YAAe,SAAS7C,GACvBA,EAAUC,KAAK6C,UAAU9C,GACzB2C,EAAQ,eAAe,WAAW3C,EAASzC,EAASJ,GAAUD,OAAOC,MAMzE,GACChB,GAAMM,EAAMiB,KACZb,KACAM,EAAW,IAERgC,MACHtC,EAAcY,IACdN,EAAcN,EAAYO,IAErBgC,KAA6BgD,EAAYjF,KAC7Cd,EAAckB,EAASJ,GAAUxB,IACjCA,EAAI,cAAcQ,GAEbgE,KAAuB1B,KAC3BsD,MAIFpG,EAAI,aAAaQ,GAMnB,QAASqE,KACL,OAASG,IACXA,GACCpF,EAA2BiE,SAAvBxE,EAAO+H,YAA6B/H,EAAO+H,YAAcpB,SAASqB,gBAAgBC,WACtFrC,EAA2BpB,SAAvBxE,EAAOkI,YAA6BlI,EAAOkI,YAAcvB,SAASqB,gBAAgBG,WAEvFxH,EAAI,uBAAuBgF,EAAapF,EAAE,IAAIoF,EAAaC,IAI7D,QAAS9D,KACL,OAAS6D,IACX3F,EAAOiG,SAASN,EAAapF,EAAEoF,EAAaC,GAC5CjF,EAAI,uBAAuBgF,EAAapF,EAAE,IAAIoF,EAAaC,GAC3DD,EAAe,MAIjB,QAASsB,GAAYpF,GACpB,QAASuG,KACRxG,EAAQC,GACR8F,EAAQ,QAAQ,QAAQ9F,EAAYK,OAAOL,EAAYO,IAGxDzB,EAAI,6BAA6B,SAASkB,EAAYmB,KAAK,YAAY,WACvEwC,IACAxD,EAAWoG,EAAMvG,EAAY,QAG9B,QAASD,GAAQC,GAChB,QAASwG,GAAahF,GACrBxB,EAAYK,OAAOoG,MAAMjF,GAAaxB,EAAYwB,GAAa,KAC/D1C,EACC,YAAcwB,EACd,KAAOkB,EACP,WAAaxB,EAAYwB,GAAa,MAGxC,GAAIlB,GAAWN,EAAYK,OAAOE,EAC9BG,GAASJ,GAAUoG,YAAcF,EAAa,UAC9C9F,EAASJ,GAAUqG,WAAcH,EAAa,SAGnD,QAASrG,GAAW5B,EAAKyB,EAAY4G,GACjCA,IAAY5G,EAAYmB,MAAQtC,GAClCC,EAAI,+BACJD,EAAsBN,IAEtBA,IAIF,QAASuH,GAAQe,EAAUvH,EAAIe,EAAOE,GAClCF,GAAUA,EAAOyG,eACnBhI,EAAI,IAAM+H,EAAY,4BAA4BvH,EAAI,KACtDe,EAAOyG,cAAcC,YAAaxH,EAAQD,EAAKoB,EAASH,GAAMF,EAAOE,IAAIyG,gBAEzEtH,EAAK,IAAMmH,EAAY,sBACpBnG,EAASH,UACJG,GAASH,IAMnB,QAAS0G,GAAY5G,EAAO6G,GAC3B,QAASC,KACR,QAASC,GAASX,GACZY,MAAa3G,EAASJ,GAAUmG,IAAY,IAAM/F,EAASJ,GAAUmG,KACzEpG,EAAOoG,MAAMA,GAAS/F,EAASJ,GAAUmG,GAAS,KAClD3H,EAAI,QAAQ2H,EAAM,MAAM/F,EAASJ,GAAUmG,GAAO,OAIpDW,EAAS,aACTA,EAAS,aACTA,EAAS,YACTA,EAAS,YAGV,QAASE,GAAYhH,GAOpB,MANI,KAAKA,IACRD,EAAOE,GAAKD,EAAW,gBAAkBiH,IACzC/H,GAAc0H,OAAepI,IAC7BA,EAAI,6BAA8BwB,EAAU,KAAOD,EAAOmH,IAAM,MAG1DlH,EAGR,QAASmH,KACR3I,EAAI,sBAAwB4B,EAASJ,GAAUoH,UAAY,UAAY,YAAc,QAAUpH,GAC/FD,EAAOoG,MAAMkB,UAAW,IAAUjH,EAASJ,GAAUoH,UAAY,SAAW,OAC5ErH,EAAOqH,WAAiB,IAAUhH,EAASJ,GAAUoH,UAAY,KAAO,MAMzE,QAASE,MACH,gBAAkBlH,GAASJ,GAAoB,YAAO,MAAMI,EAASJ,GAAUuH,cACnFnH,EAASJ,GAAUwH,aAAepH,EAASJ,GAAUuH,WACrDnH,EAASJ,GAAUuH,WAAe,GAAKnH,EAASJ,GAAUuH,WAAa,MAIzE,QAASE,KACR,MAAOzH,GACN,IAAMI,EAASJ,GAAUwH,aACzB,IAAMpH,EAASJ,GAAUqG,UACzB,IAAMjG,EAASJ,GAAUxB,IACzB,IAAM4B,EAASJ,GAAU0H,SACzB,IAAMtH,EAASJ,GAAU2H,oBACzB,IAAMvH,EAASJ,GAAU4H,WACzB,IAAMxH,EAASJ,GAAUuH,WACzB,IAAMnH,EAASJ,GAAU6H,wBACzB,IAAMzH,EAASJ,GAAU8H,eACzB,IAAM1H,EAASJ,GAAU+H,YACzB,IAAM3H,EAASJ,GAAUgI,UACzB,IAAM5H,EAASJ,GAAUiI,YACzB,IAAM7H,EAASJ,GAAUkI,WACzB,IAAM9H,EAASJ,GAAUmI,uBAG3B,QAASC,KAIR,GACCvD,GAAoBzE,EAASJ,GAAU6E,SACvCwD,EAAoBjI,EAASJ,GAAU6H,0BAA2BS,IAE9DzD,GAAYwD,GAChBvD,GAAa/E,OAAOA,EAAQY,OAAO,EAAGC,MAAM,EAAGC,KAAK,SAQtD,QAAS0H,GAAKvJ,GACb,QAASwJ,KACRhD,EAAQ,gBAAgBxG,EAAIe,GAC5BqI,IAGDtK,EAAiBiC,EAAO,OAAOyI,GAC/BhD,EAAQ,OAAOxG,EAAIe,GAGpB,QAAS0I,GAAa7B,GACrB,GAAI,gBAAoBA,GACvB,KAAM,IAAI8B,WAAU,6BAItB,QAASC,GAAY/B,GACpB,IAAK,GAAIgC,KAAUC,GACdA,EAASC,eAAeF,KAC3BxI,EAASJ,GAAU4I,GAAUhC,EAAQkC,eAAeF,GAAUhC,EAAQgC,GAAUC,EAASD,IAK5F,QAASG,GAAiBlH,GACzB,MAAO,YAAcA,EAAa,IAAMA,EAGzC,QAASmH,GAAepC,GACvBA,EAAUA,MACVxG,EAASJ,IACR6E,UAAW,EACX9E,OAAaA,EACb8B,WAAa9B,EAAOmH,IAAIxG,MAAM,KAAKuI,MAAM,EAAE,GAAGC,KAAK,MAGpDT,EAAa7B,GACb+B,EAAY/B,GAEZxG,EAASJ,GAAU0G,cAAe,IAAStG,EAASJ,GAAUyB,YAAcsH,EAAgB3I,EAASJ,GAAU6B,YAAc,IAE7H3C,EAAakB,EAASJ,GAAUxB,IAGjC,QAAS2K,KACR,MAAQnJ,KAAYI,GAGrB,GAAIJ,GAAWgH,EAAYjH,EAAOE,GAE7BkJ,KAOJ/J,EAAK,oCANL4J,EAAepC,GACfO,IACAN,IACAS,IACAiB,EAAKd,MAMP,QAAS2B,GAASC,EAAGC,GAChB,OAASC,IACZA,EAAQC,WAAW,WAClBD,EAAQ,KACRF,KACEC,IAIL,QAASG,KACR,QAASC,GAAcpK,GACtB8J,EAAS,WACRO,EAAe,UAAUrK,EAAM,WAC9B,IAGH,QAASsK,KACL,WAAapF,SAASqF,iBACxBF,EAAe,cAAc,UAI/B,QAASA,GAAeG,EAAUxK,GACjC,QAASyK,GAAsB/J,GAC9B,MAAO,WAAaI,EAASJ,GAAUkI,YACrC9H,EAASJ,GAAU4H,aAClBxH,EAASJ,GAAU6E,SAGvB,IAAK,GAAI7E,KAAYI,GACjB2J,EAAsB/J,IACxBwF,EAAQsE,EAAUxK,EAAMkF,SAASC,eAAezE,GAAUA,GAK7DlC,EAAiBD,EAAO,UAAUwB,GAElCvB,EAAiBD,EAAO,SAAU,WAAW6L,EAAc,YAE3D5L,EAAiB0G,SAAS,mBAAmBoF,GAC7C9L,EAAiB0G,SAAS,2BAA2BoF,GACrD9L,EAAiBD,EAAO,UAAU,WAAW6L,EAAc,WAI5D,QAASM,KACR,QAASzB,GAAK3B,EAAQqD,GACrB,IAAIA,EAAQC,QACX,KAAM,IAAIxB,WAAU,oCACd,IAAI,WAAauB,EAAQC,QAAQC,cACvC,KAAM,IAAIzB,WAAU,iCAAiCuB,EAAQC,QAAQ,KAErEvD,GAAYsD,EAASrD,GAOvB,MAHAzI,KACAsL,IAEO,SAAuB7C,EAAQ1D,GACrC,aAAc,IACd,IAAK,YACL,IAAK,SACJnB,MAAMqD,UAAUgF,QAAQC,KACvB7F,SAAS8F,iBAAkBpH,GAAU,UACrCqF,EAAKlD,KAAKhD,OAAWuE,GAEtB,MACD,KAAK,SACJ2B,EAAK3B,EAAQ1D,EACb,MACD,SACC,KAAM,IAAIwF,WAAU,+BAA+B,GAAS,QAK/D,QAAS6B,GAAyBC,GACjCA,EAAEnB,GAAGoB,aAAe,SAAwB7D,GAC3C,MAAO8D,MAAKC,OAAO,UAAUC,KAAK,SAAUC,EAAOZ,GAClDtD,EAAYsD,EAASrD,KACnBkE,OAlrBL,GACC7D,GAAwB,EACxB/H,GAAwB,EACxB6L,EAAwB,UACxBtI,EAAwBsI,EAAUzM,OAClCW,EAAwB,gBACxBwB,EAAwBxB,EAAMX,OAC9BkF,EAAwB,KACxBjF,EAAwBV,EAAOU,sBAC/B+J,GAAyBvH,IAAI,EAAEiK,OAAO,EAAEC,WAAW,EAAEC,sBAAsB,GAC3E9K,KACAmJ,EAAwB,KAExBV,GACCjB,YAA4B,EAC5BE,eAA4B,KAC5BP,WAA4B,KAC5BC,aAA4B,EAC5BO,YAA4B,KAC5BtG,aAA4B,EAC5BwG,aAA4B,EAC5BN,qBAA4B,EAC5BE,wBAA4B,aAC5BH,SAA4B,GAC5BlJ,KAA4B,EAC5B2M,UAA4BpE,IAC5BqE,SAA4BrE,IAC5BsE,UAA4B,EAC5BC,SAA4B,EAC5BpD,WAA4B,SAC5Bd,WAA4B,EAC5BhB,YAA4B,EAC5BC,WAA4B,EAC5B2B,UAA4B,EAC5BG,uBAA4B,SAC5B9H,eAA4B,aAC5B0E,aAA4B,aAC5BnC,gBAA4B,WAAWxD,EAAK,yCAC5C4F,gBAA4B,aAC5BhB,eAA4B,WAAW,OAAO,GA+oB5CnG,GAAO0N,QAAUhB,EAAyBgB,QAExB,kBAAXC,SAAyBA,OAAOC,IAC1CD,UAAUxB,GACkB,gBAAX0B,SAAiD,gBAAnBA,QAAOC,QACtDD,OAAOC,QAAU3B,IAEjBnM,EAAO4M,aAAe5M,EAAO4M,cAAgBT,KAG5CnM","sourcesContent":["/*\n * File: iframeResizer.js\n * Desc: Force iframes to size to content.\n * Requires: iframeResizer.contentWindow.js to be loaded into the target frame.\n * Doc: https://github.com/davidjbradshaw/iframe-resizer\n * Author: David J. Bradshaw - dave@bradshaw.net\n * Contributor: Jure Mav - jure.mav@gmail.com\n * Contributor: Reed Dadoune - reed@dadoune.com\n */\n;(function(window) {\n\t'use strict';\n\n\tvar\n\t\tcount = 0,\n\t\tlogEnabled = false,\n\t\tmsgHeader = 'message',\n\t\tmsgHeaderLen = msgHeader.length,\n\t\tmsgId = '[iFrameSizer]', //Must match iframe msg ID\n\t\tmsgIdLen = msgId.length,\n\t\tpagePosition = null,\n\t\trequestAnimationFrame = window.requestAnimationFrame,\n\t\tresetRequiredMethods = {max:1,scroll:1,bodyScroll:1,documentElementScroll:1},\n\t\tsettings = {},\n\t\ttimer = null,\n\n\t\tdefaults = {\n\t\t\tautoResize : true,\n\t\t\tbodyBackground : null,\n\t\t\tbodyMargin : null,\n\t\t\tbodyMarginV1 : 8,\n\t\t\tbodyPadding : null,\n\t\t\tcheckOrigin : true,\n\t\t\tinPageLinks : false,\n\t\t\tenablePublicMethods : true,\n\t\t\theightCalculationMethod : 'bodyOffset',\n\t\t\tinterval : 32,\n\t\t\tlog : false,\n\t\t\tmaxHeight : Infinity,\n\t\t\tmaxWidth : Infinity,\n\t\t\tminHeight : 0,\n\t\t\tminWidth : 0,\n\t\t\tresizeFrom : 'parent',\n\t\t\tscrolling : false,\n\t\t\tsizeHeight : true,\n\t\t\tsizeWidth : false,\n\t\t\ttolerance : 0,\n\t\t\twidthCalculationMethod : 'scroll',\n\t\t\tclosedCallback : function(){},\n\t\t\tinitCallback : function(){},\n\t\t\tmessageCallback : function(){warn('MessageCallback function not defined');},\n\t\t\tresizedCallback : function(){},\n\t\t\tscrollCallback : function(){return true;}\n\t\t};\n\n\tfunction addEventListener(obj,evt,func){\n\t\tif ('addEventListener' in window){\n\t\t\tobj.addEventListener(evt,func, false);\n\t\t} else if ('attachEvent' in window){//IE\n\t\t\tobj.attachEvent('on'+evt,func);\n\t\t}\n\t}\n\n\tfunction setupRequestAnimationFrame(){\n\t\tvar\n\t\t\tvendors = ['moz', 'webkit', 'o', 'ms'],\n\t\t\tx;\n\n\t\t// Remove vendor prefixing if prefixed and break early if not\n\t\tfor (x = 0; x < vendors.length && !requestAnimationFrame; x += 1) {\n\t\t\trequestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\n\t\t}\n\n\t\tif (!(requestAnimationFrame)){\n\t\t\tlog(' RequestAnimationFrame not supported');\n\t\t}\n\t}\n\n\tfunction getMyID(){\n\t\tvar retStr = 'Host page';\n\n\t\tif (window.top!==window.self){\n\t\t\tif (window.parentIFrame){\n\t\t\t\tretStr = window.parentIFrame.getId();\n\t\t\t} else {\n\t\t\t\tretStr = 'Nested host page';\n\t\t\t}\n\t\t}\n\n\t\treturn retStr;\n\t}\n\n\tfunction formatLogMsg(msg){\n\t\treturn msgId + '[' + getMyID() + ']' + msg;\n\t}\n\n\tfunction log(msg){\n\t\tif (logEnabled && ('object' === typeof window.console)){\n\t\t\tconsole.log(formatLogMsg(msg));\n\t\t}\n\t}\n\n\tfunction warn(msg){\n\t\tif ('object' === typeof window.console){\n\t\t\tconsole.warn(formatLogMsg(msg));\n\t\t}\n\t}\n\n\tfunction iFrameListener(event){\n\t\tfunction resizeIFrame(){\n\t\t\tfunction resize(){\n\t\t\t\tsetSize(messageData);\n\t\t\t\tsetPagePosition();\n\t\t\t}\n\n\t\t\tensureInRange('Height');\n\t\t\tensureInRange('Width');\n\n\t\t\tsyncResize(resize,messageData,'resetPage');\n\t\t}\n\n\t\tfunction closeIFrame(iframe){\n\t\t\tvar iframeId = iframe.id;\n\n\t\t\tlog(' Removing iFrame: '+iframeId);\n\t\t\tiframe.parentNode.removeChild(iframe);\n\t\t\tsettings[iframeId].closedCallback(iframeId);\n\t\t\tdelete settings[iframeId];\n\t\t\tlog(' --');\n\t\t}\n\n\t\tfunction processMsg(){\n\t\t\tvar data = msg.substr(msgIdLen).split(':');\n\n\t\t\treturn {\n\t\t\t\tiframe: settings[data[0]].iframe,\n\t\t\t\tid: data[0],\n\t\t\t\theight: data[1],\n\t\t\t\twidth: data[2],\n\t\t\t\ttype: data[3]\n\t\t\t};\n\t\t}\n\n\t\tfunction ensureInRange(Dimension){\n\t\t\tvar\n\t\t\t\tmax = Number(settings[iframeId]['max'+Dimension]),\n\t\t\t\tmin = Number(settings[iframeId]['min'+Dimension]),\n\t\t\t\tdimension = Dimension.toLowerCase(),\n\t\t\t\tsize = Number(messageData[dimension]);\n\n\t\t\tif (min>max){\n\t\t\t\tthrow new Error('Value for min'+Dimension+' can not be greater than max'+Dimension);\n\t\t\t}\n\n\t\t\tlog(' Checking '+dimension+' is in range '+min+'-'+max);\n\n\t\t\tif (sizemax) {\n\t\t\t\tsize=max;\n\t\t\t\tlog(' Set '+dimension+' to max value');\n\t\t\t}\n\n\t\t\tmessageData[dimension]=''+size;\n\t\t}\n\n\n\t\tfunction isMessageFromIFrame(){\n\t\t\tfunction checkAllowedOrigin(){\n\t\t\t\tfunction checkList(){\n\t\t\t\t\tlog(' Checking connection is from allowed list of origins: ' + checkOrigin);\n\t\t\t\t\tvar i;\n\t\t\t\t\tfor (i = 0; i < checkOrigin.length; i++) {\n\t\t\t\t\t\tif (checkOrigin[i] === origin) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tfunction checkSingle(){\n\t\t\t\t\tvar remoteHost = settings[iframeId].remoteHost;\n\t\t\t\t\tlog(' Checking connection is from: '+remoteHost);\n\t\t\t\t\treturn origin === remoteHost;\n\t\t\t\t}\n\n\t\t\t\treturn checkOrigin.constructor === Array ? checkList() : checkSingle();\n\t\t\t}\n\n\t\t\tvar\n\t\t\t\torigin = event.origin,\n\t\t\t\tcheckOrigin = settings[iframeId].checkOrigin;\n\n\t\t\tif (checkOrigin) {\n\t\t\t\tif ((''+origin !== 'null') && !checkAllowedOrigin()) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'Unexpected message received from: ' + origin +\n\t\t\t\t\t\t' for ' + messageData.iframe.id +\n\t\t\t\t\t\t'. Message was: ' + event.data +\n\t\t\t\t\t\t'. This error can be disabled by setting the checkOrigin: false option or by providing of array of trusted domains.'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\tfunction isMessageForUs(){\n\t\t\treturn msgId === (('' + msg).substr(0,msgIdLen)) && (msg.substr(msgIdLen).split(':')[0] in settings); //''+Protects against non-string msg\n\t\t}\n\n\t\tfunction isMessageFromMetaParent(){\n\t\t\t//Test if this message is from a parent above us. This is an ugly test, however, updating\n\t\t\t//the message format would break backwards compatibity.\n\t\t\tvar retCode = messageData.type in {'true':1,'false':1,'undefined':1};\n\n\t\t\tif (retCode){\n\t\t\t\tlog(' Ignoring init message from meta parent page');\n\t\t\t}\n\n\t\t\treturn retCode;\n\t\t}\n\n\t\tfunction getMsgBody(offset){\n\t\t\treturn msg.substr(msg.indexOf(':')+msgHeaderLen+offset);\n\t\t}\n\n\t\tfunction forwardMsgFromIFrame(msgBody){\n\t\t\tlog(' MessageCallback passed: {iframe: '+ messageData.iframe.id + ', message: ' + msgBody + '}');\n\t\t\tsettings[iframeId].messageCallback({\n\t\t\t\tiframe: messageData.iframe,\n\t\t\t\tmessage: JSON.parse(msgBody)\n\t\t\t});\n\t\t\tlog(' --');\n\t\t}\n\n\t\tfunction checkIFrameExists(){\n\t\t\tif (null === messageData.iframe) {\n\t\t\t\twarn(' IFrame ('+messageData.id+') not found');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tfunction getElementPosition(target){\n\t\t\tvar iFramePosition = target.getBoundingClientRect();\n\n\t\t\tgetPagePosition();\n\n\t\t\treturn {\n\t\t\t\tx: parseInt(iFramePosition.left, 10) + parseInt(pagePosition.x, 10),\n\t\t\t\ty: parseInt(iFramePosition.top, 10) + parseInt(pagePosition.y, 10)\n\t\t\t};\n\t\t}\n\n\t\tfunction scrollRequestFromChild(addOffset){\n\t\t\tfunction reposition(){\n\t\t\t\tpagePosition = newPosition;\n\t\t\t\tscrollTo();\n\t\t\t\tlog(' --');\n\t\t\t}\n\n\t\t\tfunction calcOffset(){\n\t\t\t\treturn {\n\t\t\t\t\tx: Number(messageData.width) + offset.x,\n\t\t\t\t\ty: Number(messageData.height) + offset.y\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tvar\n\t\t\t\toffset = addOffset ? getElementPosition(messageData.iframe) : {x:0,y:0},\n\t\t\t\tnewPosition = calcOffset();\n\n\t\t\tlog(' Reposition requested from iFrame (offset x:'+offset.x+' y:'+offset.y+')');\n\n\t\t\tif(window.top!==window.self){\n\t\t\t\tif (window.parentIFrame){\n\t\t\t\t\twindow.parentIFrame['scrollTo'+(addOffset?'Offset':'')](newPosition.x,newPosition.y);\n\t\t\t\t} else {\n\t\t\t\t\twarn(' Unable to scroll to requested position, window.parentIFrame not found');\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treposition();\n\t\t\t}\n\n\t\t}\n\n\t\tfunction scrollTo(){\n\t\t\tif (false !== settings[iframeId].scrollCallback(pagePosition)){\n\t\t\t\tsetPagePosition();\n\t\t\t}\n\t\t}\n\n\t\tfunction findTarget(location){\n\t\t\tfunction jumpToTarget(target){\n\t\t\t\tvar jumpPosition = getElementPosition(target);\n\n\t\t\t\tlog(' Moving to in page link (#'+hash+') at x: '+jumpPosition.x+' y: '+jumpPosition.y);\n\t\t\t\tpagePosition = {\n\t\t\t\t\tx: jumpPosition.x,\n\t\t\t\t\ty: jumpPosition.y\n\t\t\t\t};\n\n\t\t\t\tscrollTo();\n\t\t\t\tlog(' --');\n\t\t\t}\n\n\t\t\tvar\n\t\t\t\thash = location.split('#')[1] || '',\n\t\t\t\thashData = decodeURIComponent(hash),\n\t\t\t\ttarget = document.getElementById(hashData) || document.getElementsByName(hashData)[0];\n\n\t\t\tif(window.top!==window.self){\n\t\t\t\tif (window.parentIFrame){\n\t\t\t\t\twindow.parentIFrame.moveToAnchor(hash);\n\t\t\t\t} else {\n\t\t\t\t\tlog(' In page link #'+hash+' not found and window.parentIFrame not found');\n\t\t\t\t}\n\t\t\t} else if (target){\n\t\t\t\tjumpToTarget(target);\n\t\t\t} else {\n\t\t\t\tlog(' In page link #'+hash+' not found');\n\t\t\t}\n\t\t}\n\n\t\tfunction actionMsg(){\n\n\t\t\tif(settings[iframeId].firstRun) firstRun();\n\n\t\t\tswitch(messageData.type){\n\t\t\tcase 'close':\n\t\t\t\tcloseIFrame(messageData.iframe);\n\t\t\t\tbreak;\n\t\t\tcase 'message':\n\t\t\t\tforwardMsgFromIFrame(getMsgBody(6));\n\t\t\t\tbreak;\n\t\t\tcase 'scrollTo':\n\t\t\t\tscrollRequestFromChild(false);\n\t\t\t\tbreak;\n\t\t\tcase 'scrollToOffset':\n\t\t\t\tscrollRequestFromChild(true);\n\t\t\t\tbreak;\n\t\t\tcase 'inPageLink':\n\t\t\t\tfindTarget(getMsgBody(9));\n\t\t\t\tbreak;\n\t\t\tcase 'reset':\n\t\t\t\tresetIFrame(messageData);\n\t\t\t\tbreak;\n\t\t\tcase 'init':\n\t\t\t\tresizeIFrame();\n\t\t\t\tsettings[iframeId].initCallback(messageData.iframe);\n\t\t\t\tsettings[iframeId].resizedCallback(messageData);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tresizeIFrame();\n\t\t\t\tsettings[iframeId].resizedCallback(messageData);\n\t\t\t}\n\t\t}\n\n\t\tfunction hasSettings(iframeId){\n\t\t\tvar retBool = true;\n\n\t\t\tif (!settings[iframeId]){\n\t\t\t\tretBool = false;\n\t\t\t\twarn(messageData.type + ' No settings for ' + iframeId + '. Message was: ' + msg);\n\t\t\t}\n\n\t\t\treturn retBool;\n\t\t}\n\n\t\tfunction firstRun() {\n\t\t\tsettings[iframeId].firstRun = false;\n\n\t\t\tif(Function.prototype.bind){ //Ignore unpolyfilled IE8.\n\t\t\t\tsettings[iframeId].iframe.iFrameResizer = {\n\n\t\t\t\t\tclose : closeIFrame.bind(null,settings[iframeId].iframe),\n\n\t\t\t\t\tresize : trigger.bind(null,'Window resize', 'resize', settings[iframeId].iframe),\n\n\t\t\t\t\tmoveToAnchor : function(anchor){\n\t\t\t\t\t\ttrigger('Move to anchor','inPageLink:'+anchor, settings[iframeId].iframe,iframeId);\n\t\t\t\t\t},\n\n\t\t\t\t\tsendMessage : function(message){\n\t\t\t\t\t\tmessage = JSON.stringify(message);\n\t\t\t\t\t\ttrigger('Send Message','message:'+message, settings[iframeId].iframe,iframeId);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tvar\n\t\t\tmsg = event.data,\n\t\t\tmessageData = {},\n\t\t\tiframeId = null;\n\n\t\tif (isMessageForUs()){\n\t\t\tmessageData = processMsg();\n\t\t\tiframeId = messageData.id;\n\n\t\t\tif (!isMessageFromMetaParent() && hasSettings(iframeId)){\n\t\t\t\tlogEnabled = settings[iframeId].log;\n\t\t\t\tlog(' Received: '+msg);\n\n\t\t\t\tif ( checkIFrameExists() && isMessageFromIFrame() ){\n\t\t\t\t\tactionMsg();\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tlog(' Ignored: '+msg);\n\t\t}\n\n\t}\n\n\n\tfunction getPagePosition (){\n\t\tif(null === pagePosition){\n\t\t\tpagePosition = {\n\t\t\t\tx: (window.pageXOffset !== undefined) ? window.pageXOffset : document.documentElement.scrollLeft,\n\t\t\t\ty: (window.pageYOffset !== undefined) ? window.pageYOffset : document.documentElement.scrollTop\n\t\t\t};\n\t\t\tlog(' Get page position: '+pagePosition.x+','+pagePosition.y);\n\t\t}\n\t}\n\n\tfunction setPagePosition(){\n\t\tif(null !== pagePosition){\n\t\t\twindow.scrollTo(pagePosition.x,pagePosition.y);\n\t\t\tlog(' Set page position: '+pagePosition.x+','+pagePosition.y);\n\t\t\tpagePosition = null;\n\t\t}\n\t}\n\n\tfunction resetIFrame(messageData){\n\t\tfunction reset(){\n\t\t\tsetSize(messageData);\n\t\t\ttrigger('reset','reset',messageData.iframe,messageData.id);\n\t\t}\n\n\t\tlog(' Size reset requested by '+('init'===messageData.type?'host page':'iFrame'));\n\t\tgetPagePosition();\n\t\tsyncResize(reset,messageData,'init');\n\t}\n\n\tfunction setSize(messageData){\n\t\tfunction setDimension(dimension){\n\t\t\tmessageData.iframe.style[dimension] = messageData[dimension] + 'px';\n\t\t\tlog(\n\t\t\t\t' IFrame (' + iframeId +\n\t\t\t\t') ' + dimension +\n\t\t\t\t' set to ' + messageData[dimension] + 'px'\n\t\t\t);\n\t\t}\n\t\tvar iframeId = messageData.iframe.id;\n\t\tif( settings[iframeId].sizeHeight) { setDimension('height'); }\n\t\tif( settings[iframeId].sizeWidth ) { setDimension('width'); }\n\t}\n\n\tfunction syncResize(func,messageData,doNotSync){\n\t\tif(doNotSync!==messageData.type && requestAnimationFrame){\n\t\t\tlog(' Requesting animation frame');\n\t\t\trequestAnimationFrame(func);\n\t\t} else {\n\t\t\tfunc();\n\t\t}\n\t}\n\n\tfunction trigger(calleeMsg,msg,iframe,id){\n\t\tif(iframe && iframe.contentWindow){\n\t\t\tlog('[' + calleeMsg + '] Sending msg to iframe ('+msg+')');\n\t\t\tiframe.contentWindow.postMessage( msgId + msg, settings[id || iframe.id].targetOrigin );\n\t\t} else {\n\t\t\twarn('[' + calleeMsg + '] IFrame not found');\n\t\t\tif(settings[id]) {\n\t\t\t\tdelete settings[id];\n\t\t\t}\n\t\t}\n\t}\n\n\n\tfunction setupIFrame(iframe,options){\n\t\tfunction setLimits(){\n\t\t\tfunction addStyle(style){\n\t\t\t\tif ((Infinity !== settings[iframeId][style]) && (0 !== settings[iframeId][style])){\n\t\t\t\t\tiframe.style[style] = settings[iframeId][style] + 'px';\n\t\t\t\t\tlog(' Set '+style+' = '+settings[iframeId][style]+'px');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\taddStyle('maxHeight');\n\t\t\taddStyle('minHeight');\n\t\t\taddStyle('maxWidth');\n\t\t\taddStyle('minWidth');\n\t\t}\n\n\t\tfunction ensureHasId(iframeId){\n\t\t\tif (''===iframeId){\n\t\t\t\tiframe.id = iframeId = 'iFrameResizer' + count++;\n\t\t\t\tlogEnabled = (options || {}).log;\n\t\t\t\tlog(' Added missing iframe ID: '+ iframeId +' (' + iframe.src + ')');\n\t\t\t}\n\n\t\t\treturn iframeId;\n\t\t}\n\n\t\tfunction setScrolling(){\n\t\t\tlog(' IFrame scrolling ' + (settings[iframeId].scrolling ? 'enabled' : 'disabled') + ' for ' + iframeId);\n\t\t\tiframe.style.overflow = false === settings[iframeId].scrolling ? 'hidden' : 'auto';\n\t\t\tiframe.scrolling = false === settings[iframeId].scrolling ? 'no' : 'yes';\n\t\t}\n\n\t\t//The V1 iFrame script expects an int, where as in V2 expects a CSS\n\t\t//string value such as '1px 3em', so if we have an int for V2, set V1=V2\n\t\t//and then convert V2 to a string PX value.\n\t\tfunction setupBodyMarginValues(){\n\t\t\tif (('number'===typeof(settings[iframeId].bodyMargin)) || ('0'===settings[iframeId].bodyMargin)){\n\t\t\t\tsettings[iframeId].bodyMarginV1 = settings[iframeId].bodyMargin;\n\t\t\t\tsettings[iframeId].bodyMargin = '' + settings[iframeId].bodyMargin + 'px';\n\t\t\t}\n\t\t}\n\n\t\tfunction createOutgoingMsg(){\n\t\t\treturn iframeId +\n\t\t\t\t':' + settings[iframeId].bodyMarginV1 +\n\t\t\t\t':' + settings[iframeId].sizeWidth +\n\t\t\t\t':' + settings[iframeId].log +\n\t\t\t\t':' + settings[iframeId].interval +\n\t\t\t\t':' + settings[iframeId].enablePublicMethods +\n\t\t\t\t':' + settings[iframeId].autoResize +\n\t\t\t\t':' + settings[iframeId].bodyMargin +\n\t\t\t\t':' + settings[iframeId].heightCalculationMethod +\n\t\t\t\t':' + settings[iframeId].bodyBackground +\n\t\t\t\t':' + settings[iframeId].bodyPadding +\n\t\t\t\t':' + settings[iframeId].tolerance +\n\t\t\t\t':' + settings[iframeId].inPageLinks +\n\t\t\t\t':' + settings[iframeId].resizeFrom +\n\t\t\t\t':' + settings[iframeId].widthCalculationMethod;\n\t\t}\n\n\t\tfunction checkReset(){\n\t\t\t// Reduce scope of firstRun to function, because IE8's JS execution\n\t\t\t// context stack is borked and this value gets externally\n\t\t\t// changed midway through running this function!!!\n\t\t\tvar\n\t\t\t\tfirstRun = settings[iframeId].firstRun,\n\t\t\t\trestRequertMethod = settings[iframeId].heightCalculationMethod in resetRequiredMethods;\n\n\t\t\tif (!firstRun && restRequertMethod){\n\t\t\t\tresetIFrame({iframe:iframe, height:0, width:0, type:'init'});\n\t\t\t}\n\t\t}\n\n\n\t\t//We have to call trigger twice, as we can not be sure if all\n\t\t//iframes have completed loading when this code runs. The\n\t\t//event listener also catches the page changing in the iFrame.\n\t\tfunction init(msg){\n\t\t\tfunction iFrameLoaded(){\n\t\t\t\ttrigger('iFrame.onload',msg,iframe);\n\t\t\t\tcheckReset();\n\t\t\t}\n\n\t\t\taddEventListener(iframe,'load',iFrameLoaded);\n\t\t\ttrigger('init',msg,iframe);\n\t\t}\n\n\t\tfunction checkOptions(options){\n\t\t\tif ('object' !== typeof options){\n\t\t\t\tthrow new TypeError('Options is not an object.');\n\t\t\t}\n\t\t}\n\n\t\tfunction copyOptions(options){\n\t\t\tfor (var option in defaults) {\n\t\t\t\tif (defaults.hasOwnProperty(option)){\n\t\t\t\t\tsettings[iframeId][option] = options.hasOwnProperty(option) ? options[option] : defaults[option];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction getTargetOrigin (remoteHost){\n\t\t\treturn 'file://' === remoteHost ? '*' : remoteHost; //Deal with Chrome wierdness.\n\t\t}\n\n\t\tfunction processOptions(options){\n\t\t\toptions = options || {};\n\t\t\tsettings[iframeId] = {\n\t\t\t\tfirstRun : true,\n\t\t\t\tiframe : iframe,\n\t\t\t\tremoteHost : iframe.src.split('/').slice(0,3).join('/')\n\t\t\t};\n\n\t\t\tcheckOptions(options);\n\t\t\tcopyOptions(options);\n\n\t\t\tsettings[iframeId].targetOrigin = true === settings[iframeId].checkOrigin ? getTargetOrigin(settings[iframeId].remoteHost) : '*';\n\n\t\t\tlogEnabled = settings[iframeId].log;\n\t\t}\n\n\t\tfunction beenHere(){\n\t\t\treturn (iframeId in settings);\n\t\t}\n\n\t\tvar iframeId = ensureHasId(iframe.id);\n\n\t\tif (!beenHere()){\n\t\t\tprocessOptions(options);\n\t\t\tsetScrolling();\n\t\t\tsetLimits();\n\t\t\tsetupBodyMarginValues();\n\t\t\tinit(createOutgoingMsg());\n\t\t} else {\n\t\t\twarn(' Ignored iFrame, already setup.');\n\t\t}\n\t}\n\n\tfunction throttle(fn,time){\n\t\tif (null === timer){\n\t\t\ttimer = setTimeout(function(){\n\t\t\t\ttimer = null;\n\t\t\t\tfn();\n\t\t\t}, time);\n\t\t}\n\t}\n\n\tfunction setupEventListeners(){\n\t\tfunction resizeIFrames(event){\n\t\t\tthrottle(function(){\n\t\t\t\tsendTriggerMsg('Window '+event,'resize');\n\t\t\t},66);\n\t\t}\n\n\t\tfunction tabVisible() {\n\t\t\tif('hidden' !== document.visibilityState) {\n\t\t\t\tsendTriggerMsg('Tab Visable','resize');\n\t\t\t}\n\t\t}\n\n\t\tfunction sendTriggerMsg(eventName,event){\n\t\t\tfunction isIFrameResizeEnabled(iframeId) {\n\t\t\t\treturn\t'parent' === settings[iframeId].resizeFrom &&\n\t\t\t\t\t\tsettings[iframeId].autoResize &&\n\t\t\t\t\t\t!settings[iframeId].firstRun;\n\t\t\t}\n\n\t\t\tfor (var iframeId in settings){\n\t\t\t\tif(isIFrameResizeEnabled(iframeId)){\n\t\t\t\t\ttrigger(eventName,event,document.getElementById(iframeId),iframeId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\taddEventListener(window,'message',iFrameListener);\n\n\t\taddEventListener(window,'resize', function(){resizeIFrames('resize');});\n\n\t\taddEventListener(document,'visibilitychange',tabVisible);\n\t\taddEventListener(document,'-webkit-visibilitychange',tabVisible); //Andriod 4.4\n\t\taddEventListener(window,'focusin',function(){resizeIFrames('focus');}); //IE8-9\n\t}\n\n\n\tfunction factory(){\n\t\tfunction init(options,element){\n\t\t\tif(!element.tagName) {\n\t\t\t\tthrow new TypeError('Object is not a valid DOM element');\n\t\t\t} else if ('IFRAME' !== element.tagName.toUpperCase()) {\n\t\t\t\tthrow new TypeError('Expected