//Copyright (c) 2005-2006, Philipp Serr (philipp.serr@epiSource.de; epiSource@gmx.de)
//All rights reserved.
//
//Redistribution and use in source and binary forms, with or without modification, are 
//permitted provided that the following conditions are met:
//
//- Redistributions of source code must retain the above copyright notice, this list 
//  of conditions and the following disclaimer.
//
//- Redistributions in binary form must reproduce the above copyright notice, this list
//  of conditions and the following disclaimer in the documentation and/or other materials 
//  provided with the distribution.
//
//- Neither the name epiSource nor the names of its contributors may be used to 
//  endorse or promote products derived from this software without specific prior written 
//  permission.
//
//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS 
//OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 
//AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
//CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
//DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
//DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 
//IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
//OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


//
// This JS-File is part of the EpiFrame DNN-Module.
// A commented version is included in the source-package.
//
var EpiFrame={EpiFrame:function(Settings){var _elIFrame=document.getElementById(Settings.strID);var _cntWindow,_cntDoc,_cntHtmlNode;var _intScrollbarWidth=0;var _intMinWidth=0;var _bolFullHeight=false;var _bolIsUserResize=true;var _bolBlockAdjustHeight=false;var _tPolling;var _strOldScrolling;var _bolScrollingDisabled=false;var _objBrowser=new EpiFrame.BrowserCaps(this);this.Settings=Settings;var _objThis=this;bolStdEvents=(window.addEventListener);if(_objThis.Settings.bolAutoSize){if(bolStdEvents)window.addEventListener("resize",_OnResize,false);else window.attachEvent("onresize",_OnResize);}if(bolStdEvents)_elIFrame.addEventListener("load",_OnLoad,false);else _elIFrame.attachEvent("onload",_OnLoad);function _PrepareAutoWidth(){var bolCurIsUserResize=_bolIsUserResize;_bolIsUserResize=false;_elIFrame.style.minWidth="";switch(_objBrowser.strGetBrowserEngine()){case"msie":if(_cntDoc.compatMode=="BackCompat"||_bolFullHeight)_elIFrame.style.width="auto";else _elIFrame.style.width="1px";break;default:_elIFrame.style.width="1px";break;}_intMinWidth=_intGetScrollWidth();if(_objThis.Settings.uMinWidth.intValue>_intMinWidth){_intMinWidth=_objThis.Settings.uMinWidth.intValue;}_elIFrame.style.width=_objThis.Settings.uWidth.ToString();_bolIsUserResize=bolCurIsUserResize;}function _PrepareAutoHeight(){var bolCurIsUserResize=_bolIsUserResize;_bolIsUserResize=false;_bolFullHeight=false;_elIFrame.style.height=_intGetScrollHeight()+300+"px";_bolFullHeight=(_intGetHeight()==_elIFrame.clientHeight);if(_objBrowser.strGetBrowserEngine()=="msie"){_bolBlockAdjustHeight=_bolFullHeight;}_bolIsUserResize=bolCurIsUserResize;}function _OnError(exc){try{if(_objThis.Settings.bolAutoHeight||_objThis.Settings.bolAutoWidth){try{var strTmp=_cntWindow.location.href;}catch(e){if(_objThis.Settings.strErrorPageUrl!="")window.setTimeout(function(){document.getElementById(_elIFrame.id).contentWindow.location.replace(_objThis.Settings.strErrorPageUrl);},1);else history.back();}}}catch(exc){}finally{window.clearInterval(_tPolling);if(_objBrowser.strGetBrowserEngine()!="msie")_elIFrame.scrolling=_strOldScrolling;}}function _OnLoad(){try{_cntWindow=_elIFrame.contentWindow;switch(_objBrowser.strGetBrowserEngine()){case"msie":_cntDoc=_cntWindow.document;break;default:_cntDoc=_elIFrame.contentDocument;break;}_cntHtmlNode=_cntDoc.body.parentNode;if(_objThis.Settings.bolAutoSize){if(_objThis.Settings.bolAutoHeight)_PrepareAutoHeight();if(_objThis.Settings.bolAutoWidth)_PrepareAutoWidth();_objThis.AutoSize();if(_objThis.Settings.bolDetectDynChanges&&_objBrowser.strGetBrowserEngine()!="opera"){_strOldScrolling=_elIFrame.scrolling;_elIFrame.scrolling="no";if(_objBrowser.strGetBrowserEngine()=="msie"&&!_bolScrollingDisabled){_elIFrame.outerHTML=_elIFrame.outerHTML.replace(/src=".*"/,"src=\""+_cntWindow.location.href+"\"");_bolScrollingDisabled=true;window.setTimeout(function(){_elIFrame=document.getElementById(Settings.strID);_cntWindow=_elIFrame.contentWindow;_cntDoc=_cntWindow.document;_cntHtmlNode=_cntDoc.body.parentNode;_elIFrame.attachEvent("onload",_OnLoad);_tPolling=window.setInterval("obj_"+_elIFrame.id+".EmulateDomSubtreeModified()",10);},100);}else _tPolling=window.setInterval("obj_"+_elIFrame.id+".EmulateDomSubtreeModified()",10);}EpiFrame.LinkValidator.CheckLinks(_cntDoc);}}catch(exc){_OnError(exc);}}function _OnResize(bolForce){try{if(_bolIsUserResize&&_objBrowser.strGetBrowserEngine()!="opera"){if(!_bolBlockAdjustHeight||bolForce==true)_objThis.AutoSize();else if(_objThis.Settings.bolAutoWidth)_objThis.AdjustWidth();}else{window.clearTimeout(EpiFrame.Globals.Timeout);EpiFrame.Globals.Timeout=window.setTimeout("obj_"+_elIFrame.id+".AutoSize()",100);}}catch(exc){_OnError(exc);}}function _intGetWidth(){if(_objBrowser.strGetBrowserEngine()=="opera"){var intOldScrollLeft;_elIFrame.style.height="0px";_cntWindow.scrollTo(0,0);_elIFrame.style.visibility="hidden";do{intOldScrollLeft=_cntHtmlNode.scrollLeft;_cntWindow.scrollBy(500,0);}while(intOldScrollLeft<_cntHtmlNode.scrollLeft)_elIFrame.style.visibility="";return _cntHtmlNode.scrollLeft;}else{return _cntDoc.body.scrollWidth>_cntHtmlNode.scrollWidth?_cntDoc.body.scrollWidth:_cntHtmlNode.scrollWidth;}}function _intGetScrollWidth(){return _intGetWidth();}function _intGetClientWidth(){if(_cntDoc.compatMode=="BackCompat")return _cntDoc.body.clientWidth;else return _cntHtmlNode.clientWidth;}function _intGetHeight(bolForceNormal){if(_bolFullHeight&&!bolForceNormal)return _intGetFullHeight();switch(_objBrowser.strGetBrowserEngine()){case"opera":var intOldScrollTop;_elIFrame.style.height="0px";_cntWindow.scrollTo(0,0);_elIFrame.style.visibility="hidden";do{intOldScrollTop=_cntHtmlNode.scrollTop;_cntWindow.scrollBy(0,500);}while(intOldScrollTop<_cntHtmlNode.scrollTop)_elIFrame.style.visibility="";return _cntHtmlNode.scrollTop+10;case"msie":if(_cntDoc.compatMode=="BackCompat")return _cntDoc.body.scrollHeight;else return _cntHtmlNode.scrollHeight;case"gecko":if(_bolFullHeight)return _intGetScrollHeight();else return _cntHtmlNode.offsetHeight;default:return _cntHtmlNode.offsetHeight;}}function _intGetScrollHeight(){return _cntDoc.body.scrollHeight>_cntHtmlNode.scrollHeight?_cntDoc.body.scrollHeight:_cntHtmlNode.scrollHeight;}function _intGetFullHeight(){var bolCurIsUserResize=_bolIsUserResize;var strCurHeight=_elIFrame.style.height;_bolIsUserResize=false;_elIFrame.style.height="1px";var intHeight=_intGetHeight(true);_elIFrame.style.height=strCurHeight;_bolIsUserResize=bolCurIsUserResize;return intHeight;}function _intGetClientHeight(){if(_cntDoc.compatMode=="BackCompat")return _cntDoc.body.clientHeight;else return _cntHtmlNode.clientHeight;}function _bolHasVScrollbar(){return(_intGetScrollHeight()>_intGetClientHeight());}function _bolHasHScrollbar(){return(_intGetScrollWidth()>_intGetClientWidth());}function _intGetScrollbarWidth(){if(_intScrollbarWidth!=0)return _intScrollbarWidth;else{_intScrollbarWidth=_elIFrame.clientHeight-_intGetClientHeight();if(_intScrollbarWidth!=0)return _intScrollbarWidth;else{var strOldWidth=_elIFrame.style.width;var strOldBWidth=_cntDoc.body.style.width;var bolCurIsUserResize=_bolIsUserResize;_bolIsUserResize=false;_elIFrame.style.width="50px";_cntDoc.body.style.width="100px";_intScrollbarWidth=_elIFrame.clientHeight-_intGetClientHeight();_elIFrame.style.width=strOldWidth;_cntDoc.body.style.width=strOldBWidth;_bolIsUserResize=bolCurIsUserResize;return _intScrollbarWidth;}}}this.AutoSize=function(){try{var ScrollTop=document.body.scrollTop?document.body.scrollTop:document.body.parentNode.scrollTop?document.body.parentNode.scrollTop:window.pageYOffset?window.pageYOffset:0;var ScrollLeft=document.body.scrollLeft?document.body.scrollLeft:document.body.parentNode.scrollLeft?document.body.parentNode.scrollLeft:window.pageXOffset?window.pageXOffset:0;if(_objThis.Settings.bolAutoWidth)_objThis.AdjustWidth();if(_objThis.Settings.bolAutoHeight)_objThis.AdjustHeight();if(ScrollTop!=0||ScrollLeft!=0)window.scrollTo(ScrollLeft,ScrollTop);}catch(exc){_OnError(exc);}};this.AdjustWidth=function(){try{var bolCurIsUserResize=_bolIsUserResize;_bolIsUserResize=false;var intCMinWidth=_intMinWidth+_objBrowser.intGetWidthOffset()+(!_objThis.Settings.bolAutoHeight&&!_objThis.Settings.bolDetectDynChanges&&_bolHasVScrollbar()?_intGetScrollbarWidth():0);if(_objBrowser.bolSupportsMinWidth())_elIFrame.style.minWidth=intCMinWidth+"px";if(!_objBrowser.bolSupportsMinWidth()||_objThis.Settings.bolForceWidth)_elIFrame.style.width=_elIFrame.parentNode.offsetWidth>intCMinWidth?_objThis.Settings.uWidth.ToString():intCMinWidth+"px";_bolIsUserResize=bolCurIsUserResize;}catch(exc){_OnError(exc);}};this.AdjustHeight=function(){try{var bolCurIsUserResize=_bolIsUserResize;_bolIsUserResize=false;var intHeight=_intGetHeight();_elIFrame.style.height=intHeight+_objBrowser.intGetHeightOffset()+(_bolHasHScrollbar()&&!_objThis.Settings.bolDetectDynChanges?_intGetScrollbarWidth():0)+"px";_bolIsUserResize=bolCurIsUserResize;}catch(exc){_OnError(exc);}};this.EmulateDomSubtreeModified=function(){try{if(_bolIsUserResize){if(_objThis.Settings.bolAutoWidth&&(_intGetScrollWidth()>_elIFrame.clientWidth+1||(_elIFrame.style.width!=_objThis.Settings.uWidth.ToString()&&_intGetScrollWidth()<_elIFrame.clientWidth+1))){_PrepareAutoWidth();_objThis.AutoSize();}else if(_objThis.Settings.bolAutoHeight&&_intGetScrollHeight()!=_elIFrame.clientHeight+1)_objThis.AutoSize();}}catch(exc){_OnError(exc);}};},Settings:function(strID,strWidth,strMinWidth,strHeight,bolAutoWidth,bolAutoHeight,bolDetectDynChanges,bolForceWidth,strErrorPageUrl){this.strID=strID;this.uWidth=EpiFrame.Globals.StringToUnit(strWidth);this.uMinWidth=EpiFrame.Globals.StringToUnit(strMinWidth);this.uHeight=EpiFrame.Globals.StringToUnit(strHeight);this.bolAutoWidth=bolAutoWidth;this.bolAutoHeight=bolAutoHeight;this.bolAutoSize=(this.bolAutoWidth||this.bolAutoHeight);this.bolDetectDynChanges=bolDetectDynChanges;this.bolForceWidth=(bolForceWidth||bolDetectDynChanges);this.strErrorPageUrl=strErrorPageUrl;},Unit:function(intValue,strUnitType){this.intValue=intValue;this.strUnitType=strUnitType;this.ToString=function(){return this.intValue+this.strUnitType;};this.Equals=function(uCompare){if(uCompare.intValue!=this.intValue||uCompare.strUnitType!=this.strUnitType)return false;else return true;};},BrowserCaps:function(objEpiFrame){var _strBrowser;var _strBrowserEngine;var _strBrowserVersion;var _intTmpPos;var _objEpiFrame=objEpiFrame;with(navigator.userAgent){if(search(/Safari/i)!=-1)_strBrowser="safari";else if(search(/Firefox/i)!=-1)_strBrowser="firefox";else if(search(/Opera/i)!=-1)_strBrowser="opera";else if(search(/Netscape/i)!=-1)_strBrowser="netscape";else if(search(/MSIE/i)!=-1)_strBrowser="msie";_strBrowserEngine=_strBrowser;if(search(/Gecko/i)!=-1)_strBrowserEngine="gecko";}var expVersion=new RegExp(_strBrowser+"[^a-zA-Z]?([\\w:.-]*)","i");_strBrowserVersion=expVersion.exec(navigator.userAgent);if(_strBrowserVersion)_strBrowserVersion=_strBrowserVersion[1];this.strGetBrowser=function(){return _strBrowser;};this.strGetBrowserEngine=function(){return _strBrowserEngine;};this.strGetBrowserVersion=function(){return _strBrowserVersion;};this.bolSupportsMinWidth=function(){switch(_strBrowserEngine){case"msie":if(_strBrowserVersion>6)return true;else return false;default:return true;}};this.bolLiveResize=function(){switch(_strBrowserEngine){case"msie":return true;case"msie7":return true;case"opera":return true;default:return false;}};this.intGetHeightOffset=function(){if(_objEpiFrame.Settings.bolDetectDynChanges&&this.strGetBrowserEngine()!="opera")return-1;else if(this.strGetBrowserEngine()=="gecko")return 1;else return 0;};this.intGetWidthOffset=function(){if(_objEpiFrame.Settings.bolDetectDynChanges&&this.strGetBrowserEngine()!="opera")return-1;else return 0;};},LinkValidator:{CheckLinks:function(Doc){for(var i=0;i<Doc.links.length;i++)EpiFrame.LinkValidator.CheckLink(Doc.links[i]);},CheckLink:function(Link){if(Link.href.search(/javascript\:/)==-1&&(Link.target=="_self"||Link.target=="")){var bolDiffPort=(EpiFrame.LinkValidator.GetPortFromLink(Link)!=EpiFrame.LinkValidator.GetPortFromLink(window.location));var bolDiffProto=(EpiFrame.LinkValidator.GetProtocolFromLink(Link)!=EpiFrame.LinkValidator.GetProtocolFromLink(window.location));var bolDiffHostname=(Link.hostname!=window.location.hostname);if(bolDiffPort||bolDiffProto||bolDiffHostname){Link.target="_top";}}},GetPortFromLink:function(Link){var strProto=EpiFrame.LinkValidator.GetProtocolFromLink(Link);var intPort=Link.port;if(!intPort){if(strProto=="http:")intPort=80;if(strProto=="https:")intPort=443;}return intPort;},GetProtocolFromLink:function(Link){return Link.protocol==""?"http:":Link.protocol;}},Globals:{StringToUnit:function(String){regPattern=/^([0-9]+)([a-zA-Z%]*)$/;if(regPattern.test(String)){var arrValues=regPattern.exec(String);return new EpiFrame.Unit(parseInt(arrValues[1]),arrValues.length==3?arrValues[2]:"px");}else return new EpiFrame.Unit(null,null);}}}
