aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/ContentFlow/contentflow_src.js
diff options
context:
space:
mode:
authorTeddy Wing2013-04-27 15:16:14 -0400
committerTeddy Wing2013-04-27 15:16:14 -0400
commite5081d9d10c5ad2882b9ff3fd4a393d00fef47a6 (patch)
tree36297e5c3f4038d6bf9089edc1a3494192e52d1f /vendor/ContentFlow/contentflow_src.js
downloadWho-am-I-e5081d9d10c5ad2882b9ff3fd4a393d00fef47a6.tar.bz2
Initial commit
Initial version of HTML page for in-Viggle-app display.
Diffstat (limited to 'vendor/ContentFlow/contentflow_src.js')
-rw-r--r--vendor/ContentFlow/contentflow_src.js2584
1 files changed, 2584 insertions, 0 deletions
diff --git a/vendor/ContentFlow/contentflow_src.js b/vendor/ContentFlow/contentflow_src.js
new file mode 100644
index 0000000..b6a5968
--- /dev/null
+++ b/vendor/ContentFlow/contentflow_src.js
@@ -0,0 +1,2584 @@
+/* ContentFlow, version 1.0.2
+ * (c) 2007 - 2010 Sebastian Kutsch
+ * <http://www.jacksasylum.eu/ContentFlow/>
+ *
+ * ContentFlow is distributed under the terms of the MIT license.
+ * (see http://www.jacksasylum.eu/ContentFlow/LICENSE)
+ *
+ *--------------------------------------------------------------------------*/
+/*
+ * ============================================================
+ * Global configutaion and initilization object
+ * ============================================================
+ */
+var ContentFlowGlobal = {
+ Flows: new Array,
+ AddOns: {},
+ scriptName: 'contentflow.js',
+ scriptElement: null,
+ Browser: new (function () {
+ this.Opera = window.opera ? true : false;
+ this.IE = document.all && !this.Opera ? true : false;
+ this.IE6 = this.IE && typeof(window.XMLHttpRequest) == "undefined" ? true : false;
+ this.IE8 = this.IE && typeof(document.querySelectorAll) != "undefined" ? true : false;
+ this.IE7 = this.IE && ! this.IE6 && !this.IE8 ? true : false;
+ this.WebKit = /WebKit/i.test(navigator.userAgent) ? true : false,
+ this.iPhone = /iPhone|iPod/i.test(navigator.userAgent)? true : false;
+ this.Chrome = /Chrome/i.test(navigator.userAgent) ? true : false;
+ this.Safari = /Safari/i.test(navigator.userAgent) && !this.Chrome ? true : false;
+ this.Konqueror = navigator.vendor == "KDE" ? true : false;
+ this.Konqueror4 = this.Konqueror && /native code/.test(document.getElementsByClassName) ? true : false;
+ this.Gecko = !this.WebKit && navigator.product == "Gecko" ? true : false;
+ this.Gecko19 = this.Gecko && Array.reduce ? true : false;
+ })(),
+
+ getAddOnConf: function(name) {
+ if(this.AddOns[name])
+ return this.AddOns[name].conf;
+ else
+ return {};
+ },
+
+ setAddOnConf: function (name, conf) {
+ this.AddOns[name].setConfig(conf);
+ },
+
+ getScriptElement:function (scriptName) {
+ var regex = new RegExp(scriptName);
+ var scripts = document.getElementsByTagName('script');
+ for (var i=0; i<scripts.length; i++) {
+ if (scripts[i].src && regex.test(scripts[i].src))
+ return scripts[i];
+ }
+ return '';
+ },
+
+ getScriptPath: function (scriptElement, scriptName) {
+ var regex = new RegExp(scriptName+".*");
+ return scriptElement.src.replace(regex, '');
+ },
+
+ addScript: function (path) {
+ if (this.Browser.IE || this.Browser.WebKit || this.Browser.Konqueror) {
+ document.write('<script type="text/javascript" src="'+path+'"><\/script>');
+ }
+ else {
+ var script = document.createElement('script');
+ script.src = path;
+ script.setAttribute('type', 'text/javascript');
+ document.getElementsByTagName('head')[0].appendChild(script);
+ }
+ },
+
+ addScripts: function (basePath, filenames) {
+ for (var i=0; i<filename.length; i++)
+ this.addScript(basepath+filenames[i]);
+ },
+
+ addStylesheet: function (path) {
+ if (this.Browser.Gecko19) {
+ var link = document.createElement('link');
+ link.setAttribute('rel', 'stylesheet');
+ link.setAttribute('href', path);
+ link.setAttribute('type', 'text/css');
+ link.setAttribute('media', 'screen');
+ document.getElementsByTagName('head')[0].appendChild(link);
+ }
+ else {
+ document.write('<link rel="stylesheet" href="'+path+'" type="text/css" media="screen" />');
+ }
+
+ },
+
+ addStylesheets: function (basePath, filenames) {
+ for (var i=0; i<filename.length; i++)
+ this.addStylesheet(basepath+filenames[i]);
+ },
+
+ initPath: function () {
+ /* get / set basic values */
+ this.scriptElement = this.getScriptElement(this.scriptName);
+ if (!this.scriptElement) {
+ this.scriptName = 'contentflow_src.js';
+ this.scriptElement = this.getScriptElement(this.scriptName);
+ }
+
+ this.BaseDir = this.getScriptPath(this.scriptElement, this.scriptName) ;
+ if (!this.AddOnBaseDir) this.AddOnBaseDir = this.BaseDir;
+ if (!this.CSSBaseDir) this.CSSBaseDir = this.BaseDir;
+ },
+
+ init: function () {
+ /* add default stylesheets */
+ this.addStylesheet(this.CSSBaseDir+'contentflow.css');
+ this.addStylesheet(this.CSSBaseDir+'mycontentflow.css'); // FF2: without adding a css-file FF2 hangs on a reload.
+ // I don't have the slidest idea why
+ // Could be timing problem
+ this.loadAddOns = new Array();
+ /* add AddOns scripts */
+ if (this.scriptElement.getAttribute('load')) {
+ var AddOns = this.loadAddOns = this.scriptElement.getAttribute('load').replace(/\ +/g,' ').split(' ');
+ for (var i=0; i<AddOns.length; i++) {
+ if (AddOns[i] == '') continue;
+ //if (AddOns[i] == 'myStyle') {
+ //this.addStylesheet(this.BaseDir+'mycontentflow.css');
+ //continue;
+ //}
+ this.addScript(this.AddOnBaseDir+'ContentFlowAddOn_'+AddOns[i]+'.js');
+ }
+ }
+
+ /* ========== ContentFlow auto initialization on document load ==========
+ * thanks to Dean Edwards
+ * http://dean.edwards.name/weblog/2005/02/order-of-events/
+ */
+ var CFG = this;
+
+ /* for Mozilla, Opera 9, Safari */
+ if (document.addEventListener) {
+ /* for Safari */
+ if (this.Browser.WebKit) {
+ var _timer = setInterval(function() {
+ if (/loaded|complete/.test(document.readyState)) {
+ clearInterval(_timer);
+ CFG.onloadInit(); // call the onload handler
+ }
+ }, 10);
+ }
+ else {
+ document.addEventListener("DOMContentLoaded", CFG.onloadInit, false);
+ }
+ }
+ else if (this.Browser.IE) {
+ document.write("<script id=__ie_cf_onload defer src=javascript:void(0)><\/script>");
+ var script = document.getElementById("__ie_cf_onload");
+ script.onreadystatechange = function() {
+ if (this.readyState == "complete") {
+ CFG.onloadInit(); // call the onload handler
+ }
+ };
+ }
+
+ /* for all other browsers */
+ window.addEvent('load', CFG.onloadInit, false);
+
+ /* ================================================================== */
+
+ },
+
+ onloadInit: function () {
+ // quit if this function has already been called
+ if (arguments.callee.done) return;
+ for (var i=0; i< ContentFlowGlobal.loadAddOns.length; i++) {
+ var a = ContentFlowGlobal.loadAddOns[i];
+ if (!ContentFlowGlobal.AddOns[a]) {
+ var CFG = ContentFlowGlobal;
+ window.setTimeout( CFG.onloadInit, 10);
+ return;
+ }
+ }
+ // flag this function so we don't do the same thing twice
+ arguments.callee.done = true;
+
+ /* fix for mootools */
+ if (window.Element && Element.implement && document.all && !window.opera) {
+ for (var prop in window.CFElement.prototype) {
+ if(!window.Element.prototype[prop]) {
+ var implement = {};
+ implement[prop] = window.CFElement.prototype[prop];
+ Element.implement(implement);
+ }
+ }
+ }
+
+ /* init all manualy created flows */
+ for (var i=0; i< ContentFlowGlobal.Flows.length; i++) {
+ ContentFlowGlobal.Flows[i].init();
+ }
+
+ /* init the rest */
+ var divs = document.getElementsByTagName('div');
+ DIVS: for (var i = 0; i < divs.length; i++) {
+ if (divs[i].className.match(/\bContentFlow\b/)) {
+ for (var j=0; j<ContentFlowGlobal.Flows.length; j++) {
+ if (divs[i] == ContentFlowGlobal.Flows[j].Container) continue DIVS;
+ }
+ var CF = new ContentFlow(divs[i],{}, false);
+ CF.init();
+ }
+ }
+ }
+
+};
+
+ContentFlowGlobal.initPath();
+
+
+/*
+ * ============================================================
+ * ContentFlowAddOn
+ * ============================================================
+ */
+var ContentFlowAddOn = function (name, methods, register) {
+ if (typeof register == "undefined" || register != false)
+ ContentFlowGlobal.AddOns[name] = this;
+
+ this.name = name;
+ if (!methods) methods = {};
+ this.methods = methods;
+ this.conf = {};
+ if (this.methods.conf) {
+ this.setConfig(this.methods.conf);
+ delete this.methods.conf;
+ }
+
+
+ this.scriptpath = ContentFlowGlobal.AddOnBaseDir;
+ if (methods.init) {
+ var init = methods.init.bind(this);
+ init(this);
+ }
+};
+
+ContentFlowAddOn.prototype = {
+ Browser: ContentFlowGlobal.Browser,
+
+ addScript: ContentFlowGlobal.addScript,
+ addScripts: ContentFlowGlobal.addScripts,
+
+ addStylesheet: function (path) {
+ if (!path)
+ path = this.scriptpath+'ContentFlowAddOn_'+this.name+'.css';
+ ContentFlowGlobal.addStylesheet(path);
+ },
+ addStylesheets: ContentFlowGlobal.addStylesheets,
+
+ setConfig: function (conf) {
+ for (var c in conf) {
+ this.conf[c] = conf[c];
+ }
+ },
+
+ _init: function (flow) {
+ if (this.methods.ContentFlowConf) {
+ flow.setConfig(this.methods.ContentFlowConf);
+ }
+ }
+
+
+};
+
+
+
+/*
+ * ============================================================
+ * ContentFlowGUIElement
+ * ============================================================
+ */
+
+var ContentFlowGUIElement = function (CFobj, element) {
+ element.setDimensions = function () {
+ this.dimensions = this.getDimensions();
+ this.center = {x: this.dimensions.width/2, y:this.dimensions.height/2};
+ this.position = this.findPos();
+ };
+ element.addObserver = function (eventName, method) {
+ var m = this.eventMethod = method.bind(CFobj);
+ this.observedEvent = eventName;
+ this.addEvent(eventName, m, false);
+ };
+
+ element.makeDraggable = function (onDrag, beforeDrag, afterDrag) {
+
+ this.stopDrag = function(event) {
+ if (!event) var event = window.event;
+ if (this.Browser.iPhone) {
+ window.removeEvent('touchemove', onDrag, false);
+ if (!this.ontochmove) {
+ var t = event.target;
+ if (t.firstChild) t = t.firstChild;
+ var e = document.createEvent('MouseEvents');
+ e.initEvent('click', true, true);
+ t.dispatchEvent(e);
+ }
+ }
+ else {
+ window.removeEvent('mousemove', onDrag, false);
+ }
+ afterDrag(event);
+ }.bind(this);
+
+ this.initDrag = function (event) {
+ if (!event) var event = window.event;
+ var e = event;
+ if (event.touches) e = event.touches[0];
+
+ this.mouseX = e.clientX;
+ this.mouseY = e.clientY;
+
+ beforeDrag(event);
+
+ }.bind(this);
+
+ this.startDrag = function (event) {
+ if (!event) var event = window.event;
+
+ var stopDrag = this.stopDrag;
+
+ if (this.Browser.iPhone) {
+ var s = this;
+ s.ontouchmove = false
+ window.addEvent('touchmove', function (e) {
+ s.ontouchmove = true;
+ onDrag(e);
+ }, false);
+ event.preventDefault();
+ window.addEvent('touchend', stopDrag, false);
+ }
+ else {
+ window.addEvent('mousemove', onDrag, false);
+ window.addEvent('mouseup', stopDrag, false);
+ }
+ if(event.preventDefault) { event.preventDefault() }
+
+ }.bind(this);
+
+ var startDrag = this.startDrag;
+ if (this.Browser.iPhone) {
+ this.addEventListener('touchstart', startDrag, false);
+ }
+ else {
+ this.addEvent('mousedown', startDrag, false);
+ }
+
+ };
+
+ element.Browser = ContentFlowGlobal.Browser;
+ $CF(element).setDimensions();
+ return element;
+};
+
+
+/*
+ * ============================================================
+ * ContentFlowItem
+ * ============================================================
+ */
+var ContentFlowItem = function (CFobj, element, index) {
+ this.CFobj = CFobj;
+ this._activeElement = CFobj.conf.activeElement;
+ this.pre = null;
+ this.next = null;
+ /*
+ * ==================== item click events ====================
+ * handles the click event on an active and none active item
+ */
+
+ this.clickItem = function (event) {
+ if(!event) var event = window.event;
+ var el = event.target ? event.target : event.srcElement;
+ var index = el.itemIndex ? el.itemIndex : el.parentNode.itemIndex;
+ var item = this.items[index];
+ if (this._activeItem == item) {
+ this.conf.onclickActiveItem(item);
+ }
+ else {
+ if (this.conf.onclickInactiveItem(item) != false ) this.moveToIndex(index);
+ }
+ }.bind(CFobj),
+
+ this.setIndex = function (index) {
+ this.index = index;
+ this.element.itemIndex = index;
+ };
+ this.getIndex = function () {
+ return this.index;
+ };
+
+
+ /* generate deault HTML structure if item is an image */
+ if ($CF(element).nodeName == "IMG") {
+ var el = document.createElement('div');
+ el.className = "item";
+
+ var cont = element.parentNode.replaceChild( el, element);
+ cont.className = "content";
+ el.appendChild(cont);
+
+ if (element.title) {
+ var cap = document.createElement('div');
+ cap.className = "caption";
+ cap.innerHTML = element.title;
+ el.appendChild(cap);
+ }
+ element = el;
+ }
+
+ /* create item object */
+ this.element = $CF(element);
+ this.item = element;
+ if (typeof index != "undefined") this.setIndex(index);
+ this.content = this.element.getChildrenByClassName('content')[0];
+ this.caption = this.element.getChildrenByClassName('caption')[0];
+ this.label = this.element.getChildrenByClassName('label')[0];
+
+ /* if content is image set properties */
+ if (this.content.nodeName == "IMG") {
+ CFobj._imagesToLoad++;
+
+ var foobar = function () {
+ CFobj._imagesToLoad--;
+ this.image = this.content;
+ this.setImageFormat(this.image);
+ if ( CFobj.conf.reflectionHeight > 0) {
+ this.addReflection();
+ }
+ this.initClick();
+ CFobj._addItemCueProcess(true);
+ }.bind(this);
+
+ if (this.content.complete && this.content.width > 0)
+ window.setTimeout(foobar, 100);
+ else if (this.Browser.IE && !this.content.onload) {
+ var self = this;
+ var t = window.setInterval( function () {
+ if (self.content.complete && self.content.width > 0) {
+ window.clearInterval(t);
+ foobar();
+ }
+ }, 10);
+ }
+ else
+ this.content.onload = window.setTimeout(foobar, 100);
+ }
+ else {
+ this.initClick();
+ CFobj._addItemCueProcess(true);
+ }
+
+};
+
+ContentFlowItem.prototype = {
+
+ Browser: ContentFlowGlobal.Browser,
+
+ makeActive: function () {
+ this.element.addClassName('active');
+ this.CFobj.conf.onMakeActive(this);
+ },
+
+ makeInactive: function () {
+ this.element.removeClassName('active');
+ this.CFobj.conf.onMakeInactive(this);
+ },
+
+ initClick: function () {
+ var cItem = this.clickItem;
+ this[this._activeElement].addEvent('click', cItem, false);
+ },
+
+ setImageFormat: function (img) {
+ if (this.Browser.IE6 || this.Browser.IE7) img.style.width = "auto";
+ img.origProportion = img.width / img.height;
+ img.setAttribute('origProportion', img.width / img.height);
+ if (this.Browser.IE6 || this.Browser.IE7) img.style.width = "";
+ //img.origWidth = img.width;
+ //img.origHeight = img.height;
+ if (img.origProportion <= 1)
+ img.addClassName('portray');
+ else
+ img.addClassName('landscape');
+ },
+
+ /*
+ * add reflection to item
+ */
+ addReflection: function() {
+ var CFobj = this.CFobj;
+ var reflection;
+ var image = this.content;
+
+
+ if (this.Browser.IE) {
+ var filterString = 'progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)';
+ if (CFobj._reflectionColorRGB) {
+ // transparent gradient
+ if (CFobj.conf.reflectionColor == "transparent") {
+ var RefImg = reflection = this.reflection = document.createElement('img');
+ reflection.src = image.src;
+ }
+ // color gradient
+ else {
+ reflection = this.reflection = document.createElement('div');
+ var RefImg = document.createElement('img');
+ RefImg.src = image.src;
+ reflection.width = RefImg.width;
+ reflection.height = RefImg.height;
+ RefImg.style.width = '100%';
+ RefImg.style.height = '100%';
+ var color = CFobj._reflectionColorRGB;
+ reflection.style.backgroundColor = '#'+color.hR+color.hG+color.hB;
+ reflection.appendChild(RefImg);
+ }
+ filterString += ' progid:DXImageTransform.Microsoft.Alpha(opacity=0, finishOpacity=50, style=1, finishX=0, startY='+CFobj.conf.reflectionHeight*100+' finishY=0)';
+ } else {
+ var RefImg = reflection = this.reflection = document.createElement('img');
+ reflection.src = image.src;
+ }
+ // crop image (streches and crops (clip on default dimensions), original proportions will be restored through CSS)
+ filterString += ' progid:DXImageTransform.Microsoft.Matrix(M11=1, M12=0, M21=0, M22='+1/CFobj.conf.reflectionHeight+')';
+
+ if (ContentFlowGlobal.Browser.IE6) {
+ if (image.src.match(/\.png$/) ) {
+ image.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+image.src+"', sizingMethod=scale )";
+ image.filterString = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+image.src+"', sizingMethod=scale )";
+ filterString += " progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+image.src+"', sizingMethod=scale )";
+ image.origSrc = image.src;
+ image.src='img/blank.gif';
+ RefImg.src="img/blank.gif";
+ }
+ }
+
+ reflection.filterString = filterString;
+ RefImg.style.filter = filterString;
+
+ } else {
+ if (CFobj._reflectionWithinImage)
+ var canvas = this.canvas = $CF(document.createElement('canvas'));
+ else
+ var canvas = reflection = this.reflection = document.createElement('canvas');
+
+ if (canvas.getContext) {
+ if (CFobj._reflectionWithinImage) {
+ for (var i=0; i <image.attributes.length; i++) {
+ canvas.setAttributeNode(image.attributes[i].cloneNode(true));
+ }
+ }
+
+ var context = canvas.getContext("2d");
+
+ /* calc image size */
+ var max = CFobj.maxHeight;
+ var size = CFobj._scaleImageSize(this, {width: max, height: max }, max)
+ var width = size.width;
+ var height = size.height;
+
+ // overwrite default height and width
+ if (CFobj._reflectionWithinImage) {
+ canvas.width = width;
+ canvas.height = height;
+ this.setImageFormat(canvas);
+ canvas.height = height * (1 + CFobj.conf.reflectionHeight + CFobj.conf.reflectionGap);
+
+ }
+ else {
+ canvas.width = width;
+ canvas.height = height * CFobj.conf.reflectionHeight;
+ }
+
+ context.save(); /* save default context */
+
+ /* draw image into canvas */
+ if (CFobj._reflectionWithinImage) {
+ context.drawImage(image, 0, 0, width, height);
+ }
+
+ /* mirror image by transformation of context and image drawing */
+ if (CFobj._reflectionWithinImage) {
+ var contextHeight = height * ( 1 + CFobj.conf.reflectionGap/2) * 2;
+ }
+ else {
+ var contextHeight = image.height;
+ }
+ // -1 for FF 1.5
+ contextHeight -= 1;
+
+ context.translate(0, contextHeight);
+ context.scale(1, -1);
+ /* draw reflection image into canvas */
+ context.drawImage(image, 0, 0, width, height);
+
+ /* restore default context for simpler further canvas manupulation */
+ context.restore();
+
+ if (CFobj._reflectionColorRGB) {
+ var gradient = context.createLinearGradient(0, 0, 0, canvas.height);
+
+ var alpha = [0, 0.5, 1];
+ if (CFobj._reflectionColor == "transparent") {
+ context.globalCompositeOperation = "destination-in";
+ alpha = [1, 0.5, 0];
+ }
+
+ var red = CFobj._reflectionColorRGB.iR;
+ var green = CFobj._reflectionColorRGB.iG;
+ var blue = CFobj._reflectionColorRGB.iB;
+ if (CFobj._reflectionWithinImage) {
+ gradient.addColorStop(0, 'rgba('+red+','+green+','+blue+','+alpha[0]+')');
+ gradient.addColorStop(height/canvas.height, 'rgba('+red+','+green+','+blue+','+alpha[0]+')');
+ gradient.addColorStop(height/canvas.height, 'rgba('+red+','+green+','+blue+','+alpha[1]+')');
+ }
+ else {
+ gradient.addColorStop(0, 'rgba('+red+','+green+','+blue+','+alpha[1]+')');
+ }
+ gradient.addColorStop(1, 'rgba('+red+','+green+','+blue+','+alpha[2]+')');
+
+ context.fillStyle = gradient;
+ context.fillRect(0, 0, canvas.width, canvas.height);
+
+ }
+
+ if (CFobj._reflectionWithinImage) {
+ image.parentNode.replaceChild(canvas, image);
+ this.content = canvas;
+ this.origContent = canvas;
+ delete this.image;// = true;
+
+ }
+
+ } else {
+ CFobj._reflectionWithinImage = false;
+ delete this.reflection;
+ }
+
+ }
+ if (reflection) {
+ reflection.className = "reflection";
+ this.element.appendChild(reflection);
+
+ /* be shure that caption is last child */
+ if (this.caption) this.element.appendChild(this.caption);
+ }
+
+ }
+
+
+ };
+
+/*
+ * ============================================================
+ * ContentFlow
+ * ============================================================
+ */
+var ContentFlow = function (container, config) {
+
+ if (container) {
+ ContentFlowGlobal.Flows.push(this);
+ this.Container = container;
+ this._userConf = config?config:{};
+ this.conf = {};
+ this._loadedAddOns = new Array();
+ } else {
+ throw ('ContentFlow ERROR: No flow container node or id given');
+ }
+
+};
+
+ContentFlow.prototype = {
+ _imagesToLoad: 0,
+ _activeItem: 0,
+ _currentPosition: 0,
+ _targetPosition: 0,
+ _stepLock: false,
+ _millisecondsPerStep: 40,
+ _reflectionWithinImage: true,
+ Browser: ContentFlowGlobal.Browser,
+
+ _defaultConf: {
+ /* pre conf */
+ useAddOns: 'all', // all, none, [AddOn1, ... , AddOnN]
+
+ biggestItemPos: 0,
+ loadingTimeout: 30000, //milliseconds
+ activeElement: 'content', // item or content
+
+ maxItemHeight: 0,
+ scaleFactor: 1,
+ scaleFactorLandscape: 1.33,
+ scaleFactorPortrait: 1.0,
+ fixItemSize: false,
+ relativeItemPosition: "top center", // align top/above, bottom/below, left, right, center of position coordinate
+
+ circularFlow: true,
+ verticalFlow: false,
+ visibleItems: -1,
+ endOpacity: 1,
+ startItem: "center",
+ scrollInFrom: "pre",
+
+ flowSpeedFactor: 1.0,
+ flowDragFriction: 1.0,
+ scrollWheelSpeed: 1.0,
+ keys: {
+ 13: function () { this.conf.onclickActiveItem(this._activeItem) },
+ 37: function () { this.moveTo('pre') },
+ 38: function () { this.moveTo('visibleNext') },
+ 39: function () { this.moveTo('next') },
+ 40: function () { this.moveTo('visiblePre') }
+ },
+
+ reflectionColor: "transparent", // none, transparent or hex RGB CSS style #RRGGBB
+ reflectionHeight: 0.5, // float (relative to original image height)
+ reflectionGap: 0.0,
+
+ /* ==================== actions ==================== */
+
+ onInit: function () {},
+
+ onclickInactiveItem: function (item) {},
+
+ onclickActiveItem: function (item) {
+ var url, target;
+
+ if (url = item.content.getAttribute('href')) {
+ target = item.content.getAttribute('target');
+ }
+ else if (url = item.element.getAttribute('href')) {
+ target = item.element.getAttribute('target');
+ }
+ else if (url = item.content.getAttribute('src')) {
+ target = item.content.getAttribute('target');
+ }
+
+ if (url) {
+ if (target)
+ window.open(url, target).focus();
+ else
+ window.location.href = url;
+ }
+ },
+
+ onMakeInactive: function (item) {},
+
+ onMakeActive: function (item) {},
+
+ onReachTarget: function(item) {},
+
+ onMoveTo: function(item) {},
+
+ //onDrawItem: function(item, relativePosition, relativePositionNormed, side, size) {},
+ onDrawItem: function(item) {},
+
+ onclickPreButton: function (event) {
+ this.moveToIndex('pre');
+ return Event.stop(event);
+ },
+
+ onclickNextButton: function (event) {
+ this.moveToIndex('next');
+ return Event.stop(event);
+ },
+
+ /* ==================== calculations ==================== */
+
+ calcStepWidth: function(diff) {
+ var vI = this.conf.visibleItems;
+ var items = this.items.length;
+ items = items == 0 ? 1 : items;
+ if (Math.abs(diff) > vI) {
+ if (diff > 0) {
+ var stepwidth = diff - vI;
+ } else {
+ var stepwidth = diff + vI;
+ }
+ } else if (vI >= this.items.length) {
+ var stepwidth = diff / items;
+ } else {
+ var stepwidth = diff * ( vI / items);
+ //var stepwidth = diff/absDiff * Math.max(diff * diff,Math.min(absDiff,0.3)) * ( vI / this.items.length);
+ //var stepwidth = this.flowSpeedFactor * diff / this.visibleItems;
+ //var stepwidth = this.flowSpeedFactor * diff * ( this.visibleItems / this.items.length)
+ //var stepwidth = this.flowSpeedFactor * diff / this._millisecondsPerStep * 2; // const. speed
+ }
+ return stepwidth;
+ },
+
+ calcSize: function (item) {
+ var rP = item.relativePosition;
+ //var rPN = relativePositionNormed;
+ //var vI = this.conf.visibleItems;
+
+ var h = 1/(Math.abs(rP)+1);
+ var w = h;
+ return {width: w, height: h};
+ },
+
+ calcCoordinates: function (item) {
+ var rP = item.relativePosition;
+ //var rPN = item.relativePositionNormed;
+ var vI = this.conf.visibleItems;
+
+ var f = 1 - 1/Math.exp( Math.abs(rP)*0.75);
+ var x = item.side * vI/(vI+1)* f;
+ var y = 1;
+
+ return {x: x, y: y};
+ },
+
+ /*
+ calcRelativeItemPosition: function (item) {
+ var x = 0;
+ var y = -1;
+ return {x: x, y: y};
+ },
+ */
+
+ calcZIndex: function (item) {
+ return -Math.abs(item.relativePositionNormed);
+ },
+
+ calcFontSize: function (item) {
+ return item.size.height;
+ },
+
+ calcOpacity: function (item) {
+ return Math.max(1 - ((1 - this.conf.endOpacity ) * Math.sqrt(Math.abs(item.relativePositionNormed))), this.conf.endOpacity);
+ }
+ },
+
+ /* ---------- end of defaultConf ---------- */
+
+
+ /*
+ * ==================== index helper methods ====================
+ */
+
+ /*
+ * checks if index is within the index range of the this.items array
+ * returns a value that is within this range
+ */
+ _checkIndex: function (index) {
+ index = Math.max(index, 0);
+ index = Math.min(index, this.itemsLastIndex);
+ return index;
+ },
+
+ /*
+ * sets the object property itemsLastIndex
+ */
+ _setLastIndex: function () {
+ this.itemsLastIndex = this.items.length - 1;
+ },
+
+ /*
+*/
+ _getItemByIndex: function (index) {
+ return this.items[this._checkIndex(index)];
+ },
+
+ _getItemByPosition: function (position) {
+ return this._getItemByIndex(this._getIndexByPosition(position));
+ },
+
+ /* returns the position of an item-index relative to current position */
+ _getPositionByIndex: function(index) {
+ if (!this.conf.circularFlow) return this._checkIndex(index);
+ var cI = this._getIndexByPosition(this._currentPosition);
+ var dI = index - cI;
+ if (Math.abs(dI) > dI+this.items.length)
+ dI += this.items.length;
+ else if (Math.abs(dI) > (Math.abs(dI-this.items.length)))
+ dI -= this.items.length;
+
+ return this._currentPosition + dI;
+
+ },
+
+ /* returns the index an item at position p would have */
+ _getIndexByPosition: function (position) {
+ if (position < 0) var mod = 0;
+ else var mod = 1;
+
+ var I = (Math.round(position) + mod) % this.items.length;
+ if (I>0) I -= mod;
+ else if(I<0) I += this.items.length - mod;
+ else if(position<0) I = 0;
+ else I = this.items.length - 1;
+
+ return I;
+ },
+
+ _getIndexByKeyWord: function (keyword, relativeTo, check) {
+ if (relativeTo)
+ var index = relativeTo;
+ else if (this._activeItem)
+ var index = this._activeItem.index;
+ else
+ var index = 0;
+
+ if (isNaN(keyword)) {
+ switch (keyword) {
+ case "first":
+ case "start":
+ index = 0;
+ break;
+ case "last":
+ case "end":
+ index = this.itemsLastIndex;
+ break;
+ case "middle":
+ case "center":
+ index = Math.round(this.itemsLastIndex/2);
+ break;
+ case "right":
+ case "next":
+ index += 1;
+ break;
+ case "left":
+ case "pre":
+ case "previous":
+ index -= 1;
+ break;
+ case 'visible':
+ case 'visiblePre':
+ case 'visibleLeft':
+ index -= this.conf.visibleItems;
+ break;
+ case 'visibleNext':
+ case 'visibleRight':
+ index += this.conf.visibleItems;
+ break;
+ default:
+ index = index;
+ }
+ }
+ else {
+ index = keyword;
+ }
+ if (check != false)
+ index = this._checkIndex(index);
+
+ return index;
+ },
+
+
+ _setCaptionLabel: function (index) {
+ if(this.Position && !this.Slider.locked)
+ this.Position.setLabel(index);
+ this._setGlobalCaption();
+ },
+
+
+ /*
+ * ==================== public methods ====================
+ */
+ getAddOnConf: function(name) {
+ return ContentFlowGlobal.getAddOnConf(name);
+ },
+
+ setAddOnConf: function(name, conf) {
+ ContentFlowGlobal.setAddOnConf(name, conf);
+ },
+
+
+ /*
+ * calls _init() if ContentFlow has not been initialized before
+ * needed if ContentFlow is not automatically initialized on window.load
+ */
+ init: function () {
+ if(this.isInit) return;
+ this._init();
+ },
+
+ /*
+ * parses configuration object and initializes configuration values
+ */
+ setConfig: function(config) {
+ if (!config) return;
+ var dC = this._defaultConf;
+ for (var option in config) {
+ if (dC[option] == "undefined" ) continue;
+ switch (option) {
+ case "scrollInFrom":
+ case "startItem":
+ if (typeof(config[option]) == "number" || typeof(config[option]) == "string") {
+ //this["_"+option] = config[option];
+ this.conf[option] = config[option];
+ }
+ break;
+ default:
+ if (typeof(dC[option] == config[option])) {
+ //this["_"+option] = config[option];
+ if (typeof config[option] == "function") {
+ this.conf[option] = config[option].bind(this);
+ }
+ else {
+ this.conf[option] = config[option];
+ }
+ }
+ }
+ }
+ switch (this.conf.reflectionColor) {
+ case this.conf.reflectionColor.search(/#[0-9a-fA-F]{6}/)>= 0?this.conf.reflectionColor:this.conf.reflectionColor+"x":
+ this._reflectionColorRGB = {
+ hR: this.conf.reflectionColor.slice(1,3),
+ hG: this.conf.reflectionColor.slice(3,5),
+ hB: this.conf.reflectionColor.slice(5,7),
+ iR: parseInt(this.conf.reflectionColor.slice(1,3), 16),
+ iG: parseInt(this.conf.reflectionColor.slice(3,5), 16),
+ iB: parseInt(this.conf.reflectionColor.slice(5,7), 16)
+ };
+ break;
+ case "none":
+ case "transparent":
+ default:
+ this._reflectionColor = "transparent";
+ this._reflectionColorRGB = {
+ hR: 0, hG: 0, hB:0,
+ iR: 0, iG: 0, iB:0
+ };
+ break;
+ }
+ if (this.items) {
+ if (this.conf.visibleItems < 0)
+ this.conf.visibleItems = Math.round(Math.sqrt(this.items.length));
+ this.conf.visibleItems = Math.min(this.conf.visibleItems, this.items.length - 1);
+ }
+
+ if (this.conf.relativeItemPosition) {
+ var calcRP = {
+ x: {
+ left: function(size) { return -1 },
+ center: function(size) { return 0 },
+ right: function(size) { return 1 }
+ },
+ y: {
+ top: function(size) { return -1 },
+ center: function(size) { return 0 },
+ bottom: function(size) { return 1 }
+ }
+ };
+
+ var iP = this.conf.relativeItemPosition;
+ iP = iP.replace(/above/,"top").replace(/below/,"bottom");
+ var x, y = null;
+ x = iP.match(/left|right/);
+ y = iP.match(/top|bottom/);
+ c = iP.match(/center/);
+ if (!x) {
+ if (c) x = "center";
+ else x = "center";
+ }
+ if (!y) {
+ if (c) y = "center";
+ else y = "top";
+ }
+ var calcX = calcRP.x[x];
+ var calcY = calcRP.y[y];
+ this.conf.calcRelativeItemPosition = function (item) {
+ var x = calcX(item.size);
+ var y = calcY(item.size);
+ return {x: x, y: y};
+ };
+ this.conf.relativeItemPosition = null;
+ }
+
+ if (this._reflectionType && this._reflectionType != "clientside") {
+ this.conf.reflectionHeight = 0;
+ }
+
+ },
+
+ getItem: function (index) {
+ return this.items[this._checkIndex(Math.round(index))];
+ },
+
+ /*
+ * returns the index number of the active item
+ */
+ getActiveItem: function() {
+ return this._activeItem;
+ },
+
+ /*
+ * returns the number of items the flow contains
+ */
+ getNumberOfItems: function () {
+ return this.items.length;
+ },
+
+ /*
+ * reinitializes sizes.
+ * called on window.resize
+ */
+ resize: function () {
+ this._initSizes();
+ this._initStep();
+ },
+
+ /*
+ * scrolls flow to item i
+ */
+ moveToPosition: function (p, holdPos) {
+ if (!this.conf.circularFlow) p = this._checkIndex(p);
+ this._targetPosition = p;
+ this.conf.onMoveTo(this._getItemByPosition(p));
+ this._initStep(false, holdPos);
+ },
+ moveToIndex: function (index) {
+ this._targetPosition = Math.round(this._getPositionByIndex(this._getIndexByKeyWord(index, this._activeItem.index, !this.conf.circularFlow)));
+ this.conf.onMoveTo(this._getItemByPosition(this._targetPosition));
+ this._initStep();
+ },
+ moveToItem: function (item) {
+ var i;
+ if (item.itemIndex) i = item.itemIndex;
+ else i = item.index;
+ this.moveToIndex(i);
+ },
+ moveTo: function (i) {
+ if (typeof i == "object") this.moveToItem(i);
+ else if (isNaN(i) || (i == Math.floor(i) && i < this.items.length) ) this.moveToIndex(i);
+ else this.moveToPosition(i);
+ },
+
+ /*
+ * initializes item and adds it at index position
+ */
+ _addItemCue: [],
+ _addItemCueProcess: function (deleteFirst) {
+ var c = this._addItemCue;
+ if (deleteFirst == true)
+ c.shift();
+ if (c.length > 0 && ! c[0].p) {
+ c[0].p = true;
+ var self = this;
+ var t = c.length > 5 ? 1 : 40;
+ window.setTimeout(function () { self._addItem(c[0].el, c[0].i)}, t) ;
+ }
+ },
+ addItem: function(el, index) {
+ this._addItemCue.push({ el: el, i: index, p: false});
+ if (this._addItemCue.length == 1)
+ this._addItemCueProcess();
+ },
+
+ _addItem: function(el, index) {
+ if (typeof index == "string") {
+ switch (index) {
+ case "first":
+ case "start":
+ index = 0;
+ break;
+ case "last":
+ case "end":
+ index = isNaN(this.itemsLastIndex) ? 0 : this.itemsLastIndex;
+ index += 1;
+ break;
+ default:
+ index = this._getIndexByKeyWord(index);
+ }
+ }
+
+ index = Math.max(index, 0);
+ index = Math.min(index, this.itemsLastIndex + 1);
+ index = isNaN(index) ? 0 : index;
+
+ this.Flow.appendChild(el);
+
+ /* init item after insertion. that way it's part of the document and all styles are applied */
+ var item = new ContentFlowItem(this, el, index);
+ if (this.items.length == 0 ) {
+ this.resize();
+ if (this.conf.circularFlow) {
+ item.pre = item;
+ item.next = item;
+ }
+ }
+ else {
+ if (index == this.itemsLastIndex + 1) {
+ item.pre = this.items[this.itemsLastIndex];
+ item.next = item.pre.next;
+ }
+ else {
+ item.next = this.items[index];
+ item.pre = item.next.pre;
+ }
+ if (item.pre) item.pre.next = item;
+ if (item.next) item.next.pre = item;
+ }
+ this.items.splice(index,0, item);
+
+ /* adjust item indices */
+ for (var i = index; i < this.items.length; i++) {
+ this.items[i].setIndex(i);
+ }
+ this._setLastIndex();
+
+ if (this.conf.origVisibleItems < 0) {
+ this.conf.visibleItems = Math.round(Math.sqrt(this.items.length));
+ }
+ this.conf.visibleItems = Math.min(this.conf.visibleItems, this.items.length - 1);
+
+ /* adjust targetItem, currentPos so that current view does not change*/
+ if (Math.round(this._getPositionByIndex(index)) <= Math.round(this._targetPosition)) {
+ this._targetPosition++;
+ if (!this.conf.circularFlow)
+ this._targetPosition = Math.min(this._targetPosition, this.itemsLastIndex);
+ }
+ if (this._getPositionByIndex(index) <= this._currentPosition) {
+ this._currentPosition++;
+ if (!this.conf.circularFlow)
+ this._currentPosition = Math.min(this._currentPosition, this.itemsLastIndex);
+ }
+
+ // avoid display errors (wrong sizing)
+ var CF = this;
+ window.setTimeout(function () {
+ if(CF.items.length == 1 ) {
+ CF._currentPosition = -0.01;
+ CF._targetPosition = 0;
+ CF.resize();
+ }
+ else {
+ CF._initStep();
+ }
+ }, 100);
+
+ return index;
+
+ },
+
+ /*
+ * removes item at index position, cleans it up and returns it
+ */
+ rmItem: function(index) {
+ if (index == "undefined") index = this._activeItem.index;
+ index = this._getIndexByKeyWord(index);
+ if (!this.items[index]) return null;
+
+ var item = this.items[index];
+
+ if (item.pre) item.pre.next = item.next;
+ if (item.next) item.next.pre = item.pre;
+ this.items.splice(index,1);
+
+ /* adjust item indices */
+ for (var i = index ; i < this.items.length; i++) {
+ this.items[i].setIndex(i);
+ }
+ this._setLastIndex();
+
+ /* adjust targetItem, currentPos and activeItem so that current view does not change*/
+ if (Math.round(this._getPositionByIndex(index)) < Math.round(this._targetPosition)) {
+ this._targetPosition--;
+ if (!this.conf.circularFlow)
+ this._targetPosition = this._checkIndex(this._targetPosition);
+ }
+ if (this._getPositionByIndex(index) < this._currentPosition) {
+ this._currentPosition--;
+ if (!this.conf.circularFlow)
+ this._currentPosition = this._checkIndex(this._currentPosition);
+ }
+ this._activeItem = this._getItemByPosition(this._currentPosition);
+
+ /* remove item from DOM tree, take the next step and return removed item */
+ var removedItem = item.element.parentNode.removeChild(item.element);
+ // avoid display errors (wrong sizing)
+ var CF = this;
+ window.setTimeout(function () { CF._initStep() }, 10);
+ return removedItem;
+
+ },
+
+
+ /*
+ * ==================== initialization ====================
+ */
+
+
+ /* -------------------- main init -------------------- */
+ _init: function () {
+
+ if (typeof(this.Container) == 'string') { // no node
+ var container = document.getElementById(this.Container);
+ if (container) {
+ this.Container = container;
+ } else {
+ throw ('ContentFlow ERROR: No element with id \''+this.Container+'\' found!');
+ return;
+ }
+ }
+
+ /* ---------- reserve CSS namespace */
+
+ $CF(this.Container).addClassName('ContentFlow');
+
+ /* ---------- detect GUI elements */
+ var flow = $CF(this.Container).getChildrenByClassName('flow')[0];
+ if (!flow) {
+ throw ('ContentFlow ERROR: No element with class\'flow\' found!');
+ return;
+ }
+ this.Flow = new ContentFlowGUIElement(this, flow);
+
+ var scrollbar = this.Container.getChildrenByClassName('scrollbar')[0];
+ if (scrollbar) {
+ this.Scrollbar = new ContentFlowGUIElement(this, scrollbar);
+ var slider = this.Scrollbar.getChildrenByClassName('slider')[0];
+ if (slider) {
+ this.Slider = new ContentFlowGUIElement(this, slider);
+ var position = this.Slider.getChildrenByClassName('position')[0];
+ if (position) {
+ this.Position = new ContentFlowGUIElement(this, position);
+ }
+ }
+
+ }
+
+ /* ---------- init configuration */
+ this.setConfig(this._defaultConf);
+ this._initAddOns(); /* init AddOns */
+ this.setConfig(this._userConf);
+
+ this._initSizes(); // ......
+
+
+ /* ---------- init item lists ---------- */
+ var items = this.Flow.getChildrenByClassName('item');
+
+ this.items = new Array();
+ for (var i=0; i<items.length; i++) {
+ var item = this.items[i] = new ContentFlowItem(this, items[i], i);
+ if (i > 0) {
+ item.pre = this.items[i-1];
+ item.pre.next = item;
+ }
+ }
+ this._setLastIndex();
+ if (this.conf.circularFlow && this.items.length > 0) {
+ var s = this.items[0];
+ s.pre = this.items[this.items.length-1];
+ s.pre.next = s;
+ }
+
+ /* ---------- init GUI */
+ this._initGUI();
+
+ /* ---------- init start parameters ---------- */
+ if (this._activeElement != "content")
+ this._activeElement = "element";
+
+ this.conf.origVisibleItems = this.conf.visibleItems;
+ if (this.conf.visibleItems < 0) {
+ this.conf.visibleItems = Math.round(Math.sqrt(this.items.length));
+ }
+ this.conf.visibleItems = Math.min(this.conf.visibleItems, this.items.length - 1);
+
+ this._targetPosition = this._getIndexByKeyWord(this.conf.startItem, 0);
+
+ var index = this._getIndexByKeyWord(this.conf.scrollInFrom, this._targetPosition);
+ switch (this.conf.scrollInFrom) {
+ case "next":
+ case "right":
+ index -= 0.5;
+ break;
+ case "pre":
+ case "previous":
+ case "left":
+ index += 0.5;
+ break;
+ }
+ this._currentPosition = index;
+
+
+ /* ---------- wait till all images are loaded or
+ * grace time is up to show all and take the first step
+ */
+ var now = new Date();
+ var cf = this;
+ var timer = window.setInterval (
+ function() {
+ if ( cf._imagesToLoad == 0 || new Date() - now > cf._loadingTimeout ) {
+ clearInterval(timer);
+
+ cf._activeItem = cf.getItem(cf._currentPosition);
+ if (cf._activeItem) {
+ cf._activeItem.makeActive();
+ cf._setCaptionLabel(cf._activeItem.index);
+ }
+
+ cf.Flow.style.visibility = "visible"; // show flow after images are loaded
+ if (cf.loadIndicator) cf.loadIndicator.style.display = "none";
+ if (cf.Scrollbar) cf.Scrollbar.style.visibility = "visible";
+
+ cf.resize();
+ for (var i=0; i < cf._loadedAddOns.length; i++) {
+ var a = ContentFlowGlobal.AddOns[cf._loadedAddOns[i]];
+ if (a.methods.afterContentFlowInit)
+ a.methods.afterContentFlowInit(cf);
+ }
+ cf.conf.onInit();
+ }
+ }, 10
+ );
+
+ this.isInit = true;
+
+ },
+
+ /* ---------- init AddOns ---------- */
+ _initAddOns: function () {
+
+ // get an array of names of all AddOns that should be used
+ var loadAddOns = [];
+ if (this._userConf.useAddOns) {
+ if (typeof this._userConf.useAddOns == "string") {
+ loadAddOns = this._userConf.useAddOns.split(" ");
+ }
+ else if (typeof this._userConf.useAddOns == "array") {
+ loadAddOns = this._userConf.useAddOns;
+ }
+ }
+ else if (this.Container.getAttribute("useAddOns")) {
+ loadAddOns = this.Container.getAttribute("useAddOns").split(" ");
+ }
+ else {
+ loadAddOns = this.conf.useAddOns.split(' ');
+ }
+
+
+ // check the names for keywords
+ for (var i=0; i<loadAddOns.length; i++) {
+ if (loadAddOns[i] == "none") {
+ loadAddOns = new Array();
+ break;
+ }
+ else if (loadAddOns[i] == "all") {
+ loadAddOns = new Array();
+ for (var AddOn in ContentFlowGlobal.AddOns)
+ loadAddOns.push(AddOn);
+ break;
+ }
+ }
+
+ // init all AddOns that should be used and exist
+ for (var i=0; i<loadAddOns.length; i++) {
+ var AddOn = ContentFlowGlobal.AddOns[loadAddOns[i]];
+ if (AddOn) {
+ this._loadedAddOns.push(loadAddOns[i]);
+ AddOn._init(this);
+ this.Container.addClassName('ContentFlowAddOn_'+AddOn.name);
+ if (AddOn.methods.onloadInit)
+ AddOn.methods.onloadInit(this);
+ }
+ }
+
+ },
+
+
+ _initGUI: function () {
+
+ // resize
+ //if (!this.Browser.iPhone) {
+ var resize = this.resize.bind(this);
+ window.addEvent('resize', resize, false);
+ //}
+ //else {
+ //var g = this;
+ //window.addEvent('resize', function () {
+ //g._initSizes();
+ //g._initStep();
+ //} , false);
+ //}
+
+ // pre and next buttons
+ var divs = this.Container.getElementsByTagName('div');
+ for (var i = 0; i < divs.length; i++) {
+ if ($CF(divs[i]).hasClassName('preButton')) {
+ var pre = divs[i];
+ var mt = this.conf.onclickPreButton;
+ pre.addEvent('click', mt, false);
+ }
+ else if (divs[i].hasClassName('nextButton')) {
+ var next = divs[i];
+ var mt = this.conf.onclickNextButton;
+ next.addEvent('click', mt, false);
+ }
+ }
+
+ // Container object
+ // mousewheel
+ if (this.conf.scrollWheelSpeed != 0) {
+ var wheel = this._wheel.bind(this);
+ if(window.addEventListener) this.Container.addEventListener('DOMMouseScroll', wheel, false);
+ this.Container.onmousewheel = wheel;
+ }
+
+ // key strokes
+ var key = this._keyStroke.bind(this);
+ if (this.conf.keys && !this.Browser.iPhone) {
+ if (document.addEventListener) {
+ if (!this.Browser.Opera) {
+ var mouseoverCheck = document.createElement('div');
+ mouseoverCheck.addClassName('mouseoverCheckElement');
+ this.Container.appendChild(mouseoverCheck);
+
+ if (this.Browser.WebKit) {
+ document.body.addEvent('keydown', function (event) {
+ if (mouseoverCheck.offsetLeft > 0) key(event) ;
+ });
+ } else {
+ window.addEvent('keydown', function (event) {
+ if (mouseoverCheck.offsetLeft > 0) key(event) ;
+ });
+ }
+ }
+ else {
+ this.Container.addEvent('keydown', key);
+ }
+ }
+ else {
+ this.Container.onkeydown = key;
+ }
+ }
+
+
+ // Flow object
+ if (this.conf.flowDragFriction > 0) {
+ var onDrag = function (event) {
+ var e = event;
+ if (event.touches) e = event.touches[0];
+ var mouseX = e.clientX;
+ var mouseY = e.clientY;
+
+ if (this.conf.verticalFlow) {
+ var dist = mouseY - this.Flow.mouseY; // px / or px per sec because _dragFlow wil be called in shorter intervalls if draged fast
+ var dim = this.Flow.dimensions.height;
+ }
+ else {
+ var dist = mouseX - this.Flow.mouseX; // px / or px per sec because _dragFlow wil be called in shorter intervalls if draged fast
+ var dim = this.Flow.dimensions.width;
+ }
+ var itemDist = (dist / dim )* (2*this.conf.visibleItems +1); // items
+ var target = this._currentPosition - itemDist * 2*this.conf.visibleItems / this.conf.flowDragFriction ;
+
+ this.Flow.mouseX = mouseX;
+ this.Flow.mouseY = mouseY;
+
+ this.moveToPosition(target, true);
+ }.bind(this);
+
+ var beforeDrag = function () {};
+
+ var afterDrag = function (event) {
+ var t = Math.round(this._targetPosition);
+ if (Math.abs( t - this._currentPosition) > 0.001 )
+ this.moveToPosition(t);
+ }.bind(this);
+
+
+ this.Flow.makeDraggable(onDrag, beforeDrag, afterDrag);
+ }
+
+ // Scrollbar Object
+ if (this.Scrollbar) {
+ var click = function(event) {
+ if (!event) var event = window.event;
+
+ if (!this.Scrollbar.clickLocked) {
+ var mouseX = event.clientX;
+ var positionOnScrollbar = mouseX - this.Scrollbar.position.left;
+ var targetIndex = Math.round(positionOnScrollbar/this.Scrollbar.dimensions.width * this.itemsLastIndex);
+ this.moveToIndex(targetIndex);
+ }
+ else
+ this.Scrollbar.clickLocked = false;
+ }.bind(this);
+ this.Scrollbar.addObserver('click', click);
+ }
+
+ // Slider Object
+ if (this.Slider) {
+
+ if (this.Browser.IE6) {
+ var virtualSlider = document.createElement('div');
+ virtualSlider.className = 'virtualSlider';
+ this.Slider.appendChild(virtualSlider);
+ }
+
+ // position slider on scrollbar
+ this.Slider.setPosition = function (relPos) {
+ relPos = relPos - Math.floor(relPos) + this._getIndexByPosition(Math.floor(relPos));
+ if (Math.round(relPos) < 0)
+ relPos = this.itemsLastIndex;
+ else if (relPos <= 0)
+ relPos = 0;
+ else if (Math.round(relPos) > this.itemsLastIndex)
+ relPos = 0;
+ else if (relPos >= this.itemsLastIndex)
+ relPos = this.itemsLastIndex;
+
+
+ if (this.items.length > 1) {
+ var sPos = (relPos / this.itemsLastIndex)* this.Scrollbar.dimensions.width;
+ } else {
+ var sPos = 0.5 * this.Scrollbar.dimensions.width;
+ }
+ this.Slider.style.left = sPos - this.Slider.center.x+ "px";
+ this.Slider.style.top = this.Scrollbar.center.y - this.Slider.center.y +"px";
+
+ }.bind(this);
+
+ // make slider draggable
+ var beforeDrag = function (event) {
+ this.Scrollbar.clickLocked = true;
+ }.bind(this);
+
+ var onDrag = function (event) {
+ var e = event;
+ if (event.touches) e = event.touches[0];
+ var selectedIndex = this._checkIndex((e.clientX - this.Scrollbar.position.left) / this.Scrollbar.dimensions.width * this.itemsLastIndex);
+ this._targetPosition = this._getPositionByIndex(selectedIndex);
+ this.Slider.setPosition(selectedIndex);
+ if (this.Position) this.Position.setLabel(selectedIndex);
+ this._initStep(true, true);
+ }.bind(this);
+
+ var afterDrag = function (event) {
+ this._targetPosition = Math.round(this._targetPosition);
+ this.conf.onMoveTo(this._getItemByPosition(this._targetPosition));
+ this._initStep(true);
+ }.bind(this);
+
+ this.Slider.makeDraggable(onDrag, beforeDrag, afterDrag);
+ }
+
+
+ // Position object
+ if (this.Position) {
+ this.Position.setLabel = function (index) {
+ index = this._checkIndex(Math.round(index));
+ if (this.items && this.items[index].label)
+ this.Position.innerHTML = this.items[index].label.innerHTML;
+ else
+ this.Position.innerHTML = index + 1;
+ }.bind(this);
+ }
+
+
+ this.globalCaption = this.Container.getChildrenByClassName('globalCaption')[0];
+ this.loadIndicator = this.Container.getChildrenByClassName('loadIndicator')[0];
+ },
+
+ /* ---------- init element sizes ---------- */
+ _initSizes: function (x) {
+ //if (this.Browser.Konqueror4 && x != true) {
+ //var t = this;
+ //window.setTimeout( function () { t._initSizes(true) }, 0);
+ //return;
+ //}
+
+ // sets this.maxHeight
+ this._initMaxHeight();
+
+ var scrollbarHeight = this._initScrollbarSize();
+
+ // reduce maxHeit if container has a fixed height
+ if (!this.conf.verticalFlow && this.Container.style.height && this.Container.style.height != "auto")
+ this.maxHeight -= scrollbarHeight;
+
+ if (!this._activeItem) return;
+
+ var mFS = this._findBiggestItem();
+
+ var pF = this.Flow.findPos();
+
+ /* set height / width of flow */
+ if (this.conf.verticalFlow) {
+ this.Flow.style.width = mFS.width.width+"px";
+ this.Flow.style.height =3* mFS.width.width * (1 + this.conf.reflectionHeight + this.conf.reflectionGap) + "px";
+ } else {
+ this.Flow.style.height = mFS.height.height +(mFS.height.top - pF.top)+"px";
+ }
+
+ /* remove gap */
+ var s = this.conf.verticalFlow ? mFS.width.width : mFS.height.height;
+ var cH = s /(1 + this.conf.reflectionHeight + this.conf.reflectionGap);
+ this.Flow.style.marginBottom = - (s - cH)+ "px";
+
+ this.Flow.dimensions = this.Flow.getDimensions();
+
+ if (!this.Browser.IE6) {
+ if (this.conf.verticalFlow && this.Container.clientWidth < this.Flow.dimensions.width) {
+ //this.Container.style.width = this.Flow.dimensions.width+"px";
+ }
+ else if (this.Container.clientHeight < this.Flow.dimensions.height) {
+ this.Container.style.height = this.Flow.dimensions.height+"px";
+ }
+ }
+
+ if (this.conf.verticalFlow) {
+ this.Flow.center = {x: this.Flow.dimensions.height/2, y:mFS.width.width/2};
+ } else {
+ this.Flow.center = {x: this.Flow.dimensions.width/2, y:mFS.height.height/2};
+ }
+
+ },
+
+ /* -------------------------------------------------------------------------------- */
+
+ _initScrollbarSize: function () {
+ var SB;
+ var SL;
+ var PO;
+ if (SB = this.Scrollbar) {
+ SB.setDimensions();
+ var scrollbarHeight = SB.dimensions.height;
+
+ if (SL = this.Slider) {
+ SL.setDimensions();
+ scrollbarHeight += SL.dimensions.height;
+
+ if (PO = this.Position) {
+
+ var oldLabel = PO.innerHTML;
+ var maxH = maxW = 0;
+ PO.style.width = "auto";
+
+ if (this.items) {
+ for (var i=0; i < this.items.length; i++) {
+ var item = this.items[i];
+ if (item.label) {
+ PO.innerHTML = item.label.innerHTML;
+ }
+ else {
+ PO.innerHTML = item.index;
+ }
+ var h = PO.clientHeight;
+ var w = PO.clientWidth;
+ if ( h > maxH) maxH = h;
+ if ( w > maxW) maxW = w;
+ }
+ }
+ else {
+ PO.innerHTML = "&nbsp;";
+ maxH = PO.clientHeight;
+ maxW = PO.clientWidth;
+ }
+
+ PO.innerHTML = oldLabel;
+
+ PO.setDimensions();
+
+ PO.style.width = maxW +"px";
+ PO.style.left = (SL.dimensions.width - maxW)/2 + "px";
+
+ var extraSpace = PO.position.top - SL.position.top;
+ if (extraSpace > 0) {
+ extraSpace += -SB.dimensions.height + maxH;
+ SB.style.marginBottom = extraSpace + "px";
+ }
+ else {
+ extraSpace *= -1;
+ SB.style.marginTop = extraSpace + "px";
+ }
+ scrollbarHeight += extraSpace;
+ }
+ }
+ }
+ else {
+ scrollbarHeight = 0;
+ }
+
+ return scrollbarHeight;
+
+ },
+
+ /* -------------------------------------------------------------------------------- */
+
+ _initMaxHeight: function () {
+
+ if (this.conf.verticalFlow) {
+ var proportion = screen.width/screen.height;
+ var Csd = this.Container.style.width;
+ var Cdim = this.Container.clientWidth;
+ var Fsd = this.Flow.style.width;
+ var Fdim = this.Flow.clientWidth;
+ var Fdim_o = this.Flow.clientHeight;
+ } else {
+ var proportion = screen.height/screen.width;
+ var Csd = this.Container.style.height;
+ var Cdim = this.Container.clientHeight;
+ var Fsd = this.Flow.style.height;
+ var Fdim = this.Flow.clientHeight;
+ var Fdim_o = this.Flow.clientWidth;
+ }
+
+ // set height of container and flow
+ if (this.ContainerOldDim)
+ Csd = this.ContainerOldDim;
+ if (this.FlowOldDim)
+ Fsd = this.FlowOldDim;
+
+ this.ContainerOldDim = "auto";
+ this.FlowOldDim = "auto";
+
+
+ /* calc maxHeight */
+ if (this.conf.maxItemHeight <= 0) {
+
+ this.maxHeight = Fdim_o / 3 * proportion/1 * this.conf.scaleFactor; // divided by 3 because of left/center/right, yes it's a magic number
+
+ if (this.conf.verticalFlow && (this.maxHeight == 0 || this.maxHeight > Fdim)) {
+ this.maxHeight = Fdim;
+ }
+
+ if (Csd && Csd != "auto") {
+ var gap = this.conf.verticalFlow ? 0 : this.conf.reflectionGap;
+ var rH = this.conf.verticalFlow ? 0 : this.conf.reflectionHeight;
+ this.maxHeight = Cdim/ (this.conf.scaleFactor* (1 + rH + gap));
+ this.ContainerOldDim = Csd;
+ }
+ else if (Fsd && Fsd != "auto") {
+ var gap = this.conf.verticalFlow ? 0 : this.conf.reflectionGap;
+ this.maxHeight = Fdim / (this.conf.scaleFactor* (1 + this.conf.reflectionHeight + gap));
+ this.FlowOldDim = Fsd;
+ }
+ }
+ else {
+ this.maxHeight = this.conf.maxItemHeight;
+ }
+ },
+
+ /* -------------------------------------------------------------------------------- */
+
+ _findBiggestItem: function () {
+
+ var currentItem = this._activeItem;
+
+ var itemP = currentItem.pre;
+ var itemN = currentItem.next;
+ var mFS = maxFlowSize = {
+ width: { width: 0, left: 0, height:0, top: 0, item: null, rI: 0 },
+ height: { width: 0, left: 0, height:0, top: 0, item: null, rI: 0 }
+ }
+
+
+ var checkMax = function (item, rI) {
+ var el = item.element;
+ el.style.display = "block";
+ var p = el.findPos();
+ var h = el.clientHeight;
+ var w = el.clientWidth;
+ if (h + p.top >= mFS.height.height + mFS.height.top) {
+ mFS.height.height = h;
+ mFS.height.top = p.top;
+ mFS.height.item = item;
+ mFS.height.rI = rI;
+ }
+ if (w + p.left >= mFS.width.width + mFS.width.left) {
+ mFS.width.width = w;
+ mFS.width.left = p.left;
+ mFS.width.item = item;
+ mFS.width.rI = rI;
+ }
+ el.style.display = "none";
+ }
+
+ var ocp = this._currentPosition;
+ this._currentPosition = this.conf.visibleItems+1;
+
+ // find the position with highest y-value
+ for (var i=-this.conf.visibleItems; i <= this.conf.visibleItems; i++) {
+ currentItem.element.style.display = "none";
+ this._positionItem(currentItem, i);
+ checkMax(currentItem, i);
+ }
+
+ // find the biggest item
+ var index = mFS.height.rI;
+ for (var i=0; i < this.items.length; i++) {
+ var item = this.items[i];
+ item.element.style.display = "none";
+ this._positionItem(item, index);
+ checkMax(item, index);
+ }
+
+ this._currentPosition = ocp;
+
+ return mFS
+ },
+
+
+
+ /*
+ * ==================== Key strok ====================
+ */
+
+ /*
+ * handles keystroke events
+ */
+ _keyStroke: function(event) {
+ if(!event) var event = window.event;
+
+ if (event.which) {
+ var keyCode = event.which;
+ } else if (event.keyCode) {
+ var keyCode = event.keyCode;
+ }
+
+ if (this.conf.keys[keyCode]) {
+ this.conf.keys[keyCode].bind(this)();
+ return Event.stop(event);
+ }
+ else {
+ return true;
+ }
+ },
+
+ /*
+ * ==================== mouse wheel ====================
+ * Event handler for mouse wheel event
+ * http://adomas.org/javascript-mouse-wheel/
+ */
+
+ _wheel: function (event) {
+ if (!event) var event = window.event; // MS
+
+ var delta = 0;
+ if (event.wheelDelta) {
+ delta = event.wheelDelta/120;
+ } else if (event.detail) {
+ delta = -event.detail/3;
+ }
+
+ if (delta) {
+ var target = this._targetPosition ;
+ if (delta < 0 ) {
+ target += (1 * this.conf.scrollWheelSpeed);
+ } else {
+ target -= (1 * this.conf.scrollWheelSpeed);
+ }
+ this.moveToPosition(Math.round(target));
+ }
+
+ return Event.stop(event);
+ },
+
+
+ /*
+ * ==================== set global Caption ====================
+ */
+ _setGlobalCaption: function () {
+ if (this.globalCaption) {
+ this.globalCaption.innerHTML = '';
+ if(this._activeItem && this._activeItem.caption)
+ this.globalCaption.appendChild(this._activeItem.caption.cloneNode(true));
+ }
+ },
+
+ /*
+ * ==================== move items ====================
+ */
+
+ /*
+ * intend to make a step
+ */
+ _initStep: function (holdSlider, holdPos) {
+ if (this.Slider) {
+ if(holdSlider) {
+ this.Slider.locked = true;
+ } else {
+ this.Slider.locked = false;
+ }
+ }
+ this._holdPos = holdPos == true ? true : false;
+ if (!this._stepLock) {
+ this._stepLock = true;
+ this._step();
+ }
+ },
+
+ /*
+ * make a step
+ */
+ _step: function () {
+
+ var diff = this._targetPosition - this._currentPosition;
+ var absDiff = Math.abs(diff);
+ if ( absDiff > 0.001) { // till activeItem is nearly at position 0
+
+ this._currentPosition += this.conf.flowSpeedFactor * this.conf.calcStepWidth(diff, absDiff, this.items.length, this.conf.visibleItems);
+
+ var AI = this.items[(this._getIndexByPosition(this._currentPosition))];
+
+ if (AI && AI != this._activeItem) {
+ if (this._activeItem) this._activeItem.makeInactive();
+ this._activeItem = AI;
+ this._activeItem.makeActive();
+ this._setCaptionLabel(this._activeItem.index);
+ if (Math.abs(this._targetPosition - this._currentPosition) <= 0.5 ) this.conf.onReachTarget(this._activeItem);
+ }
+
+ this._positionItems();
+
+ var st = this._step.bind(this);
+ window.setTimeout(st,this._millisecondsPerStep);
+
+ } else if (!this._holdPos) {
+ if (this.Slider) this.Slider.locked = false;
+ this._currentPosition = Math.round(this._currentPosition);
+ if(this.Position && !this.Slider.locked && this._activeItem) {
+ this._setCaptionLabel(this._activeItem.index);
+ }
+ this._positionItems();
+ this._stepLock = false;
+ } else {
+ this._stepLock = false;
+ }
+
+ if (this.Slider && !this.Slider.locked) {
+ this.Slider.setPosition(this._currentPosition);
+ }
+ },
+
+
+
+/* ------------------------------------------------------------------------------------------------------ */
+
+ /*
+ * position items
+ */
+ _positionItems: function () {
+
+ if (this._lastStart) {
+ var item = this._lastStart;
+ while (item) {
+ item.element.style.display="none";
+ item = item.next;
+ if (item == this._lastStart) break;
+ if (item && item.pre == this._lastEnd) break;
+ }
+ }
+ else {
+ this._lastStart = this._activeItem;
+ }
+
+ if (!this._activeItem) return;
+ var currentItem = this._activeItem;
+ var itemP = currentItem.pre;
+ var itemN = currentItem.next;
+
+ this._positionItem(currentItem, 0);
+ for (var i=1; i <= this.conf.visibleItems && 2*i < this.items.length ; i++) {
+ if (itemP) {
+ this._positionItem(itemP, -i);
+ this._lastStart = itemP;
+ itemP = itemP.pre;
+ }
+ if (itemN) {
+ this._positionItem(itemN, i);
+ this._lastEnd = itemN;
+ itemN = itemN.next;
+ }
+ }
+
+ },
+
+ _positionItem: function (item, relativeIndex) {
+
+ var conf = this.conf;
+ var vF = conf.verticalFlow;
+
+ var els = item.element.style;
+ //els.display =" none";
+ //if (els.display != "none") return;
+
+ /* Index and position relative to activeItem */
+ var p = item.position = this._currentPosition + relativeIndex;
+ var relativePosition = item.relativePosition = Math.round(p) - this._currentPosition;
+ var relativePositionNormed = item.relativePositionNormed = conf.visibleItems > 0 ? relativePosition/conf.visibleItems : 0;
+ var side = relativePosition < 0 ? -1 : 1;
+ side *= relativePosition == 0 ? 0 : 1;
+ item.side = side;
+
+ var size = conf.calcSize(item);
+ size.height = Math.max(size.height, 0);
+ size.width = Math.max(size.width, 0);
+ if (item.content.origProportion) size = this._scaleImageSize(item, size);
+ item.size = size;
+
+ var coords = item.coordinates = conf.calcCoordinates (item);
+ var relItemPos = item.relativeItemPosition = conf.calcRelativeItemPosition(item);
+ var zIndex = item.zIndex = conf.calcZIndex (item);
+ var fontSize = item.fontSize = conf.calcFontSize (item);
+ var opacity = item.opacity = conf.calcOpacity(item);
+
+ size.height *= this.maxHeight;
+ size.width *= this.maxHeight;
+
+ /* set position */
+ var sA = vF ? size.height : size.width;
+ var sB = vF ? size.width : size.height;
+ var pX = this.Flow.center.x * ( 1 + coords.x ) + (relItemPos.x - 1) * sA/2;
+ var pY = this.maxHeight/2 * ( 1 + coords.y ) + (relItemPos.y - 1 )* sB/2;
+ els.left = (vF ? pY : pX)+"px";
+ els.top = (vF ? pX : pY)+"px";
+
+ this._setItemSize(item, size);
+
+ /* set opacity */
+ if (conf.endOpacity != 1) {
+ this._setItemOpacity(item);
+ }
+
+ /* set font size */
+ if (!this.Browser.IE) els.fontSize = (fontSize * 100) +"%";
+
+ /* set z-index */
+ els.zIndex = 32768 + Math.round(zIndex * this.items.length); // just for FF
+
+ conf.onDrawItem(item);
+
+ els.visibility = "visible";
+ els.display = "block";
+ },
+
+ _scaleImageSize: function (item, size, max) {
+ var sFL = this.conf.scaleFactorLandscape;
+ var sFP = this.conf.scaleFactorPortrait;
+ var vF = this.conf.verticalFlow;
+ var prop = item.content.origProportion;
+ var width = size.width;
+ var height = size.height;
+ var c = item.content;
+
+ if (vF) {
+ if (prop <= 1) {
+ if (sFL != "max" && sFL != 1) {
+ height *= sFL;
+ width = Math.min(height * prop, max ? max : 1 );
+ }
+ height = width / prop;
+ }
+ else if (prop > 1) {
+ if (sFP == "max") {
+ height = max ? max : 1;
+ }
+ else if (sFP != 1) {
+ width *= sFP;
+ height = Math.min(width/prop, max ? max : 1)
+ }
+ else {
+ height = width / prop;
+ }
+ width = height * prop;
+ }
+ }
+ else {
+ if (prop > 1) {
+ if (sFL != "max" && sFL != 1) {
+ width *= sFL;
+ height = Math.min(width / prop, max ? max : 1);
+ }
+ width = height * prop;
+ }
+ else if (prop <= 1) {
+ if (sFP == "max") {
+ width = max ? max : 1;
+ }
+ else if (sFP != 1) {
+ height *= sFP;
+ width = Math.min(height*prop, max ? max : 1);
+ }
+ else {
+ width = height * prop;
+ }
+ height = width / prop;
+ }
+ }
+
+ height = isNaN(height) ? 0 : height;
+ width = isNaN(width) ? 0 : width;
+
+ if (!max && this.conf.fixItemSize) {
+
+ var propS = size.width / size.height;
+
+ var max = Math.max(size.width, size.height);
+ var s = this._scaleImageSize(item, {width: max, height: max}, max);
+
+ if (propS < 1) {
+ height = s.height/size.height;
+ width = height * prop / propS;
+ }
+ else {
+ width = s.width/size.width;
+ height = width / prop * propS;
+ }
+
+ var h = height * 100;
+ var w = width * 100;
+ var mL= (1 - width)/2 * 100;
+ var mT= ( 1 - height ) / propS * 100 * (vF ? 0.5 : 1 );
+ c.style.height = h+"%";
+ if (item.reflection) item.reflection.style.height = h*this.conf.reflectionHeight+"%";
+ c.style.width = w+"%";
+ if (item.reflection) item.reflection.style.width = w+"%";
+ c.style.marginLeft = mL+"%";
+ if (item.reflection) item.reflection.style.marginLeft = mL+"%";
+ c.style.marginTop = mT+"%";
+
+ item.element.style.overflow = "hidden";
+
+ return size;
+ }
+ else {
+ return {width: width, height: height};
+ }
+
+ },
+
+ _setItemSize: (function () {
+ if (ContentFlowGlobal.Browser.IE) {
+ var _setItemSize = function (item, size) {
+ if (!this.conf.fixItemSize) {
+ item.content.style.height = size.height+"px";
+ }
+ else if (ContentFlowGlobal.Browser.IE6) {
+ var h = parseInt(item.content.style.height)/100;
+ item.content.style.height = size.height*h+"px";
+ var mT = parseInt(item.content.style.marginTop)/100;
+ item.content.style.marginTop = size.height*mT+"px";
+ }
+ if (item.reflection) {
+ var h = parseInt(item.content.style.height);
+ item.reflection.style.height = h*this.conf.reflectionHeight+"px";
+ item.reflection.style.marginTop = h * this.conf.reflectionGap + "px";
+ }
+ item.element.style.width = size.width +"px";
+ item.element.style.height = size.height*(1+this.conf.reflectionHeight+this.conf.reflectionGap)+"px";
+ }
+ }
+ else {
+ var _setItemSize = function (item, size) {
+ if (item.reflection) {
+ item.element.style.height = size.height*(1+this.conf.reflectionHeight + this.conf.reflectionGap) +"px";
+ item.reflection.style.marginTop = size.height * this.conf.reflectionGap + "px";
+ }
+ else if (this._reflectionWithinImage) {
+ item.element.style.height = size.height*(1+this.conf.reflectionHeight + this.conf.reflectionGap) +"px";
+ }
+ else {
+ item.element.style.height = size.height +"px";
+ }
+ item.element.style.width = size.width +"px";
+ }
+ }
+ return _setItemSize;
+
+ })(),
+
+ _setItemOpacity: (function () {
+ if (ContentFlowGlobal.Browser.IE6) {
+ var _setItemOpacity = function (item) {
+ if (item.content.origSrc && item.content.origSrc.match(/\.png$/) ) {
+ var s = item.content.src;
+ item.content.src = item.content.origSrc;
+ item.content.style.filter = item.content.filterString+" progid:DXImageTransform.Microsoft.BasicImage(opacity="+item.opacity+")";
+ item.content.src = s;
+ }
+ else {
+ item.content.style.filter = "progid:DXImageTransform.Microsoft.BasicImage(opacity="+item.opacity+")";
+ }
+ if (item.reflection) item.reflection.style.filter = item.reflection.filterString+"progid:DXImageTransform.Microsoft.BasicImage(opacity="+item.opacity+")";
+ }
+ }
+ else if (ContentFlowGlobal.Browser.IE) {
+ var _setItemOpacity = function (item) { item.element.style.filter = "progid:DXImageTransform.Microsoft.BasicImage(opacity="+item.opacity+")"; }
+ }
+ else {
+ var _setItemOpacity = function (item) { item.element.style.opacity = item.opacity; }
+ }
+ return _setItemOpacity;
+ })()
+
+
+};
+
+
+/* ==================== extendig javascript/DOM objects ==================== */
+
+/*
+ * adds bind method to Function class
+ * http://www.digital-web.com/articles/scope_in_javascript/
+ */
+
+if (!Function.bind) {
+ Function.prototype.bind = function(obj) {
+ var method = this;
+ return function () {
+ return method.apply(obj, arguments);
+ };
+ };
+}
+
+
+/*
+ * extending Math object
+ */
+if (!Math.erf2) {
+ // error function (http://en.wikipedia.org/wiki/Error_function), implemented as erf(x)^2
+ Math.erf2 = function (x) {
+ var a = - (8*(Math.PI -3)/(3*Math.PI*(Math.PI -4)));
+ var x2 = x*x;
+ var f = 1 - Math.pow(Math.E, -x2 * (4/Math.PI + a*x2)/(1+a*x2));
+ return f;
+ };
+}
+
+if (!Math._2PI05) {
+ Math._2PI05 = Math.sqrt(2*Math.PI);
+}
+
+if (!Math.normDist) {
+ // normal distribution
+ Math.normDist = function (x, sig, mu) {
+ if (!sig) var sig = 1;
+ if (!mu) var mu = 0;
+ if (!x) var x = - mu;
+ return 1/(sig * Math._2PI05) * Math.pow(Math.E, - (x-mu)*(x-mu)/(2*sig*sig) );
+ };
+}
+
+if (!Math.normedNormDist) {
+ Math.normedNormDist = function (x, sig, mu) {
+ return this.normDist(x, sig, mu)/this.normDist(mu, sig, mu);
+ };
+}
+
+if (!Math.exp) {
+ Math.exp = function(x) {
+ return Math.pow(Math.E, x);
+ };
+}
+
+if (!Math.ln) {
+ Math.ln = Math.log;
+}
+
+if (!Math.log2) {
+ Math.log2 = function (x) {
+ return Math.log(x)/Math.LN2;
+ };
+}
+
+if (!Math.log10) {
+ Math.log10 = function (x) {
+ return Math.log(x)/Math.LN10;
+ };
+}
+
+if (!Math.logerithm) {
+ Math.logerithm = function (x, b) {
+ if (!b || b == Math.E)
+ return Math.log(x);
+ else if (b == 2)
+ return Math.log2(x);
+ else if (b == 10)
+ return Math.log10(x);
+ else
+ return Math.log(x)/Math.log(b);
+ };
+}
+
+
+/*
+ * extending Event object
+ */
+if (!Event) var Event = {};
+
+if (!Event.stop) {
+ Event.stop = function (event) {
+ event.cancelBubble = true;
+ if (event.preventDefault) event.preventDefault();
+ if (event.stopPropagation) event.stopPropagation();
+ return false;
+ };
+}
+
+/*
+ * extending Element object
+ */
+if (document.all && !window.opera) {
+ window.$CF = function (el) {
+ if (typeof el == "string") {
+ return window.$CF(document.getElementById(el));
+ }
+ else {
+ if (CFElement.prototype.extend && el && !el.extend) CFElement.prototype.extend(el);
+ }
+ return el;
+ };
+} else {
+ window.$CF = function (el) {
+ return el;
+ };
+}
+
+if (!window.HTMLElement) {
+ CFElement = {};
+ CFElement.prototype = {};
+ CFElement.prototype.extend = function (el) {
+ for (var method in this) {
+ if (!el[method]) el[method] = this[method];
+ }
+ };
+}
+else {
+ CFElement = window.HTMLElement;
+}
+
+
+/*
+ * Thanks to Peter-Paul Koch
+ * http://www.quirksmode.org/js/findpos.html
+ */
+if (!CFElement.findPos) {
+ CFElement.prototype.findPos = function() {
+ var obj = this;
+ var curleft = curtop = 0;
+ try {
+ if (obj.offsetParent) {
+ curleft = obj.offsetLeft;
+ curtop = obj.offsetTop;
+ while (obj = obj.offsetParent) {
+ curleft += obj.offsetLeft;
+ curtop += obj.offsetTop;
+ }
+ }
+ }
+ catch (ex) {}
+ return {left:curleft, top:curtop};
+ };
+}
+
+if (!CFElement.getDimensions) {
+ CFElement.prototype.getDimensions = function() {
+ return {width: this.clientWidth, height: this.clientHeight};
+ };
+}
+
+/*
+ * checks if an element has the class className
+ */
+if (!CFElement.hasClassName) {
+ CFElement.prototype.hasClassName = function(className) {
+ return (new RegExp('\\b'+className+'\\b').test(this.className));
+ };
+}
+
+/*
+ * adds the class className to the element
+ */
+if (!CFElement.addClassName) {
+ CFElement.prototype.addClassName = function(className) {
+ if(!this.hasClassName(className)) {
+ this.className += (this.className ? ' ':'') + className ;
+ }
+ };
+}
+
+/*
+ * removes the class className from the element el
+ */
+if (!CFElement.removeClassName) {
+ CFElement.prototype.removeClassName = function(className) {
+ this.className = this.className.replace(new RegExp('\\b'+className+'\\b'), '').replace(/\s\s/g,' ');
+ };
+}
+
+/*
+ * removes or adds the class className from/to the element el
+ * depending if the element has the class className or not.
+ */
+if (!CFElement.toggleClassName) {
+ CFElement.prototype.toggleClassName = function(className) {
+ if(this.hasClassName(className)) {
+ this.removeClassName(className);
+ } else {
+ this.addClassName(className);
+ }
+ };
+}
+
+/*
+ * returns all children of element el, which have the class className
+ */
+if (!CFElement.getChildrenByClassName) {
+ CFElement.prototype.getChildrenByClassName = function(className) {
+ var children = new Array();
+ for (var i=0; i < this.childNodes.length; i++) {
+ var c = this.childNodes[i];
+ if (c.nodeType == 1 && $CF(c).hasClassName(className)) {
+ children.push(c);
+ }
+ }
+ return children;
+ };
+}
+
+/*
+ * Browser independent event handling method.
+ * adds the eventListener eventName to element el and attaches the function method to it.
+ */
+if (!CFElement.addEvent) {
+ CFElement.prototype.addEvent = function(eventName, method, capture) {
+ if (this.addEventListener)
+ this.addEventListener(eventName, method, capture);
+ else
+ this.attachEvent('on'+eventName, method);
+ };
+}
+
+/*
+ * Browser independent event handling method.
+ * removes the eventListener eventName with the attached function method from element el.
+ */
+if (!CFElement.removeEvent) {
+ CFElement.prototype.removeEvent = function(eventName, method, capture) {
+ if (this.removeEventListener)
+ this.removeEventListener(eventName, method, capture);
+ else
+ this.detachEvent('on'+eventName, method);
+ };
+}
+
+/*
+ * Browser independent event handling method.
+ * adds the eventListener eventName to element el and attaches the function method to it.
+ */
+if (!window.addEvent) {
+ window.addEvent = function(eventName, method, capture) {
+ if (this.addEventListener) {
+ this.addEventListener(eventName, method, capture);
+ } else {
+ if (eventName != 'load' && eventName != 'resize')
+ document.attachEvent('on'+eventName, method);
+ else
+ this.attachEvent('on'+eventName, method);
+ }
+ };
+}
+
+/*
+ * Browser independent event handling method.
+ * removes the eventListener eventName with the attached function method from element el.
+ */
+if (!window.removeEvent) {
+ window.removeEvent = function(eventName, method, capture) {
+ if (this.removeEventListener) {
+ this.removeEventListener(eventName, method, capture);
+ } else {
+ if (eventName != 'load' && eventName != 'resize')
+ document.detachEvent('on'+eventName, method);
+ else
+ this.detachEvent('on'+eventName, method);
+ }
+ };
+}
+
+/* ==================== start it all up ==================== */
+ContentFlowGlobal.init();
+