var flowIDs; var nextPicFunctions = {}; var nextPicManualFunctions = {}; var isWebkit = 'WebkitAppearance' in document.documentElement.style; jQuery(document).ready(function() { flowIDs = getFlowIDs(); flowIDs.every(function(DOM) { return makeFlow(DOM); }); }); function getFlowIDs() { var flowDivs = jQuery('[id^=dflow-]'); return jQuery.map(flowDivs, function(div) { return jQuery("#" + div.id); }); } //+ Jonas Raoni Soares Silva //@ http://jsfromhell.com/array/shuffle [v1.0] function shuffle(o){ //v1.0 for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x); return o; }; function range(start, count) { if(arguments.length == 1) { count = start; start = 0; } var foo = []; for (var i = 0; i < count; i++) { foo.push(start + i); } return foo; } function makeFlow(DOM) { var id = DOM.data("id"); var curr = 0; var prev = 0; var curr_subpic = 0; // Only used when coupling is not active var next_subpic = 0; // Only used when coupling is not active var timer = false; var auto_change = false; var blocked = true; var subpic_blocked = false; var count = DOM.data("pictures"); var counter = 0; var i = 0; // Counter for main pictures var j = 0; // counter for subpics, only used if coupling is disabled var flowtime = DOM.data("flowtime"); var flowtype = DOM.data("flowtype"); var intersectiontime = DOM.data("intersectiontime"); var restart_number = DOM.data("restartnumber"); var changetime = DOM.data("changetime"); var preview = DOM.data("preview"); var switchmode = DOM.data("switchmode"); var scale_to = DOM.data("scaleto"); var height = DOM.data("height"); var width = DOM.data("width"); var subpic_delay = DOM.data("subpic-delay"); var subpic_flowtime = DOM.data("subpic-flowtime"); var subpic_flowtype = DOM.data("subpic-flowtype"); var subpic_changetime = DOM.data("subpic-changetime"); var random = DOM.data("random"); var coupling = DOM.data("coupling"); var continue_on_manual = DOM.data("continue-on-manual"); var subpic_overlap = false; // @TODO: implement subpic overlapping var unblock_delay = flowtime; if(coupling) { unblock_delay = Math.max(flowtime, subpic_flowtime+subpic_delay); } window.setTimeout(function() {blocked = false;}, unblock_delay); var pictureQueue = range(count); if(random) { pictureQueue = shuffle(pictureQueue); } curr = pictureQueue[0]; subpic_curr = pictureQueue[0]; var nextpicManual = function(direction, target) { window.clearTimeout(timer); if(auto_change && !continue_on_manual) auto_change = false; nextpic(direction,target); } var postTransition = function() { if(isWebkit) { jQuery("#flowdata-"+id+"-"+prev).css("-webkit-transform", "initial"); jQuery("#flowdata-"+id+"-"+curr).css("-webkit-transform", "initial"); } var currentpic = jQuery("#flowdata-"+id+"-"+prev); if(currentpic.data("scrolls")) { currentpic.switchClass("dflow_pic_scrolled", "dflow_pic_scrolls"); } } var nextSubpic = function(direction, target) { if(!subpic_blocked) { subpic_blocked = true; window.setTimeout(function() {subpic_blocked = false;}, subpic_flowtime); if(direction == '-1'){ if(j == 0) j = count - 1; else j--; } else { j = (j+1) % count; } subpic_next = pictureQueue[j]; if(target !== undefined) { subpic_next = target; j = pictureQueue.indexOf(target); } var curr_subpic_exists = jQuery("#subpic-"+id+"-"+subpic_curr).size() == 1; var next_subpic_exists = jQuery("#subpic-"+id+"-"+subpic_next).size() == 1; var local_subpic_changetime = jQuery("#subpic-"+id+"-"+subpic_next).data("changetime"); var effective_subpic_changetime = local_subpic_changetime > 0 ? local_subpic_changetime : subpic_changetime; if(curr_subpic_exists) { var direction_out = jQuery("#subpic-"+id+"-"+subpic_curr).data("direction-out"); var curr_subpic_flowtype = jQuery("#subpic-"+id+"-"+subpic_curr).data("flowtype"); } if(next_subpic_exists) { var direction_in = jQuery("#subpic-"+id+"-"+subpic_next).data("direction-in"); var next_subpic_flowtype = jQuery("#subpic-"+id+"-"+subpic_next).data("flowtype"); } if(!curr_subpic_exists && !next_subpic_exists) { window.setTimeout(function() { nextSubpic(1); }, 2 * subpic_flowtime + effective_subpic_changetime); } else if(curr_subpic_exists) { if(!subpic_overlap) { // First hide the current subpic jQuery("#subpic-"+id+"-"+subpic_curr).hide((curr_subpic_flowtype || subpic_flowtype || "drop"), {direction:(direction_out||'right')}, subpic_flowtime, // check whether next subpic exists (next_subpic_exists ? function() { // show next subpic jQuery("#subpic-"+id+"-"+subpic_next).show((next_subpic_flowtype || subpic_flowtype || "drop"), {direction:(direction_in || 'left')}, subpic_flowtime, function() { // register next picture change timeout window.setTimeout(function() { nextSubpic(1); }, effective_subpic_changetime); }); } : // subpic doesn't exist, just wait and show nothing function() { // register next picture change timeout window.setTimeout(function() { nextSubpic(1); }, subpic_flowtime + effective_subpic_changetime); } ) ); } else { // @TODO } } else { window.setTimeout(function() { // show next subpic jQuery("#subpic-"+id+"-"+subpic_next).show((next_subpic_flowtype || subpic_flowtype || "drop"), {direction:(direction_in || 'left')}, subpic_flowtime, function() { // register next picture change timeout window.setTimeout(function() { nextSubpic(1); }, effective_subpic_changetime); }); }, subpic_flowtime); } subpic_curr = subpic_next; } } var nextpic = function(direction, target) { if(!blocked) { blocked = true; var unblock_delay = flowtime; if(coupling) { unblock_delay = Math.max(flowtime, subpic_flowtime+subpic_delay); } window.setTimeout(function() {blocked = false;}, unblock_delay); if(direction == '-1'){ if(i == 0) i = count - 1; else i--; } else { i = (i+1) % count; if(i == count-1) counter ++; } next = pictureQueue[i]; if(target !== undefined) { next = target; i = pictureQueue.indexOf(target); } var direction_out = jQuery("#flowdata-"+id+"-"+curr).data("direction-out"); var direction_in = jQuery("#flowdata-"+id+"-"+next).data("direction-in"); // Webkit workaround for puff / zoom effect if(isWebkit && (flowtype == "puff" || flowtype == "slide" || flowtype == "drop" || flowtype == "clip")) { var translation; if(scale_to == "width") { translation = (height - jQuery("#flowdata-"+id+"-"+curr).height()) / 2; jQuery("#flowdata-"+id+"-"+curr).css("top", 0).css("bottom", 0).css("-webkit-transform", "translateY("+translation+"px)"); translation = (height - jQuery("#flowdata-"+id+"-"+next).height()) / 2; jQuery("#flowdata-"+id+"-"+next).css("top", 0).css("bottom", 0).css("-webkit-transform", "translateY("+translation+"px)"); } else { translation = (width - jQuery("#flowdata-"+id+"-"+curr).width()) / 2; jQuery("#flowdata-"+id+"-"+curr).css("left", 0).css("right", 0).css("-webkit-transform", "translateX("+translation+"px)"); translation = (width - jQuery("#flowdata-"+id+"-"+next).height()) / 2; jQuery("#flowdata-"+id+"-"+next).css("left", 0).css("right", 0).css("-webkit-transform", "translateX("+translation+"px)"); } } if(arguments[0] != '-1'){ jQuery("#flowdata-"+id+"-"+curr).hide(flowtype, {direction:(direction_out||'left')},flowtime, postTransition); if(coupling && jQuery("#subpic-"+id+"-"+curr).size() == 1) { var custom_direction = jQuery("#subpic-"+id+"-"+curr).data("direction-out"); var curr_subpic_flowtype = jQuery("#subpic-"+id+"-"+curr).data("flowtype"); jQuery("#subpic-"+id+"-"+curr).hide(curr_subpic_flowtype || subpic_flowtype || "drop", {direction:(custom_direction || 'right')}, subpic_flowtime); } } else { jQuery("#flowdata-"+id+"-"+curr).hide(flowtype, {direction:(direction_out||'right')},flowtime, postTransition); if(coupling && jQuery("#subpic-"+id+"-"+curr).size() == 1) { var custom_direction = jQuery("#subpic-"+id+"-"+curr).data("direction-out"); var curr_subpic_flowtype = jQuery("#subpic-"+id+"-"+curr).data("flowtype"); jQuery("#subpic-"+id+"-"+curr).hide(curr_subpic_flowtype || subpic_flowtype || "drop", {direction:(custom_direction || 'left')}, subpic_flowtime); } } if(preview) { jQuery("#flowdata-"+id+"-thumb-"+curr).css("border", "2px solid transparent"); jQuery("#flowdata-"+id+"-thumb-"+next).css("border", "2px solid black"); } if(arguments[0] != '-1'){ jQuery("#flowdata-"+id+"-"+next).show(flowtype, {direction:(direction_in||'right')},flowtime-intersectiontime, postTransition); if(coupling && jQuery("#subpic-"+id+"-"+next).size() == 1) { var custom_direction = jQuery("#subpic-"+id+"-"+next).data("direction-in"); var next_subpic = next; var next_subpic_flowtype = jQuery("#subpic-"+id+"-"+next_subpic).data("flowtype"); window.setTimeout(function() { jQuery("#subpic-"+id+"-"+next_subpic).show(next_subpic_flowtype || subpic_flowtype || "drop", {direction:(custom_direction || 'left')}, subpic_flowtime); }, subpic_delay); } } else { jQuery("#flowdata-"+id+"-"+next).show(flowtype, {direction:(direction_in||'left')},flowtime-intersectiontime, postTransition); if(coupling && jQuery("#subpic-"+id+"-"+next).size() == 1) { var custom_direction = jQuery("#subpic-"+id+"-"+next).data("direction-in"); var next_subpic = next; var next_subpic_flowtype = jQuery("#subpic-"+id+"-"+next_subpic).data("flowtype"); window.setTimeout(function() { jQuery("#subpic-"+id+"-"+next_subpic).show(next_subpic_flowtype || subpic_flowtype || "drop", {direction:(custom_direction || 'right')}, subpic_flowtime); }, subpic_delay); } } prev = curr; curr = next; if(auto_change && arguments[1] === undefined && (restart_number == 0 || counter < restart_number)){ var currentpic = jQuery("#flowdata-"+id+"-"+curr); var local_changetime = currentpic.data("changetime"); var time = ((local_changetime > 0 ? local_changetime : changetime)+flowtime); if(time < 0) time = 100; timer = window.setTimeout(nextpic, time); if(currentpic.data("scrolls")) { currentpic.switchClass("dflow_pic_scrolls", "dflow_pic_scrolled", time); } } } }; jQuery("#flowdata-"+id+"-"+curr).show(); if(jQuery("#subpic-"+id+"-"+curr).size() == 1) { var initial_direction = jQuery("#subpic-"+id+"-"+curr).data("direction-in"); var initial_flowtype = jQuery("#subpic-"+id+"-"+curr).data("flowtype"); window.setTimeout(function() { jQuery("#subpic-"+id+"-"+curr).show((initial_flowtype || subpic_flowtype || "drop"), {direction:(initial_direction||'right')}, subpic_flowtime); if(!coupling) { var local_subpic_changetime = jQuery("#subpic-"+id+"-"+curr).data("changetime"); var effective_subpic_changetime = local_subpic_changetime > 0 ? local_subpic_changetime : subpic_changetime; window.setTimeout(function() { nextSubpic(1); }, effective_subpic_changetime); } }, subpic_delay); } if(switchmode == "auto" || switchmode == "both") { auto_change = true; counter = 0; var currentpic = jQuery("#flowdata-"+id+"-"+curr); var local_changetime = currentpic.data("changetime"); var effective_changetime = local_changetime || changetime; window.setTimeout(nextpic, effective_changetime); } nextPicFunctions[id] = nextpic; nextPicManualFunctions[id] = nextpicManual; return true; } function nextPic(flow, manual, direction, target) { if(!manual) { nextPicFunctions[flow](direction, target); } else { nextPicManualFunctions[flow](direction, target); } }