From: Benoît Pin Date: Wed, 24 Jul 2013 03:08:22 +0000 (+0200) Subject: Scroll et shake du message d'alerte. X-Git-Url: https://scm.cri.mines-paristech.fr/git/Plinn.git/commitdiff_plain/292a91bf78532d43a81bc528307ded8c6733d130?ds=inline Scroll et shake du message d'alerte. --- diff --git a/skins/ajax_scripts/ajax_form_manager.js b/skins/ajax_scripts/ajax_form_manager.js index d91c440..bdea518 100644 --- a/skins/ajax_scripts/ajax_form_manager.js +++ b/skins/ajax_scripts/ajax_form_manager.js @@ -429,6 +429,14 @@ FormManager.prototype.loadResponse = function(req) { onAfterPopulate = eval(onAfterPopulate); } onAfterPopulate(); + this.scrollToPortalMessage(); +}; + +FormManager.prototype.scrollToPortalMessage = function() { + var psm = document.getElementById('DesktopStatusBar'); + var msgOffset = psm.offsetTop; + smoothScroll(window.scrollY, msgOffset); + shake(psm, 10, 1000); }; FormManager.prototype._fitField = function(evt) { @@ -450,4 +458,69 @@ function initForms(baseElement, lazy) { } } +function smoothScroll(from, to) { + var intervalId; + var step = 25; + var pos = from; + var dir; + if (to > from) { + dir = 1; + } + else { + dir = -1; + } + + var jump = function() { + window.scroll(0, pos); + pos = pos + step * dir; + if ((dir === 1 && pos >= to) || + (dir === -1 && pos <= to)) { + window.clearInterval(intervalId); + window.scroll(0, to); + } + } + intervalId = window.setInterval(jump, 10); +} + +/* adapted from http://xahlee.info/js/js_shake_box.html */ +function shake(e, distance, time) { + // Handle arguments + if (!time) time = 500; + if (!distance) distance = 5; + + // Save the original style of e, Make e relatively positioned, Note the animation start time, Start the animation + var originalStyle = e.style.cssText; + e.style.position = "relative"; + var start = (new Date()).getTime(); + animate(); + + // This function checks the elapsed time and updates the position of e. + // If the animation is complete, it restores e to its original state. + // Otherwise, it updates e's position and schedules itself to run again. + function animate() { + var now = (new Date()).getTime(); + // Get current time + var elapsed = now-start; + // How long since we started + var fraction = elapsed/time; + // What fraction of total time? + if (fraction < 1) { + // If the animation is not yet complete + // Compute the x position of e as a function of animation + // completion fraction. We use a sinusoidal function, and multiply + // the completion fraction by 4pi, so that it shakes back and + // forth twice. + var x = distance * Math.sin(fraction*8*Math.PI); + e.style.left = x + "px"; + // Try to run again in 25ms or at the end of the total time. + // We're aiming for a smooth 40 frames/second animation. + setTimeout(animate, Math.min(25, time-elapsed)); + } + else { + // Otherwise, the animation is complete + e.style.cssText = originalStyle // Restore the original style + } + } +} + }());