From 20bea94ab6b91c85b171dcf86baba0a64169d508 Mon Sep 17 00:00:00 2001 From: Giulio Cesare Solaroli Date: Fri, 30 Aug 2013 15:56:53 +0000 Subject: First release of /delta version --- (limited to 'frontend/delta/js/Clipperz/Visual.js') diff --git a/frontend/delta/js/Clipperz/Visual.js b/frontend/delta/js/Clipperz/Visual.js new file mode 100644 index 0000000..93ed725 --- a/dev/null +++ b/frontend/delta/js/Clipperz/Visual.js @@ -0,0 +1,363 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.Visual) == 'undefined') { Clipperz.Visual = {}; } + +Clipperz.Visual.VERSION = "0.1"; +Clipperz.Visual.NAME = "Clipperz.Visual"; + +MochiKit.Base.update(Clipperz.Visual, { + + //------------------------------------------------------------------------- + + '__repr__': function () { + return "[" + this.NAME + " " + this.VERSION + "]"; + }, + + //------------------------------------------------------------------------- + + 'toString': function () { + return this.__repr__(); + }, + + //------------------------------------------------------------------------- + + 'deferredResize': function (anElement, someOptions) { + var deferredResult; + var moveTransition; + var scaleTransition; + var duration; + + duration = someOptions.duration || 0.5; + + deferredResult = new Clipperz.Async.Deferred("Visual.deferredResize", {trace:false}); + deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]); + + moveTransition = MochiKit.Visual.Transitions.linear; //MochiKit.Visual.Transitions.sinoidal; + scaleTransition = MochiKit.Visual.Transitions.linear; //MochiKit.Visual.Transitions.sinoidal; + + MochiKit.Style.setElementPosition(anElement, {x:someOptions.from.position.x, y:someOptions.from.position.y }, 'px'); + + new MochiKit.Visual.Parallel([ + new MochiKit.Visual.Move(anElement, {x:someOptions.to.position.x, y:someOptions.to.position.y, mode:'absolute', transition:moveTransition, sync:true}), + new Clipperz.Visual.Resize(anElement, {fromSize:{h:someOptions.from.dimensions.h, w:someOptions.from.dimensions.w}, toSize:{h:someOptions.to.dimensions.h, w:someOptions.to.dimensions.w}, transition:scaleTransition, scaleContent:false, scaleFromCenter:false, restoreAfterFinish:true, sync:true}) + ], {duration:duration, afterFinish:MochiKit.Base.method(deferredResult, 'callback')}) + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'deferredAnimation': function (anAnimation, someParameters, someOptions) { + var deferredResult; + var afterFinishCallback; + var options; + + deferredResult = new Clipperz.Async.Deferred("Clipperz.Visual.deferredAnimation", {trace:false}); + deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]); + + if (MochiKit.Base.isUndefinedOrNull(someOptions)) { + options = {} + } else { + options = someOptions; + } + + if (MochiKit.Base.isUndefinedOrNull(someOptions['afterFinish'])) { + options['afterFinish'] = MochiKit.Base.noop; + } + + MochiKit.Base.update(options, { + 'afterFinish': MochiKit.Base.compose(options['afterFinish'], MochiKit.Base.method(deferredResult, 'callback')) + }); + + new anAnimation(someParameters, options); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'deferredAnimations': function (aSinchronizationType, someAnimations, someOptions) { + var deferredResult; + var options; + + deferredResult = new Clipperz.Async.Deferred("Visual.deferredParallelAnimations", {trace:false}); + deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]); + + options = someOptions; + if (MochiKit.Base.isUndefinedOrNull(someOptions['afterFinish'])) { + options['afterFinish'] = MochiKit.Base.noop; + } + MochiKit.Base.update(options, { + 'afterFinish': MochiKit.Base.compose(options['afterFinish'], MochiKit.Base.method(deferredResult, 'callback')) + }); + + new aSinchronizationType(someAnimations, options) + + return deferredResult; + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + +//############################################################################# + +/** @id Clipperz.Visual.Resize */ +Clipperz.Visual.Resize = function (element, percent, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(element, percent, options); + } + this.__init__(element, percent, options); +}; + +Clipperz.Visual.Resize.prototype = new MochiKit.Visual.Base(); + +MochiKit.Base.update(Clipperz.Visual.Resize.prototype, { + __class__ : Clipperz.Visual.Resize, + + __init__: function (element, options) { + this.element = MochiKit.DOM.getElement(element); + options = MochiKit.Base.update({ + scaleX: true, + scaleY: true, + scaleContent: true, + scaleFromCenter: false, + scaleMode: 'box', // 'box' or 'contents' or {} with provided values + syntax_fix: 'syntax fix' + }, options); + + this.start(options); + }, + + setup: function () { + this.restoreAfterFinish = this.options.restoreAfterFinish || false; + this.elementPositioning = MochiKit.Style.getStyle(this.element, 'position'); + + var ma = MochiKit.Base.map; + var b = MochiKit.Base.bind; + this.originalStyle = {}; + ma(b(function (k) { this.originalStyle[k] = this.element.style[k]; }, this), ['top', 'left', 'width', 'height', 'fontSize']); + + this.originalTop = this.element.offsetTop; + this.originalLeft = this.element.offsetLeft; + + var fontSize = MochiKit.Style.getStyle(this.element, 'font-size') || '100%'; + ma(b(function (fontSizeType) { + if (fontSize.indexOf(fontSizeType) > 0) { + this.fontSize = parseFloat(fontSize); + this.fontSizeType = fontSizeType; + } + }, this), ['em', 'px', '%']); + + this.factor = 1; + + this.dims = [this.options.fromSize.h, this.options.fromSize.w]; + }, + + update: function (position) { + this.setDimensions( (this.options.toSize.h - this.options.fromSize.h) * position + this.options.fromSize.h, + (this.options.toSize.w - this.options.fromSize.w) * position + this.options.fromSize.w); + }, + + finish: function () { + if (this.restoreAfterFinish) { + MochiKit.Style.setStyle(this.element, this.originalStyle); + } + }, + + setDimensions: function (height, width) { + var d = {}; + var r = Math.round; + if (/MSIE/.test(navigator.userAgent)) { + r = Math.ceil; + } + if (this.options.scaleX) { + d.width = r(width) + 'px'; + } + if (this.options.scaleY) { + d.height = r(height) + 'px'; + } + if (this.options.scaleFromCenter) { + var topd = (height - this.dims[0])/2; + var leftd = (width - this.dims[1])/2; + if (this.elementPositioning == 'absolute') { + if (this.options.scaleY) { + d.top = this.originalTop - topd + 'px'; + } + if (this.options.scaleX) { + d.left = this.originalLeft - leftd + 'px'; + } + } else { + if (this.options.scaleY) { + d.top = -topd + 'px'; + } + if (this.options.scaleX) { + d.left = -leftd + 'px'; + } + } + } + MochiKit.Style.setStyle(this.element, d); + } +}); + +//============================================================================= + +Clipperz.Visual.squize = function (element, /* optional */ options) { + var d = MochiKit.DOM; + var v = MochiKit.Visual; + var s = MochiKit.Style; + + element = d.getElement(element); + options = MochiKit.Base.update({ + moveTransition: v.Transitions.sinoidal, + scaleTransition: v.Transitions.sinoidal, + opacityTransition: v.Transitions.none, + scaleContent: true, + scaleFromCenter: false, + scaleX: true, + scaleY: true + }, options); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: s.getStyle(element, 'opacity') + }; + + var dims = s.getElementDimensions(element, true); + var moveX, moveY; + + moveX = options.scaleX ? dims.w/2 : 0; + moveY = options.scaleY ? dims.h/2 : 0; + + var elemClip; + + var optionsParallel = MochiKit.Base.update({ + beforeStartInternal: function (effect) { + s.makePositioned(effect.effects[0].element); + elemClip = s.makeClipping(effect.effects[0].element); + }, + afterFinishInternal: function (effect) { + s.hideElement(effect.effects[0].element); + s.undoClipping(effect.effects[0].element, elemClip); + s.undoPositioned(effect.effects[0].element); + s.setStyle(effect.effects[0].element, oldStyle); + } + }, options); + + return new v.Parallel( + [new v.Opacity(element, { + sync: true, to: 0.0, from: 1.0, + transition: options.opacityTransition + }), + new v.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, { + scaleMode: {originalHeight: dims.h, originalWidth: dims.w}, + sync: true, transition: options.scaleTransition, + scaleContent: options.scaleContent, + scaleFromCenter: options.scaleFromCenter, + restoreAfterFinish: true, + scaleX: options.scaleX, + scaleY: options.scaleY + }), + new v.Move(element, { + x: moveX, y: moveY, sync: true, transition: options.moveTransition + }) + ], optionsParallel + ); +}; + +//----------------------------------------------------------------------------- + +Clipperz.Visual.expand = function (element, /* optional */ options) { + var d = MochiKit.DOM; + var v = MochiKit.Visual; + var s = MochiKit.Style; + + element = d.getElement(element); + options = MochiKit.Base.update({ +// direction: 'center', + moveTransition: v.Transitions.sinoidal, + scaleTransition: v.Transitions.sinoidal, + opacityTransition: v.Transitions.none, + scaleContent: true, + scaleFromCenter: false, + scaleX: true, + scaleY: true + }, options); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: s.getStyle(element, 'opacity') + }; + + var dims = s.getElementDimensions(element, true); + var moveX, moveY; + + moveX = options.scaleX ? dims.w/2 : 0; + moveY = options.scaleY ? dims.h/2 : 0; + + var elemClip; + + var optionsParallel = MochiKit.Base.update({ + beforeStartInternal: function (effect) { + s.makePositioned(effect.effects[0].element); + elemClip = s.makeClipping(effect.effects[0].element); + }, + afterFinishInternal: function (effect) { + s.hideElement(effect.effects[0].element); + s.undoClipping(effect.effects[0].element, elemClip); + s.undoPositioned(effect.effects[0].element); + s.setStyle(effect.effects[0].element, oldStyle); + } + }, options); + + return new v.Parallel( + [new v.Opacity(element, { + sync: true, to: 0.0, from: 1.0, + transition: options.opacityTransition + }), + new v.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, { + scaleMode: {originalHeight: dims.h, originalWidth: dims.w}, + sync: true, transition: options.scaleTransition, + scaleContent: options.scaleContent, + scaleFromCenter: options.scaleFromCenter, + restoreAfterFinish: true, + scaleX: options.scaleX, + scaleY: options.scaleY + }), + new v.Move(element, { + x: moveX, y: moveY, sync: true, transition: options.moveTransition + }) + ], optionsParallel + ); +}; + +//============================================================================= + -- cgit v0.9.0.2