\",{text:b})}}},functionAttributes:[\"beforeOpen\",\"afterOpen\",\"beforeContent\",\"afterContent\",\"beforeClose\",\"afterClose\"],readElementConfig:function(b,c){var d=this,e=new RegExp(\"^data-\"+c+\"-(.*)\"),f={};return b&&b.attributes&&a.each(b.attributes,function(){var b=this.name.match(e);if(b){var c=this.value,g=a.camelCase(b[1]);if(a.inArray(g,d.functionAttributes)>=0)c=new Function(c);else try{c=JSON.parse(c)}catch(h){}f[g]=c}}),f},extend:function(b,c){var d=function(){this.constructor=b};return d.prototype=this.prototype,b.prototype=new d,b.__super__=this.prototype,a.extend(b,this,c),b.defaults=b.prototype,b},attach:function(b,c,d){var e=this;\"object\"!=typeof c||c instanceof a!=!1||d||(d=c,c=void 0),d=a.extend({},d);var f,g=d.namespace||e.defaults.namespace,h=a.extend({},e.defaults,e.readElementConfig(b[0],g),d),i=function(g){var i=a(g.currentTarget),j=a.extend({$source:b,$currentTarget:i},e.readElementConfig(b[0],h.namespace),e.readElementConfig(g.currentTarget,h.namespace),d),k=f||i.data(\"featherlight-persisted\")||new e(c,j);\"shared\"===k.persist?f=k:k.persist!==!1&&i.data(\"featherlight-persisted\",k),j.$currentTarget.blur&&j.$currentTarget.blur(),k.open(g)};return b.on(h.openTrigger+\".\"+h.namespace,h.filter,i),i},current:function(){var a=this.opened();return a[a.length-1]||null},opened:function(){var b=this;return f(),a.grep(e,function(a){return a instanceof b})},close:function(a){var b=this.current();return b?b.close(a):void 0},_onReady:function(){var b=this;b.autoBind&&(a(b.autoBind).each(function(){b.attach(a(this))}),a(document).on(\"click\",b.autoBind,function(c){if(!c.isDefaultPrevented()){var d=b.attach(a(c.currentTarget));d(c)}}))},_callbackChain:{onKeyUp:function(b,c){return 27===c.keyCode?(this.closeOnEsc&&a.featherlight.close(c),!1):b(c)},beforeOpen:function(b,c){return a(document.documentElement).addClass(\"with-featherlight\"),this._previouslyActive=document.activeElement,this._$previouslyTabbable=a(\"a, input, select, textarea, iframe, button, iframe, [contentEditable=true]\").not(\"[tabindex]\").not(this.$instance.find(\"button\")),this._$previouslyWithTabIndex=a(\"[tabindex]\").not('[tabindex=\"-1\"]'),this._previousWithTabIndices=this._$previouslyWithTabIndex.map(function(b,c){return a(c).attr(\"tabindex\")}),this._$previouslyWithTabIndex.add(this._$previouslyTabbable).attr(\"tabindex\",-1),document.activeElement.blur&&document.activeElement.blur(),b(c)},afterClose:function(c,d){var e=c(d),f=this;return this._$previouslyTabbable.removeAttr(\"tabindex\"),this._$previouslyWithTabIndex.each(function(b,c){a(c).attr(\"tabindex\",f._previousWithTabIndices[b])}),this._previouslyActive.focus(),0===b.opened().length&&a(document.documentElement).removeClass(\"with-featherlight\"),e},onResize:function(a,b){return this.resize(this.$content.naturalWidth,this.$content.naturalHeight),a(b)},afterContent:function(a,b){var c=a(b);return this.$instance.find(\"[autofocus]:not([disabled])\").focus(),this.onResize(b),c}}}),a.featherlight=b,a.fn.featherlight=function(a,c){return b.attach(this,a,c),this},a(document).ready(function(){b._onReady()})}(jQuery);","/**\n * Featherlight Gallery – an extension for the ultra slim jQuery lightbox\n * Version 1.7.9 - http://noelboss.github.io/featherlight/\n *\n * Copyright 2017, Noël Raoul Bossart (http://www.noelboss.com)\n * MIT Licensed.\n**/!function(a){\"use strict\";function b(c,d){if(!(this instanceof b)){var e=new b(a.extend({$source:c,$currentTarget:c.first()},d));return e.open(),e}a.featherlight.apply(this,arguments),this.chainCallbacks(h)}var c=function(a){window.console&&window.console.warn&&window.console.warn(\"FeatherlightGallery: \"+a)};if(\"undefined\"==typeof a)return c(\"Too much lightness, Featherlight needs jQuery.\");if(!a.featherlight)return c(\"Load the featherlight plugin before the gallery plugin\");var d=\"ontouchstart\"in window||window.DocumentTouch&&document instanceof DocumentTouch,e=a.event&&a.event.special.swipeleft&&a,f=window.Hammer&&function(a){var b=new window.Hammer.Manager(a[0]);return b.add(new window.Hammer.Swipe),b},g=d&&(e||f);d&&!g&&c(\"No compatible swipe library detected; one must be included before featherlightGallery for swipe motions to navigate the galleries.\");var h={afterClose:function(a,b){var c=this;return c.$instance.off(\"next.\"+c.namespace+\" previous.\"+c.namespace),c._swiper&&(c._swiper.off(\"swipeleft\",c._swipeleft).off(\"swiperight\",c._swiperight),c._swiper=null),a(b)},beforeOpen:function(a,b){var c=this;return c.$instance.on(\"next.\"+c.namespace+\" previous.\"+c.namespace,function(a){var b=\"next\"===a.type?1:-1;c.navigateTo(c.currentNavigation()+b)}),g&&(c._swiper=g(c.$instance).on(\"swipeleft\",c._swipeleft=function(){c.$instance.trigger(\"next\")}).on(\"swiperight\",c._swiperight=function(){c.$instance.trigger(\"previous\")}),c.$instance.addClass(this.namespace+\"-swipe-aware\",g)),c.$instance.find(\".\"+c.namespace+\"-content\").append(c.createNavigation(\"previous\")).append(c.createNavigation(\"next\")),a(b)},beforeContent:function(a,b){var c=this.currentNavigation(),d=this.slides().length;return this.$instance.toggleClass(this.namespace+\"-first-slide\",0===c).toggleClass(this.namespace+\"-last-slide\",c===d-1),a(b)},onKeyUp:function(a,b){var c={37:\"previous\",39:\"next\"}[b.keyCode];return c?(this.$instance.trigger(c),!1):a(b)}};a.featherlight.extend(b,{autoBind:\"[data-featherlight-gallery]\"}),a.extend(b.prototype,{previousIcon:\"◀\",nextIcon:\"▶\",galleryFadeIn:100,galleryFadeOut:300,slides:function(){return this.filter?this.$source.find(this.filter):this.$source},images:function(){return c(\"images is deprecated, please use slides instead\"),this.slides()},currentNavigation:function(){return this.slides().index(this.$currentTarget)},navigateTo:function(b){var c=this,d=c.slides(),e=d.length,f=c.$instance.find(\".\"+c.namespace+\"-inner\");return b=(b%e+e)%e,c.$currentTarget=d.eq(b),c.beforeContent(),a.when(c.getContent(),f.fadeTo(c.galleryFadeOut,.2)).always(function(a){c.setContent(a),c.afterContent(),a.fadeTo(c.galleryFadeIn,1)})},createNavigation:function(b){var c=this;return a('
'+this[b+\"Icon\"]+\"\").click(function(){a(this).trigger(b+\".\"+c.namespace)})}}),a.featherlightGallery=b,a.fn.featherlightGallery=function(a){return b.attach(this,a),this},a(document).ready(function(){b._onReady()})}(jQuery);","/*\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() {\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\tenableInPageLinks : false,\n\t\t\tenablePublicMethods : false,\n\t\t\theightCalculationMethod : 'offset',\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 : true,\n\t\t\tsizeHeight : true,\n\t\t\tsizeWidth : false,\n\t\t\ttolerance : 0,\n\t\t\tclosedCallback : function(){},\n\t\t\tinitCallback : function(){},\n\t\t\tmessageCallback : function(){},\n\t\t\tresizedCallback : function(){},\n\t\t\tscrollCallback : function(){\n\t\t\t\treturn true;\n\t\t\t}\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\tsettings[iframeId].resizedCallback(messageData);\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: document.getElementById(data[0]),\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 (size
max) {\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\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\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\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\t\t\t\tremoteHost = messageData.iframe.src.split('/').slice(0, 3)\n\t\t\t\t\t.join('/');\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); //''+Protects against non-string msg\n\t\t}\n\n\t\tfunction isMessageFromMetaParent(){\n\t\t\t/*\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\t */\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\n\t\t\t\tiFramePosition = 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\n\t\t\t\tscrollTo();\n\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\tif (addOffset){\n\t\t\t\t\t\twindow.parentIFrame.scrollToOffset(newPosition.x, newPosition.y);\n\t\t\t\t\t} else {\n\t\t\t\t\t\twindow.parentIFrame.scrollTo(messageData.width, messageData.height);\n\t\t\t\t\t}\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\t\t\tswitch (messageData.type){\n\t\t\t\tcase 'close':\n\t\t\t\t\tcloseIFrame(messageData.iframe);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'message':\n\t\t\t\t\tforwardMsgFromIFrame(getMsgBody(6));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'scrollTo':\n\t\t\t\t\tscrollRequestFromChild(false);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'scrollToOffset':\n\t\t\t\t\tscrollRequestFromChild(true);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'inPageLink':\n\t\t\t\t\tfindTarget(getMsgBody(9));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'reset':\n\t\t\t\t\tresetIFrame(messageData);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'init':\n\t\t\t\t\tresizeIFrame();\n\t\t\t\t\tsettings[iframeId].initCallback(messageData.iframe);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tresizeIFrame();\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\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\tsettings[iframeId].firstRun = false;\n\t\t\t\t\tactionMsg();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\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\n\t\tif ( settings[iframeId].sizeHeight) {\n\t\t\tsetDimension('height');\n\t\t}\n\t\tif ( settings[iframeId].sizeWidth ) {\n\t\t\tsetDimension('width');\n\t\t}\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, '*' );\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\tfunction setupIFrame(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/*\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\t */\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].enableInPageLinks\n\t\t\t\t+ ':' + settings[iframeId].resizeFrom;\n\t\t}\n\n\t\tfunction init(msg){\n\t\t\t/*\n\t\t\t *We have to call trigger twice, as we can not be sure if all\n\t\t\t *iframes have completed loading when this code runs. The\n\t\t\t *event listener also catches the page changing in the iFrame.\n\t\t\t */\n\t\t\taddEventListener(iframe, 'load', function(){\n\t\t\t\tvar fr = settings[iframeId].firstRun; // Reduce scope of var to function, because IE8's JS execution\n\t\t\t\t/*\n\t\t\t\t * context stack is borked and this value gets externally\n\t\t\t\t * changed midway through running this function.\n\t\t\t\t */\n\n\t\t\t\ttrigger('iFrame.onload', msg, iframe);\n\t\t\t\tif (!fr && settings[iframeId].heightCalculationMethod in resetRequiredMethods){\n\t\t\t\t\tresetIFrame({\n\t\t\t\t\t\tiframe:iframe,\n\t\t\t\t\t\theight:0,\n\t\t\t\t\t\twidth:0,\n\t\t\t\t\t\ttype:'init'\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\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 processOptions(options){\n\t\t\toptions = options || {};\n\t\t\tsettings[iframeId] = {\n\t\t\t\tfirstRun: true\n\t\t\t};\n\n\t\t\tcheckOptions(options);\n\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\n\t\t\tlogEnabled = settings[iframeId].log;\n\t\t}\n\n\t\tvar\n\t\t/*jshint validthis:true */\n\t\t\tiframe = this,\n\t\t\tiframeId = ensureHasId(iframe.id);\n\n\t\tprocessOptions(options);\n\t\tsetScrolling();\n\t\tsetLimits();\n\t\tsetupBodyMarginValues();\n\t\tinit(createOutgoingMsg());\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 winResize(){\n\t\tfunction isIFrameResizeEnabled(iframeId) {\n\t\t\treturn\t'parent' === settings[iframeId].resizeFrom\n\t\t\t\t&& settings[iframeId].autoResize\n\t\t\t\t&& !settings[iframeId].firstRun;\n\t\t}\n\n\t\tthrottle(function(){\n\t\t\tfor (var iframeId in settings){\n\t\t\t\tif (isIFrameResizeEnabled(iframeId)){\n\t\t\t\t\ttrigger('Window resize', 'resize', document.getElementById(iframeId), iframeId);\n\t\t\t\t}\n\t\t\t}\n\t\t}, 66);\n\t}\n\n\tfunction factory(){\n\t\tfunction init(element, options){\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