{"version":3,"file":"iframeResizer.contentWindow.min.js","sources":["../src/iframeResizer.contentWindow.js"],"names":["addEventListener","el","evt","func","window","attachEvent","formatLogMsg","msg","msgID","myID","log","logging","console","warn","init","readData","setMargin","setBodyStyle","bodyBackground","bodyPadding","injectClearFixIntoBodyElement","checkHeightMode","stopInfiniteResizingOfIFrame","setupPublicMethods","startEventListeners","inPageLinks","setupInPageLinks","sendSize","strBool","str","data","initMsg","substr","msgIdLen","split","bodyMargin","undefined","Number","calculateWidth","interval","publicMethods","autoResize","bodyMarginStr","heightCalcMode","tolerance","enable","resizeFrom","chkCSS","attr","value","indexOf","document","body","style","documentElement","height","addTriggerEvent","options","addListener","eventName","eventType","eventNames","Array","prototype","map","initEventListeners","heightCalcModeDefault","getHeight","setupMutationObserver","clearFix","createElement","clear","display","appendChild","getPagePosition","x","pageXOffset","scrollLeft","y","pageYOffset","scrollTop","getElementPosition","elPosition","getBoundingClientRect","pagePosition","parseInt","left","top","findTarget","location","jumpToTarget","target","jumpPosition","hash","sendMsg","hashData","decodeURIComponent","getElementById","getElementsByName","checkLocationHash","href","bindAnchors","setupLink","linkClicked","e","preventDefault","this","getAttribute","forEach","call","querySelectorAll","bindLocationHash","initCheck","setTimeout","eventCancelTimer","enableInPageLinks","parentIFrame","close","getId","moveToAnchor","reset","resetIFrame","scrollTo","scrollToOffset","sendMessage","targetOrigin","JSON","stringify","setHeightCalculationMethod","heightCalculationMethod","setTargetOrigin","targetOriginDefault","size","customHeight","customWidth","valString","lockTrigger","initInterval","setInterval","Math","abs","setupInjectElementLoadListners","mutations","addLoadListener","element","width","src","mutation","type","attributeName","images","image","createMutationObserver","querySelector","config","attributes","attributeOldValue","characterData","characterDataOldValue","childList","subtree","observer","MutationObserver","observe","WebKitMutationObserver","getBodyOffsetHeight","getComputedBodyStyle","prop","convertUnitsToPxForIE8","PIXEL","test","base","runtimeStyle","currentStyle","pixelLeft","retVal","defaultView","getComputedStyle","offsetHeight","getBodyScrollHeight","scrollHeight","getDEOffsetHeight","getDEScrollHeight","getLowestElementHeight","allElements","allElementsLength","length","maxBottomVal","timer","Date","getTime","i","bottom","getAllHeights","getMaxHeight","max","apply","getMinHeight","min","getBestHeight","getWidth","scrollWidth","triggerEvent","triggerEventDesc","recordTrigger","resetPage","resizeIFrame","currentHeight","currentWidth","isDoubleFiredEvent","triggerLocked","doubleEventList","isSizeChangeDetected","checkTolarance","a","b","isForceResizableEvent","isForceResizableHeightCalcMode","resetRequiredMethods","logIgnored","checkDownSizing","clearTimeout","triggerLockedTimer","triggerReset","hcm","sendToParent","message","postMessage","receiver","event","isMessageForUs","initFromParent","source","firstRun","initLock","resetFromParent","resizeFromParent","getMessageType","isMiddleTier","isInitMsg","true","false","resize","click","scroll","bodyScroll","documentElementScroll","parent","offset","bodyOffset","documentElementOffset","grow","lowestElement"],"mappings":"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","sourcesContent":["/*\n * File: iframeResizer.contentWindow.js\n * Desc: Include this file in any page being loaded into an iframe\n * to force the iframe to resize to the content size.\n * Requires: iframeResizer.js on host page.\n * Author: David J. Bradshaw - dave@bradshaw.net\n * Contributor: Jure Mav - jure.mav@gmail.com\n * Contributor: Ian Caunce - ian@hallnet.co.uk\n */\n\n;(function() {\n\t'use strict';\n\n\tvar\n\t\tautoResize = true,\n\t\tbase = 10,\n\t\tbodyBackground = '',\n\t\tbodyMargin = 0,\n\t\tbodyMarginStr = '',\n\t\tbodyPadding = '',\n\t\tcalculateWidth = false,\n\t\tdoubleEventList = {'resize':1,'click':1},\n\t\teventCancelTimer = 128,\n\t\theight = 1,\n\t\tfirstRun = true,\n\t\theightCalcModeDefault = 'offset',\n\t\theightCalcMode = heightCalcModeDefault,\n\t\tinitLock = true,\n\t\tinitMsg = '',\n\t\tinPageLinks = {},\n\t\tinterval = 32,\n\t\tlogging = false,\n\t\tmsgID = '[iFrameSizer]', //Must match host page msg ID\n\t\tmsgIdLen = msgID.length,\n\t\tmyID = '',\n\t\tpublicMethods = false,\n\t\tresetRequiredMethods = {max:1,scroll:1,bodyScroll:1,documentElementScroll:1},\n\t\tresizeFrom = 'parent',\n\t\ttargetOriginDefault = '*',\n\t\ttarget = window.parent,\n\t\ttolerance = 0,\n\t\ttriggerLocked = false,\n\t\ttriggerLockedTimer = null,\n\t\twidth = 1;\n\n\n\tfunction addEventListener(el,evt,func){\n\t\tif ('addEventListener' in window){\n\t\t\tel.addEventListener(evt,func, false);\n\t\t} else if ('attachEvent' in window){ //IE\n\t\t\tel.attachEvent('on'+evt,func);\n\t\t}\n\t}\n\n\tfunction formatLogMsg(msg){\n\t\treturn msgID + '[' + myID + ']' + ' ' + msg;\n\t}\n\n\tfunction log(msg){\n\t\tif (logging && ('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\n\tfunction init(){\n\t\tlog('Initialising iFrame');\n\t\treadData();\n\t\tsetMargin();\n\t\tsetBodyStyle('background',bodyBackground);\n\t\tsetBodyStyle('padding',bodyPadding);\n\t\tinjectClearFixIntoBodyElement();\n\t\tcheckHeightMode();\n\t\tstopInfiniteResizingOfIFrame();\n\t\tsetupPublicMethods();\n\t\tstartEventListeners();\n\t\tinPageLinks = setupInPageLinks();\n\t\tsendSize('init','Init message from host page');\n\t}\n\n\tfunction readData(){\n\n\t\tvar data = initMsg.substr(msgIdLen).split(':');\n\n\t\tfunction strBool(str){\n\t\t\treturn 'true' === str ? true : false;\n\t\t}\n\n\t\tmyID = data[0];\n\t\tbodyMargin = (undefined !== data[1]) ? Number(data[1]) : bodyMargin; //For V1 compatibility\n\t\tcalculateWidth = (undefined !== data[2]) ? strBool(data[2]) : calculateWidth;\n\t\tlogging = (undefined !== data[3]) ? strBool(data[3]) : logging;\n\t\tinterval = (undefined !== data[4]) ? Number(data[4]) : interval;\n\t\tpublicMethods = (undefined !== data[5]) ? strBool(data[5]) : publicMethods;\n\t\tautoResize = (undefined !== data[6]) ? strBool(data[6]) : autoResize;\n\t\tbodyMarginStr = data[7];\n\t\theightCalcMode = (undefined !== data[8]) ? data[8] : heightCalcMode;\n\t\tbodyBackground = data[9];\n\t\tbodyPadding = data[10];\n\t\ttolerance = (undefined !== data[11]) ? Number(data[11]) : tolerance;\n\t\tinPageLinks.enable = (undefined !== data[12]) ? strBool(data[12]): false;\n\t\tresizeFrom = data[13];\n\t}\n\n\tfunction chkCSS(attr,value){\n\t\tif (-1 !== value.indexOf('-')){\n\t\t\twarn('Negative CSS value ignored for '+attr);\n\t\t\tvalue='';\n\t\t}\n\t\treturn value;\n\t}\n\n\tfunction setBodyStyle(attr,value){\n\t\tif ((undefined !== value) && ('' !== value) && ('null' !== value)){\n\t\t\tdocument.body.style[attr] = value;\n\t\t\tlog('Body '+attr+' set to \"'+value+'\"');\n\t\t}\n\t}\n\n\tfunction setMargin(){\n\t\t//If called via V1 script, convert bodyMargin from int to str\n\t\tif (undefined === bodyMarginStr){\n\t\t\tbodyMarginStr = bodyMargin+'px';\n\t\t}\n\t\tchkCSS('margin',bodyMarginStr);\n\t\tsetBodyStyle('margin',bodyMarginStr);\n\t}\n\n\tfunction stopInfiniteResizingOfIFrame(){\n\t\tdocument.documentElement.style.height = '';\n\t\tdocument.body.style.height = '';\n\t\tlog('HTML & body height set to \"auto\"');\n\t}\n\n\n\tfunction addTriggerEvent(options){\n\t\tfunction addListener(eventName){\n\t\t\taddEventListener(window,eventName,function(e){\n\t\t\t\tsendSize(options.eventName,options.eventType);\n\t\t\t});\n\t\t}\n\n\t\tif(options.eventNames && Array.prototype.map){\n\t\t\toptions.eventName = options.eventNames[0];\n\t\t\toptions.eventNames.map(addListener);\n\t\t} else {\n\t\t\taddListener(options.eventName);\n\t\t}\n\n\t\tlog('Added event listener: ' + options.eventType);\n\t}\n\n\tfunction initEventListeners(){\n\t\taddTriggerEvent({ eventType: 'Animation Start', eventNames: ['animationstart','webkitAnimationStart'] });\n\t\taddTriggerEvent({ eventType: 'Animation Iteration', eventNames: ['animationiteration','webkitAnimationIteration'] });\n\t\taddTriggerEvent({ eventType: 'Animation End', eventNames: ['animationend','webkitAnimationEnd'] });\n\t\taddTriggerEvent({ eventType: 'Device Orientation Change', eventName: 'deviceorientation' });\n\t\taddTriggerEvent({ eventType: 'Transition End', eventNames: ['transitionend','webkitTransitionEnd','MSTransitionEnd','oTransitionEnd','otransitionend'] });\n\t\taddTriggerEvent({ eventType: 'Window Clicked', eventName: 'click' });\n\t\t//addTriggerEvent({ eventType: 'Window Mouse Down', eventName: 'mousedown' });\n\t\t//addTriggerEvent({ eventType: 'Window Mouse Up', eventName: 'mouseup' });\n\t\tif('child' === resizeFrom){\n\t\t\taddTriggerEvent({ eventType: 'IFrame Resized', eventName: 'resize' });\n\t\t}\n\t}\n\n\tfunction checkHeightMode(){\n\t\tif (heightCalcModeDefault !== heightCalcMode){\n\t\t\tif (!(heightCalcMode in getHeight)){\n\t\t\t\twarn(heightCalcMode + ' is not a valid option for heightCalculationMethod.');\n\t\t\t\theightCalcMode='bodyScroll';\n\t\t\t}\n\t\t\tlog('Height calculation method set to \"'+heightCalcMode+'\"');\n\t\t}\n\t}\n\n\tfunction startEventListeners(){\n\t\tif ( true === autoResize ) {\n\t\t\tinitEventListeners();\n\t\t\tsetupMutationObserver();\n\t\t}\n\t\telse {\n\t\t\tlog('Auto Resize disabled');\n\t\t}\n\t}\n\n\tfunction injectClearFixIntoBodyElement(){\n\t\tvar clearFix = document.createElement('div');\n\t\tclearFix.style.clear = 'both';\n\t\tclearFix.style.display = 'block'; //Guard against this having been globally redefined in CSS.\n\t\tdocument.body.appendChild(clearFix);\n\t}\n\n\tfunction setupInPageLinks(){\n\n\t\tfunction getPagePosition (){\n\t\t\treturn {\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}\n\n\t\tfunction getElementPosition(el){\n\t\t\tvar\n\t\t\t\telPosition = el.getBoundingClientRect(),\n\t\t\t\tpagePosition = getPagePosition();\n\n\t\t\treturn {\n\t\t\t\tx: parseInt(elPosition.left,10) + parseInt(pagePosition.x,10),\n\t\t\t\ty: parseInt(elPosition.top,10) + parseInt(pagePosition.y,10)\n\t\t\t};\n\t\t}\n\n\t\tfunction findTarget(location){\n\t\t\tvar hash = location.split(\"#\")[1] || \"\";\n\t\t\tvar hashData = decodeURIComponent(hash);\n\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\tsendMsg(jumpPosition.y, jumpPosition.x, 'scrollToOffset'); // X&Y reversed at sendMsg uses height/width\n\t\t\t}\n\n\t\t\tvar target = document.getElementById(hashData) || document.getElementsByName(hashData)[0];\n\n\t\t\tif (target){\n\t\t\t\tjumpToTarget(target);\n\t\t\t} else {\n\t\t\t\tlog('In page link (#' + hash + ') not found in iFrame, so sending to parent');\n\t\t\t\tsendMsg(0,0,'inPageLink','#'+hash);\n\t\t\t}\n\t\t}\n\n\t\tfunction checkLocationHash(){\n\t\t\tif ('' !== location.hash && '#' !== location.hash){\n\t\t\t\tfindTarget(location.href);\n\t\t\t}\n\t\t}\n\n\t\tfunction bindAnchors(){\n\t\t\tfunction setupLink(el){\n\t\t\t\tfunction linkClicked(e){\n\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\t/*jshint validthis:true */\n\t\t\t\t\tfindTarget(this.getAttribute('href'));\n\t\t\t\t}\n\n\t\t\t\tif ('#' !== el.getAttribute('href')){\n\t\t\t\t\taddEventListener(el,'click',linkClicked);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tArray.prototype.forEach.call( document.querySelectorAll( 'a[href^=\"#\"]' ), setupLink );\n\t\t}\n\n\t\tfunction bindLocationHash(){\n\t\t\taddEventListener(window,'hashchange',checkLocationHash);\n\t\t}\n\n\t\tfunction initCheck(){ //check if page loaded with location hash after init resize\n\t\t\tsetTimeout(checkLocationHash,eventCancelTimer);\n\t\t}\n\n\t\tfunction enableInPageLinks(){\n\t\t\tif(Array.prototype.forEach && document.querySelectorAll){\n\t\t\t\tlog('Setting up location.hash handlers');\n\t\t\t\tbindAnchors();\n\t\t\t\tbindLocationHash();\n\t\t\t\tinitCheck();\n\t\t\t} else {\n\t\t\t\twarn('In page linking not fully supported in this browser! (See README.md for IE8 workaround)');\n\t\t\t}\n\t\t}\n\n\t\tif(inPageLinks.enable){\n\t\t\tenableInPageLinks();\n\t\t} else {\n\t\t\tlog('In page linking not enabled');\n\t\t}\n\n\t\treturn {\n\t\t\tfindTarget:findTarget\n\t\t};\n\t}\n\n\tfunction setupPublicMethods(){\n\t\tif (publicMethods) {\n\t\t\tlog('Enable public methods');\n\n\t\t\twindow.parentIFrame = {\n\t\t\t\tclose: function closeF(){\n\t\t\t\t\tsendMsg(0,0,'close');\n\t\t\t\t},\n\t\t\t\tgetId: function getIdF(){\n\t\t\t\t\treturn myID;\n\t\t\t\t},\n\t\t\t\tmoveToAnchor: function moveToAnchorF(hash){\n\t\t\t\t\tinPageLinks.findTarget(hash);\n\t\t\t\t},\n\t\t\t\treset: function resetF(){\n\t\t\t\t\tresetIFrame('parentIFrame.reset');\n\t\t\t\t},\n\t\t\t\tscrollTo: function scrollToF(x,y){\n\t\t\t\t\tsendMsg(y,x,'scrollTo'); // X&Y reversed at sendMsg uses height/width\n\t\t\t\t},\n\t\t\t\tscrollToOffset: function scrollToF(x,y){\n\t\t\t\t\tsendMsg(y,x,'scrollToOffset'); // X&Y reversed at sendMsg uses height/width\n\t\t\t\t},\n\t\t\t\tsendMessage: function sendMessageF(msg,targetOrigin){\n\t\t\t\t\tsendMsg(0,0,'message',JSON.stringify(msg),targetOrigin);\n\t\t\t\t},\n\t\t\t\tsetHeightCalculationMethod: function setHeightCalculationMethodF(heightCalculationMethod){\n\t\t\t\t\theightCalcMode = heightCalculationMethod;\n\t\t\t\t\tcheckHeightMode();\n\t\t\t\t},\n\t\t\t\tsetTargetOrigin: function setTargetOriginF(targetOrigin){\n\t\t\t\t\tlog('Set targetOrigin: '+targetOrigin);\n\t\t\t\t\ttargetOriginDefault = targetOrigin;\n\t\t\t\t},\n\t\t\t\tsize: function sizeF(customHeight, customWidth){\n\t\t\t\t\tvar valString = ''+(customHeight?customHeight:'')+(customWidth?','+customWidth:'');\n\t\t\t\t\tlockTrigger();\n\t\t\t\t\tsendSize('size','parentIFrame.size('+valString+')', customHeight, customWidth);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t}\n\n\tfunction initInterval(){\n\t\tif ( 0 !== interval ){\n\t\t\tlog('setInterval: '+interval+'ms');\n\t\t\tsetInterval(function(){\n\t\t\t\tsendSize('interval','setInterval: '+interval);\n\t\t\t},Math.abs(interval));\n\t\t}\n\t}\n\n\tfunction setupInjectElementLoadListners(mutations){\n\t\tfunction addLoadListener(element){\n\t\t\tif (element.height === undefined || element.width === undefined || 0 === element.height || 0 === element.width){\n\t\t\t\tlog('Attach listerner to '+element.src);\n\t\t\t\taddEventListener(element,'load', function imageLoaded(){\n\t\t\t\t\tsendSize('imageLoad','Image loaded');\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tmutations.forEach(function (mutation) {\n\t\t\tif (mutation.type === 'attributes' && mutation.attributeName === 'src'){\n\t\t\t\taddLoadListener(mutation.target);\n\t\t\t} else if (mutation.type === 'childList'){\n\t\t\t\tvar images = mutation.target.querySelectorAll('img');\n\t\t\t\tArray.prototype.forEach.call(images,function (image) {\n\t\t\t\t\taddLoadListener(image);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction setupMutationObserver(){\n\n\t\tvar MutationObserver = window.MutationObserver || window.WebKitMutationObserver;\n\n\t\tfunction createMutationObserver(){\n\t\t\tvar\n\t\t\t\ttarget = document.querySelector('body'),\n\n\t\t\t\tconfig = {\n\t\t\t\t\tattributes : true,\n\t\t\t\t\tattributeOldValue : false,\n\t\t\t\t\tcharacterData : true,\n\t\t\t\t\tcharacterDataOldValue : false,\n\t\t\t\t\tchildList : true,\n\t\t\t\t\tsubtree : true\n\t\t\t\t},\n\n\t\t\t\tobserver = new MutationObserver(function(mutations) {\n\t\t\t\t\tsendSize('mutationObserver','mutationObserver: ' + mutations[0].target + ' ' + mutations[0].type);\n\t\t\t\t\tsetupInjectElementLoadListners(mutations); //Deal with WebKit asyncing image loading when tags are injected into the page\n\t\t\t\t});\n\n\t\t\tlog('Enable MutationObserver');\n\t\t\tobserver.observe(target, config);\n\t\t}\n\n\t\tif (MutationObserver){\n\t\t\tif (0 > interval) {\n\t\t\t\tinitInterval();\n\t\t\t} else {\n\t\t\t\tcreateMutationObserver();\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\twarn('MutationObserver not supported in this browser!');\n\t\t\tinitInterval();\n\t\t}\n\t}\n\n\n\t// document.documentElement.offsetHeight is not reliable, so\n\t// we have to jump through hoops to get a better value.\n\tfunction getBodyOffsetHeight(){\n\t\tfunction getComputedBodyStyle(prop) {\n\t\t\tfunction convertUnitsToPxForIE8(value) {\n\t\t\t\tvar PIXEL = /^\\d+(px)?$/i;\n\n\t\t\t\tif (PIXEL.test(value)) {\n\t\t\t\t\treturn parseInt(value,base);\n\t\t\t\t}\n\n\t\t\t\tvar\n\t\t\t\t\tstyle = el.style.left,\n\t\t\t\t\truntimeStyle = el.runtimeStyle.left;\n\n\t\t\t\tel.runtimeStyle.left = el.currentStyle.left;\n\t\t\t\tel.style.left = value || 0;\n\t\t\t\tvalue = el.style.pixelLeft;\n\t\t\t\tel.style.left = style;\n\t\t\t\tel.runtimeStyle.left = runtimeStyle;\n\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tvar\n\t\t\t\tel = document.body,\n\t\t\t\tretVal = 0;\n\n\t\t\tif (('defaultView' in document) && ('getComputedStyle' in document.defaultView)) {\n\t\t\t\tretVal = document.defaultView.getComputedStyle(el, null);\n\t\t\t\tretVal = (null !== retVal) ? retVal[prop] : 0;\n\t\t\t} else {//IE8\n\t\t\t\tretVal = convertUnitsToPxForIE8(el.currentStyle[prop]);\n\t\t\t}\n\n\t\t\treturn parseInt(retVal,base);\n\t\t}\n\n\t\treturn document.body.offsetHeight +\n\t\t\t\tgetComputedBodyStyle('marginTop') +\n\t\t\t\tgetComputedBodyStyle('marginBottom');\n\t}\n\n\tfunction getBodyScrollHeight(){\n\t\treturn document.body.scrollHeight;\n\t}\n\n\tfunction getDEOffsetHeight(){\n\t\treturn document.documentElement.offsetHeight;\n\t}\n\n\tfunction getDEScrollHeight(){\n\t\treturn document.documentElement.scrollHeight;\n\t}\n\n\t//From https://github.com/guardian/iframe-messenger\n\tfunction getLowestElementHeight() {\n\t\tvar\n\t\t\tallElements = document.querySelectorAll('body *'),\n\t\t\tallElementsLength = allElements.length,\n\t\t\tmaxBottomVal = 0,\n\t\t\ttimer = new Date().getTime();\n\n\t\tfor (var i = 0; i < allElementsLength; i++) {\n\t\t\tif (allElements[i].getBoundingClientRect().bottom > maxBottomVal) {\n\t\t\t\tmaxBottomVal = allElements[i].getBoundingClientRect().bottom;\n\t\t\t}\n\t\t}\n\n\t\ttimer = new Date().getTime() - timer;\n\n\t\tlog('Parsed '+allElementsLength+' HTML elements');\n\t\tlog('LowestElement bottom position calculated in ' + timer + 'ms');\n\n\t\treturn maxBottomVal;\n\t}\n\n\tfunction getAllHeights(){\n\t\treturn [\n\t\t\tgetBodyOffsetHeight(),\n\t\t\tgetBodyScrollHeight(),\n\t\t\tgetDEOffsetHeight(),\n\t\t\tgetDEScrollHeight()\n\t\t];\n\t}\n\n\tfunction getMaxHeight(){\n\t\treturn Math.max.apply(null,getAllHeights());\n\t}\n\n\tfunction getMinHeight(){\n\t\treturn Math.min.apply(null,getAllHeights());\n\t}\n\n\tfunction getBestHeight(){\n\t\treturn Math.max(getBodyOffsetHeight(),getLowestElementHeight());\n\t}\n\n\tvar getHeight = {\n\t\toffset : getBodyOffsetHeight, //Backward compatability\n\t\tbodyOffset : getBodyOffsetHeight,\n\t\tbodyScroll : getBodyScrollHeight,\n\t\tdocumentElementOffset : getDEOffsetHeight,\n\t\tscroll : getDEScrollHeight, //Backward compatability\n\t\tdocumentElementScroll : getDEScrollHeight,\n\t\tmax : getMaxHeight,\n\t\tmin : getMinHeight,\n\t\tgrow : getMaxHeight,\n\t\tlowestElement : getBestHeight\n\t};\n\n\tfunction getWidth(){\n\t\treturn Math.max(\n\t\t\tdocument.documentElement.scrollWidth,\n\t\t\tdocument.body.scrollWidth\n\t\t);\n\t}\n\n\tfunction sendSize(triggerEvent, triggerEventDesc, customHeight, customWidth){\n\n\t\tvar\tcurrentHeight,currentWidth;\n\n\t\tfunction recordTrigger(){\n\t\t\tif (!(triggerEvent in {'reset':1,'resetPage':1,'init':1})){\n\t\t\t\tlog( 'Trigger event: ' + triggerEventDesc );\n\t\t\t}\n\t\t}\n\n\t\tfunction resizeIFrame(){\n\t\t\theight = currentHeight;\n\t\t\twidth = currentWidth;\n\n\t\t\tsendMsg(height,width,triggerEvent);\n\t\t}\n\n\t\tfunction isDoubleFiredEvent(){\n\t\t\treturn triggerLocked && (triggerEvent in doubleEventList);\n\t\t}\n\n\t\tfunction isSizeChangeDetected(){\n\t\t\tfunction checkTolarance(a,b){\n\t\t\t\tvar retVal = Math.abs(a-b) <= tolerance;\n\t\t\t\treturn !retVal;\n\t\t\t}\n\n\t\t\tcurrentHeight = (undefined !== customHeight) ? customHeight : getHeight[heightCalcMode]();\n\t\t\tcurrentWidth = (undefined !== customWidth ) ? customWidth : getWidth();\n\n\t\t\treturn\tcheckTolarance(height,currentHeight) ||\n\t\t\t\t\t(calculateWidth && checkTolarance(width,currentWidth));\n\t\t}\n\n\t\tfunction isForceResizableEvent(){\n\t\t\treturn !(triggerEvent in {'init':1,'interval':1,'size':1});\n\t\t}\n\n\t\tfunction isForceResizableHeightCalcMode(){\n\t\t\treturn (heightCalcMode in resetRequiredMethods);\n\t\t}\n\n\t\tfunction logIgnored(){\n\t\t\tlog('No change in size detected');\n\t\t}\n\n\t\tfunction checkDownSizing(){\n\t\t\tif (isForceResizableEvent() && isForceResizableHeightCalcMode()){\n\t\t\t\tresetIFrame(triggerEventDesc);\n\t\t\t} else if (!(triggerEvent in {'interval':1})){\n\t\t\t\trecordTrigger();\n\t\t\t\tlogIgnored();\n\t\t\t}\n\t\t}\n\n\t\tif (!isDoubleFiredEvent()){\n\t\t\tif (isSizeChangeDetected()){\n\t\t\t\trecordTrigger();\n\t\t\t\tlockTrigger();\n\t\t\t\tresizeIFrame();\n\t\t\t} else {\n\t\t\t\tcheckDownSizing();\n\t\t\t}\n\t\t} else {\n\t\t\tlog('Trigger event cancelled: '+triggerEvent);\n\t\t}\n\t}\n\n\tfunction lockTrigger(){\n\t\tif (!triggerLocked){\n\t\t\ttriggerLocked = true;\n\t\t\tlog('Trigger event lock on');\n\t\t}\n\t\tclearTimeout(triggerLockedTimer);\n\t\ttriggerLockedTimer = setTimeout(function(){\n\t\t\ttriggerLocked = false;\n\t\t\tlog('Trigger event lock off');\n\t\t\tlog('--');\n\t\t},eventCancelTimer);\n\t}\n\n\tfunction triggerReset(triggerEvent){\n\t\theight = getHeight[heightCalcMode]();\n\t\twidth = getWidth();\n\n\t\tsendMsg(height,width,triggerEvent);\n\t}\n\n\tfunction resetIFrame(triggerEventDesc){\n\t\tvar hcm = heightCalcMode;\n\t\theightCalcMode = heightCalcModeDefault;\n\n\t\tlog('Reset trigger event: ' + triggerEventDesc);\n\t\tlockTrigger();\n\t\ttriggerReset('reset');\n\n\t\theightCalcMode = hcm;\n\t}\n\n\tfunction sendMsg(height,width,triggerEvent,msg,targetOrigin){\n\t\tfunction setTargetOrigin(){\n\t\t\tif (undefined === targetOrigin){\n\t\t\t\ttargetOrigin = targetOriginDefault;\n\t\t\t} else {\n\t\t\t\tlog('Message targetOrigin: '+targetOrigin);\n\t\t\t}\n\t\t}\n\n\t\tfunction sendToParent(){\n\t\t\tvar\n\t\t\t\tsize = height + ':' + width,\n\t\t\t\tmessage = myID + ':' + size + ':' + triggerEvent + (undefined !== msg ? ':' + msg : '');\n\n\t\t\tlog('Sending message to host page (' + message + ')');\n\t\t\ttarget.postMessage( msgID + message, targetOrigin);\n\t\t}\n\n\t\tsetTargetOrigin();\n\t\tsendToParent();\n\t}\n\n\tfunction receiver(event) {\n\t\tfunction isMessageForUs(){\n\t\t\treturn msgID === (''+event.data).substr(0,msgIdLen); //''+ Protects against non-string messages\n\t\t}\n\n\t\tfunction initFromParent(){\n\t\t\tinitMsg = event.data;\n\t\t\ttarget = event.source;\n\n\t\t\tinit();\n\t\t\tfirstRun = false;\n\t\t\tsetTimeout(function(){ initLock = false;},eventCancelTimer);\n\t\t}\n\n\t\tfunction resetFromParent(){\n\t\t\tif (!initLock){\n\t\t\t\tlog('Page size reset by host page');\n\t\t\t\ttriggerReset('resetPage');\n\t\t\t} else {\n\t\t\t\tlog('Page reset ignored by init');\n\t\t\t}\n\t\t}\n\n\t\tfunction resizeFromParent(){\n\t\t\tsendSize('resizeParent','Parent window resized');\n\t\t}\n\n\t\tfunction getMessageType(){\n\t\t\treturn event.data.split(']')[1];\n\t\t}\n\n\t\tfunction isMiddleTier(){\n\t\t\treturn ('iFrameResize' in window);\n\t\t}\n\n\t\tfunction isInitMsg(){\n\t\t\t//test if this message is from a child below us. This is an ugly test, however, updating\n\t\t\t//the message format would break backwards compatibity.\n\t\t\treturn event.data.split(':')[2] in {'true':1,'false':1};\n\t\t}\n\n\t\tif (isMessageForUs()){\n\t\t\tif (firstRun === false) {\n\t\t\t\tif ('reset' === getMessageType()){\n\t\t\t\t\tresetFromParent();\n\t\t\t\t} else if ('resize' === getMessageType()){\n\t\t\t\t\tresizeFromParent();\n\t\t\t\t} else if (event.data !== initMsg && !isMiddleTier()){\n\t\t\t\t\twarn('Unexpected message ('+event.data+')');\n\t\t\t\t}\n\t\t\t} else if (isInitMsg()) {\n\t\t\t\tinitFromParent();\n\t\t\t} else {\n\t\t\t\twarn('Received message of type ('+getMessageType()+') before initialization.');\n\t\t\t}\n\t\t}\n\t}\n\n\taddEventListener(window, 'message', receiver);\n\n})();\n"]}