Index: branches/1.0.x/designs/default_design.des.tpl =================================================================== --- branches/1.0.x/designs/default_design.des.tpl (revision 15800) +++ branches/1.0.x/designs/default_design.des.tpl (revision 15801) @@ -1,79 +1,79 @@ <inp2:m_CheckSSL/><inp2:m_DefaultParam columns="2"/> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="<inp2:lang.current_Field name='Locale' db='1'/>"> <html> <head> <!--## includes system elements ##--> <inp2:m_Include template="elements/forms.elm" strip_nl="2"/> <inp2:m_Include template="elements/content_boxes.elm" strip_nl="2"/> <inp2:m_Include template="elements/product_elements.elm" strip_nl="2"/> <title><inp2:m_RenderElement name="page_title" default_element="default_page_title" no_editing="1"/></title> - <link rel="stylesheet" rev="stylesheet" href="<inp2:m_Compress from='all_css'/>" type="text/css" /> + <!--<link rel="stylesheet" rev="stylesheet" href="<inp2:m_Compress from='all_css'/>" type="text/css" />--> - <inp2:m_Include template="elements/html_head.elm" strip_nl="2"/> + <inp2:m_Include template="elements/html_head.elm"/> <!--## <script type="text/javascript" src="<inp2:m_Compress from='all_js'/>"></script> ##--> <inp2:m_RenderElement name="add_to_head" default_element="default_add_to_head"/> </head> <body> <!--## System tag please do not remove ##--> <inp2:st_EditPage mode="start"/> <inp2:m_Include template="elements/header.elm" /> <inp2:m_Include template="elements/menu.elm" /> <div id="content"> <div class="padding"> <inp2:m_if check="m_Param" name="before_content"> <inp2:m_RenderElement name="$before_content" /> </inp2:m_if> <inp2:m_if check="m_Param" name="left_column"> <div class="leftcol"> <inp2:m_RenderElement name="$left_column" /> </div> <div class="contentcol"> <inp2:m_RenderElement name="content" /> </div> <inp2:m_elseif check="m_Param" name="right_column" /> <div class="contentcol"> <inp2:m_RenderElement name="content" /> </div> <div class="rightcol"> <inp2:m_RenderElement name="$right_column" /> </div> <inp2:m_else/> <inp2:m_RenderElement name="content"/> </inp2:m_if> <div class="clear"></div> </div> </div> <inp2:m_Include template="elements/footer_menu.elm" /> <inp2:m_Include template="elements/footer.elm" /> <inp2:st_EditPage mode="end"/> <!--## /System tag please do not remove ##--> <inp2:m_Include template="elements/tracking.elm" /> <inp2:m_RenderElement name="add_to_footer" default_element="default_add_to_footer"/> </body> </html> \ No newline at end of file Index: branches/1.0.x/inc/js/colorbox/jquery.colorbox.js =================================================================== --- branches/1.0.x/inc/js/colorbox/jquery.colorbox.js (nonexistent) +++ branches/1.0.x/inc/js/colorbox/jquery.colorbox.js (revision 15801) @@ -0,0 +1,1026 @@ +/*! + jQuery Colorbox v1.4.15 - 2013-04-22 + (c) 2013 Jack Moore - jacklmoore.com/colorbox + license: http://www.opensource.org/licenses/mit-license.php +*/ +(function ($, document, window) { + var + // Default settings object. + // See http://jacklmoore.com/colorbox for details. + defaults = { + transition: "elastic", + speed: 300, + fadeOut: 300, + width: false, + initialWidth: "600", + innerWidth: false, + maxWidth: false, + height: false, + initialHeight: "450", + innerHeight: false, + maxHeight: false, + scalePhotos: true, + scrolling: true, + inline: false, + html: false, + iframe: false, + fastIframe: true, + photo: false, + href: false, + title: false, + rel: false, + opacity: 0.9, + preloading: true, + className: false, + + // alternate image paths for high-res displays + retinaImage: false, + retinaUrl: false, + retinaSuffix: '@2x.$1', + + // internationalization + current: "image {current} of {total}", + previous: "previous", + next: "next", + close: "close", + xhrError: "This content failed to load.", + imgError: "This image failed to load.", + + open: false, + returnFocus: true, + reposition: true, + loop: true, + slideshow: false, + slideshowAuto: true, + slideshowSpeed: 2500, + slideshowStart: "start slideshow", + slideshowStop: "stop slideshow", + photoRegex: /\.(gif|png|jp(e|g|eg)|bmp|ico|webp)((#|\?).*)?$/i, + + onOpen: false, + onLoad: false, + onComplete: false, + onCleanup: false, + onClosed: false, + overlayClose: true, + escKey: true, + arrowKey: true, + top: false, + bottom: false, + left: false, + right: false, + fixed: false, + data: undefined + }, + + // Abstracting the HTML and event identifiers for easy rebranding + colorbox = 'colorbox', + prefix = 'cbox', + boxElement = prefix + 'Element', + + // Events + event_open = prefix + '_open', + event_load = prefix + '_load', + event_complete = prefix + '_complete', + event_cleanup = prefix + '_cleanup', + event_closed = prefix + '_closed', + event_purge = prefix + '_purge', + + // Cached jQuery Object Variables + $overlay, + $box, + $wrap, + $content, + $topBorder, + $leftBorder, + $rightBorder, + $bottomBorder, + $related, + $window, + $loaded, + $loadingBay, + $loadingOverlay, + $title, + $current, + $slideshow, + $next, + $prev, + $close, + $groupControls, + $events = $('<a/>'), + + // Variables for cached values or use across multiple functions + settings, + interfaceHeight, + interfaceWidth, + loadedHeight, + loadedWidth, + element, + index, + photo, + open, + active, + closing, + loadingTimer, + publicMethod, + div = "div", + className, + requests = 0, + init; + + // **************** + // HELPER FUNCTIONS + // **************** + + // Convenience function for creating new jQuery objects + function $tag(tag, id, css) { + var element = document.createElement(tag); + + if (id) { + element.id = prefix + id; + } + + if (css) { + element.style.cssText = css; + } + + return $(element); + } + + // Get the window height using innerHeight when available to avoid an issue with iOS + // http://bugs.jquery.com/ticket/6724 + function winheight() { + return window.innerHeight ? window.innerHeight : $(window).height(); + } + + // Determine the next and previous members in a group. + function getIndex(increment) { + var + max = $related.length, + newIndex = (index + increment) % max; + + return (newIndex < 0) ? max + newIndex : newIndex; + } + + // Convert '%' and 'px' values to integers + function setSize(size, dimension) { + return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : winheight()) / 100) : 1) * parseInt(size, 10)); + } + + // Checks an href to see if it is a photo. + // There is a force photo option (photo: true) for hrefs that cannot be matched by the regex. + function isImage(settings, url) { + return settings.photo || settings.photoRegex.test(url); + } + + function retinaUrl(settings, url) { + return settings.retinaUrl && window.devicePixelRatio > 1 ? url.replace(settings.photoRegex, settings.retinaSuffix) : url; + } + + function trapFocus(e) { + if ('contains' in $box[0] && !$box[0].contains(e.target)) { + e.stopPropagation(); + $box.focus(); + } + } + + // Assigns function results to their respective properties + function makeSettings() { + var i, + data = $.data(element, colorbox); + + if (data == null) { + settings = $.extend({}, defaults); + if (console && console.log) { + console.log('Error: cboxElement missing settings object'); + } + } else { + settings = $.extend({}, data); + } + + for (i in settings) { + if ($.isFunction(settings[i]) && i.slice(0, 2) !== 'on') { // checks to make sure the function isn't one of the callbacks, they will be handled at the appropriate time. + settings[i] = settings[i].call(element); + } + } + + settings.rel = settings.rel || element.rel || $(element).data('rel') || 'nofollow'; + settings.href = settings.href || $(element).attr('href'); + settings.title = settings.title || element.title; + + if (typeof settings.href === "string") { + settings.href = $.trim(settings.href); + } + } + + function trigger(event, callback) { + // for external use + $(document).trigger(event); + + // for internal use + $events.trigger(event); + + if ($.isFunction(callback)) { + callback.call(element); + } + } + + // Slideshow functionality + function slideshow() { + var + timeOut, + className = prefix + "Slideshow_", + click = "click." + prefix, + clear, + set, + start, + stop; + + if (settings.slideshow && $related[1]) { + clear = function () { + clearTimeout(timeOut); + }; + + set = function () { + if (settings.loop || $related[index + 1]) { + timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed); + } + }; + + start = function () { + $slideshow + .html(settings.slideshowStop) + .unbind(click) + .one(click, stop); + + $events + .bind(event_complete, set) + .bind(event_load, clear) + .bind(event_cleanup, stop); + + $box.removeClass(className + "off").addClass(className + "on"); + }; + + stop = function () { + clear(); + + $events + .unbind(event_complete, set) + .unbind(event_load, clear) + .unbind(event_cleanup, stop); + + $slideshow + .html(settings.slideshowStart) + .unbind(click) + .one(click, function () { + publicMethod.next(); + start(); + }); + + $box.removeClass(className + "on").addClass(className + "off"); + }; + + if (settings.slideshowAuto) { + start(); + } else { + stop(); + } + } else { + $box.removeClass(className + "off " + className + "on"); + } + } + + function launch(target) { + if (!closing) { + + element = target; + + makeSettings(); + + $related = $(element); + + index = 0; + + if (settings.rel !== 'nofollow') { + $related = $('.' + boxElement).filter(function () { + var data = $.data(this, colorbox), + relRelated; + + if (data) { + relRelated = $(this).data('rel') || data.rel || this.rel; + } + + return (relRelated === settings.rel); + }); + index = $related.index(element); + + // Check direct calls to Colorbox. + if (index === -1) { + $related = $related.add(element); + index = $related.length - 1; + } + } + + $overlay.css({ + opacity: parseFloat(settings.opacity), + cursor: settings.overlayClose ? "pointer" : "auto", + visibility: 'visible' + }).show(); + + + if (className) { + $box.add($overlay).removeClass(className); + } + if (settings.className) { + $box.add($overlay).addClass(settings.className); + } + className = settings.className; + + $close.html(settings.close).show(); + + if (!open) { + open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys. + + // Show colorbox so the sizes can be calculated in older versions of jQuery + $box.css({visibility:'hidden', display:'block'}); + + $loaded = $tag(div, 'LoadedContent', 'width:0; height:0; overflow:hidden').appendTo($content); + + // Cache values needed for size calculations + interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height(); + interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width(); + loadedHeight = $loaded.outerHeight(true); + loadedWidth = $loaded.outerWidth(true); + + + // Opens inital empty Colorbox prior to content being loaded. + settings.w = setSize(settings.initialWidth, 'x'); + settings.h = setSize(settings.initialHeight, 'y'); + publicMethod.position(); + + slideshow(); + + trigger(event_open, settings.onOpen); + + $groupControls.add($title).hide(); + + $box.focus(); + + // Confine focus to the modal + // Uses event capturing that is not supported in IE8- + if (document.addEventListener) { + + document.addEventListener('focus', trapFocus, true); + + $events.one(event_closed, function () { + document.removeEventListener('focus', trapFocus, true); + }); + } + + // Return focus on closing + if (settings.returnFocus) { + $events.one(event_closed, function () { + $(element).focus(); + }); + } + } + + load(); + } + } + + // Colorbox's markup needs to be added to the DOM prior to being called + // so that the browser will go ahead and load the CSS background images. + function appendHTML() { + if (!$box && document.body) { + init = false; + $window = $(window); + $box = $tag(div).attr({ + id: colorbox, + 'class': $.support.opacity === false ? prefix + 'IE' : '', // class for optional IE8 & lower targeted CSS. + role: 'dialog', + tabindex: '-1' + }).hide(); + $overlay = $tag(div, "Overlay").hide(); + $loadingOverlay = $tag(div, "LoadingOverlay").add($tag(div, "LoadingGraphic")); + $wrap = $tag(div, "Wrapper"); + $content = $tag(div, "Content").append( + $title = $tag(div, "Title"), + $current = $tag(div, "Current"), + $prev = $('<button type="button"/>').attr({id:prefix+'Previous'}), + $next = $('<button type="button"/>').attr({id:prefix+'Next'}), + $slideshow = $tag('button', "Slideshow"), + $loadingOverlay, + $close = $('<button type="button"/>').attr({id:prefix+'Close'}) + ); + + $wrap.append( // The 3x3 Grid that makes up Colorbox + $tag(div).append( + $tag(div, "TopLeft"), + $topBorder = $tag(div, "TopCenter"), + $tag(div, "TopRight") + ), + $tag(div, false, 'clear:left').append( + $leftBorder = $tag(div, "MiddleLeft"), + $content, + $rightBorder = $tag(div, "MiddleRight") + ), + $tag(div, false, 'clear:left').append( + $tag(div, "BottomLeft"), + $bottomBorder = $tag(div, "BottomCenter"), + $tag(div, "BottomRight") + ) + ).find('div div').css({'float': 'left'}); + + $loadingBay = $tag(div, false, 'position:absolute; width:9999px; visibility:hidden; display:none'); + + $groupControls = $next.add($prev).add($current).add($slideshow); + + $(document.body).append($overlay, $box.append($wrap, $loadingBay)); + } + } + + // Add Colorbox's event bindings + function addBindings() { + function clickHandler(e) { + // ignore non-left-mouse-clicks and clicks modified with ctrl / command, shift, or alt. + // See: http://jacklmoore.com/notes/click-events/ + if (!(e.which > 1 || e.shiftKey || e.altKey || e.metaKey || e.control)) { + e.preventDefault(); + launch(this); + } + } + + if ($box) { + if (!init) { + init = true; + + // Anonymous functions here keep the public method from being cached, thereby allowing them to be redefined on the fly. + $next.click(function () { + publicMethod.next(); + }); + $prev.click(function () { + publicMethod.prev(); + }); + $close.click(function () { + publicMethod.close(); + }); + $overlay.click(function () { + if (settings.overlayClose) { + publicMethod.close(); + } + }); + + // Key Bindings + $(document).bind('keydown.' + prefix, function (e) { + var key = e.keyCode; + if (open && settings.escKey && key === 27) { + e.preventDefault(); + publicMethod.close(); + } + if (open && settings.arrowKey && $related[1] && !e.altKey) { + if (key === 37) { + e.preventDefault(); + $prev.click(); + } else if (key === 39) { + e.preventDefault(); + $next.click(); + } + } + }); + + if ($.isFunction($.fn.on)) { + // For jQuery 1.7+ + $(document).on('click.'+prefix, '.'+boxElement, clickHandler); + } else { + // For jQuery 1.3.x -> 1.6.x + // This code is never reached in jQuery 1.9, so do not contact me about 'live' being removed. + // This is not here for jQuery 1.9, it's here for legacy users. + $('.'+boxElement).live('click.'+prefix, clickHandler); + } + } + return true; + } + return false; + } + + // Don't do anything if Colorbox already exists. + if ($.colorbox) { + return; + } + + // Append the HTML when the DOM loads + $(appendHTML); + + + // **************** + // PUBLIC FUNCTIONS + // Usage format: $.colorbox.close(); + // Usage from within an iframe: parent.jQuery.colorbox.close(); + // **************** + + publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) { + var $this = this; + + options = options || {}; + + appendHTML(); + + if (addBindings()) { + if ($.isFunction($this)) { // assume a call to $.colorbox + $this = $('<a/>'); + options.open = true; + } else if (!$this[0]) { // colorbox being applied to empty collection + return $this; + } + + if (callback) { + options.onComplete = callback; + } + + $this.each(function () { + $.data(this, colorbox, $.extend({}, $.data(this, colorbox) || defaults, options)); + }).addClass(boxElement); + + if (($.isFunction(options.open) && options.open.call($this)) || options.open) { + launch($this[0]); + } + } + + return $this; + }; + + publicMethod.position = function (speed, loadedCallback) { + var + css, + top = 0, + left = 0, + offset = $box.offset(), + scrollTop, + scrollLeft; + + $window.unbind('resize.' + prefix); + + // remove the modal so that it doesn't influence the document width/height + $box.css({top: -9e4, left: -9e4}); + + scrollTop = $window.scrollTop(); + scrollLeft = $window.scrollLeft(); + + if (settings.fixed) { + offset.top -= scrollTop; + offset.left -= scrollLeft; + $box.css({position: 'fixed'}); + } else { + top = scrollTop; + left = scrollLeft; + $box.css({position: 'absolute'}); + } + + // keeps the top and left positions within the browser's viewport. + if (settings.right !== false) { + left += Math.max($window.width() - settings.w - loadedWidth - interfaceWidth - setSize(settings.right, 'x'), 0); + } else if (settings.left !== false) { + left += setSize(settings.left, 'x'); + } else { + left += Math.round(Math.max($window.width() - settings.w - loadedWidth - interfaceWidth, 0) / 2); + } + + if (settings.bottom !== false) { + top += Math.max(winheight() - settings.h - loadedHeight - interfaceHeight - setSize(settings.bottom, 'y'), 0); + } else if (settings.top !== false) { + top += setSize(settings.top, 'y'); + } else { + top += Math.round(Math.max(winheight() - settings.h - loadedHeight - interfaceHeight, 0) / 2); + } + + $box.css({top: offset.top, left: offset.left, visibility:'visible'}); + + // setting the speed to 0 to reduce the delay between same-sized content. + speed = ($box.width() === settings.w + loadedWidth && $box.height() === settings.h + loadedHeight) ? 0 : speed || 0; + + // this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly, + // but it has to be shrank down around the size of div#colorbox when it's done. If not, + // it can invoke an obscure IE bug when using iframes. + $wrap[0].style.width = $wrap[0].style.height = "9999px"; + + function modalDimensions(that) { + $topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = (parseInt(that.style.width,10) - interfaceWidth)+'px'; + $content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = (parseInt(that.style.height,10) - interfaceHeight)+'px'; + } + + css = {width: settings.w + loadedWidth + interfaceWidth, height: settings.h + loadedHeight + interfaceHeight, top: top, left: left}; + + if(speed===0){ // temporary workaround to side-step jQuery-UI 1.8 bug (http://bugs.jquery.com/ticket/12273) + $box.css(css); + } + $box.dequeue().animate(css, { + duration: speed, + complete: function () { + modalDimensions(this); + + active = false; + + // shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation. + $wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px"; + $wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px"; + + if (settings.reposition) { + setTimeout(function () { // small delay before binding onresize due to an IE8 bug. + $window.bind('resize.' + prefix, publicMethod.position); + }, 1); + } + + if (loadedCallback) { + loadedCallback(); + } + }, + step: function () { + modalDimensions(this); + } + }); + }; + + publicMethod.resize = function (options) { + if (open) { + options = options || {}; + + if (options.width) { + settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth; + } + if (options.innerWidth) { + settings.w = setSize(options.innerWidth, 'x'); + } + $loaded.css({width: settings.w}); + + if (options.height) { + settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight; + } + if (options.innerHeight) { + settings.h = setSize(options.innerHeight, 'y'); + } + if (!options.innerHeight && !options.height) { + $loaded.css({height: "auto"}); + settings.h = $loaded.height(); + } + $loaded.css({height: settings.h}); + + publicMethod.position(settings.transition === "none" ? 0 : settings.speed); + } + }; + + publicMethod.prep = function (object) { + if (!open) { + return; + } + + var callback, speed = settings.transition === "none" ? 0 : settings.speed; + + $loaded.empty().remove(); // Using empty first may prevent some IE7 issues. + + $loaded = $tag(div, 'LoadedContent').append(object); + + function getWidth() { + settings.w = settings.w || $loaded.width(); + settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w; + return settings.w; + } + function getHeight() { + settings.h = settings.h || $loaded.height(); + settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h; + return settings.h; + } + + $loaded.hide() + .appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations. + .css({width: getWidth(), overflow: settings.scrolling ? 'auto' : 'hidden'}) + .css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height. + .prependTo($content); + + $loadingBay.hide(); + + // floating the IMG removes the bottom line-height and fixed a problem where IE miscalculates the width of the parent element as 100% of the document width. + + $(photo).css({'float': 'none'}); + + callback = function () { + var total = $related.length, + iframe, + frameBorder = 'frameBorder', + allowTransparency = 'allowTransparency', + complete; + + if (!open) { + return; + } + + function removeFilter() { // Needed for IE7 & IE8 in versions of jQuery prior to 1.7.2 + if ($.support.opacity === false) { + $box[0].style.removeAttribute('filter'); + } + } + + complete = function () { + clearTimeout(loadingTimer); + $loadingOverlay.hide(); + trigger(event_complete, settings.onComplete); + }; + + + $title.html(settings.title).add($loaded).show(); + + if (total > 1) { // handle grouping + if (typeof settings.current === "string") { + $current.html(settings.current.replace('{current}', index + 1).replace('{total}', total)).show(); + } + + $next[(settings.loop || index < total - 1) ? "show" : "hide"]().html(settings.next); + $prev[(settings.loop || index) ? "show" : "hide"]().html(settings.previous); + + if (settings.slideshow) { + $slideshow.show(); + } + + // Preloads images within a rel group + if (settings.preloading) { + $.each([getIndex(-1), getIndex(1)], function(){ + var src, + img, + i = $related[this], + data = $.data(i, colorbox); + + if (data && data.href) { + src = data.href; + if ($.isFunction(src)) { + src = src.call(i); + } + } else { + src = $(i).attr('href'); + } + + if (src && isImage(data, src)) { + src = retinaUrl(data, src); + img = new Image(); + img.src = src; + } + }); + } + } else { + $groupControls.hide(); + } + + if (settings.iframe) { + iframe = $tag('iframe')[0]; + + if (frameBorder in iframe) { + iframe[frameBorder] = 0; + } + + if (allowTransparency in iframe) { + iframe[allowTransparency] = "true"; + } + + if (!settings.scrolling) { + iframe.scrolling = "no"; + } + + $(iframe) + .attr({ + src: settings.href, + name: (new Date()).getTime(), // give the iframe a unique name to prevent caching + 'class': prefix + 'Iframe', + allowFullScreen : true, // allow HTML5 video to go fullscreen + webkitAllowFullScreen : true, + mozallowfullscreen : true + }) + .one('load', complete) + .appendTo($loaded); + + $events.one(event_purge, function () { + iframe.src = "//about:blank"; + }); + + if (settings.fastIframe) { + $(iframe).trigger('load'); + } + } else { + complete(); + } + + if (settings.transition === 'fade') { + $box.fadeTo(speed, 1, removeFilter); + } else { + removeFilter(); + } + }; + + if (settings.transition === 'fade') { + $box.fadeTo(speed, 0, function () { + publicMethod.position(0, callback); + }); + } else { + publicMethod.position(speed, callback); + } + }; + + function load () { + var href, setResize, prep = publicMethod.prep, $inline, request = ++requests; + + active = true; + + photo = false; + + element = $related[index]; + + makeSettings(); + + trigger(event_purge); + + trigger(event_load, settings.onLoad); + + settings.h = settings.height ? + setSize(settings.height, 'y') - loadedHeight - interfaceHeight : + settings.innerHeight && setSize(settings.innerHeight, 'y'); + + settings.w = settings.width ? + setSize(settings.width, 'x') - loadedWidth - interfaceWidth : + settings.innerWidth && setSize(settings.innerWidth, 'x'); + + // Sets the minimum dimensions for use in image scaling + settings.mw = settings.w; + settings.mh = settings.h; + + // Re-evaluate the minimum width and height based on maxWidth and maxHeight values. + // If the width or height exceed the maxWidth or maxHeight, use the maximum values instead. + if (settings.maxWidth) { + settings.mw = setSize(settings.maxWidth, 'x') - loadedWidth - interfaceWidth; + settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw; + } + if (settings.maxHeight) { + settings.mh = setSize(settings.maxHeight, 'y') - loadedHeight - interfaceHeight; + settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh; + } + + href = settings.href; + + loadingTimer = setTimeout(function () { + $loadingOverlay.show(); + }, 100); + + if (settings.inline) { + // Inserts an empty placeholder where inline content is being pulled from. + // An event is bound to put inline content back when Colorbox closes or loads new content. + $inline = $tag(div).hide().insertBefore($(href)[0]); + + $events.one(event_purge, function () { + $inline.replaceWith($loaded.children()); + }); + + prep($(href)); + } else if (settings.iframe) { + // IFrame element won't be added to the DOM until it is ready to be displayed, + // to avoid problems with DOM-ready JS that might be trying to run in that iframe. + prep(" "); + } else if (settings.html) { + prep(settings.html); + } else if (isImage(settings, href)) { + + href = retinaUrl(settings, href); + + $(photo = new Image()) + .addClass(prefix + 'Photo') + .bind('error',function () { + settings.title = false; + prep($tag(div, 'Error').html(settings.imgError)); + }) + .one('load', function () { + var percent; + + if (request !== requests) { + return; + } + + photo.alt = $(element).attr('alt') || $(element).attr('data-alt') || ''; + + if (settings.retinaImage && window.devicePixelRatio > 1) { + photo.height = photo.height / window.devicePixelRatio; + photo.width = photo.width / window.devicePixelRatio; + } + + if (settings.scalePhotos) { + setResize = function () { + photo.height -= photo.height * percent; + photo.width -= photo.width * percent; + }; + if (settings.mw && photo.width > settings.mw) { + percent = (photo.width - settings.mw) / photo.width; + setResize(); + } + if (settings.mh && photo.height > settings.mh) { + percent = (photo.height - settings.mh) / photo.height; + setResize(); + } + } + + if (settings.h) { + photo.style.marginTop = Math.max(settings.mh - photo.height, 0) / 2 + 'px'; + } + + if ($related[1] && (settings.loop || $related[index + 1])) { + photo.style.cursor = 'pointer'; + photo.onclick = function () { + publicMethod.next(); + }; + } + + photo.style.width = photo.width + 'px'; + photo.style.height = photo.height + 'px'; + + setTimeout(function () { // A pause because Chrome will sometimes report a 0 by 0 size otherwise. + prep(photo); + }, 1); + }); + + setTimeout(function () { // A pause because Opera 10.6+ will sometimes not run the onload function otherwise. + photo.src = href; + }, 1); + } else if (href) { + $loadingBay.load(href, settings.data, function (data, status) { + if (request === requests) { + prep(status === 'error' ? $tag(div, 'Error').html(settings.xhrError) : $(this).contents()); + } + }); + } + } + + // Navigates to the next page/image in a set. + publicMethod.next = function () { + if (!active && $related[1] && (settings.loop || $related[index + 1])) { + index = getIndex(1); + launch($related[index]); + } + }; + + publicMethod.prev = function () { + if (!active && $related[1] && (settings.loop || index)) { + index = getIndex(-1); + launch($related[index]); + } + }; + + // Note: to use this within an iframe use the following format: parent.jQuery.colorbox.close(); + publicMethod.close = function () { + if (open && !closing) { + + closing = true; + + open = false; + + trigger(event_cleanup, settings.onCleanup); + + $window.unbind('.' + prefix); + + $overlay.fadeTo(settings.fadeOut || 0, 0); + + $box.stop().fadeTo(settings.fadeOut || 0, 0, function () { + + $box.add($overlay).css({'opacity': 1, cursor: 'auto'}).hide(); + + trigger(event_purge); + + $loaded.empty().remove(); // Using empty first may prevent some IE7 issues. + + setTimeout(function () { + closing = false; + trigger(event_closed, settings.onClosed); + }, 1); + }); + } + }; + + // Removes changes Colorbox made to the document, but does not remove the plugin. + publicMethod.remove = function () { + if (!$box) { return; } + + $box.stop(); + $.colorbox.close(); + $box.stop().remove(); + $overlay.remove(); + closing = false; + $box = null; + $('.' + boxElement) + .removeData(colorbox) + .removeClass(boxElement); + + $(document).unbind('click.'+prefix); + }; + + // A method for fetching the current element Colorbox is referencing. + // returns a jQuery object. + publicMethod.element = function () { + return $(element); + }; + + publicMethod.settings = defaults; + +}(jQuery, document, window)); Property changes on: branches/1.0.x/inc/js/colorbox/jquery.colorbox.js ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +LF \ No newline at end of property Index: branches/1.0.x/inc/js/colorbox/images/loading_background.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: branches/1.0.x/inc/js/colorbox/images/loading_background.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: branches/1.0.x/inc/js/colorbox/images/border.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: branches/1.0.x/inc/js/colorbox/images/border.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: branches/1.0.x/inc/js/colorbox/images/loading.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: branches/1.0.x/inc/js/colorbox/images/loading.gif ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: branches/1.0.x/inc/js/colorbox/images/overlay.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: branches/1.0.x/inc/js/colorbox/images/overlay.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: branches/1.0.x/inc/js/colorbox/images/controls.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: branches/1.0.x/inc/js/colorbox/images/controls.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: branches/1.0.x/inc/js/colorbox/jquery.colorbox.css =================================================================== --- branches/1.0.x/inc/js/colorbox/jquery.colorbox.css (nonexistent) +++ branches/1.0.x/inc/js/colorbox/jquery.colorbox.css (revision 15801) @@ -0,0 +1,69 @@ +/* + Colorbox Core Style: + The following CSS is consistent between example themes and should not be altered. +*/ +#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;} +#cboxOverlay{position:fixed; width:100%; height:100%;} +#cboxMiddleLeft, #cboxBottomLeft{clear:left;} +#cboxContent{position:relative;} +#cboxLoadedContent{overflow:auto; -webkit-overflow-scrolling: touch;} +#cboxTitle{margin:0;} +#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;} +#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;} +.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none; -ms-interpolation-mode:bicubic;} +.cboxIframe{width:100%; height:100%; display:block; border:0;} +#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;} + +/* + User Style: + Change the following styles to modify the appearance of Colorbox. They are + ordered & tabbed in a way that represents the nesting of the generated HTML. +*/ +#cboxOverlay{background:url(@templates_base@/inc/js/colorbox/images/overlay.png) repeat 0 0;} +#colorbox{outline:0;} + #cboxTopLeft{width:21px; height:21px; background:url(@templates_base@/inc/js/colorbox/images/controls.png) no-repeat -101px 0;} + #cboxTopRight{width:21px; height:21px; background:url(@templates_base@/inc/js/colorbox/images/controls.png) no-repeat -130px 0;} + #cboxBottomLeft{width:21px; height:21px; background:url(@templates_base@/inc/js/colorbox/images/controls.png) no-repeat -101px -29px;} + #cboxBottomRight{width:21px; height:21px; background:url(@templates_base@/inc/js/colorbox/images/controls.png) no-repeat -130px -29px;} + #cboxMiddleLeft{width:21px; background:url(@templates_base@/inc/js/colorbox/images/controls.png) left top repeat-y;} + #cboxMiddleRight{width:21px; background:url(@templates_base@/inc/js/colorbox/images/controls.png) right top repeat-y;} + #cboxTopCenter{height:21px; background:url(@templates_base@/inc/js/colorbox/images/border.png) 0 0 repeat-x;} + #cboxBottomCenter{height:21px; background:url(@templates_base@/inc/js/colorbox/images/border.png) 0 -29px repeat-x;} + #cboxContent{background:#fff; overflow:hidden;} + .cboxIframe{background:#fff;} + #cboxError{padding:50px; border:1px solid #ccc;} + #cboxLoadedContent{margin-bottom:28px;} + #cboxTitle{position:absolute; bottom:4px; left:0; text-align:center; width:100%; color:#949494;} + #cboxCurrent{position:absolute; bottom:4px; left:58px; color:#949494;} + #cboxLoadingOverlay{background:url(@templates_base@/inc/js/colorbox/images/loading_background.png) no-repeat center center;} + #cboxLoadingGraphic{background:url(@templates_base@/inc/js/colorbox/images/loading.gif) no-repeat center center;} + + /* these elements are buttons, and may need to have additional styles reset to avoid unwanted base styles */ + #cboxPrevious, #cboxNext, #cboxSlideshow, #cboxClose {border:0; padding:0; margin:0; overflow:visible; width:auto; background:none; } + + /* avoid outlines on :active (mouseclick), but preserve outlines on :focus (tabbed navigating) */ + #cboxPrevious:active, #cboxNext:active, #cboxSlideshow:active, #cboxClose:active {outline:0;} + + #cboxSlideshow{position:absolute; bottom:4px; right:30px; color:#0092ef;} + #cboxPrevious{position:absolute; bottom:0; left:0; background:url(@templates_base@/inc/js/colorbox/images/controls.png) no-repeat -75px 0; width:25px; height:25px; text-indent:-9999px;} + #cboxPrevious:hover{background-position:-75px -25px;} + #cboxNext{position:absolute; bottom:0; left:27px; background:url(@templates_base@/inc/js/colorbox/images/controls.png) no-repeat -50px 0; width:25px; height:25px; text-indent:-9999px;} + #cboxNext:hover{background-position:-50px -25px;} + #cboxClose{position:absolute; bottom:0; right:0; background:url(@templates_base@/inc/js/colorbox/images/controls.png) no-repeat -25px 0; width:25px; height:25px; text-indent:-9999px;} + #cboxClose:hover{background-position:-25px -25px;} + +/* + The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill + when an alpha filter (opacity change) is set on the element or ancestor element. This style is not applied to or needed in IE9. + See: http://jacklmoore.com/notes/ie-transparency-problems/ +*/ +.cboxIE #cboxTopLeft, +.cboxIE #cboxTopCenter, +.cboxIE #cboxTopRight, +.cboxIE #cboxBottomLeft, +.cboxIE #cboxBottomCenter, +.cboxIE #cboxBottomRight, +.cboxIE #cboxMiddleLeft, +.cboxIE #cboxMiddleRight { + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF); +} \ No newline at end of file Property changes on: branches/1.0.x/inc/js/colorbox/jquery.colorbox.css ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +LF \ No newline at end of property Index: branches/1.0.x/inc/js/form_manager.js =================================================================== --- branches/1.0.x/inc/js/form_manager.js (revision 15800) +++ branches/1.0.x/inc/js/form_manager.js (revision 15801) @@ -1,610 +1,890 @@ function FormManager() { } FormManager.init = function ($settings) { $.ajaxSetup( {cache: false} ); this.url = ''; this.fieldMask = '#PREFIX#[#ID#][#FIELD_NAME#]'; this.noErrorsHTML = ''; this.checkTimeout = 1000; this.pendingChecks = {}; this.fields = {}; this.errors = {}; this.fieldTypes = {}; this.forms = {}; this.fieldWatermarks = {}; this.xhrRequests = []; + this.windowScope = 'a.form-manager-window, area.form-manager-window, input.form-manager-window'; + this.windowManager = undefined; $.extend(this, $settings); -} + + if ( this.windowManager === undefined ) { + this.windowManager = new FormManager_WindowManagerExample(); + } + + $(document).ready(function () { + FormManager.windowManager.init(FormManager.windowScope); + }); +}; FormManager.resetFields = function ($prefix) { this.fields[$prefix] = []; -} +}; FormManager.registerField = function ($prefix, $field, $watermark, $field_type) { // fields are registered before form -> store them in separate array if (!this.fields[$prefix]) { this.fields[$prefix] = []; } if ($watermark === undefined) { $watermark = ''; } this.fieldWatermarks[$prefix + '_' + $field] = $watermark; this.fields[$prefix].push($field); if ($field_type !== undefined) { this.fieldTypes[$prefix + '_' + $field] = $field_type; } -} +}; FormManager.unregisterField = function ($prefix, $field) { var $field_index = array_search($field, this.fields[$prefix]); this.fields[$prefix].splice($field_index, 1); delete this.fieldWatermarks[$prefix + '_' + $field]; delete this.fieldTypes[$prefix + '_' + $field]; -} - +}; FormManager.getFieldMask = function ($prefix) { return this.fieldMask.replace('#PREFIX#', $prefix).replace('#ID#', this.form_param($prefix, 'id')); -} +}; FormManager.getField = function ($prefix, $field, $prepend, $append) { if ($prepend === undefined) { $prepend = ''; } if ($append === undefined) { $append = ''; } var $control_id = this.getFieldMask($prefix).replace('#FIELD_NAME#', $field); return document.getElementById($prepend + $control_id + $append); -} +}; FormManager.getBlurFields = function ($prefix, $field) { var $field_mask = this.getFieldMask($prefix); switch ( this.fieldTypes[$prefix + '_' + $field] ) { case 'swf_upload': return this.getField($prefix, $field, undefined, '[json]'); break; case 'date': $field += '_date'; break; case 'radio': return $("input[name='" + jq($field_mask.replace('#FIELD_NAME#', $field)) + "']"); break; case 'checkbox': return get_control($field_mask, $field, undefined, '_cb'); break; case 'checkboxes': return $("input[id^='" + jq($field_mask.replace('#FIELD_NAME#', $field)) + "_']"); break; case 'cc_expiration': return $('select', this.getCell($prefix, $field, 'field')); break; } return this.getField($prefix, $field); -} +}; FormManager.registerForm = function ($settings) { var $defaults = { url: false, // url for form submission template: '', // template to use instead of empty string prefix: '', // unit prefix, used in the form enabled: true, // form submit enabled enabledTimer: null, // timer that performs form-resubmit countdown save_event: '', // event to use for form data processing id: 0, // id of item being add/edited on a form form_id: '', // form id to work with before_close: '', // before window close callback validation_failure: '', // on validate failure callback - immediate_validation: true // perfom validation on blur - } + immediate_validation: true // perform validation on blur + }; this.forms[$settings.prefix] = {}; $.extend(this.forms[$settings.prefix], $defaults, $settings); $(document).trigger('FormManager.Form.Ready', [$settings.prefix]); - // when form is registred, then all it's fields should also be registred + // when form is registered, then all it's fields should also be registered if ( !this.form_param($settings.prefix, 'immediate_validation') ) { return ; } var $me = this; $( this.fields[$settings.prefix] ).each( function () { var $blur_fields = $( $me.getBlurFields($settings.prefix, this) ), $event_name = $blur_fields.length == 1 ? 'blur' : 'click'; $blur_fields[$event_name]( function ($e) { $me.checkField(this); } ); } ); for (var $error_field in this.errors[$settings.prefix]) { this.setFieldStatus($settings.prefix, $error_field, this.errors[$settings.prefix][$error_field]); } // custom: begin $('input[title], select[title], textarea[title]', '#' + this.forms[$settings.prefix].form_id).qtip( { style: { classes: 'ui-tooltip-light ui-tooltip-shadow' }, position: { my: 'left center', at: 'right center' }, show: { event: 'focus' } } ); $('img.help-icon', '#' + this.forms[$settings.prefix].form_id ).qtip( { style: { classes: 'ui-tooltip-light ui-tooltip-shadow' }, position: { my: 'bottom left', at: 'top center' } } ); // custom: end -} +}; FormManager.getURL = function ($prefix, $template, $event, $params) { var $url = this.getUrlMask($prefix); if ($template === undefined) { $template = this.form_param($prefix, 'template'); } $url = $url.replace('#TEMPLATE#', $template); if ($event !== undefined) { $url += ($url.indexOf('?') == -1 ? '?' : '&') + 'events[' + $prefix + ']=' + $event; } if ( typeof($params) == 'object' ) { for (key in $params) { $url += ($url.indexOf('?') == -1 ? '?' : '&') + key + '=' + $params[key]; } } return $url; -} +}; FormManager.getUrlMask = function ($prefix) { // 1. look in form config var $url = this.form_param($prefix, 'url'); if ( !$url ) { // 2. look at 'action' attribute of a form $url = this.getForm($prefix).attr('action'); } if ( !$url ) { // 3. use global fallback url $url = this.url; } return $url; }; FormManager.processResponse = function ($prefix, $data, $add_params) { // enable form back // alert('enabling for for [' + $prefix + '] in processResponse'); if ( $add_params !== undefined ) { $add_params.response = $data; } else { $add_params = {response: $data}; } this.clearErrors($prefix); this.processUploadFields($prefix, $data); if ($data.status == 'OK') { var $next_template = this.getNextTemplate($prefix, $data); if ( $next_template || $data.do_refresh || $data.redirect_to ) { var $before_close = this.getFormParamOverride($prefix, 'before_close', $add_params); if ( $.isFunction($before_close) ) { $before_close.call(this, $data, $add_params); } if ( $next_template ) { // load another template instead of current form - $('#TB_ajaxContent').html('').load( this.getURL($prefix, $next_template, undefined, $data.params) ); + $(this.windowManager.getContentSelector()) + .html('') + .load(this.getURL($prefix, $next_template, undefined, $data.params), function () { + $(document).trigger('FormManager.WindowManager.Ready'); + }); } else if ( $data.do_refresh ) { // refresh whole page window.location.reload(true); } else if ( $data.redirect_to ) { // redirect to given page window.location.assign($data.redirect_to); } } else { // close form without refreshing the page this.closeForm($prefix, $data, $add_params); } } else { // set new errors for ($field in $data.field_errors) { this.setFieldStatus($prefix, $field, $data.field_errors[$field]); } var $validation_failure = this.form_param($prefix, 'validation_failure'); if ( $.isFunction($validation_failure) ) { $validation_failure.call(this, $data, $add_params); } } this.enableForm($prefix, true); // var $me = this; // setTimeout(function () { $me.enableForm($prefix, true); }, 1000); -} +}; /** * Clear errors from all from fields * * @param $prefix */ FormManager.clearErrors = function ($prefix) { var $fields = this.fields[$prefix]; if (typeof($fields) == 'undefined') { $fields = []; } this.errors[$prefix] = {}; for (var $i = 0; $i < $fields.length; $i++) { this.setFieldStatus($prefix, $fields[$i]); } -} +}; FormManager.getNextTemplate = function ($prefix, $responce) { if ( $responce.next_template && $responce.next_template != '' ) { return $responce.next_template; } else if ( this.form_param($prefix, 'next_template') ) { return this.form_param($prefix, 'next_template'); } return false; -} +}; FormManager.getCell = function ($prefix, $field_name, $cell_type) { $field_name = $field_name.replace(/_(date|time)$/, ''); return this.getField($prefix, $field_name, undefined, '_' + $cell_type + '_cell'); -} +}; FormManager.setFieldStatus = function ($prefix, $field_name, $error_msg) { - var field_cell = this.getCell($prefix, $field_name, 'field'); - var status_cell = this.getCell($prefix, $field_name, 'status'); + var field_cell = $(this.getCell($prefix, $field_name, 'field')); + var status_cell = $(this.getCell($prefix, $field_name, 'status')); if ( $error_msg === undefined || !$error_msg ) { $error_msg = ''; } - if ( !field_cell ) { + if ( field_cell.length == 0 ) { if (!this.errors[$prefix]) { this.errors[$prefix] = {}; } this.errors[$prefix][$field_name] = $error_msg; /*if(typeof console === 'object') { console.log('FormManager: Error field "' + $field_name + '" missing.'); }*/ return ; } if ($error_msg === undefined || !$error_msg) { // show OK - $(field_cell).parents('p:first').removeClass('error'); //.addClass('ok'); - $(status_cell)/*.removeClass('field-error')*/.html(this.noErrorsHTML); + field_cell.parents('p:first').removeClass('error'); //.addClass('ok'); + status_cell/*.removeClass('field-error')*/.html(this.noErrorsHTML); var $fields = this.fields[$prefix]; for (var $i = 0; $i < $fields.length; $i++) { if ( this.fieldHasError($prefix, $fields[$i]) ) { return ; } } } else { // show error message - $(field_cell).parents('p:first')/*.removeClass('ok')*/.addClass('error'); - $(status_cell)/*.addClass('field-error')*/.html($error_msg); + field_cell.parents('p:first')/*.removeClass('ok')*/.addClass('error'); + status_cell/*.addClass('field-error')*/.html($error_msg); } -} +}; FormManager.fieldHasError = function ($prefix, $field) { var status_cell = this.getField($prefix, $field, undefined, '_status_cell'); return $.trim( $(status_cell).html() ) != $.trim( this.noErrorsHTML ); -} +}; FormManager.checkField = function ($input, $delayed) { if ( !$input.id.match(/^(.*?)\[.*?\]\[(.*?)\].*?$/) ) { return ; } var $prefix = RegExp.$1; var $field = RegExp.$2.replace(/(_date|_time)$/, ''); if ( $field.match(/(.*)(Month|Year)$/) && this.fieldTypes[$prefix + '_' + RegExp.$1 + 'Date'] == 'cc_expiration' ) { $field = RegExp.$1 + 'Date'; } if ( this.pendingChecks[$field] ) { clearTimeout( this.pendingChecks[$field] ); delete this.pendingChecks[$field]; } var $me = this; this.pendingChecks[$field] = setTimeout( function () { $me.validateField($prefix, $field, $input) }, ($delayed === true ? this.checkTimeout : 0) ); -} +}; FormManager.validateField = function ($prefix, $field, $input) { var $me = this, form = this.getForm($prefix); var $request = $.post( this.getURL($prefix, undefined, 'OnValidateField') + '&field=' + encodeURIComponent($field) + '&' + $input.name + '=' + encodeURIComponent($input.value), this._getFormFields($prefix), function ($data) { $data = eval('(' + $data + ')'); $me.setFieldStatus($prefix, $field, $data.status == 'OK' ? undefined : $data.status); $me.processUploadFields($prefix, $data); $("input[type='submit']", form).attr('disabled', !$.isArray($data.other_errors) ); // custom } ); this.xhrRequests.push($request); }; FormManager.processUploadFields = function ($prefix, $response) { if ( $response['uploader_info'] === undefined || $.isArray($response['uploader_info']) ) { // no data (event don't support that) OR empty array (no uploader fields on form) return; } var $field_mask = this.getFieldMask($prefix); $.each($response['uploader_info'], function ($field_name, $field_data) { var $uploader_id = $field_mask.replace('#FIELD_NAME#', $field_name); $(document).trigger('UploadsManager.Uploader.' + crc32($uploader_id), ['refreshQueue', $field_data]); }); }; FormManager.form_param = function ($prefix, $param, $value) { if ( this.forms[$prefix] === undefined ) { return ''; } if ($value === undefined) { return this.forms[$prefix][$param]; } this.forms[$prefix][$param] = $value; -} +}; FormManager.getFormParamOverride = function ($prefix, $param, $overrides) { if ( $overrides[$param] !== undefined ) { return $overrides[$param]; } return this.form_param($prefix, $param); -} +}; /* === related to form opening/closing/submitting === */ FormManager.openForm = function ($prefix, $template, $width, $height, $source_form, $params) { var $url = this.getURL($prefix, $template, undefined, $params); - $url += ($url.indexOf('?') == -1 ? '?' : '&') + 'width=' + $width + '&height=' + $height + '&modal=true'; - - var $tb_settings = {url: $url}; - - if ($source_form !== undefined) { - $tb_settings.postParams = $($source_form).serialize(); - } - - TB.show($tb_settings); -} + this.windowManager.open($url, $width, $height, $source_form); +}; FormManager.validateAll = function ($prefix, $status) { var $fields = this.fields[$prefix]; for (var $i = 0; $i < $fields.length; $i++) { this.setFieldStatus($prefix, $fields[$i], $status); } -} +}; FormManager.closeForm = function ($prefix, $data, $add_params) { if ( $data === undefined ) { $data = {}; } if ( $add_params === undefined ) { $add_params = {}; } var $before_close = this.getFormParamOverride($prefix, 'before_close', $add_params); this.cancelXHRRequests(); this.validateAll($prefix); if ( $.isFunction($before_close) ) { var $result = $before_close.call(this, $data, $add_params); if ($result === false) { return; } } - TB.remove(); -} + this.windowManager.close(); +}; FormManager._getFormFields = function ($prefix) { var $old_values = {}, $fields = this.fields[$prefix]; if (typeof($fields) == 'undefined') { $fields = []; } // remove watermarks from input fields for (var $i = 0; $i < $fields.length; $i++) { var $control = this.getField($prefix, $fields[$i]), $watermark = this.fieldWatermarks[ $prefix + '_' + $fields[$i] ]; if ( $control ) { $old_values[$fields[$i]] = $control.value; if ( $watermark !== undefined && $control.value == $watermark ) { $control.value = ''; } } } var $form_fields = this.getForm($prefix).serialize(); // restore original values into input fields for (var $i = 0; $i < $fields.length; $i++) { var $control = this.getField($prefix, $fields[$i]); if ( $control ) { $control.value = $old_values[$fields[$i]]; } } return $form_fields; -} +}; FormManager.getForm = function ($prefix) { var $form_id = this.form_param($prefix, 'form_id'); return $('#' + jq($form_id)); }; FormManager.enableForm = function ($prefix, $enabled) { if ($enabled === undefined) { $enabled = true; } if ($enabled) { clearTimeout( this.form_param($prefix, 'enabledTimer') ); this.form_param($prefix, 'enabledTimer', null); } else { var $me = this; // set timer for 10 seconds to enable form back (just in case if ajax responce fails) var $timer = setTimeout( function () { // alert('enabling for for [' + $prefix + '] in setTimeout'); $me.enableForm($prefix, true); } , 10000 ); this.form_param($prefix, 'enabledTimer', $timer); } this.form_param($prefix, 'enabled', $enabled); -} +}; FormManager.cancelXHRRequests = function () { while ( this.xhrRequests.length > 0 ) { this.xhrRequests.shift().abort(); } -} +}; FormManager.submitForm = function ($prefix, $add_params) { if ( !this.form_param($prefix, 'enabled') ) { return ; } // disable form this.enableForm($prefix, false); var $me = this; this.cancelXHRRequests(); $.post( this.getURL( $prefix, undefined, this.form_param($prefix, 'save_event') ), this._getFormFields($prefix), function ($data) { - var $redirect = TB.parseRedirect($data); + var $redirect = FormManager.parseRedirect($data); if ( $redirect !== false ) { window.location.href = $redirect; return ; } $me.processResponse($prefix, eval('(' + $data + ')'), $add_params); } ) -} +}; FormManager.beforeClose = function () { this.cancelXHRRequests(); for (var $prefix in this.forms) { var $before_close = this.form_param($prefix, 'before_close'); this.clearErrors($prefix); if ( $.isFunction($before_close) ) { $before_close.call(this, {}, {}); } } -} \ No newline at end of file +}; + +FormManager.parseRedirect = function ($data) { + var $match_redirect = new RegExp('^#redirect#(.*?)($|\\s.*)').exec($data); + + if ( $match_redirect != null ) { + // redirect to external template requested + return $match_redirect[1]; + } + + return false; +}; + +FormManager.parseQueryString = function ($url) { + var $query_string = {}; + + $url.replace( + new RegExp('([^?=&]+)(=([^&]*))?', 'g'), + function($0, $1, $2, $3) { + $query_string[$1] = decodeURIComponent($3); + } + ); + + return $query_string; +}; + +/* ==================================================================== */ + +function FormManager_WindowManagerExample() { + +} + +FormManager_WindowManagerExample.prototype.init = function ($window_scope, $context) { + throw 'FormManager_WindowManagerExample: Please use other window manager.'; +}; + +FormManager_WindowManagerExample.prototype.open = function ($url, $width, $height, $source_form) { + +}; + +FormManager_WindowManagerExample.prototype.getDefaultOptions = function ($url, $width, $height) { + +}; + +FormManager_WindowManagerExample.prototype.close = function () { + +}; + +FormManager_WindowManagerExample.prototype.getContentSelector = function () { + +}; + +/* ==================================================================== */ + +function FormManager_WindowManagerThickBox() { + this.lastWindowScope = ''; +} + +FormManager_WindowManagerThickBox.prototype.init = function ($window_scope, $context) { + var $me = this; + + $(this.getWindowScope($window_scope), $context).click(function ($e) { + var $options = $me.getDefaultOptions(this.href || this.alt); + + $.extend($options, { + caption: this.title || this.name || null, + imageGroup: this.rel || false + }); + + TB.show($options); + this.blur(); + + $e.preventDefault(); + }); +}; + +FormManager_WindowManagerThickBox.prototype.getWindowScope = function ($window_scope) { + if ( $window_scope !== undefined ) { + this.lastWindowScope = $window_scope; + + return $window_scope; + } + + return this.lastWindowScope; +}; + +FormManager_WindowManagerThickBox.prototype.open = function ($url, $width, $height, $source_form) { + $url += ($url.indexOf('?') == -1 ? '?' : '&') + 'width=' + $width + '&height=' + $height + '&modal=true'; + + var $options = this.getDefaultOptions($url, $width, $height); + + if ( $source_form !== undefined ) { + $options.postParams = $($source_form).serialize(); + } + + TB.show($options); +}; + +FormManager_WindowManagerThickBox.prototype.getDefaultOptions = function ($url, $width, $height) { + var $me = this; + + return { + url: $url, + onAfterShow: function () { + $me.init(undefined, $me.getContentSelector()); + + // document.ready equivalent for ajax loaded windows + $(document).trigger('FormManager.WindowManager.Ready'); + } + }; +}; + +FormManager_WindowManagerThickBox.prototype.close = function () { + TB.remove(); +}; + +FormManager_WindowManagerThickBox.prototype.getContentSelector = function () { + return '#TB_ajaxContent'; +}; + +/* ==================================================================== */ + +function FormManager_WindowManagerColorBox() { + this.lastWindowScope = ''; +} + +FormManager_WindowManagerColorBox.prototype.init = function ($window_scope, $context) { + var $me = this; + + $(this.getWindowScope($window_scope), $context).each(function () { + var $url = this.href || this.alt, + $query_string = FormManager.parseQueryString($url), + $options = $me.getDefaultOptions( + this.href || this.alt, + $query_string['width'] !== undefined ? $query_string['width'] : false, + $query_string['height'] !== undefined ? $query_string['height'] : false + ); + + $.extend($options, { + title: this.title || this.name || false + }); + + $(this).colorbox($options); + }); +}; + +FormManager_WindowManagerColorBox.prototype.getWindowScope = function ($window_scope) { + if ( $window_scope !== undefined ) { + this.lastWindowScope = $window_scope; + + return $window_scope; + } + + return this.lastWindowScope; +}; + +FormManager_WindowManagerColorBox.prototype.open = function ($url, $width, $height, $source_form) { + var $options = this.getDefaultOptions($url, $width, $height); + + $.extend($options, { + // modal analog + escKey: false, + overlayClose: false + }); + + if ( $source_form !== undefined ) { + $options.data = $($source_form).serialize(); + } + + $.colorbox($options); +}; + +FormManager_WindowManagerColorBox.prototype.getDefaultOptions = function ($url, $width, $height) { + var $me = this; + + return { + href: $url, + + innerWidth: $width, + innerHeight: $height, + + onComplete: function () { + $me.init(undefined, $me.getContentSelector()); + + // document.ready equivalent for ajax loaded windows + $(document).trigger('FormManager.WindowManager.Ready'); + } + }; +}; + +FormManager_WindowManagerColorBox.prototype.close = function () { + $.colorbox.close(); +}; + +FormManager_WindowManagerColorBox.prototype.getContentSelector = function () { + return '#cboxLoadedContent'; +}; + +/* ==================================================================== */ + +function FormManager_WindowManagerFancyBox() { + this.lastWindowScope = ''; +} +FormManager_WindowManagerFancyBox.prototype.init = function ($window_scope, $context) { + var $me = this; + + $(this.getWindowScope($window_scope), $context).each(function () { + var $url = this.href || this.alt, + $query_string = FormManager.parseQueryString($url), + $options = $me.getDefaultOptions( + $url, + $query_string['width'] !== undefined ? $query_string['width'] : false, + $query_string['height'] !== undefined ? $query_string['height'] : false + ); + + $.extend($options, { + title: this.title || this.name || false + }); + + $(this).fancybox($options); + }); +}; + +FormManager_WindowManagerFancyBox.prototype.getWindowScope = function ($window_scope) { + if ( $window_scope !== undefined ) { + this.lastWindowScope = $window_scope; + + return $window_scope; + } + + return this.lastWindowScope; +}; + +FormManager_WindowManagerFancyBox.prototype.open = function ($url, $width, $height, $source_form) { + var $options = this.getDefaultOptions($url, $width, $height); + + $.extend($options, { + modal: true + }); + + if ($source_form !== undefined) { + $options['ajax'] = { + data: $($source_form).serialize() + }; + } + + $.fancybox.open($options); +}; + +FormManager_WindowManagerFancyBox.prototype.getDefaultOptions = function ($url, $width, $height) { + var $me = this; + + return { + href: $url, + type : $.fancybox.isImage($url) ? 'image' : 'ajax', + + width: $width, + height: $height, + autoSize: false, + + afterShow: function () { + $me.init(undefined, $me.getContentSelector()); + + // document.ready equivalent for ajax loaded windows + $(document).trigger('FormManager.WindowManager.Ready'); + } + }; +}; + +FormManager_WindowManagerFancyBox.prototype.close = function () { + $.fancybox.close(); +}; + +FormManager_WindowManagerFancyBox.prototype.getContentSelector = function () { + return '.fancybox-inner'; +}; Index: branches/1.0.x/inc/js/fancybox/jquery.fancybox.js =================================================================== --- branches/1.0.x/inc/js/fancybox/jquery.fancybox.js (nonexistent) +++ branches/1.0.x/inc/js/fancybox/jquery.fancybox.js (revision 15801) @@ -0,0 +1,1983 @@ +/*! + * fancyBox - jQuery Plugin + * version: 2.1.4 (Thu, 10 Jan 2013) + * @requires jQuery v1.6 or later + * + * Examples at http://fancyapps.com/fancybox/ + * License: www.fancyapps.com/fancybox/#license + * + * Copyright 2012 Janis Skarnelis - janis@fancyapps.com + * + */ + +(function (window, document, $, undefined) { + "use strict"; + + var W = $(window), + D = $(document), + F = $.fancybox = function () { + F.open.apply( this, arguments ); + }, + IE = navigator.userAgent.match(/msie/), + didUpdate = null, + isTouch = document.createTouch !== undefined, + + isQuery = function(obj) { + return obj && obj.hasOwnProperty && obj instanceof $; + }, + isString = function(str) { + return str && $.type(str) === "string"; + }, + isPercentage = function(str) { + return isString(str) && str.indexOf('%') > 0; + }, + isScrollable = function(el) { + return (el && !(el.style.overflow && el.style.overflow === 'hidden') && ((el.clientWidth && el.scrollWidth > el.clientWidth) || (el.clientHeight && el.scrollHeight > el.clientHeight))); + }, + getScalar = function(orig, dim) { + var value = parseInt(orig, 10) || 0; + + if (dim && isPercentage(orig)) { + value = F.getViewport()[ dim ] / 100 * value; + } + + return Math.ceil(value); + }, + getValue = function(value, dim) { + return getScalar(value, dim) + 'px'; + }; + + $.extend(F, { + // The current version of fancyBox + version: '2.1.4', + + defaults: { + padding : 15, + margin : 20, + + width : 800, + height : 600, + minWidth : 100, + minHeight : 100, + maxWidth : 9999, + maxHeight : 9999, + + autoSize : true, + autoHeight : false, + autoWidth : false, + + autoResize : true, + autoCenter : !isTouch, + fitToView : true, + aspectRatio : false, + topRatio : 0.5, + leftRatio : 0.5, + + scrolling : 'auto', // 'auto', 'yes' or 'no' + wrapCSS : '', + + arrows : true, + closeBtn : true, + closeClick : false, + nextClick : false, + mouseWheel : true, + autoPlay : false, + playSpeed : 3000, + preload : 3, + modal : false, + loop : true, + + ajax : { + dataType : 'html', + headers : { 'X-fancyBox': true } + }, + iframe : { + scrolling : 'auto', + preload : true + }, + swf : { + wmode: 'transparent', + allowfullscreen : 'true', + allowscriptaccess : 'always' + }, + + keys : { + next : { + 13 : 'left', // enter + 34 : 'up', // page down + 39 : 'left', // right arrow + 40 : 'up' // down arrow + }, + prev : { + 8 : 'right', // backspace + 33 : 'down', // page up + 37 : 'right', // left arrow + 38 : 'down' // up arrow + }, + close : [27], // escape key + play : [32], // space - start/stop slideshow + toggle : [70] // letter "f" - toggle fullscreen + }, + + direction : { + next : 'left', + prev : 'right' + }, + + scrollOutside : true, + + // Override some properties + index : 0, + type : null, + href : null, + content : null, + title : null, + + // HTML templates + tpl: { + wrap : '<div class="fancybox-wrap" tabIndex="-1"><div class="fancybox-skin"><div class="fancybox-outer"><div class="fancybox-inner"></div></div></div></div>', + image : '<img class="fancybox-image" src="{href}" alt="" />', + iframe : '<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" frameborder="0" vspace="0" hspace="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen' + (IE ? ' allowtransparency="true"' : '') + '></iframe>', + error : '<p class="fancybox-error">The requested content cannot be loaded.<br/>Please try again later.</p>', + closeBtn : '<a title="Close" class="fancybox-item fancybox-close" href="javascript:;"></a>', + next : '<a title="Next" class="fancybox-nav fancybox-next" href="javascript:;"><span></span></a>', + prev : '<a title="Previous" class="fancybox-nav fancybox-prev" href="javascript:;"><span></span></a>' + }, + + // Properties for each animation type + // Opening fancyBox + openEffect : 'fade', // 'elastic', 'fade' or 'none' + openSpeed : 250, + openEasing : 'swing', + openOpacity : true, + openMethod : 'zoomIn', + + // Closing fancyBox + closeEffect : 'fade', // 'elastic', 'fade' or 'none' + closeSpeed : 250, + closeEasing : 'swing', + closeOpacity : true, + closeMethod : 'zoomOut', + + // Changing next gallery item + nextEffect : 'elastic', // 'elastic', 'fade' or 'none' + nextSpeed : 250, + nextEasing : 'swing', + nextMethod : 'changeIn', + + // Changing previous gallery item + prevEffect : 'elastic', // 'elastic', 'fade' or 'none' + prevSpeed : 250, + prevEasing : 'swing', + prevMethod : 'changeOut', + + // Enable default helpers + helpers : { + overlay : true, + title : true + }, + + // Callbacks + onCancel : $.noop, // If canceling + beforeLoad : $.noop, // Before loading + afterLoad : $.noop, // After loading + beforeShow : $.noop, // Before changing in current item + afterShow : $.noop, // After opening + beforeChange : $.noop, // Before changing gallery item + beforeClose : $.noop, // Before closing + afterClose : $.noop // After closing + }, + + //Current state + group : {}, // Selected group + opts : {}, // Group options + previous : null, // Previous element + coming : null, // Element being loaded + current : null, // Currently loaded element + isActive : false, // Is activated + isOpen : false, // Is currently open + isOpened : false, // Have been fully opened at least once + + wrap : null, + skin : null, + outer : null, + inner : null, + + player : { + timer : null, + isActive : false + }, + + // Loaders + ajaxLoad : null, + imgPreload : null, + + // Some collections + transitions : {}, + helpers : {}, + + /* + * Static methods + */ + + open: function (group, opts) { + if (!group) { + return; + } + + if (!$.isPlainObject(opts)) { + opts = {}; + } + + // Close if already active + if (false === F.close(true)) { + return; + } + + // Normalize group + if (!$.isArray(group)) { + group = isQuery(group) ? $(group).get() : [group]; + } + + // Recheck if the type of each element is `object` and set content type (image, ajax, etc) + $.each(group, function(i, element) { + var obj = {}, + href, + title, + content, + type, + rez, + hrefParts, + selector; + + if ($.type(element) === "object") { + // Check if is DOM element + if (element.nodeType) { + element = $(element); + } + + if (isQuery(element)) { + obj = { + href : element.data('fancybox-href') || element.attr('href'), + title : element.data('fancybox-title') || element.attr('title'), + isDom : true, + element : element + }; + + if ($.metadata) { + $.extend(true, obj, element.metadata()); + } + + } else { + obj = element; + } + } + + href = opts.href || obj.href || (isString(element) ? element : null); + title = opts.title !== undefined ? opts.title : obj.title || ''; + + content = opts.content || obj.content; + type = content ? 'html' : (opts.type || obj.type); + + if (!type && obj.isDom) { + type = element.data('fancybox-type'); + + if (!type) { + rez = element.prop('class').match(/fancybox\.(\w+)/); + type = rez ? rez[1] : null; + } + } + + if (isString(href)) { + // Try to guess the content type + if (!type) { + if (F.isImage(href)) { + type = 'image'; + + } else if (F.isSWF(href)) { + type = 'swf'; + + } else if (href.charAt(0) === '#') { + type = 'inline'; + + } else if (isString(element)) { + type = 'html'; + content = element; + } + } + + // Split url into two pieces with source url and content selector, e.g, + // "/mypage.html #my_id" will load "/mypage.html" and display element having id "my_id" + if (type === 'ajax') { + hrefParts = href.split(/\s+/, 2); + href = hrefParts.shift(); + selector = hrefParts.shift(); + } + } + + if (!content) { + if (type === 'inline') { + if (href) { + content = $( isString(href) ? href.replace(/.*(?=#[^\s]+$)/, '') : href ); //strip for ie7 + + } else if (obj.isDom) { + content = element; + } + + } else if (type === 'html') { + content = href; + + } else if (!type && !href && obj.isDom) { + type = 'inline'; + content = element; + } + } + + $.extend(obj, { + href : href, + type : type, + content : content, + title : title, + selector : selector + }); + + group[ i ] = obj; + }); + + // Extend the defaults + F.opts = $.extend(true, {}, F.defaults, opts); + + // All options are merged recursive except keys + if (opts.keys !== undefined) { + F.opts.keys = opts.keys ? $.extend({}, F.defaults.keys, opts.keys) : false; + } + + F.group = group; + + return F._start(F.opts.index); + }, + + // Cancel image loading or abort ajax request + cancel: function () { + var coming = F.coming; + + if (!coming || false === F.trigger('onCancel')) { + return; + } + + F.hideLoading(); + + if (F.ajaxLoad) { + F.ajaxLoad.abort(); + } + + F.ajaxLoad = null; + + if (F.imgPreload) { + F.imgPreload.onload = F.imgPreload.onerror = null; + } + + if (coming.wrap) { + coming.wrap.stop(true, true).trigger('onReset').remove(); + } + + F.coming = null; + + // If the first item has been canceled, then clear everything + if (!F.current) { + F._afterZoomOut( coming ); + } + }, + + // Start closing animation if is open; remove immediately if opening/closing + close: function (event) { + F.cancel(); + + if (false === F.trigger('beforeClose')) { + return; + } + + F.unbindEvents(); + + if (!F.isActive) { + return; + } + + if (!F.isOpen || event === true) { + $('.fancybox-wrap').stop(true).trigger('onReset').remove(); + + F._afterZoomOut(); + + } else { + F.isOpen = F.isOpened = false; + F.isClosing = true; + + $('.fancybox-item, .fancybox-nav').remove(); + + F.wrap.stop(true, true).removeClass('fancybox-opened'); + + F.transitions[ F.current.closeMethod ](); + } + }, + + // Manage slideshow: + // $.fancybox.play(); - toggle slideshow + // $.fancybox.play( true ); - start + // $.fancybox.play( false ); - stop + play: function ( action ) { + var clear = function () { + clearTimeout(F.player.timer); + }, + set = function () { + clear(); + + if (F.current && F.player.isActive) { + F.player.timer = setTimeout(F.next, F.current.playSpeed); + } + }, + stop = function () { + clear(); + + $('body').unbind('.player'); + + F.player.isActive = false; + + F.trigger('onPlayEnd'); + }, + start = function () { + if (F.current && (F.current.loop || F.current.index < F.group.length - 1)) { + F.player.isActive = true; + + $('body').bind({ + 'afterShow.player onUpdate.player' : set, + 'onCancel.player beforeClose.player' : stop, + 'beforeLoad.player' : clear + }); + + set(); + + F.trigger('onPlayStart'); + } + }; + + if (action === true || (!F.player.isActive && action !== false)) { + start(); + } else { + stop(); + } + }, + + // Navigate to next gallery item + next: function ( direction ) { + var current = F.current; + + if (current) { + if (!isString(direction)) { + direction = current.direction.next; + } + + F.jumpto(current.index + 1, direction, 'next'); + } + }, + + // Navigate to previous gallery item + prev: function ( direction ) { + var current = F.current; + + if (current) { + if (!isString(direction)) { + direction = current.direction.prev; + } + + F.jumpto(current.index - 1, direction, 'prev'); + } + }, + + // Navigate to gallery item by index + jumpto: function ( index, direction, router ) { + var current = F.current; + + if (!current) { + return; + } + + index = getScalar(index); + + F.direction = direction || current.direction[ (index >= current.index ? 'next' : 'prev') ]; + F.router = router || 'jumpto'; + + if (current.loop) { + if (index < 0) { + index = current.group.length + (index % current.group.length); + } + + index = index % current.group.length; + } + + if (current.group[ index ] !== undefined) { + F.cancel(); + + F._start(index); + } + }, + + // Center inside viewport and toggle position type to fixed or absolute if needed + reposition: function (e, onlyAbsolute) { + var current = F.current, + wrap = current ? current.wrap : null, + pos; + + if (wrap) { + pos = F._getPosition(onlyAbsolute); + + if (e && e.type === 'scroll') { + delete pos.position; + + wrap.stop(true, true).animate(pos, 200); + + } else { + wrap.css(pos); + + current.pos = $.extend({}, current.dim, pos); + } + } + }, + + update: function (e) { + var type = (e && e.type), + anyway = !type || type === 'orientationchange'; + + if (anyway) { + clearTimeout(didUpdate); + + didUpdate = null; + } + + if (!F.isOpen || didUpdate) { + return; + } + + didUpdate = setTimeout(function() { + var current = F.current; + + if (!current || F.isClosing) { + return; + } + + F.wrap.removeClass('fancybox-tmp'); + + if (anyway || type === 'load' || (type === 'resize' && current.autoResize)) { + F._setDimension(); + } + + if (!(type === 'scroll' && current.canShrink)) { + F.reposition(e); + } + + F.trigger('onUpdate'); + + didUpdate = null; + + }, (anyway && !isTouch ? 0 : 300)); + }, + + // Shrink content to fit inside viewport or restore if resized + toggle: function ( action ) { + if (F.isOpen) { + F.current.fitToView = $.type(action) === "boolean" ? action : !F.current.fitToView; + + // Help browser to restore document dimensions + if (isTouch) { + F.wrap.removeAttr('style').addClass('fancybox-tmp'); + + F.trigger('onUpdate'); + } + + F.update(); + } + }, + + hideLoading: function () { + D.unbind('.loading'); + + $('#fancybox-loading').remove(); + }, + + showLoading: function () { + var el, viewport; + + F.hideLoading(); + + el = $('<div id="fancybox-loading"><div></div></div>').click(F.cancel).appendTo('body'); + + // If user will press the escape-button, the request will be canceled + D.bind('keydown.loading', function(e) { + if ((e.which || e.keyCode) === 27) { + e.preventDefault(); + + F.cancel(); + } + }); + + if (!F.defaults.fixed) { + viewport = F.getViewport(); + + el.css({ + position : 'absolute', + top : (viewport.h * 0.5) + viewport.y, + left : (viewport.w * 0.5) + viewport.x + }); + } + }, + + getViewport: function () { + var locked = (F.current && F.current.locked) || false, + rez = { + x: W.scrollLeft(), + y: W.scrollTop() + }; + + if (locked) { + rez.w = locked[0].clientWidth; + rez.h = locked[0].clientHeight; + + } else { + // See http://bugs.jquery.com/ticket/6724 + rez.w = isTouch && window.innerWidth ? window.innerWidth : W.width(); + rez.h = isTouch && window.innerHeight ? window.innerHeight : W.height(); + } + + return rez; + }, + + // Unbind the keyboard / clicking actions + unbindEvents: function () { + if (F.wrap && isQuery(F.wrap)) { + F.wrap.unbind('.fb'); + } + + D.unbind('.fb'); + W.unbind('.fb'); + }, + + bindEvents: function () { + var current = F.current, + keys; + + if (!current) { + return; + } + + // Changing document height on iOS devices triggers a 'resize' event, + // that can change document height... repeating infinitely + W.bind('orientationchange.fb' + (isTouch ? '' : ' resize.fb') + (current.autoCenter && !current.locked ? ' scroll.fb' : ''), F.update); + + keys = current.keys; + + if (keys) { + D.bind('keydown.fb', function (e) { + var code = e.which || e.keyCode, + target = e.target || e.srcElement; + + // Skip esc key if loading, because showLoading will cancel preloading + if (code === 27 && F.coming) { + return false; + } + + // Ignore key combinations and key events within form elements + if (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey && !(target && (target.type || $(target).is('[contenteditable]')))) { + $.each(keys, function(i, val) { + if (current.group.length > 1 && val[ code ] !== undefined) { + F[ i ]( val[ code ] ); + + e.preventDefault(); + return false; + } + + if ($.inArray(code, val) > -1) { + F[ i ] (); + + e.preventDefault(); + return false; + } + }); + } + }); + } + + if ($.fn.mousewheel && current.mouseWheel) { + F.wrap.bind('mousewheel.fb', function (e, delta, deltaX, deltaY) { + var target = e.target || null, + parent = $(target), + canScroll = false; + + while (parent.length) { + if (canScroll || parent.is('.fancybox-skin') || parent.is('.fancybox-wrap')) { + break; + } + + canScroll = isScrollable( parent[0] ); + parent = $(parent).parent(); + } + + if (delta !== 0 && !canScroll) { + if (F.group.length > 1 && !current.canShrink) { + if (deltaY > 0 || deltaX > 0) { + F.prev( deltaY > 0 ? 'down' : 'left' ); + + } else if (deltaY < 0 || deltaX < 0) { + F.next( deltaY < 0 ? 'up' : 'right' ); + } + + e.preventDefault(); + } + } + }); + } + }, + + trigger: function (event, o) { + var ret, obj = o || F.coming || F.current; + + if (!obj) { + return; + } + + if ($.isFunction( obj[event] )) { + ret = obj[event].apply(obj, Array.prototype.slice.call(arguments, 1)); + } + + if (ret === false) { + return false; + } + + if (obj.helpers) { + $.each(obj.helpers, function (helper, opts) { + if (opts && F.helpers[helper] && $.isFunction(F.helpers[helper][event])) { + opts = $.extend(true, {}, F.helpers[helper].defaults, opts); + + F.helpers[helper][event](opts, obj); + } + }); + } + + $.event.trigger(event + '.fb'); + }, + + isImage: function (str) { + return isString(str) && str.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp)((\?|#).*)?$)/i); + }, + + isSWF: function (str) { + return isString(str) && str.match(/\.(swf)((\?|#).*)?$/i); + }, + + _start: function (index) { + var coming = {}, + obj, + href, + type, + margin, + padding; + + index = getScalar( index ); + obj = F.group[ index ] || null; + + if (!obj) { + return false; + } + + coming = $.extend(true, {}, F.opts, obj); + + // Convert margin and padding properties to array - top, right, bottom, left + margin = coming.margin; + padding = coming.padding; + + if ($.type(margin) === 'number') { + coming.margin = [margin, margin, margin, margin]; + } + + if ($.type(padding) === 'number') { + coming.padding = [padding, padding, padding, padding]; + } + + // 'modal' propery is just a shortcut + if (coming.modal) { + $.extend(true, coming, { + closeBtn : false, + closeClick : false, + nextClick : false, + arrows : false, + mouseWheel : false, + keys : null, + helpers: { + overlay : { + closeClick : false + } + } + }); + } + + // 'autoSize' property is a shortcut, too + if (coming.autoSize) { + coming.autoWidth = coming.autoHeight = true; + } + + if (coming.width === 'auto') { + coming.autoWidth = true; + } + + if (coming.height === 'auto') { + coming.autoHeight = true; + } + + /* + * Add reference to the group, so it`s possible to access from callbacks, example: + * afterLoad : function() { + * this.title = 'Image ' + (this.index + 1) + ' of ' + this.group.length + (this.title ? ' - ' + this.title : ''); + * } + */ + + coming.group = F.group; + coming.index = index; + + // Give a chance for callback or helpers to update coming item (type, title, etc) + F.coming = coming; + + if (false === F.trigger('beforeLoad')) { + F.coming = null; + + return; + } + + type = coming.type; + href = coming.href; + + if (!type) { + F.coming = null; + + //If we can not determine content type then drop silently or display next/prev item if looping through gallery + if (F.current && F.router && F.router !== 'jumpto') { + F.current.index = index; + + return F[ F.router ]( F.direction ); + } + + return false; + } + + F.isActive = true; + + if (type === 'image' || type === 'swf') { + coming.autoHeight = coming.autoWidth = false; + coming.scrolling = 'visible'; + } + + if (type === 'image') { + coming.aspectRatio = true; + } + + if (type === 'iframe' && isTouch) { + coming.scrolling = 'scroll'; + } + + // Build the neccessary markup + coming.wrap = $(coming.tpl.wrap).addClass('fancybox-' + (isTouch ? 'mobile' : 'desktop') + ' fancybox-type-' + type + ' fancybox-tmp ' + coming.wrapCSS).appendTo( coming.parent || 'body' ); + + $.extend(coming, { + skin : $('.fancybox-skin', coming.wrap), + outer : $('.fancybox-outer', coming.wrap), + inner : $('.fancybox-inner', coming.wrap) + }); + + $.each(["Top", "Right", "Bottom", "Left"], function(i, v) { + coming.skin.css('padding' + v, getValue(coming.padding[ i ])); + }); + + F.trigger('onReady'); + + // Check before try to load; 'inline' and 'html' types need content, others - href + if (type === 'inline' || type === 'html') { + if (!coming.content || !coming.content.length) { + return F._error( 'content' ); + } + + } else if (!href) { + return F._error( 'href' ); + } + + if (type === 'image') { + F._loadImage(); + + } else if (type === 'ajax') { + F._loadAjax(); + + } else if (type === 'iframe') { + F._loadIframe(); + + } else { + F._afterLoad(); + } + }, + + _error: function ( type ) { + $.extend(F.coming, { + type : 'html', + autoWidth : true, + autoHeight : true, + minWidth : 0, + minHeight : 0, + scrolling : 'no', + hasError : type, + content : F.coming.tpl.error + }); + + F._afterLoad(); + }, + + _loadImage: function () { + // Reset preload image so it is later possible to check "complete" property + var img = F.imgPreload = new Image(); + + img.onload = function () { + this.onload = this.onerror = null; + + F.coming.width = this.width; + F.coming.height = this.height; + + F._afterLoad(); + }; + + img.onerror = function () { + this.onload = this.onerror = null; + + F._error( 'image' ); + }; + + img.src = F.coming.href; + + if (img.complete !== true) { + F.showLoading(); + } + }, + + _loadAjax: function () { + var coming = F.coming; + + F.showLoading(); + + F.ajaxLoad = $.ajax($.extend({}, coming.ajax, { + url: coming.href, + error: function (jqXHR, textStatus) { + if (F.coming && textStatus !== 'abort') { + F._error( 'ajax', jqXHR ); + + } else { + F.hideLoading(); + } + }, + success: function (data, textStatus) { + if (textStatus === 'success') { + coming.content = data; + + F._afterLoad(); + } + } + })); + }, + + _loadIframe: function() { + var coming = F.coming, + iframe = $(coming.tpl.iframe.replace(/\{rnd\}/g, new Date().getTime())) + .attr('scrolling', isTouch ? 'auto' : coming.iframe.scrolling) + .attr('src', coming.href); + + // This helps IE + $(coming.wrap).bind('onReset', function () { + try { + $(this).find('iframe').hide().attr('src', '//about:blank').end().empty(); + } catch (e) {} + }); + + if (coming.iframe.preload) { + F.showLoading(); + + iframe.one('load', function() { + $(this).data('ready', 1); + + // iOS will lose scrolling if we resize + if (!isTouch) { + $(this).bind('load.fb', F.update); + } + + // Without this trick: + // - iframe won't scroll on iOS devices + // - IE7 sometimes displays empty iframe + $(this).parents('.fancybox-wrap').width('100%').removeClass('fancybox-tmp').show(); + + F._afterLoad(); + }); + } + + coming.content = iframe.appendTo( coming.inner ); + + if (!coming.iframe.preload) { + F._afterLoad(); + } + }, + + _preloadImages: function() { + var group = F.group, + current = F.current, + len = group.length, + cnt = current.preload ? Math.min(current.preload, len - 1) : 0, + item, + i; + + for (i = 1; i <= cnt; i += 1) { + item = group[ (current.index + i ) % len ]; + + if (item.type === 'image' && item.href) { + new Image().src = item.href; + } + } + }, + + _afterLoad: function () { + var coming = F.coming, + previous = F.current, + placeholder = 'fancybox-placeholder', + current, + content, + type, + scrolling, + href, + embed; + + F.hideLoading(); + + if (!coming || F.isActive === false) { + return; + } + + if (false === F.trigger('afterLoad', coming, previous)) { + coming.wrap.stop(true).trigger('onReset').remove(); + + F.coming = null; + + return; + } + + if (previous) { + F.trigger('beforeChange', previous); + + previous.wrap.stop(true).removeClass('fancybox-opened') + .find('.fancybox-item, .fancybox-nav') + .remove(); + } + + F.unbindEvents(); + + current = coming; + content = coming.content; + type = coming.type; + scrolling = coming.scrolling; + + $.extend(F, { + wrap : current.wrap, + skin : current.skin, + outer : current.outer, + inner : current.inner, + current : current, + previous : previous + }); + + href = current.href; + + switch (type) { + case 'inline': + case 'ajax': + case 'html': + if (current.selector) { + content = $('<div>').html(content).find(current.selector); + + } else if (isQuery(content)) { + if (!content.data(placeholder)) { + content.data(placeholder, $('<div class="' + placeholder + '"></div>').insertAfter( content ).hide() ); + } + + content = content.show().detach(); + + current.wrap.bind('onReset', function () { + if ($(this).find(content).length) { + content.hide().replaceAll( content.data(placeholder) ).data(placeholder, false); + } + }); + } + break; + + case 'image': + content = current.tpl.image.replace('{href}', href); + break; + + case 'swf': + content = '<object id="fancybox-swf" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%"><param name="movie" value="' + href + '"></param>'; + embed = ''; + + $.each(current.swf, function(name, val) { + content += '<param name="' + name + '" value="' + val + '"></param>'; + embed += ' ' + name + '="' + val + '"'; + }); + + content += '<embed src="' + href + '" type="application/x-shockwave-flash" width="100%" height="100%"' + embed + '></embed></object>'; + break; + } + + if (!(isQuery(content) && content.parent().is(current.inner))) { + current.inner.append( content ); + } + + // Give a chance for helpers or callbacks to update elements + F.trigger('beforeShow'); + + // Set scrolling before calculating dimensions + current.inner.css('overflow', scrolling === 'yes' ? 'scroll' : (scrolling === 'no' ? 'hidden' : scrolling)); + + // Set initial dimensions and start position + F._setDimension(); + + F.reposition(); + + F.isOpen = false; + F.coming = null; + + F.bindEvents(); + + if (!F.isOpened) { + $('.fancybox-wrap').not( current.wrap ).stop(true).trigger('onReset').remove(); + + } else if (previous.prevMethod) { + F.transitions[ previous.prevMethod ](); + } + + F.transitions[ F.isOpened ? current.nextMethod : current.openMethod ](); + + F._preloadImages(); + }, + + _setDimension: function () { + var viewport = F.getViewport(), + steps = 0, + canShrink = false, + canExpand = false, + wrap = F.wrap, + skin = F.skin, + inner = F.inner, + current = F.current, + width = current.width, + height = current.height, + minWidth = current.minWidth, + minHeight = current.minHeight, + maxWidth = current.maxWidth, + maxHeight = current.maxHeight, + scrolling = current.scrolling, + scrollOut = current.scrollOutside ? current.scrollbarWidth : 0, + margin = current.margin, + wMargin = getScalar(margin[1] + margin[3]), + hMargin = getScalar(margin[0] + margin[2]), + wPadding, + hPadding, + wSpace, + hSpace, + origWidth, + origHeight, + origMaxWidth, + origMaxHeight, + ratio, + width_, + height_, + maxWidth_, + maxHeight_, + iframe, + body; + + // Reset dimensions so we could re-check actual size + wrap.add(skin).add(inner).width('auto').height('auto').removeClass('fancybox-tmp'); + + wPadding = getScalar(skin.outerWidth(true) - skin.width()); + hPadding = getScalar(skin.outerHeight(true) - skin.height()); + + // Any space between content and viewport (margin, padding, border, title) + wSpace = wMargin + wPadding; + hSpace = hMargin + hPadding; + + origWidth = isPercentage(width) ? (viewport.w - wSpace) * getScalar(width) / 100 : width; + origHeight = isPercentage(height) ? (viewport.h - hSpace) * getScalar(height) / 100 : height; + + if (current.type === 'iframe') { + iframe = current.content; + + if (current.autoHeight && iframe.data('ready') === 1) { + try { + if (iframe[0].contentWindow.document.location) { + inner.width( origWidth ).height(9999); + + body = iframe.contents().find('body'); + + if (scrollOut) { + body.css('overflow-x', 'hidden'); + } + + origHeight = body.height(); + } + + } catch (e) {} + } + + } else if (current.autoWidth || current.autoHeight) { + inner.addClass( 'fancybox-tmp' ); + + // Set width or height in case we need to calculate only one dimension + if (!current.autoWidth) { + inner.width( origWidth ); + } + + if (!current.autoHeight) { + inner.height( origHeight ); + } + + if (current.autoWidth) { + origWidth = inner.width(); + } + + if (current.autoHeight) { + origHeight = inner.height(); + } + + inner.removeClass( 'fancybox-tmp' ); + } + + width = getScalar( origWidth ); + height = getScalar( origHeight ); + + ratio = origWidth / origHeight; + + // Calculations for the content + minWidth = getScalar(isPercentage(minWidth) ? getScalar(minWidth, 'w') - wSpace : minWidth); + maxWidth = getScalar(isPercentage(maxWidth) ? getScalar(maxWidth, 'w') - wSpace : maxWidth); + + minHeight = getScalar(isPercentage(minHeight) ? getScalar(minHeight, 'h') - hSpace : minHeight); + maxHeight = getScalar(isPercentage(maxHeight) ? getScalar(maxHeight, 'h') - hSpace : maxHeight); + + // These will be used to determine if wrap can fit in the viewport + origMaxWidth = maxWidth; + origMaxHeight = maxHeight; + + if (current.fitToView) { + maxWidth = Math.min(viewport.w - wSpace, maxWidth); + maxHeight = Math.min(viewport.h - hSpace, maxHeight); + } + + maxWidth_ = viewport.w - wMargin; + maxHeight_ = viewport.h - hMargin; + + if (current.aspectRatio) { + if (width > maxWidth) { + width = maxWidth; + height = getScalar(width / ratio); + } + + if (height > maxHeight) { + height = maxHeight; + width = getScalar(height * ratio); + } + + if (width < minWidth) { + width = minWidth; + height = getScalar(width / ratio); + } + + if (height < minHeight) { + height = minHeight; + width = getScalar(height * ratio); + } + + } else { + width = Math.max(minWidth, Math.min(width, maxWidth)); + + if (current.autoHeight && current.type !== 'iframe') { + inner.width( width ); + + height = inner.height(); + } + + height = Math.max(minHeight, Math.min(height, maxHeight)); + } + + // Try to fit inside viewport (including the title) + if (current.fitToView) { + inner.width( width ).height( height ); + + wrap.width( width + wPadding ); + + // Real wrap dimensions + width_ = wrap.width(); + height_ = wrap.height(); + + if (current.aspectRatio) { + while ((width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight) { + if (steps++ > 19) { + break; + } + + height = Math.max(minHeight, Math.min(maxHeight, height - 10)); + width = getScalar(height * ratio); + + if (width < minWidth) { + width = minWidth; + height = getScalar(width / ratio); + } + + if (width > maxWidth) { + width = maxWidth; + height = getScalar(width / ratio); + } + + inner.width( width ).height( height ); + + wrap.width( width + wPadding ); + + width_ = wrap.width(); + height_ = wrap.height(); + } + + } else { + width = Math.max(minWidth, Math.min(width, width - (width_ - maxWidth_))); + height = Math.max(minHeight, Math.min(height, height - (height_ - maxHeight_))); + } + } + + if (scrollOut && scrolling === 'auto' && height < origHeight && (width + wPadding + scrollOut) < maxWidth_) { + width += scrollOut; + } + + inner.width( width ).height( height ); + + wrap.width( width + wPadding ); + + width_ = wrap.width(); + height_ = wrap.height(); + + canShrink = (width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight; + canExpand = current.aspectRatio ? (width < origMaxWidth && height < origMaxHeight && width < origWidth && height < origHeight) : ((width < origMaxWidth || height < origMaxHeight) && (width < origWidth || height < origHeight)); + + $.extend(current, { + dim : { + width : getValue( width_ ), + height : getValue( height_ ) + }, + origWidth : origWidth, + origHeight : origHeight, + canShrink : canShrink, + canExpand : canExpand, + wPadding : wPadding, + hPadding : hPadding, + wrapSpace : height_ - skin.outerHeight(true), + skinSpace : skin.height() - height + }); + + if (!iframe && current.autoHeight && height > minHeight && height < maxHeight && !canExpand) { + inner.height('auto'); + } + }, + + _getPosition: function (onlyAbsolute) { + var current = F.current, + viewport = F.getViewport(), + margin = current.margin, + width = F.wrap.width() + margin[1] + margin[3], + height = F.wrap.height() + margin[0] + margin[2], + rez = { + position: 'absolute', + top : margin[0], + left : margin[3] + }; + + if (current.autoCenter && current.fixed && !onlyAbsolute && height <= viewport.h && width <= viewport.w) { + rez.position = 'fixed'; + + } else if (!current.locked) { + rez.top += viewport.y; + rez.left += viewport.x; + } + + rez.top = getValue(Math.max(rez.top, rez.top + ((viewport.h - height) * current.topRatio))); + rez.left = getValue(Math.max(rez.left, rez.left + ((viewport.w - width) * current.leftRatio))); + + return rez; + }, + + _afterZoomIn: function () { + var current = F.current; + + if (!current) { + return; + } + + F.isOpen = F.isOpened = true; + + F.wrap.css('overflow', 'visible').addClass('fancybox-opened'); + + F.update(); + + // Assign a click event + if ( current.closeClick || (current.nextClick && F.group.length > 1) ) { + F.inner.css('cursor', 'pointer').bind('click.fb', function(e) { + if (!$(e.target).is('a') && !$(e.target).parent().is('a')) { + e.preventDefault(); + + F[ current.closeClick ? 'close' : 'next' ](); + } + }); + } + + // Create a close button + if (current.closeBtn) { + $(current.tpl.closeBtn).appendTo(F.skin).bind('click.fb', function(e) { + e.preventDefault(); + + F.close(); + }); + } + + // Create navigation arrows + if (current.arrows && F.group.length > 1) { + if (current.loop || current.index > 0) { + $(current.tpl.prev).appendTo(F.outer).bind('click.fb', F.prev); + } + + if (current.loop || current.index < F.group.length - 1) { + $(current.tpl.next).appendTo(F.outer).bind('click.fb', F.next); + } + } + + F.trigger('afterShow'); + + // Stop the slideshow if this is the last item + if (!current.loop && current.index === current.group.length - 1) { + F.play( false ); + + } else if (F.opts.autoPlay && !F.player.isActive) { + F.opts.autoPlay = false; + + F.play(); + } + }, + + _afterZoomOut: function ( obj ) { + obj = obj || F.current; + + $('.fancybox-wrap').trigger('onReset').remove(); + + $.extend(F, { + group : {}, + opts : {}, + router : false, + current : null, + isActive : false, + isOpened : false, + isOpen : false, + isClosing : false, + wrap : null, + skin : null, + outer : null, + inner : null + }); + + F.trigger('afterClose', obj); + } + }); + + /* + * Default transitions + */ + + F.transitions = { + getOrigPosition: function () { + var current = F.current, + element = current.element, + orig = current.orig, + pos = {}, + width = 50, + height = 50, + hPadding = current.hPadding, + wPadding = current.wPadding, + viewport = F.getViewport(); + + if (!orig && current.isDom && element.is(':visible')) { + orig = element.find('img:first'); + + if (!orig.length) { + orig = element; + } + } + + if (isQuery(orig)) { + pos = orig.offset(); + + if (orig.is('img')) { + width = orig.outerWidth(); + height = orig.outerHeight(); + } + + } else { + pos.top = viewport.y + (viewport.h - height) * current.topRatio; + pos.left = viewport.x + (viewport.w - width) * current.leftRatio; + } + + if (F.wrap.css('position') === 'fixed' || current.locked) { + pos.top -= viewport.y; + pos.left -= viewport.x; + } + + pos = { + top : getValue(pos.top - hPadding * current.topRatio), + left : getValue(pos.left - wPadding * current.leftRatio), + width : getValue(width + wPadding), + height : getValue(height + hPadding) + }; + + return pos; + }, + + step: function (now, fx) { + var ratio, + padding, + value, + prop = fx.prop, + current = F.current, + wrapSpace = current.wrapSpace, + skinSpace = current.skinSpace; + + if (prop === 'width' || prop === 'height') { + ratio = fx.end === fx.start ? 1 : (now - fx.start) / (fx.end - fx.start); + + if (F.isClosing) { + ratio = 1 - ratio; + } + + padding = prop === 'width' ? current.wPadding : current.hPadding; + value = now - padding; + + F.skin[ prop ]( getScalar( prop === 'width' ? value : value - (wrapSpace * ratio) ) ); + F.inner[ prop ]( getScalar( prop === 'width' ? value : value - (wrapSpace * ratio) - (skinSpace * ratio) ) ); + } + }, + + zoomIn: function () { + var current = F.current, + startPos = current.pos, + effect = current.openEffect, + elastic = effect === 'elastic', + endPos = $.extend({opacity : 1}, startPos); + + // Remove "position" property that breaks older IE + delete endPos.position; + + if (elastic) { + startPos = this.getOrigPosition(); + + if (current.openOpacity) { + startPos.opacity = 0.1; + } + + } else if (effect === 'fade') { + startPos.opacity = 0.1; + } + + F.wrap.css(startPos).animate(endPos, { + duration : effect === 'none' ? 0 : current.openSpeed, + easing : current.openEasing, + step : elastic ? this.step : null, + complete : F._afterZoomIn + }); + }, + + zoomOut: function () { + var current = F.current, + effect = current.closeEffect, + elastic = effect === 'elastic', + endPos = {opacity : 0.1}; + + if (elastic) { + endPos = this.getOrigPosition(); + + if (current.closeOpacity) { + endPos.opacity = 0.1; + } + } + + F.wrap.animate(endPos, { + duration : effect === 'none' ? 0 : current.closeSpeed, + easing : current.closeEasing, + step : elastic ? this.step : null, + complete : F._afterZoomOut + }); + }, + + changeIn: function () { + var current = F.current, + effect = current.nextEffect, + startPos = current.pos, + endPos = { opacity : 1 }, + direction = F.direction, + distance = 200, + field; + + startPos.opacity = 0.1; + + if (effect === 'elastic') { + field = direction === 'down' || direction === 'up' ? 'top' : 'left'; + + if (direction === 'down' || direction === 'right') { + startPos[ field ] = getValue(getScalar(startPos[ field ]) - distance); + endPos[ field ] = '+=' + distance + 'px'; + + } else { + startPos[ field ] = getValue(getScalar(startPos[ field ]) + distance); + endPos[ field ] = '-=' + distance + 'px'; + } + } + + // Workaround for http://bugs.jquery.com/ticket/12273 + if (effect === 'none') { + F._afterZoomIn(); + + } else { + F.wrap.css(startPos).animate(endPos, { + duration : current.nextSpeed, + easing : current.nextEasing, + complete : F._afterZoomIn + }); + } + }, + + changeOut: function () { + var previous = F.previous, + effect = previous.prevEffect, + endPos = { opacity : 0.1 }, + direction = F.direction, + distance = 200; + + if (effect === 'elastic') { + endPos[ direction === 'down' || direction === 'up' ? 'top' : 'left' ] = ( direction === 'up' || direction === 'left' ? '-' : '+' ) + '=' + distance + 'px'; + } + + previous.wrap.animate(endPos, { + duration : effect === 'none' ? 0 : previous.prevSpeed, + easing : previous.prevEasing, + complete : function () { + $(this).trigger('onReset').remove(); + } + }); + } + }; + + /* + * Overlay helper + */ + + F.helpers.overlay = { + defaults : { + closeClick : true, // if true, fancyBox will be closed when user clicks on the overlay + speedOut : 200, // duration of fadeOut animation + showEarly : true, // indicates if should be opened immediately or wait until the content is ready + css : {}, // custom CSS properties + locked : !isTouch, // if true, the content will be locked into overlay + fixed : true // if false, the overlay CSS position property will not be set to "fixed" + }, + + overlay : null, // current handle + fixed : false, // indicates if the overlay has position "fixed" + + // Public methods + create : function(opts) { + opts = $.extend({}, this.defaults, opts); + + if (this.overlay) { + this.close(); + } + + this.overlay = $('<div class="fancybox-overlay"></div>').appendTo( 'body' ); + this.fixed = false; + + if (opts.fixed && F.defaults.fixed) { + this.overlay.addClass('fancybox-overlay-fixed'); + + this.fixed = true; + } + }, + + open : function(opts) { + var that = this; + + opts = $.extend({}, this.defaults, opts); + + if (this.overlay) { + this.overlay.unbind('.overlay').width('auto').height('auto'); + + } else { + this.create(opts); + } + + if (!this.fixed) { + W.bind('resize.overlay', $.proxy( this.update, this) ); + + this.update(); + } + + if (opts.closeClick) { + this.overlay.bind('click.overlay', function(e) { + if ($(e.target).hasClass('fancybox-overlay')) { + if (F.isActive) { + F.close(); + } else { + that.close(); + } + } + }); + } + + this.overlay.css( opts.css ).show(); + }, + + close : function() { + $('.fancybox-overlay').remove(); + + W.unbind('resize.overlay'); + + this.overlay = null; + + if (this.margin !== false) { + $('body').css('margin-right', this.margin); + + this.margin = false; + } + + if (this.el) { + this.el.removeClass('fancybox-lock'); + } + }, + + // Private, callbacks + + update : function () { + var width = '100%', offsetWidth; + + // Reset width/height so it will not mess + this.overlay.width(width).height('100%'); + + // jQuery does not return reliable result for IE + if (IE) { + offsetWidth = Math.max(document.documentElement.offsetWidth, document.body.offsetWidth); + + if (D.width() > offsetWidth) { + width = D.width(); + } + + } else if (D.width() > W.width()) { + width = D.width(); + } + + this.overlay.width(width).height(D.height()); + }, + + // This is where we can manipulate DOM, because later it would cause iframes to reload + onReady : function (opts, obj) { + $('.fancybox-overlay').stop(true, true); + + if (!this.overlay) { + this.margin = D.height() > W.height() || $('body').css('overflow-y') === 'scroll' ? $('body').css('margin-right') : false; + this.el = document.all && !document.querySelector ? $('html') : $('body'); + + this.create(opts); + } + + if (opts.locked && this.fixed) { + obj.locked = this.overlay.append( obj.wrap ); + obj.fixed = false; + } + + if (opts.showEarly === true) { + this.beforeShow.apply(this, arguments); + } + }, + + beforeShow : function(opts, obj) { + if (obj.locked) { + this.el.addClass('fancybox-lock'); + + if (this.margin !== false) { + $('body').css('margin-right', getScalar( this.margin ) + obj.scrollbarWidth); + } + } + + this.open(opts); + }, + + onUpdate : function() { + if (!this.fixed) { + this.update(); + } + }, + + afterClose: function (opts) { + // Remove overlay if exists and fancyBox is not opening + // (e.g., it is not being open using afterClose callback) + if (this.overlay && !F.isActive) { + this.overlay.fadeOut(opts.speedOut, $.proxy( this.close, this )); + } + } + }; + + /* + * Title helper + */ + + F.helpers.title = { + defaults : { + type : 'float', // 'float', 'inside', 'outside' or 'over', + position : 'bottom' // 'top' or 'bottom' + }, + + beforeShow: function (opts) { + var current = F.current, + text = current.title, + type = opts.type, + title, + target; + + if ($.isFunction(text)) { + text = text.call(current.element, current); + } + + if (!isString(text) || $.trim(text) === '') { + return; + } + + title = $('<div class="fancybox-title fancybox-title-' + type + '-wrap">' + text + '</div>'); + + switch (type) { + case 'inside': + target = F.skin; + break; + + case 'outside': + target = F.wrap; + break; + + case 'over': + target = F.inner; + break; + + default: // 'float' + target = F.skin; + + title.appendTo('body'); + + if (IE) { + title.width( title.width() ); + } + + title.wrapInner('<span class="child"></span>'); + + //Increase bottom margin so this title will also fit into viewport + F.current.margin[2] += Math.abs( getScalar(title.css('margin-bottom')) ); + break; + } + + title[ (opts.position === 'top' ? 'prependTo' : 'appendTo') ](target); + } + }; + + // jQuery plugin initialization + $.fn.fancybox = function (options) { + var index, + that = $(this), + selector = this.selector || '', + run = function(e) { + var what = $(this).blur(), idx = index, relType, relVal; + + if (!(e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) && !what.is('.fancybox-wrap')) { + relType = options.groupAttr || 'data-fancybox-group'; + relVal = what.attr(relType); + + if (!relVal) { + relType = 'rel'; + relVal = what.get(0)[ relType ]; + } + + if (relVal && relVal !== '' && relVal !== 'nofollow') { + what = selector.length ? $(selector) : that; + what = what.filter('[' + relType + '="' + relVal + '"]'); + idx = what.index(this); + } + + options.index = idx; + + // Stop an event from bubbling if everything is fine + if (F.open(what, options) !== false) { + e.preventDefault(); + } + } + }; + + options = options || {}; + index = options.index || 0; + + if (!selector || options.live === false) { + that.unbind('click.fb-start').bind('click.fb-start', run); + + } else { + D.undelegate(selector, 'click.fb-start').delegate(selector + ":not('.fancybox-item, .fancybox-nav')", 'click.fb-start', run); + } + + this.filter('[data-fancybox-start=1]').trigger('click'); + + return this; + }; + + // Tests that need a body at doc ready + D.ready(function() { + if ( $.scrollbarWidth === undefined ) { + // http://benalman.com/projects/jquery-misc-plugins/#scrollbarwidth + $.scrollbarWidth = function() { + var parent = $('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo('body'), + child = parent.children(), + width = child.innerWidth() - child.height( 99 ).innerWidth(); + + parent.remove(); + + return width; + }; + } + + if ( $.support.fixedPosition === undefined ) { + $.support.fixedPosition = (function() { + var elem = $('<div style="position:fixed;top:20px;"></div>').appendTo('body'), + fixed = ( elem[0].offsetTop === 20 || elem[0].offsetTop === 15 ); + + elem.remove(); + + return fixed; + }()); + } + + $.extend(F.defaults, { + scrollbarWidth : $.scrollbarWidth(), + fixed : $.support.fixedPosition, + parent : $('body') + }); + }); + +}(window, document, jQuery)); \ No newline at end of file Property changes on: branches/1.0.x/inc/js/fancybox/jquery.fancybox.js ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +LF \ No newline at end of property Index: branches/1.0.x/inc/js/fancybox/images/fancybox_sprite.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: branches/1.0.x/inc/js/fancybox/images/fancybox_sprite.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: branches/1.0.x/inc/js/fancybox/images/fancybox_loading.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: branches/1.0.x/inc/js/fancybox/images/fancybox_loading.gif ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: branches/1.0.x/inc/js/fancybox/images/blank.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: branches/1.0.x/inc/js/fancybox/images/blank.gif ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: branches/1.0.x/inc/js/fancybox/images/fancybox_overlay.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: branches/1.0.x/inc/js/fancybox/images/fancybox_overlay.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: branches/1.0.x/inc/js/fancybox/jquery.fancybox.css =================================================================== --- branches/1.0.x/inc/js/fancybox/jquery.fancybox.css (nonexistent) +++ branches/1.0.x/inc/js/fancybox/jquery.fancybox.css (revision 15801) @@ -0,0 +1,249 @@ +/*! fancyBox v2.1.4 fancyapps.com | fancyapps.com/fancybox/#license */ +.fancybox-wrap, +.fancybox-skin, +.fancybox-outer, +.fancybox-inner, +.fancybox-image, +.fancybox-wrap iframe, +.fancybox-wrap object, +.fancybox-nav, +.fancybox-nav span, +.fancybox-tmp +{ + padding: 0; + margin: 0; + border: 0; + outline: none; + vertical-align: top; +} + +.fancybox-wrap { + position: absolute; + top: 0; + left: 0; + z-index: 8020; +} + +.fancybox-skin { + position: relative; + background: #f9f9f9; + color: #444; + text-shadow: none; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.fancybox-opened { + z-index: 8030; +} + +.fancybox-opened .fancybox-skin { + -webkit-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); + -moz-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); + box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); +} + +.fancybox-outer, .fancybox-inner { + position: relative; +} + +.fancybox-inner { + overflow: hidden; +} + +.fancybox-type-iframe .fancybox-inner { + -webkit-overflow-scrolling: touch; +} + +.fancybox-error { + color: #444; + font: 14px/20px "Helvetica Neue",Helvetica,Arial,sans-serif; + margin: 0; + padding: 15px; + white-space: nowrap; +} + +.fancybox-image, .fancybox-iframe { + display: block; + width: 100%; + height: 100%; +} + +.fancybox-image { + max-width: 100%; + max-height: 100%; +} + +#fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span { + background-image: url('@templates_base@/inc/js/fancybox/images/fancybox_sprite.png'); +} + +#fancybox-loading { + position: fixed; + top: 50%; + left: 50%; + margin-top: -22px; + margin-left: -22px; + background-position: 0 -108px; + opacity: 0.8; + cursor: pointer; + z-index: 8060; +} + +#fancybox-loading div { + width: 44px; + height: 44px; + background: url('@templates_base@/inc/js/fancybox/images/fancybox_loading.gif') center center no-repeat; +} + +.fancybox-close { + position: absolute; + top: -18px; + right: -18px; + width: 36px; + height: 36px; + cursor: pointer; + z-index: 8040; +} + +.fancybox-nav { + position: absolute; + top: 0; + width: 40%; + height: 100%; + cursor: pointer; + text-decoration: none; + background: transparent url('@templates_base@/inc/js/fancybox/images/blank.gif'); /* helps IE */ + -webkit-tap-highlight-color: rgba(0,0,0,0); + z-index: 8040; +} + +.fancybox-prev { + left: 0; +} + +.fancybox-next { + right: 0; +} + +.fancybox-nav span { + position: absolute; + top: 50%; + width: 36px; + height: 34px; + margin-top: -18px; + cursor: pointer; + z-index: 8040; + visibility: hidden; +} + +.fancybox-prev span { + left: 10px; + background-position: 0 -36px; +} + +.fancybox-next span { + right: 10px; + background-position: 0 -72px; +} + +.fancybox-nav:hover span { + visibility: visible; +} + +.fancybox-tmp { + position: absolute; + top: -99999px; + left: -99999px; + visibility: hidden; + max-width: 99999px; + max-height: 99999px; + overflow: visible !important; +} + +/* Overlay helper */ + +.fancybox-lock { + overflow: hidden; +} + +.fancybox-overlay { + position: absolute; + top: 0; + left: 0; + overflow: hidden; + display: none; + z-index: 8010; + background: url('@templates_base@/inc/js/fancybox/images/fancybox_overlay.png'); +} + +.fancybox-overlay-fixed { + position: fixed; + bottom: 0; + right: 0; +} + +.fancybox-lock .fancybox-overlay { + overflow: auto; + overflow-y: scroll; +} + +/* Title helper */ + +.fancybox-title { + visibility: hidden; + font: normal 13px/20px "Helvetica Neue",Helvetica,Arial,sans-serif; + position: relative; + text-shadow: none; + z-index: 8050; +} + +.fancybox-opened .fancybox-title { + visibility: visible; +} + +.fancybox-title-float-wrap { + position: absolute; + bottom: 0; + right: 50%; + margin-bottom: -35px; + z-index: 8050; + text-align: center; +} + +.fancybox-title-float-wrap .child { + display: inline-block; + margin-right: -100%; + padding: 2px 20px; + background: transparent; /* Fallback for web browsers that doesn't support RGBa */ + background: rgba(0, 0, 0, 0.8); + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; + text-shadow: 0 1px 2px #222; + color: #FFF; + font-weight: bold; + line-height: 24px; + white-space: nowrap; +} + +.fancybox-title-outside-wrap { + position: relative; + margin-top: 10px; + color: #fff; +} + +.fancybox-title-inside-wrap { + padding-top: 10px; +} + +.fancybox-title-over-wrap { + position: absolute; + bottom: 0; + left: 0; + color: #fff; + padding: 10px; + background: #000; + background: rgba(0, 0, 0, .8); +} \ No newline at end of file Property changes on: branches/1.0.x/inc/js/fancybox/jquery.fancybox.css ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +LF \ No newline at end of property Index: branches/1.0.x/inc/js/thickbox/loadingAnimation.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: branches/1.0.x/inc/js/thickbox/loadingAnimation.gif ___________________________________________________________________ Deleted: svn:mime-type ## -1 +0,0 ## -application/octet-stream \ No newline at end of property Index: branches/1.0.x/inc/js/thickbox/images/loadingAnimation.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: branches/1.0.x/inc/js/thickbox/images/loadingAnimation.gif ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: branches/1.0.x/inc/js/thickbox/thickbox.js =================================================================== --- branches/1.0.x/inc/js/thickbox/thickbox.js (revision 15800) +++ branches/1.0.x/inc/js/thickbox/thickbox.js (revision 15801) @@ -1,459 +1,459 @@ /* * Thickbox 3.1 - One Box To Rule Them All. * By Cody Lindley (http://www.codylindley.com) * Copyright (c) 2007 cody lindley * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php */ // on page load call TB.init $(document).ready( function() { // pass where to apply thickbox TB.init('a.thickbox, area.thickbox, input.thickbox'); // preload image TB.imgLoader = new Image(); - TB.imgLoader.src = $base_url + 'inc/js/thickbox/loadingAnimation.gif'; + TB.imgLoader.src = $base_url + 'inc/js/thickbox/images/loadingAnimation.gif'; } ); function TB () { this.imgLoader = null; - this.pathToImage = $base_url + 'inc/js/thickbox/loadingAnimation.gif'; + this.pathToImage = $base_url + 'inc/js/thickbox/images/loadingAnimation.gif'; this.Width = null; this.Height = null; } //add thickbox to href & area elements that have a class of .thickbox TB.init = function (domChunk) { $(domChunk).click( function() { var t = this.title || this.name || null; var a = this.href || this.alt; var g = this.rel || false; TB.show( {caption: t, url: a, imageGroup: g} ); this.blur(); return false; } ); } // function called when the user clicks on a thickbox link TB.show = function (params) { // caption, url, imageGroup, onDataReceived, onAfterShow, postParams try { if (typeof document.body.style.maxHeight === 'undefined') { // if IE 6 $('body', 'html').css( {height: '100%', width: '100%'} ); $('html').css('overflow', 'hidden'); if (document.getElementById('TB_HideSelect') === null) { // iframe to hide select elements in ie6 $('body').append("<iframe id='TB_HideSelect'></iframe><div id='TB_overlay'></div><div id='TB_window'></div>"); $('#TB_overlay').click(TB.remove); } } else { // all others if (document.getElementById('TB_overlay') === null) { $('body').append("<div id='TB_overlay'></div><div id='TB_window'></div>"); $('#TB_overlay').click(TB.remove); } } $('#TB_overlay').addClass('TB_overlayBG'); // use background and opacity if (params.caption === null) { params.caption = ''; } $('body').append("<div id='TB_load'><img src='" + TB.imgLoader.src + "' /></div>"); // add loader to the page $('#TB_load').show(); // show loader var baseURL; if (params.url.indexOf('?') !== -1) { // ff there is a query string involved baseURL = params.url.substr(0, params.url.indexOf('?')); } else { baseURL = params.url; } var urlString = /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/; var url_params = {}; if ( baseURL.toLowerCase().match(urlString) ) { TB.processImages(params, urlString); } else { var queryString = params.url.replace(/^[^\?]+\??/,''); url_params = TB.parseQuery(queryString); TB.processDialog(params, url_params); } if (url_params['modal'] != 'true') { $(document).bind( 'keyup', function(e){ if (e.which == 27){ // close TB.remove(); } } ); } } catch(e) { //nothing here } } // helper functions below TB.processImages = function (params, urlString) { // code to show images var TB_PrevCaption = ''; var TB_PrevURL = ''; var TB_PrevHTML = ''; var TB_NextCaption = ''; var TB_NextURL = ''; var TB_NextHTML = ''; var TB_imageCount = ''; var TB_FoundURL = false; if (params.imageGroup) { // scan images in group to create Prev/Next links var TB_TempArray = $('a[rel=' + params.imageGroup + ']').get(); for (var TB_Counter = 0; ((TB_Counter < TB_TempArray.length) && (TB_NextHTML === '')); TB_Counter++) { var urlTypeTemp = TB_TempArray[TB_Counter].href.toLowerCase().match(urlString); if (!(TB_TempArray[TB_Counter].href == params.url)) { if (TB_FoundURL) { TB_NextCaption = TB_TempArray[TB_Counter].title; TB_NextURL = TB_TempArray[TB_Counter].href; TB_NextHTML = "<span id='TB_next'> <a href='#'>Next ></a></span>"; } else { TB_PrevCaption = TB_TempArray[TB_Counter].title; TB_PrevURL = TB_TempArray[TB_Counter].href; TB_PrevHTML = "<span id='TB_prev'> <a href='#'>< Prev</a></span>"; } } else { TB_FoundURL = true; TB_imageCount = 'Image ' + (TB_Counter + 1) + ' of ' + TB_TempArray.length; } } } var imgPreloader = new Image(); $(imgPreloader).bind( 'load', function() { $(this).unbind('load'); var $image_size = TB.scaleImage.call(TB, this); TB.Width = $image_size.width + 30; TB.Height = $image_size.height + 60; $('#TB_window').append("<a href='' id='TB_ImageOff' title='Close'><img id='TB_Image' src='" + params.url + "' width='" + $image_size.width + "' height='" + $image_size.height + "' alt='" + params.caption + "'/></a>" + "<div id='TB_caption'>" + params.caption + "<div id='TB_secondLine'>" + TB_imageCount + TB_PrevHTML + TB_NextHTML + "</div></div><div id='TB_closeWindow'><a href='#' id='TB_closeWindowButton' title='Close'>close</a> or Esc Key</div>"); $('#TB_closeWindowButton').click(TB.remove); if (TB_PrevHTML !== '') { function goPrev() { $('#TB_window').remove(); $('body').append("<div id='TB_window'></div>"); TB.show( {caption: TB_PrevCaption, url: TB_PrevURL, imageGroup: params.imageGroup} ); return false; } $('#TB_prev').click(goPrev); } if (TB_NextHTML !== '') { function goNext() { $('#TB_window').remove(); $('body').append("<div id='TB_window'></div>"); TB.show( {caption: TB_NextCaption, url: TB_NextURL, imageGroup: params.imageGroup} ); return false; } $('#TB_next').click(goNext); } $(document).bind( 'keydown', function(e) { var keycode = e.which; if (keycode == 27) { // close TB.remove(); } else if (keycode == 190) { // display previous image if (TB_NextHTML != '') { $(this).unbind('keydown'); goNext(); } } else if (keycode == 188) { // display next image if(TB_PrevHTML != ''){ $(this).unbind('keydown'); goPrev(); } } } ); // show image after it's loaded TB.position(); $('#TB_load').remove(); $('#TB_ImageOff').click(TB.remove); $('#TB_window').css('display', 'block'); // for safari using css instead of show } ); imgPreloader.src = params.url; } TB.scaleImage = function ($image) { // resizing large images - orginal by Christian Montoya edited by me var pagesize = TB.getPageSize(); var x = pagesize[0] - 150; var y = pagesize[1] - 150; var imageWidth = $image.width; var imageHeight = $image.height; if (imageWidth > x) { imageHeight = imageHeight * (x / imageWidth); imageWidth = x; if (imageHeight > y) { imageWidth = imageWidth * (y / imageHeight); imageHeight = y; } } else if (imageHeight > y) { imageWidth = imageWidth * (y / imageHeight); imageHeight = y; if (imageWidth > x) { imageHeight = imageHeight * (x / imageWidth); imageWidth = x; } } return {width: imageWidth, height: imageHeight}; } TB.processDialog = function (params, url_params) { // code to show html // window size is global TB.Width = (url_params['width'] * 1) || 630; // 17 - #TB_Window left&right padding TB.Height = (url_params['height'] * 1) || 440; // 14 - #TB_Window top&bottom padding var ajaxContentW = TB.Width /*+ 17*2*/ - (50*2 + 9*2); // #TB_ajaxContent left&right padding - left&right border var ajaxContentH = TB.Height /*+ 14*2*/ - (40*2 /*+ 9*2*/); // #TB_ajaxContent top&bottom padding var $window_title = ''; if (params.url.indexOf('TB_iframe') != -1) { // either iframe or ajax window urlNoQuery = params.url.split('TB_'); $('#TB_iframeContent').remove(); if (url_params['modal'] != 'true') { // iframe no modal $window_title = "<div id='TB_title'><div id='TB_ajaxWindowTitle'>" + params.caption + "</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton' title='Close'>close</a> or Esc Key</div></div>"; $('#TB_window').append($window_title + "<iframe frameborder='0' hspace='0' src='" + urlNoQuery[0] + "' id='TB_iframeContent' name='TB_iframeContent" + Math.round(Math.random() * 1000) + "' onload='TB.showIframe()' style='width:" + (ajaxContentW + 29) + "px;height:" + (ajaxContentH + 17) + "px;' > </iframe>"); }else{ // iframe modal $('#TB_overlay').unbind(); $('#TB_window').append("<iframe frameborder='0' hspace='0' src='" + urlNoQuery[0] + "' id='TB_iframeContent' name='TB_iframeContent" + Math.round(Math.random() * 1000) + "' onload='TB.showIframe()' style='width:" + (ajaxContentW + 29) + "px;height:" + (ajaxContentH + 17) + "px;'> </iframe>"); } } else { // not an iframe, ajax if ($('#TB_window').css('display') != 'block') { if (url_params['modal'] != 'true') { // ajax no modal // $window_title = "<div id='TB_title'><div id='TB_ajaxWindowTitle'>" + params.caption + "</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton'>close</a> or Esc Key</div></div>"; $window_title = "<div id='TB_closeAjaxWindow'><span id='TB_closeWindowButton'>close [Esc]</span></div>"; $('#TB_window').append($window_title + "<div id='TB_ajaxContent' style='width:" + ajaxContentW + "px;height:" + ajaxContentH + "px'></div>"); } else { // ajax modal $('#TB_overlay').unbind(); $('#TB_window').append("<div id='TB_ajaxContent' class='TB_modal' style='width:" + ajaxContentW + "px;height:" + ajaxContentH + "px;'></div>"); } } else { // this means the window is already up, we are just loading new content via ajax $('#TB_ajaxContent')[0].style.width = ajaxContentW + 'px'; $('#TB_ajaxContent')[0].style.height = ajaxContentH + 'px'; $('#TB_ajaxContent')[0].scrollTop = 0; $('#TB_ajaxWindowTitle').html(params.caption); } } $('#TB_closeWindowButton').click(TB.remove); if (params.url.indexOf('TB_inline') != -1) { $('#TB_ajaxContent').html( $('#' + url_params['inlineId']).html() ); $('#TB_window').unload( function () { // move elements back when you're finished $('#' + url_params['inlineId']).html( $('#TB_ajaxContent').html() ); } ); TB.position(); $('#TB_load').remove(); $('#TB_window').css('display', 'block'); } else if (params.url.indexOf('TB_iframe') != -1) { TB.position(); if ($.browser.safari) { // safari needs help because it will not fire iframe onload $('#TB_load').remove(); $('#TB_window').css('display', 'block'); } } else { var $content_url = params.url + '&random=' + (new Date().getTime()); if (params.postParams === undefined) { $.get( $content_url, function ($data) { TB.onDataReceived($data, params); } ); } else { $.post( $content_url, params.postParams, function ($data) { TB.onDataReceived($data, params); } ); } /*$('#TB_ajaxContent').load( params.url += '&random=' + (new Date().getTime()), params.postParams, function() { //to do a post change this load method TB.position(); $('#TB_load').remove(); TB.init('#TB_ajaxContent a.thickbox'); $('#TB_window').css('display', 'block'); if ( $.isFunction(params.showCallback) ) { params.showCallback(); } } );*/ } } TB.parseRedirect = function ($data) { var $match_redirect = new RegExp('^#redirect#(.*?)($|\\s.*)').exec($data); if ($match_redirect != null) { // redirect to external template requested return $match_redirect[1]; } return false; } TB.onDataReceived = function ($data, $params) { if ( $.isFunction($params.onDataReceived) ) { $data = $params.onDataReceived($data); if ($data === false) { // this callback even could prevent redirect action // callback requested to stop processing return ; } } var $redirect = TB.parseRedirect($data); if ($redirect !== false) { window.location.href = $redirect; return ; } $('#TB_ajaxContent').html($data); TB.position(); $('#TB_load').remove(); TB.init('#TB_ajaxContent a.thickbox'); $('#TB_window').css('display', 'block'); if ( $.isFunction($params.onAfterShow) ) { $params.onAfterShow(); } } TB.showIframe = function () { $('#TB_load').remove(); $('#TB_window').css('display', 'block'); } TB.remove = function () { $('#TB_imageOff').unbind('click'); $('#TB_closeWindowButton').unbind('click'); $('#TB_window').fadeOut( 'fast', function(){ $('#TB_window,#TB_overlay,#TB_HideSelect')/*.trigger('unload')*/.unbind().remove(); } ); $('#TB_load').remove(); if (typeof document.body.style.maxHeight == 'undefined') { // if IE 6 $('body','html').css( {height: 'auto', width: 'auto'} ); $('html').css('overflow', ''); } $(document).unbind('keydown').unbind('keyup'); return false; } TB.position = function () { $('#TB_window').css( {marginLeft: '-' + parseInt(TB.Width / 2) + 'px', width: TB.Width + 'px'} ); if ( !(jQuery.browser.msie && jQuery.browser.version < 7)) { // take away IE6 $('#TB_window').css( {marginTop: '-' + parseInt(TB.Height / 2) + 'px'} ); } } TB.parseQuery = function (query) { var Params = {}; if (!query) { // return empty object return Params; } var Pairs = query.split(/[;&]/); for (var i = 0; i < Pairs.length; i++ ) { var KeyVal = Pairs[i].split('='); if (!KeyVal || KeyVal.length != 2) { continue; } var key = unescape( KeyVal[0] ); var val = unescape( KeyVal[1] ); val = val.replace(/\+/g, ' '); Params[key] = val; } return Params; } TB.getPageSize = function () { var de = document.documentElement; var w = window.innerWidth || self.innerWidth || (de && de.clientWidth) || document.body.clientWidth; var h = window.innerHeight || self.innerHeight || (de && de.clientHeight) || document.body.clientHeight; return [w, h]; } \ No newline at end of file Index: branches/1.0.x/elements/html_head.elm.tpl =================================================================== --- branches/1.0.x/elements/html_head.elm.tpl (revision 15800) +++ branches/1.0.x/elements/html_head.elm.tpl (revision 15801) @@ -1,76 +1,82 @@ <inp2:m_if check="c.current_Field" name="MetaKeywords"> <meta name="Keywords" content="<inp2:c.current_Field name='MetaKeywords'/>"/> <inp2:m_else/> <meta name="Keywords" content="<inp2:m_GetConfig name='Category_MetaKey'/>"/> </inp2:m_if> <inp2:m_if check="c.current_Field" name="MetaDescription"> <meta name="Description" content="<inp2:c.current_Field name='MetaDescription'/>"/> <inp2:m_else/> <meta name="Description" content="<inp2:m_GetConfig name='Category_MetaDesc'/>"/> </inp2:m_if> <meta name="author" content="<inp2:m_GetConfig name='Site_Name' html_escape='1'/>"/> -<meta http-equiv="content-type" content="text/html; charset=<inp2:lang.current_Field name='Charset'/>" /> +<meta http-equiv="content-type" content="text/html; charset=<inp2:m_GetConst name='CHARSET'/>" /> <link rel="icon" href="<inp2:m_BaseURL/>favicon.ico" type="image/x-icon" /> <link rel="shortcut icon" href="<inp2:m_BaseURL/>favicon.ico" type="image/x-icon" /> -<link rel="stylesheet" type="text/css" href="<inp2:m_Compress files='inc/reset.css|inc/styles.css|inc/flexslider.css|inc/modal.css|inc/jquery.gzoom.css|inc/pikachoose.css|inc/qtip.css'/>" media="all" charset="<inp2:lang.current_Field name='Charset'/>"/> +<link rel="stylesheet" type="text/css" href="<inp2:m_Compress files='inc/reset.css|inc/styles.css|inc/flexslider.css|inc/modal.css|inc/jquery.gzoom.css|inc/pikachoose.css|inc/qtip.css'/>" media="all" charset="<inp2:m_GetConst name='CHARSET'/>"/> <!-- including "inc/profile.css" will break logged-in user's menu --> <link type="text/css" rel="stylesheet" href="<inp2:m_TemplatesBase />inc/ui/jquery.ui.all.css" charset="utf-8" /> <!--## <link type="text/css" rel="stylesheet" href="<inp2:m_TemplatesBase />inc/reset.css" charset="utf-8" /> <link type="text/css" rel="stylesheet" href="<inp2:m_TemplatesBase />inc/styles.css" charset="utf-8" /> <link type="text/css" rel="stylesheet" href="<inp2:m_TemplatesBase />inc/category.css" charset="utf-8" /> <link type="text/css" rel="stylesheet" href="<inp2:m_TemplatesBase />inc/flexslider.css" charset="utf-8" /> <link type="text/css" rel="stylesheet" href="<inp2:m_TemplatesBase />inc/modal.css" charset="utf-8" /> <link type="text/css" rel="stylesheet" href="<inp2:m_TemplatesBase />inc/details.css" charset="utf-8" /> <link type="text/css" rel="stylesheet" href="<inp2:m_TemplatesBase />inc/jquery.gzoom.css" charset="utf-8" /> <link type="text/css" rel="stylesheet" href="<inp2:m_TemplatesBase />inc/pikachoose.css" charset="utf-8" /> ##--> <!--## JS FOR ADMIN ##--> <inp2:st_EditingScripts/> <script type="text/javascript"> var $base_url = '<inp2:m_TemplatesBase/>'; </script> <!--## JS FOR FRONT ##--> <inp2:m_ifnot check="m_GetConst" name="EDITING_MODE"> <!--## EXCLUDE THIS JS WHEN IN ADMIN ##--> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js" type="text/javascript"></script> - <link rel="stylesheet" type="text/css" href="<inp2:m_Compress files='/inc/js/thickbox/thickbox.css'/>"/> + <link rel="stylesheet" type="text/css" href="<inp2:m_Compress files='inc/js/thickbox/thickbox.css'/>"/> <script src="<inp2:m_Compress files='inc/js/thickbox/thickbox.js'/>" type="text/javascript"></script> + + <!--<link rel="stylesheet" type="text/css" href="<inp2:m_Compress files='inc/js/colorbox/jquery.colorbox.css'/>"/>--> + <!--<script src="<inp2:m_Compress files='inc/js/colorbox/jquery.colorbox.js'/>" type="text/javascript"></script>--> + + <!--<link rel="stylesheet" type="text/css" href="<inp2:m_Compress files='inc/js/fancybox/jquery.fancybox.css'/>"/>--> + <!--<script src="<inp2:m_Compress files='inc/js/fancybox/jquery.fancybox.js'/>" type="text/javascript"></script>--> </inp2:m_ifnot> <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.15/jquery-ui.min.js" type="text/javascript"></script> <script src="<inp2:m_TemplatesBase />inc/js/ui/jquery.ui.core.min.js" type="text/javascript"></script> <script src="<inp2:m_TemplatesBase />inc/js/ui/jquery.ui.widget.min.js" type="text/javascript"></script> <script src="<inp2:m_TemplatesBase />inc/js/ui/jquery.ui.accordion.min.js" type="text/javascript"></script> <script src="<inp2:m_TemplatesBase />inc/js/jquery.flexslider-min.js" type="text/javascript"></script> <script src="<inp2:m_TemplatesBase />inc/js/jquery.scripts.js" type="text/javascript"></script> <script src="<inp2:m_TemplatesBase />inc/js/tinybox.js" type="text/javascript"></script> <script src="<inp2:m_TemplatesBase />inc/js/jquery.qtip.min.js" type="text/javascript"></script> <script src="<inp2:m_TemplatesBase />inc/js/form_manager.js" type="text/javascript"></script> <script type="text/javascript"> var aRatingManager = new RatingManager('<inp2:m_Link template="index" events[#PREFIX#]="OnMakeVote" rating="#VOTE#" id="#ID#" no_amp="1" size="#SIZE#"/>'); - FormManager.init( - { - url: '<inp2:m_Link template="#TEMPLATE#" js_escape="1" __NO_REWRITE__="1" no_amp="1"/>', - noErrorsHTML: '' - } - ); + FormManager.init({ + url: '<inp2:m_Link template="#TEMPLATE#" js_escape="1" __NO_REWRITE__="1" no_amp="1"/>', + windowManager: new FormManager_WindowManagerThickBox() +// windowManager: new FormManager_WindowManagerColorBox() +// windowManager: new FormManager_WindowManagerFancyBox() + }); </script> <inp2:m_Comment> <!--[if lt IE 9]> <![endif]--> </inp2:m_Comment> \ No newline at end of file