/****************************************************************************** Name: Highslide HTML Extension Version: 1.0.4 Author: Torstein Hønsi Support: http://vikjavev.no/highslide/forum Email: See http://vikjavev.no/megsjol Licence: Highslide JS is licensed under a Creative Commons Attribution-NonCommercial 2.5 License (http://creativecommons.org/licenses/by-nc/2.5/). You are free: * to copy, distribute, display, and perform the work * to make derivative works Under the following conditions: * Attribution. You must attribute the work in the manner specified by the author or licensor. * Noncommercial. You may not use this work for commercial purposes. * For any reuse or distribution, you must make clear to others the license terms of this work. * Any of these conditions can be waived if you get permission from the copyright holder. Your fair use and other rights are in no way affected by the above. ******************************************************************************/ // These properties can be overridden in the function call for each expander: hs.push(hs.overrides, 'contentId'); hs.push(hs.overrides, 'allowWidthReduction'); hs.push(hs.overrides, 'allowHeightReduction'); hs.push(hs.overrides, 'objectType'); hs.push(hs.overrides, 'objectWidth'); hs.push(hs.overrides, 'objectHeight'); hs.push(hs.overrides, 'objectLoadTime'); hs.push(hs.overrides, 'swfObject'); hs.allowWidthReduction = false; hs.allowHeightReduction = true; hs.objectLoadTime = 'before'; hs.htmlExpand = function(a, params) { if (!hs.$(params.contentId) && !hs.origNodes[params.contentId]) return true; try { hs.hasHtmlExpanders = true; new HsExpander(a, params, 'html'); return false; } catch (e) { return true; // script failed: try firing default href } }; hs.identifyContainer = function (parent, className) { for (i = 0; i < parent.childNodes.length; i++) { if (parent.childNodes[i].className == className) { return parent.childNodes[i]; } } }; hs.geckoBug = function(d) { // freezes on DOM access to flash object return (!hs.ie && d.className && d.className == 'highslide-body' && hs.expanders[hs.getWrapperKey(d)] && hs.expanders[hs.getWrapperKey(d)].swfObject); }; HsExpander.prototype.htmlCreate = function () { this.origContent = hs.origNodes[this.contentId] ? hs.origNodes[this.contentId] : hs.$(this.contentId); hs.setStyles (this.origContent, { position: 'relative', visibility: 'hidden' }); this.origContent.className += ' highslide-display-block'; var div = hs.createElement('div', null, { padding: '0 '+ hs.marginRight +'px 0 '+ hs.marginLeft +'px', position: 'absolute', left: 0, top: 0 }, document.body ); this.innerContent = hs.cloneNode(this.contentId); hs.setStyles(this.innerContent, { border: 'none', width: 'auto', height: 'auto' }); this.setObjContainerSize(this.origContent); this.setObjContainerSize(this.innerContent, 1); div.appendChild(this.origContent); // to get full width this.content = hs.createElement( 'div', { className: 'highslide-html' }, { position: 'relative', zIndex: 3, overflow: 'hidden', width: this.thumbWidth +'px', height: this.thumbHeight +'px' } ); this.content.appendChild(this.innerContent); this.newWidth = this.origContent.offsetWidth; this.newHeight = this.origContent.offsetHeight; if (hs.ie && this.newHeight > parseInt(this.origContent.currentStyle.height)) { // ie css bug this.newHeight = parseInt(this.origContent.currentStyle.height); } // hide origContent this.origContent.className = this.origContent.className.replace(' highslide-display-block', ''); this.onLoad(); }; HsExpander.prototype.setObjContainerSize = function(parent, auto) { if (this.swfObject || this.objectType == 'iframe') { var c = hs.identifyContainer(parent, 'highslide-body'); if (auto) { c.style.width = 'auto'; c.style.height = 'auto'; } else { c.style.width = this.swfObject ? this.swfObject.attributes.width +'px' : this.objectWidth +'px'; c.style.height = this.swfObject ? this.swfObject.attributes.height +'px' : this.objectHeight +'px'; } } }; HsExpander.prototype.writeExtendedContent = function () { if (this.objectType == 'iframe') { this.objContainer = hs.identifyContainer(this.innerContent, 'highslide-body'); var key = this.key; this.iframe = hs.createElement('iframe', { frameBorder: 0, src: hs.getSrc(this.a), scrolling: 'no' }, { width: this.objectWidth +'px', height: this.objectHeight +'px' }, this.objContainer ); if (this.objectLoadTime == 'after') this.correctIframeSize(); } else if (this.swfObject) { this.objContainer = hs.identifyContainer(this.innerContent, 'highslide-body'); this.objContainer.id = this.objContainer.id || 'hs-flash-id-' + this.key; this.swfObject.write(this.objContainer.id); } }; HsExpander.prototype.correctIframeSize = function () { var wDiff = this.innerContent.offsetWidth - this.objContainer.offsetWidth; if (wDiff < 0) wDiff = 0; var hDiff = this.innerContent.offsetHeight - this.objContainer.offsetHeight; hs.setStyles(this.iframe, { width: (this.x.span - wDiff) +'px', height: (this.y.span - hDiff) +'px' }); hs.setStyles(this.objContainer, { width: this.iframe.style.width, height: this.iframe.style.height }); this.scrollingContent = this.iframe; this.scrollerDiv = 'scrollingContent'; }; HsExpander.prototype.htmlSizeOperations = function () { this.setObjContainerSize(this.innerContent); if (this.objectLoadTime == 'before') this.writeExtendedContent(); // store for resize this.finalLeft = this.x.min; this.finalTop = this.y.min; // handle minimum size if (this.x.span < this.newWidth && !this.allowWidthReduction) this.x.span = this.newWidth; if (this.y.span < this.newHeight && !this.allowHeightReduction) this.y.span = this.newHeight; this.scrollerDiv = 'innerContent'; this.mediumContent = hs.createElement('div', null, { width: this.x.span +'px', position: 'relative', left: (this.finalLeft - this.thumbLeft) +'px', top: (this.finalTop - this.thumbTop) +'px' }, this.content); this.mediumContent.appendChild(this.innerContent); var node = hs.identifyContainer(this.innerContent, 'highslide-body'); if (node && !this.swfObject && this.objectType != 'iframe') { var cNode = node.cloneNode(true); // to get true width node.innerHTML = ''; node.id = null; hs.setStyles ( node, { margin: 0, border: 'none', padding: 0, overflow: 'hidden' } ); node.appendChild(cNode); var wDiff = this.innerContent.offsetWidth - node.offsetWidth; var hDiff = this.innerContent.offsetHeight - node.offsetHeight; var kdeBugCorr = hs.safari || navigator.vendor == 'KDE' ? 1 : 0; // KDE repainting bug hs.setStyles(node, { width: (this.x.span - wDiff - kdeBugCorr) +'px', height: (this.y.span - hDiff) +'px', overflow: 'auto', position: 'relative' } ); if (cNode.offsetHeight > node.offsetHeight) { if (kdeBugCorr) node.style.width = (parseInt(node.style.width) + kdeBugCorr) + 'px'; } this.scrollingContent = node; this.scrollerDiv = 'scrollingContent'; } if (this.iframe && this.objectLoadTime == 'before') this.correctIframeSize(); if (!this.scrollingContent && this.y.span < this.mediumContent.offsetHeight) this.scrollerDiv = 'content'; if (this.scrollerDiv == 'content' && !this.allowWidthReduction && this.objectType != 'iframe') { this.x.span += 17; // room for scrollbars } if (this.scrollerDiv && this[this.scrollerDiv].offsetHeight > this[this.scrollerDiv].parentNode.offsetHeight) { setTimeout("hs.expanders["+ this.key +"]."+ this.scrollerDiv +".style.overflow = 'auto'", hs.expandDuration); } }; HsExpander.prototype.htmlSetSize = function (w, h, x, y, offset, end) { try { hs.setStyles(this.content, { width: w +'px', height: h +'px' }); hs.setStyles(this.wrapper, { visibility: 'visible', left: x +'px', top: y +'px'}); hs.setStyles(this.mediumContent, { left: (this.finalLeft - x) +'px', top: (this.finalTop - y) +'px' }); this.innerContent.style.visibility = 'visible'; if (this.objOutline && this.outlineWhileAnimating) { var o = this.objOutline.offset - offset; this.positionOutline(x + o, y + o, w - 2*o, h - 2*o, 1); } if (end == 1) this.onExpanded(); else if (end == -1) this.onEndClose(); } catch (e) { window.location.href = hs.expanders[key].a.href; } }; /* HsExpander.prototype.resize = function () { var h1, h2, dh; h1 = this[this.scrollerDiv].offsetHeight; this[this.scrollerDiv].style.overflow = 'visible'; this[this.scrollerDiv].style.height = 'auto'; h2 = this[this.scrollerDiv].offsetHeight; dh = h2 - h1; this.htmlSetSize(parseInt(this.content.style.width), parseInt(this.content.style.height) + dh, parseInt(this.wrapper.style.left), parseInt(this.wrapper.style.top), 10); };*/ HsExpander.prototype.htmlOnClose = function() { if (this.objectLoadTime == 'after') this.destroyObject(); if (this.scrollerDiv && this.scrollerDiv != 'scrollingContent') this[this.scrollerDiv].style.overflow = 'hidden'; if (this.swfObject) hs.$(this.swfObject.getAttribute('id')).StopPlay(); }; HsExpander.prototype.destroyObject = function () { this.objContainer.innerHTML = ''; };