123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709 |
- /*
- _ _
- |_|___ _ _ ___ ___ ___ ___| |_ ___ ___ ___ ___ ___ ___ ___
- | | -_| | | | -_|_ -| | -_| _| | -_| | . | .'| . | -_|_ -|
- _| |___|___|_|_|___|___| |___|_| |___|_|_|_ |__,|_ |___|___|
- |___| |___| |___|
- Bachir Soussi Chiadmi
- 2015
- */
- jQuery(document).ready(function($) {
- console.log('Hello Jee');
- var _debug = true,
- _avgDelay = 1,
- _lastDraw = new Date,
- _fps,
- _$nav_cursor;
- var _$body = $('body'),
- _$header = $("#header"),
- _$chapitres = $('.node-chapitre', '#main'),
- _chapitres_len = _$chapitres.length,
- _chapters = [],
- _$container = $('#main'),
- _container = {
- w:_$container.width(),
- h:_$container.height()
- },
- _center = {x:_container.w/2,y:_container.h/2},
- _nav_pos = {x:0, y:0},
- _mouse_down_pos = {x:0,y:0},
- _prev_mouse_pos = {x:0,y:0},
- _fps = 1000/12,
- _dragging = false, _timeout_dragging;
- var _bubbles = new Array(),
- _stars = new Array();
- function init(){
- if(_debug)
- initDebug();
- initChapters();
- launchNav();
- var $fullscreenBtn = $('<div>enter</div>').attr('id','fullscreen-btn').appendTo("#root");
- // Launch fullscreen for browsers that support it!
- $fullscreenBtn.on('click', function(e){
- // launchIntoFullscreen(document.documentElement); // the whole page
- launchIntoFullscreen(document.getElementById("root")); // any individual element
- });
- for (var i = 2; i > 0; i--) {
- _bubbles.push($('<div>').addClass('bubble bubble-'+i).prependTo(_$container));
- };
- for (var i = 20; i > 0; i--) {
- _stars.push(
- $('<div>')
- .addClass('star star-'+i)
- .css({
- left:randB(-400, _container.w+400),
- top:randB(-400, _container.h+400)
- })
- .prependTo(_$container)
- );
- };
- };
- function initDebug(){
- $('<p>').attr('id', 'fps').appendTo(_$container);
- _fps = document.getElementById('fps');
- requestAnimationFrame(displayFps);
- _$nav_cursor = $('<div id="nav-cursor"></div>').appendTo(_$container);
- moveDebugCursor();
- };
- function displayFps(){
- requestAnimationFrame(displayFps);
- var now = new Date;
- var delay = now - _lastDraw;
- _avgDelay += (delay - _avgDelay) / 10;
- _lastDraw = now;
- _fps.innerHTML = (1000/_avgDelay).toFixed(1) + " fps";
- };
- function moveDebugCursor(){
- _$nav_cursor.css({
- left:_nav_pos.x+_center.x+"px",
- top:_nav_pos.y+_center.y+"px"
- });
- };
- function initChapters(){
- // Place each chapters on the ellipse contained on the screen
- var base_a = Math.random() *360;
- _$chapitres.each(function(i, e) {
- // Lets create the chapter object and place him self
- _chapters.push(new Chapter(i, e, base_a));
- });
- };
- function launchNav(){
- $(document)
- /*
- ____ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____
- | \| __| __| | |_ _| | _ | | __| | | __| | |_ _| __|
- | | | __|__ | -| | | | | | __| | __| | | __| | | | | | |__ |
- |____/|_____|_____|__|__| |_| |_____|__| |_____|\___/|_____|_|___| |_| |_____|
- */
- .bind('mousedown', function(e){
- console.log('mousedown');
- clearTimeout(_timeout_dragging);
- // set initial cursor pos
- _mouse_down_pos.x = e.clientX;
- _mouse_down_pos.y = e.clientY;
- updateNavPos(e.clientX, e.clientY, true);
- $(this).bind('mousemove', function(e){
- console.log('mousemove');
- updateNavPos(e.clientX, e.clientY, false);
- });
- // activate dragging if already activated
- if(!_dragging){
- _dragging = true;
- startMoveNav();
- }
- })
- .bind('mouseup', function(e){
- console.log('mouseup');
- stopMoveNav();
- $(this).unbind('mousemove');
- // close all preview
- if(Math.abs(e.clientX - _mouse_down_pos.x) < 2
- && Math.abs(e.clientY - _mouse_down_pos.y) < 2)
- for (var i = _chapitres_len - 1; i >= 0; i--)
- _chapters[i].closePreview().unMitigate();
- })
- /*
- _____ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____
- |_ _| | | | | | | | __| | | __| | |_ _| __|
- | | | | | | | --| | | __| | | __| | | | | | |__ |
- |_| |_____|_____|_____|__|__| |_____|\___/|_____|_|___| |_| |_____|
- */
- .bind('touchstart', function(e){
- console.log('touchstart');
- clearTimeout(_timeout_dragging);
- // set initial pos
- updateNavPos(e.originalEvent.touches[0].clientX, e.originalEvent.touches[0].clientY, true);
- // activate dragging if already activated
- if(!_dragging){
- _dragging = true;
- startMoveNav();
- }
- })
- .bind('touchmove', function(e){
- console.log('touchmove');
- updateNavPos(e.originalEvent.touches[0].clientX, e.originalEvent.touches[0].clientY, false);
- })
- .bind('touchend', function(e){
- console.log("touchend");
- stopMoveNav();
- });
- };
- function updateNavPos(x,y,init){
- if(!init){
- _nav_pos.x += x - _prev_mouse_pos.x;
- _nav_pos.y += y - _prev_mouse_pos.y;
- // constrain nav pos on container
- _nav_pos.x = _nav_pos.x < -_center.x*2
- ? -_center.x*2
- : _nav_pos.x > _center.x*2
- ? _center.x*2
- : _nav_pos.x;
- _nav_pos.y = _nav_pos.y < -_center.y*2
- ? -_center.y*2
- : _nav_pos.y > _center.y*2
- ? _center.y*2
- : _nav_pos.y;
- }
- _prev_mouse_pos.x = x;
- _prev_mouse_pos.y = y;
- // debuging cursor
- if(_debug)
- moveDebugCursor();
- };
- function startMoveNav(){
- window.requestAnimationFrame(moveNav);
- };
- function moveNav(){
- // console.log("moveNav");
- if(!_dragging) return;
- window.requestAnimationFrame(moveNav);
- // move chapters
- for (var i = _chapitres_len - 1; i >= 0; i--)
- _chapters[i].move();
- // move header
- _$header.css({
- transform:"translate3d("+(_nav_pos.x)*0.2+"px, "+(_nav_pos.y)*0.2+"px,0)"
- });
- // bubbles and stars dont move so smoothly on tablette ...
- // should keep it only on desktop
- // move bubbles
- // for (var i = _bubbles.length - 1; i >= 0; i--) {
- // _bubbles[i].css({
- // transform:"translate3d("+(_nav_pos.x)*0.4+"px, "+(_nav_pos.y)*0.4+"px,0)"
- // });
- // };
- // move stars
- // for (var i = _stars.length - 1; i >= 0; i--) {
- // _stars[i].css({
- // transform:"translate3d("+(_nav_pos.x)*-0.3+"px, "+(_nav_pos.y)*-0.3+"px,0)"
- // });
- // };
- };
- function stopMoveNav(){
- console.log('stopMoveNav');
- clearTimeout(_timeout_dragging);
- _timeout_dragging = setTimeout(function(){
- console.log("dragging stoped");
- _dragging = false;
- },3000);
- };
- function moveToChapter(chapter){
- // fake a mousdown by providing first pos as current pos
- _prev_mouse_pos.x = _nav_pos.x;
- _prev_mouse_pos.y = _nav_pos.y;
- // calculate the second pos of faked mousemove
- var xl = _center.x - chapter.pos.x - chapter.geom.w/2;
- var yl = 100 - chapter.pos.y;
- updateNavPos(xl, yl, false);
- startMoveNav();
- stopMoveNav();
- };
- /*
- ________ __
- / ____/ /_ ____ _____ / /____ _____
- / / / __ \/ __ `/ __ \/ __/ _ \/ ___/
- / /___/ / / / /_/ / /_/ / /_/ __/ /
- \____/_/ /_/\__,_/ .___/\__/\___/_/
- /_/
- */
- function Chapter(i, e, base_a){
- // $e.obj = this;
- this.i = i;
- this.e = e;
- this.$e = $(e);
- this.nid = this.$e.attr("id").match(/^node-(\d+)/)[1];
- this.geom = {
- base_a:base_a,
- a:0,
- r:0,
- w:this.$e.outerWidth(true),
- h:this.$e.outerHeight(true)
- }
- this.pos = {x:0,y:0};
- this.trans = {x:0, y:0,z:0};
- this.ease = randB(0.05, 0.3);
- //preview
- this.is_previewed = false;
- //mitigate
- this.is_mitigated = false;
- //parties
- this.$parties = $('.field-name-field-partie', e);
- this.parts_pos = {xs:new Array(), ys:new Array()};
- this.lines = new Array();
- this.linesAnimeStartTime = 0,
- this.linesAnimeDuration = 2000; // milli sec
- // prototypes
- if (typeof Chapter.initialized == "undefined") {
- Chapter.prototype.init = function(){
- this.setInitPos();
- this.drawLines();
- this.setEvents();
- };
- Chapter.prototype.setInitPos = function(){
- // distribute elements arround the center
- this.geom.a = (360/_chapitres_len*this.i+this.geom.base_a)*Math.PI/180;
- // console.log("Chapter :: setInitPos", this.$e);
- this.geom.c = Math.cos(this.geom.a);
- this.geom.s = Math.sin(this.geom.a);
- this.geom.abs_c = Math.abs(this.geom.c);
- this.geom.abs_s = Math.abs(this.geom.s);
- if (this.geom.abs_c * _container.h > this.geom.abs_s * _container.w) {
- // It crosses left or right side
- this.geom.r = (_center.x / this.geom.abs_c)*0.5;
- }else {
- // Top or bottom side
- this.geom.r = (_center.y / this.geom.abs_s)*0.5;
- }
- // change randomly radius
- if(this.i%2){
- this.geom.r = randB(this.geom.r*2, this.geom.r*3);
- }else{
- this.geom.r = randB(this.geom.r, this.geom.r*2);
- }
- this.pos.x = Math.round(_center.x+this.geom.r * this.geom.c) - this.geom.w/2;
- this.pos.y = Math.round(_center.y+this.geom.r * -this.geom.s) - this.geom.h/2;
- console.log('this', this);
- this.$e.css({
- left:this.pos.x,
- top:this.pos.y
- });
- };// setIniPos()
- Chapter.prototype.setEvents = function(){
- //http://technify.me/user-experience/javascript/jquery/trigger-custom-events-with-jquery/
- // click to preview chapter
- $('h2.node-title, .field-name-field-partie:first>.field-name-field-vignette', this.$e)
- .on('click', this, function(e){
- // e.stopImmediatePropagation();
- e.stopPropagation();
- e.preventDefault();
- e.data.preview(e);
- return false;
- });
- $('.links a', this.$e)
- .on('click', this, function(e){
- e.stopPropagation();
- e.preventDefault();
- e.data.loadNode();
- return false;
- });
- };
- Chapter.prototype.move = function(){
- this.trans.x += (_nav_pos.x - this.trans.x)*this.ease;
- this.trans.y += (_nav_pos.y - this.trans.y)*this.ease;
- // this.trans.z = Math.floor(Math.sqrt(
- // Math.pow(
- // _center.x-(this.pos.x+this.trans.x)
- // ,2
- // )
- // +
- // Math.pow(
- // _center.y-(this.pos.y+this.trans.y)
- // ,2
- // )
- // ));
- if(this.i === 0)
- console.log(this.i+" this.trans.z", this.trans.z);
- this.$e.css({
- transform:'translate3d('+this.trans.x+'px,'+this.trans.y+'px,0)'
- // scale:this.trans.z
- });
- };
- Chapter.prototype.preview = function(){
- // don't relaunch preview more that one time
- if(this.is_previewed) return;
- console.log('preview', this.i);
- this.unMitigate();
- this.is_previewed = true;
- // close other chapters
- for (var i = _chapitres_len - 1; i >= 0; i--)
- if(i !== this.i)
- _chapters[i].closePreview().mitigate();
- this.displayPreview();
- moveToChapter(this);
- };
- Chapter.prototype.displayPreview = function(e){
- // define randomly position of parties
- this.resetPartsPos();
- // apply new position to parties
- var that = this;
- this.$parties.each(function(i, e) {
- setTimeout(
- (function(i, e, xs, ys){
- return function(){
- $(e)
- .css({
- transform:"translate3d("+xs[i]+"px,"+ys[i]+"px,0)",
- });
- }
- }(i, e, that.parts_pos.xs, that.parts_pos.ys)),
- 10);
- }); // each $parties
- this.$e.addClass('previewed');
- requestAnimationFrame(this.animeLines.bind(this));
- };
- Chapter.prototype.resetPartsPos = function(){
- this.parts_pos = {xs:new Array(), ys:new Array()};
- for (var i = 0; i < 3; i++) {
- switch(i){
- case 0:
- this.parts_pos.xs.push(randB(-30,30)); this.parts_pos.ys.push(randB(90,110)); break;
- case 1:
- this.parts_pos.xs.push(randB(180,280)); this.parts_pos.ys.push(randB(250,350)); break;
- case 2:
- this.parts_pos.xs.push(randB(-280,-180)); this.parts_pos.ys.push(randB(430,530)); break;
- }
- };
- this.parts_pos.xs = shuffleArray(this.parts_pos.xs);
- this.parts_pos.ys = shuffleArray(this.parts_pos.ys);
- };
- Chapter.prototype.closePreview = function(){
- if(!this.is_previewed) return this;
- this.$e.removeClass('previewed')
- .find('.field-name-field-partie')
- .css({transform:"none"});
- requestAnimationFrame(this.animeLines.bind(this));
- this.is_previewed = false;
- return this;
- };
- Chapter.prototype.mitigate = function(){
- if(this.is_mitigated) return this;
- this.$e.addClass('mitigated');
- return this;
- };
- Chapter.prototype.unMitigate = function(){
- if(this.is_mitigated) return this;
- this.$e.removeClass('mitigated');
- return this;
- };
- Chapter.prototype.drawLines = function(){
- for (var i = 0; i < 2; i++) {
- this.lines.push({
- $line:$("<div>").addClass('line', 'line-'+i).prependTo(this.$parties[i])
- });
- };
- };
- Chapter.prototype.animeLines = function(timestamp){
- // console.log("anime line "+this.nid);
- // get the time on first anime launch
- if(this.linesAnimeStartTime === 0)
- this.linesAnimeStartTime = timestamp;
- // limit the animation time
- if(timestamp - this.linesAnimeStartTime < this.linesAnimeDuration){
- requestAnimationFrame(this.animeLines.bind(this));
- }else{
- this.linesAnimeStartTime = 0;
- }
- // get the lines length
- var l, a, pos1, pos2;
- for (var i = 0; i < this.lines.length; i++) {
- pos1 = this.$parties.eq(i).position();
- pos2 = this.$parties.eq(i+1).position();
- l = Math.sqrt(
- Math.pow(
- pos2.left - pos1.left
- ,2
- )
- +
- Math.pow(
- pos2.top - pos1.top
- ,2
- )
- );
- // get the rotation
- a = 180 / 3.14 * Math.acos((pos2.top - pos1.top) / l);
- if(pos2.left > pos1.left)
- a *= -1;
- // console.log("a = "+a);
- this.lines[i].$line.css({
- 'height':l,
- transform:"rotate3d(0,0,1,"+a+"deg)"
- });
- };
- };
- Chapter.prototype.loadNode = function(e){
- // console.log("Chapter :: open : nid", this.nid);
- $.getJSON(
- '/jee/chapter/'+this.nid,
- {},
- this.displayNode
- );
- };
- Chapter.prototype.displayNode = function(json, textstatus){
- console.log('Chapter :: displayNode : json', json);
- };
- Node.initialized = true;
- }
- this.init();
- };//Chapter
- /*
- __ __________ ____ __________ _____
- / / / / ____/ / / __ \/ ____/ __ \/ ___/
- / /_/ / __/ / / / /_/ / __/ / /_/ /\__ \
- / __ / /___/ /___/ ____/ /___/ _, _/___/ /
- /_/ /_/_____/_____/_/ /_____/_/ |_|/____/
- */
- function randB(min, max){
- return Math.random() * (max - min) + min;
- };
- //+ Jonas Raoni Soares Silva
- //@ http://jsfromhell.com/array/shuffle [v1.0]
- function shuffleArray(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;
- };
- if (!Date.now) {
- Date.now = function now() {
- return new Date().getTime();
- };
- }
- /*
- _ _ __
- (_)___ (_) /_
- / / __ \/ / __/
- / / / / / / /_
- /_/_/ /_/_/\__/
- */
- init();
- });
- /*
- ____ __________ __ ___________________ ___ _ ________ ______ ______________ _ __ __________ ___ __ _________
- / __ \/ ____/ __ \/ / / / ____/ ___/_ __/ / | / | / / _/ |/ / |/_ __/ _/ __ \/ | / / / ____/ __ \/ | / |/ / ____/
- / /_/ / __/ / / / / / / / __/ \__ \ / / / /| | / |/ // // /|_/ / /| | / / / // / / / |/ / / /_ / /_/ / /| | / /|_/ / __/
- / _, _/ /___/ /_/ / /_/ / /___ ___/ // / / ___ |/ /| // // / / / ___ |/ / _/ // /_/ / /| / / __/ / _, _/ ___ |/ / / / /___
- /_/ |_/_____/\___\_\____/_____//____//_/ /_/ |_/_/ |_/___/_/ /_/_/ |_/_/ /___/\____/_/ |_/ /_/ /_/ |_/_/ |_/_/ /_/_____/
- */
- (function() {
- var lastTime = 0;
- var vendors = ['ms', 'moz', 'webkit', 'o'];
- for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
- window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
- window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame']
- || window[vendors[x]+'CancelRequestAnimationFrame'];
- }
- if (!window.requestAnimationFrame)
- window.requestAnimationFrame = function(callback, element) {
- var currTime = new Date().getTime();
- var timeToCall = Math.max(0, 16 - (currTime - lastTime));
- var id = window.setTimeout(function() { callback(currTime + timeToCall); },
- timeToCall);
- lastTime = currTime + timeToCall;
- return id;
- };
- if (!window.cancelAnimationFrame)
- window.cancelAnimationFrame = function(id) {
- clearTimeout(id);
- };
- }());
- /* ____ ____
- / __/_ __/ / / __________________ ___ ____
- / /_/ / / / / / / ___/ ___/ ___/ _ \/ _ \/ __ \
- / __/ /_/ / / / (__ ) /__/ / / __/ __/ / / /
- /_/ \__,_/_/_/ /____/\___/_/ \___/\___/_/ /_/
- */
- // http://davidwalsh.name/fullscreen
- // http://www.sitepoint.com/html5-full-screen-api/
- // Find the right method, call on correct element
- function launchIntoFullscreen(element) {
- if(element.requestFullscreen) {
- element.requestFullscreen();
- } else if(element.mozRequestFullScreen) {
- element.mozRequestFullScreen();
- } else if(element.webkitRequestFullscreen) {
- element.webkitRequestFullscreen();
- } else if(element.msRequestFullscreen) {
- element.msRequestFullscreen();
- }
- }
- // remove navbar
- // $(document).ready(function() {
- // if (navigator.userAgent.match(/Android/i)) {
- // window.scrollTo(0,0); // reset in case prev not scrolled
- // var nPageH = $(document).height();
- // var nViewH = window.outerHeight;
- // if (nViewH > nPageH) {
- // nViewH -= 250;
- // $('BODY').css('height',nViewH + 'px');
- // }
- // window.scrollTo(0,1);
- // }
- // });
- // OR
- // function hideAddressBar(){
- // if(document.documentElement.scrollHeight<window.outerHeight/window.devicePixelRatio)
- // document.documentElement.style.height=(window.outerHeight/window.devicePixelRatio)+'px';
- // setTimeout(window.scrollTo(1,1),0);
- // }
- // window.addEventListener("load",function(){hideAddressBar();});
- // window.addEventListener("orientationchange",function(){hideAddressBar();});
- // OR
- // function hideAddressBar() {
- // if(!window.location.hash) {
- // if(document.height < window.outerHeight)
- // document.body.style.height = (window.outerHeight + 50) + 'px';
- // setTimeout( function(){
- // window.scrollTo(0, 1);
- // document.body.style.height = 'auto';
- // }, 50 );
- // }
- // }
- // window.addEventListener("load",function(){hideAddressBar();});
- // window.addEventListener("orientationchange",function(){hideAddressBar();});
- // Drupal.behaviors.init_theme = function (context) {
- // // Growl-style system messages
- // $('#messages-and-help > div.messages:not(.processed)')
- // .addClass('processed')
- // .each(function() {
- // // If a message meets these criteria, we don't autoclose
- // // - contains a link
- // // - is an error or warning
- // // - contains a lenghthy amount of text
- // if ($('a', this).size() || $(this).is('.error') || $(this).is('.warning') || $(this).text().length > 100) {
- // $(this).prepend("<span class='close'>X</span>");
- // $('span.close', this).click(function() {
- // $(this).parent().slideUp('fast');
- // });
- // }
- // else {
- // // This essentially adds a 3 second pause before hiding the message.
- // $(this).animate({opacity:1}, 5000, 'linear', function() {
- // $(this).slideUp('fast');
- // });
- // }
- // });
- // };
|