diff --git a/PATCHES.md b/PATCHES.md index 488659a73..819341d38 100644 --- a/PATCHES.md +++ b/PATCHES.md @@ -1 +1,5 @@ +color_field https://www.drupal.org/project/color_field/issues/2854199#comment-12316266 + +domain_site_settings +https://www.drupal.org/project/domain_site_settings/issues/2930391 diff --git a/sites/all/modules/contrib/admin/path_alias_xt/LICENSE.txt b/sites/all/modules/contrib/admin/path_alias_xt/LICENSE.txt new file mode 100644 index 000000000..d159169d1 --- /dev/null +++ b/sites/all/modules/contrib/admin/path_alias_xt/LICENSE.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/sites/all/modules/contrib/admin/path_alias_xt/config/install/path_alias_xt.settings.yml b/sites/all/modules/contrib/admin/path_alias_xt/config/install/path_alias_xt.settings.yml new file mode 100644 index 000000000..b64509822 --- /dev/null +++ b/sites/all/modules/contrib/admin/path_alias_xt/config/install/path_alias_xt.settings.yml @@ -0,0 +1,2 @@ +user_special: true +regex_pattern: '{(^node|^user|^taxonomy/term)/([0-9]+)/(.+)}' diff --git a/sites/all/modules/contrib/admin/path_alias_xt/config/schema/path_alias_xt.schema.yml b/sites/all/modules/contrib/admin/path_alias_xt/config/schema/path_alias_xt.schema.yml new file mode 100644 index 000000000..84ba2300d --- /dev/null +++ b/sites/all/modules/contrib/admin/path_alias_xt/config/schema/path_alias_xt.schema.yml @@ -0,0 +1,9 @@ +path_alias_xt.settings: + type: config_object + mapping: + user_special: + type: boolean + label: 'User special' + regex_pattern: + type: string + label: 'RegEx pattern' diff --git a/sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.info.yml b/sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.info.yml new file mode 100644 index 000000000..24feddf9d --- /dev/null +++ b/sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.info.yml @@ -0,0 +1,13 @@ +name: Extended Path Aliases +type: module +description: 'Automatically extend path aliases to include tabs, like about-us/edit for node/123/edit.
Allow these aliases to be entered in page specification wild-cards, about-us*, e.g for block visibility.' +# core: 8.x +configure: path_alias_xt.settings_form +dependencies: + - path + +# Information added by Drupal.org packaging script on 2017-07-14 +version: '8.x-1.x-dev' +core: '8.x' +project: 'path_alias_xt' +datestamp: 1500044946 diff --git a/sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.links.menu.yml b/sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.links.menu.yml new file mode 100644 index 000000000..ef411e3e0 --- /dev/null +++ b/sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.links.menu.yml @@ -0,0 +1,5 @@ +path_alias_xt.settings_form: + title: 'Extended path aliases' + route_name: path_alias_xt.settings_form + description: 'Advanced settings.' + parent: system.admin_config_system diff --git a/sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.module b/sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.module new file mode 100644 index 000000000..725ef7392 --- /dev/null +++ b/sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.module @@ -0,0 +1,24 @@ +'; + $output .= t('Installation instructions are in the README.txt file. Further documentation is on the Extended Path Aliases project page.', + ['@path_alias_xt' => Url::fromUri('http://drupal.org/project/path_alias_xt')->toString()]); + $output .= '

'; + + return ['#markup' => $output]; + } +} diff --git a/sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.permissions.yml b/sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.permissions.yml new file mode 100644 index 000000000..6ef8ecb0e --- /dev/null +++ b/sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.permissions.yml @@ -0,0 +1,2 @@ +administer extended path aliases: + title: 'Administer Extended Path Aliases' diff --git a/sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.routing.yml b/sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.routing.yml new file mode 100644 index 000000000..a9629810e --- /dev/null +++ b/sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.routing.yml @@ -0,0 +1,9 @@ +path_alias_xt.settings_form: + path: '/admin/config/system/path_alias_xt' + defaults: + _form: '\Drupal\path_alias_xt\Form\PathAliasXtSettingsForm' + _title: 'Extended path aliases' + requirements: + _permission: 'administer extended path aliases' + options: + _admin_route: TRUE diff --git a/sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.services.yml b/sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.services.yml new file mode 100644 index 000000000..cb85ebec6 --- /dev/null +++ b/sites/all/modules/contrib/admin/path_alias_xt/path_alias_xt.services.yml @@ -0,0 +1,7 @@ +services: + path_alias_xt.path_processor_alias: + class: Drupal\path_alias_xt\PathAliasXtProcessorAlias + tags: + - { name: path_processor_inbound, priority: 100 } + - { name: path_processor_outbound, priority: 100 } + arguments: ['@path.alias_manager', '@config.factory'] diff --git a/sites/all/modules/contrib/admin/path_alias_xt/src/Form/PathAliasXtSettingsForm.php b/sites/all/modules/contrib/admin/path_alias_xt/src/Form/PathAliasXtSettingsForm.php new file mode 100644 index 000000000..f9482a2e2 --- /dev/null +++ b/sites/all/modules/contrib/admin/path_alias_xt/src/Form/PathAliasXtSettingsForm.php @@ -0,0 +1,69 @@ +config('path_alias_xt.settings'); + + $form['user_special'] = [ + '#type' => 'checkbox', + '#title' => $this->t('For the current user: instead of /user/uid or its alias, apply the alias for /user.'), + '#default_value' => $config->get('user_special'), + '#description' => $this->t('If ticked and the system path /user has an alias, such as /MyAccount, then /MyAccount will also be applied when a user visits their /user/uid/... pages.
For this feature to work you must complete the full installation procedure outlined in the README.', [ + '@alias' => Url::fromRoute('path.admin_overview')->toString(), + '@README' => Url::fromUserInput('/' . drupal_get_path('module', 'path_alias_xt') . '/README.txt')->toString(), + ]), + ]; + + $form['regex_pattern'] = [ + '#type' => 'textfield', + '#size' => 100, + '#title' => $this->t('Regular expression to match system paths for nodes, users and taxonomy terms'), + '#default_value' => $config->get('regex_pattern'), + '#description' => $this->t("While you can always reset this configuration and recover without permanent damage to your site, a change to this expression may temporarily break all extended aliases. Change only when you know what you're doing."), + ]; + + return parent::buildForm($form, $form_state); + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, FormStateInterface $form_state) { + $config = $this->config('path_alias_xt.settings'); + + foreach ($form_state->getValues() as $key => $value) { + $config->set($key, $value); + } + $config->save(); + + parent::submitForm($form, $form_state); + } + +} diff --git a/sites/all/modules/contrib/admin/path_alias_xt/src/PathAliasXtProcessorAlias.php b/sites/all/modules/contrib/admin/path_alias_xt/src/PathAliasXtProcessorAlias.php new file mode 100644 index 000000000..cf1ea4c39 --- /dev/null +++ b/sites/all/modules/contrib/admin/path_alias_xt/src/PathAliasXtProcessorAlias.php @@ -0,0 +1,89 @@ +configFactory = $config_factory; + } + + /** + * {@inheritdoc} + */ + public function processInbound($path, Request $request) { + $path_to_process = ltrim($path, '/'); + + $removed_elements = []; + $path_elements = explode('/', $path_to_process); + + foreach ($path_elements as $element) { + $candidate_alias = '/' . implode('/', $path_elements); + $source = $this->aliasManager->getPathByAlias($candidate_alias); + + if ($source != $candidate_alias) { + // Change the order of the elements. + krsort($removed_elements); + $return_path = $source; + if (!empty($removed_elements)) { + $return_path .= '/' . implode('/', $removed_elements); + } + + // Validate the path. + // Injecting the service threw ServiceCircularReferenceException. + if (\Drupal::service('path.validator')->isValid($return_path)) { + return $return_path; + } + } + // Remove the last element from the elements array to be able to add it + // to the end of the found path. + $removed_elements[] = array_pop($path_elements); + } + + return $path; + } + + /** + * {@inheritdoc} + */ + public function processOutbound($path, &$options = [], Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) { + $path = parent::processOutbound($path, $options, $request, $bubbleable_metadata); + + $config = $this->configFactory->get('path_alias_xt.settings'); + if (preg_match($config->get('regex_pattern'), Unicode::substr($path, 1), $matches)) { + $langcode = isset($options['language']) ? $options['language']->getId() : NULL; + if ($alias = $this->aliasManager->getAliasByPath("/$matches[1]/$matches[2]", $langcode)) { + $path = "$alias/$matches[3]"; + } + } + + return $path; + } + +} diff --git a/sites/all/modules/figli/edlp_corpus/assets/dist/scripts/corpus.min.js b/sites/all/modules/figli/edlp_corpus/assets/dist/scripts/corpus.min.js index 27a7ed5b0..8f0723737 100644 --- a/sites/all/modules/figli/edlp_corpus/assets/dist/scripts/corpus.min.js +++ b/sites/all/modules/figli/edlp_corpus/assets/dist/scripts/corpus.min.js @@ -1,45 +1,1235 @@ +/** + * @Author: Bachir Soussi Chiadmi + * @Date: 18-12-2017 + * @Email: bachir@figureslibres.io + * @Filename: corpus.js + * @Last modified by: bach + * @Last modified time: 20-12-2017 + * @License: GPL-V3 + */ -(function($,Drupal,drupalSettings){EdlpCorpus=function(){var _activated=true;var _$body=$('body');var _$container=_$body;var _$canvas=$('').appendTo(_$container);var _canvas=_$canvas[0];var _ctx=_canvas.getContext('2d');var _dpi=window.devicePixelRatio;var _scene_props={width:window.innerWidth,height:window.innerHeight,'margin_top':75,'margin_right':0,'margin_bottom':65,'margin_left':0};var _evolution_zone={left:_scene_props.width/4,right:_scene_props.width-_scene_props.width/4,center:_scene_props.width/2,};var _physics=new Physics();var _nodes=[];var _articles_nodes=[];var _no_articles_nodes=[];var _articles_filter_on=false;var _nodes_by_entries={};var _nodes_by_nid={};var _nodes_Nid_Id={};var _nodes_centered=[];var _nodes_centered_attractions=[];var _loaded=false;var _playlist=[];var _p_velocity_factor=0.5;var _mouse_in=true;var _m_pos={x:0,y:0};var _node_hover_id=-1;var _node_opened_id=-1;var _$entrees_block=$('#block-edlpentreesblock');var _$entrees_block_termlinks=$('a.term-link',_$entrees_block);var _$articles_link;var _node_pop_up;var _settings=drupalSettings.edlp_corpus;var _ecolors=_settings.colors;var _attracter;var check_parts_colid_frq=2;var check_parts_colid_tick=1;function init(){initCanvas();if(_activated){loadCorpus();}else{_$canvas.addClass('de-activated');}};function initCanvas(){window.addEventListener('resize',onResizeCanvas,false);onResizeCanvas();};function onResizeCanvas(){_scene_props.width=window.innerWidth;_scene_props.height=window.innerHeight;_canvas.style.width=_scene_props.width+'px';_canvas.style.height=_scene_props.height+'px';_canvas.width=_scene_props.width*_dpi;_canvas.height=_scene_props.height*_dpi;_ctx.scale(_dpi,_dpi);moveEvolutionZone();if(_loaded){for(var i=0;i<_nodes.length;i++){_nodes[i].onResizeCanvas();}}};function loadCorpus(){var ajax_path=_settings.load_corpus_ajax_url;var path=window.location.origin+Drupal.url(ajax_path);$.getJSON(path,{}).done(function(data){onCorpusLoaded(data);}).fail(function(jqxhr,textStatus,error){onCorpusLoadError(jqxhr,textStatus,error);});};function onCorpusLoadError(jqxhr,textStatus,error){void 0;};function onCorpusLoaded(data){initPhysics();buildNodes(data.nodes);initArtilesLink();initNodePopup();initEvents();checkPreOpenedEntry();startAnime();_loaded=true;};function initPhysics(){_attracter=_physics.makeParticle(1000);_attracter.fixed=true;resizePhysics();};function resizePhysics(){if(typeof _attracter!='undefined'){_attracter.position={x:_evolution_zone.center,y:_scene_props.height/2};}};function buildNodes(nodes){var d;for(var i in nodes){d=i<1?true:false;new Node(i,nodes[i],d);_playlist.push({'id':i,'nid':nodes[i].nid,'audio_url':nodes[i].audio_url});}};function Node(i,node,d){this.id=i;for(key in node) -this[key]=node[key];_nodes.push(this);_nodes_by_nid[this.nid]=this;_nodes_Nid_Id[this.nid]=this.id;if(this.has_article==1){_articles_nodes.push(this);}else{_no_articles_nodes.push(this);} -for(var j=0;j3:this.r=8;break;case this.entrees.length>1&&this.entrees.length<=3:this.r=5;break;default:this.r=3;break;} -this.d=this.r*2;this.e_color='e_col_'+this.entrees[Math.floor(Math.random(this.entrees.length))];this.canvas=document.createElement('canvas');this.canvas_ctx=this.canvas.getContext('2d');this.line_width=1;this.w=this.r*2+this.line_width*2;this.w_2=this.w/2;this.canvas.width=this.w;this.canvas.height=this.w;this.canvas_ctx.fillStyle='rgb(255,255,255)';this.canvas_ctx.lineWidth=this.line_width;this.wall_bouncing_elasticity=0.75;this.hover=false;this.opened=false;this.faded=false;this.center=false;this.aside=false;this.scrambling=false;if(typeof Node.initialized=="undefined"){Node.prototype.init=function(){this.calcWallLimits();this.x=this.wall_limits.left+Math.random()*(this.wall_limits.right-this.wall_limits.left);this.y=this.wall_limits.top+Math.random()*(this.wall_limits.bottom-this.wall_limits.top);this.ori_pos={x:this.x,y:this.y};this.initPhysics();};Node.prototype.initPhysics=function(){this.p=_physics.makeParticle(this.mass,this.x,this.y);this.p.velocity=new Physics.Vector((Math.random()-0.5)*_p_velocity_factor,(Math.random()-0.5)*_p_velocity_factor);this.ori_p=_physics.makeParticle(1000,this.ori_pos.x,this.ori_pos.y);this.ori_p.fixed=true;this.ori_p_attract=_physics.makeAttraction(this.ori_p,this.p,1000,_scene_props.width*2);this.ori_p_attract.on=false;this.attract=_physics.makeAttraction(_attracter,this.p,1000,_scene_props.width*2);this.attract.on=false;};Node.prototype.calcWallLimits=function(){this.wall_limits={top:_scene_props.margin_top+this.r,right:_scene_props.width-_scene_props.margin_right-this.r,bottom:_scene_props.height-_scene_props.margin_bottom-this.r,left:_scene_props.margin_left+this.r}};Node.prototype.onResizeCanvas=function(){this.calcWallLimits();this.shuffleOriP();};Node.prototype.shuffleOriP=function(){this.ori_pos.x=this.wall_limits.left+Math.random()*(this.wall_limits.right-this.wall_limits.left);this.ori_pos.y=this.wall_limits.top+Math.random()*(this.wall_limits.bottom-this.wall_limits.top);this.scramble();};Node.prototype.onUpdate=function(){if(this.hover||this.opened){this.p.fixed=true;}else{this.p.fixed=false;if(this.center) -this.limitEvolutionZone();this.checkWallBouncing();this.updatePos();if(this.scrambling){this.checkOriPDist();}} -if(_mouse_in&&!this.aside&&!this.faded) -this.checkMouse();this.redraw();};Node.prototype.checkVelocityThreshold=function(){if(!this.centered||!this.aside){if(Math.abs(this.p.velocity.x)this.wall_limits.right&&this.p.velocity.x>0:this.p.position.x=this.wall_limits.right;this.p.velocity.multiplyScalarXY(-1,1).multiplyScalar(this.wall_bouncing_elasticity);break;case this.ythis.wall_limits.bottom&&this.p.velocity.y>0:this.p.position.y=this.wall_limits.bottom;this.p.velocity.multiplyScalarXY(1,-1).multiplyScalar(this.wall_bouncing_elasticity);break;}};Node.prototype.updatePos=function(){this.x=this.p.position.x;this.y=this.p.position.y;};Node.prototype.checkMouse=function(){if(_m_pos.x>this.x-this.r&&_m_pos.xthis.y-this.r&&_m_pos.y0.4){this.p.velocity.multiplyScalar(0.99);}} -if(this.x<_evolution_zone.left||this.x>_evolution_zone.right||Math.abs(_attracter.position.y-this.y)>_scene_props.height/4){this.attract.on=true;}else{this.attract.on=false;}} -Node.prototype.setAside=function(){this.aside=true;this.stopScrambling();this.unsetCentered();this.ori_p.position.x=this.x<_scene_props.width/2?this.wall_limits.left:this.wall_limits.right;this.ori_p_attract.on=true;this.wall_bouncing_elasticity=0.15;} -Node.prototype.unsetAside=function(){this.aside=false;this.ori_p_attract.on=false;this.ori_p.position.x=this.ori_pos.x;this.wall_bouncing_elasticity=0.75;} -Node.prototype.resolveNormalPos=function(){switch(true){case this.center:this.unsetCentered();break;case this.aside:this.unsetAside();break;}};Node.prototype.scramble=function(){this.scrambling=true;this.unsetCentered();this.unsetAside();this.ori_p.position.x=this.ori_pos.x;this.ori_p.position.y=this.ori_pos.y;this.ori_p_attract.on=true;} -Node.prototype.checkOriPDist=function(){if(this.p.distanceTo(this.ori_p)<50){this.stopScrambling();}};Node.prototype.stopScrambling=function(){this.scrambling=false;this.ori_p_attract.on=false;} -Node.prototype.move=function(){_ctx.drawImage(this.canvas,this.x-this.w_2,this.y-this.w_2);};Node.prototype.redraw=function(){_ctx.beginPath();_ctx.fillStyle='rgb(255,255,255)';_ctx.fillRect(this.x-this.r,this.y-this.r,this.d,this.d);_ctx.globalAlpha=this.faded?0.15:1;if(this.opened){_ctx.fillStyle=_ecolors[this.e_color];_ctx.fillRect(this.x-this.r,this.y-this.r,this.d,this.d);} -_ctx.strokeStyle=_ecolors[this.e_color];_ctx.strokeRect(this.x-this.r,this.y-this.r,this.d,this.d);_ctx.closePath();};Node.initialized=true;} -this.init();};function checkParticulesCollisions(){if(check_parts_colid_tickw)continue;dy=na.p.position.y-nb.p.position.y;if(Math.abs(dy)>h)continue -mb=nb.p.mass;Smamb=ma+mb;if(Math.abs(dx)0){na.p.position.y+=makeup;nb.p.position.y-=makeup;}else{na.p.position.y-=makeup;nb.p.position.y+=makeup;} -newVelY1=(ma-mb)/Smamb*na.p.velocity.y+2*mb/Smamb*nb.p.velocity.y;newVelY2=(mb-ma)/Smamb*nb.p.velocity.y+2*ma/Smamb*na.p.velocity.y;na.p.velocity.y=newVelY1;nb.p.velocity.y=newVelY2;}else{makeup=(w-Math.abs(dx))/2;if(dx>0){na.p.position.x+=makeup;nb.p.position.x-=makeup;}else{na.p.position.x-=makeup;nb.p.position.x+=makeup;} -newVelX1=(ma-mb)/Smamb*na.p.velocity.x+2*mb/Smamb*nb.p.velocity.x;newVelX2=(mb-ma)/Smamb*nb.p.velocity.x+2*ma/Smamb*na.p.velocity.x;na.p.velocity.x=newVelX1;nb.p.velocity.x=newVelX2;} -na.p.velocity.multiplyScalar(0.90);nb.p.velocity.multiplyScalar(0.90);}}};function openNodeByNid(nid){closeNode();if(typeof _nodes_Nid_Id[nid]!='undefined'){_node_opened_id=_nodes_Nid_Id[nid];_nodes[_nodes_Nid_Id[nid]].open();}} -function closeNode(){if(_node_opened_id!=-1){_nodes[_node_opened_id].close();_node_opened_id=-1;}} -function createNodesRepulsions(){purgeNodesRepulsions();for(var n=0;n<_nodes_centered.length;n++){for(var q=n+1;q<_nodes_centered.length;q++){_physics.makeAttraction(_nodes_centered[n].p,_nodes_centered[q].p,-0.4,10);}}};function purgeNodesRepulsions(){for(var a=_physics.attractions.length-1;a>=0;a--){if(Math.abs(_physics.attractions[a].constant)<1){_physics.attractions.splice(a,1);}else{break;}}};function moveEvolutionZone(l,r){var left=l||0;var right=r||0;_evolution_zone.left=Math.max(_scene_props.width/5,left+20);_evolution_zone.right=Math.min(_scene_props.width-_scene_props.width/5,_scene_props.width-right+20);_evolution_zone.center=_evolution_zone.left+(_evolution_zone.right-_evolution_zone.left)/2;resizePhysics();} -function updateRandomPlaylist(p){_$canvas.trigger({type:'update-random-playlist',playlist:p})};function toggleEntree(tid,bubbling){var $link=_$entrees_block_termlinks.filter('[tid="'+tid+'"]');var $li=$link.parents('li');var sys_path=$link.attr('data-drupal-link-system-path');var url=$link.attr('href');var title=$link.text();if(!$li.is('.opened')){_$entrees_block_termlinks.parents('li').removeClass('opened');$li.addClass('opened');$li.parents('.item-list').addClass('opened') -filterEntree(tid);if(bubbling){_$body.trigger({'type':'open_entree','tid':tid,'url':url,'sys_path':sys_path,'title':title});}}else if(bubbling){$li.removeClass('opened');$li.parents('.item-list').removeClass('opened') -scrambleCollection();_$body.trigger({'type':'close_entree','tid':tid});}};function filterEntree(t){shutDownArticles();_nodes_centered=[];for(var n=0;n<_nodes.length;n++){if(_nodes[n].entrees.indexOf(t)==-1){_nodes[n].setAside();}else{_nodes[n].setCenteredOnEntree(t);_nodes_centered.push(_nodes[n]);}} -updateRandomPlaylist(_nodes_centered);createNodesRepulsions();};function highlightEntries(){_$entrees_block_termlinks.parents('li').removeClass('highlighted').parents('.item-list').removeClass('highlighted');var id=-1;if(_node_hover_id!=-1){id=_node_hover_id;}else if(_node_opened_id!=-1){id=_node_opened_id;} -var entree;if(id!=-1){for(var i=0;i<_nodes[id].entrees.length;i++){entree=_nodes[id].entrees[i];_$entrees_block_termlinks.filter(function(){return $(this).attr('tid')==entree;}).parents('li').addClass('highlighted').parents('.item-list').addClass('highlighted');}}};function filterByNids(nids){shutDownArticles();_nodes_centered=[];for(var n=0;n<_nodes.length;n++){if(nids.indexOf(_nodes[n].nid)==-1){_nodes[n].setAside();}else{_nodes[n].setCentered();_nodes_centered.push(_nodes[n]);}} -updateRandomPlaylist(_nodes_centered);createNodesRepulsions();};function scrambleCollection(){for(var i=0;i<_nodes.length;i++){_nodes[i].scramble();} -updateRandomPlaylist(_playlist);};function closeAllEntries(){_$entrees_block_termlinks.each(function(index,el){if($(this).parents('li').is('.opened')){$(this).trigger('click');return false;}});};function initArtilesLink(){_$articles_link=$('').html('Articles').attr("href","#articles").addClass('articles-link').on('click',onCLickedOnArticles);$('.item-list ul',_$entrees_block).append($('
  • ').append($('').append(_$articles_link)));};function onCLickedOnArticles(e){e.preventDefault();$(this).toggleClass('is-active');if($(this).is('.is-active')){activateArticlesFilter();closeAllEntries();}else{deactivateArticlesFilter();} -return false;};function activateArticlesFilter(){_articles_filter_on=true;for(var i=0;i<_no_articles_nodes.length;i++){_no_articles_nodes[i].fade();} -updateRandomPlaylist(_articles_nodes);if(typeof _paq!=='undefined'){_paq.push(['trackEvent','Corpus Articles','on']);}};function deactivateArticlesFilter(){_articles_filter_on=false;for(var i=0;i<_no_articles_nodes.length;i++){_no_articles_nodes[i].unFade();} -updateRandomPlaylist(_playlist);if(typeof _paq!=='undefined'){_paq.push(['trackEvent','Corpus Articles','off']);}};function shutDownArticles(){if(_$articles_link.is('.is-active')) -_$articles_link.trigger('click');};function initEvents(){void 0;_$canvas.on('mousemove',function(event){event.preventDefault();_m_pos.x=event.originalEvent.clientX;_m_pos.y=event.originalEvent.clientY;}).on('mouseenter',function(event){_mouse_in=true;}).on('mouseout',function(event){_mouse_in=false;_node_pop_up.removeNode();}).on('click',function(event){if(event.target.tagName!="A"&&event.target.tagName!="INPUT"){event.preventDefault();if(_node_hover_id!=-1){var event={'type':'corpus-cliked-on-node','target_node':_nodes[_node_hover_id],'article':_articles_filter_on};_$canvas.trigger(event);}else{_$canvas.trigger('corpus-cliked-on-map');shutDownArticles();}}}).on('mouseover-audio-link',function(e){void 0;_nodes_by_nid[e.nid].setHover();}).on('mouseout-audio-link',function(e){void 0;_nodes_by_nid[e.nid].unsetHover();}).on('audio-node-opened',function(e){openNodeByNid(e.nid);}).on('audio-node-closed',function(e){closeNode();}).on('open-entree',function(e){toggleEntree(e.tid);}).on('close-all-entree',function(e){closeAllEntries();}).on('scramble-collection',function(e){void 0;scrambleCollection();});_$entrees_block_termlinks.on('click',function(event){event.preventDefault();toggleEntree($(this).attr('tid'),true);return false;});_$body.on('chutier-action-done',function(e){_nodes_by_nid[e.target_id].chutier_action=e.new_action;}).on('ajax-node-loaded-linked-documents',function(e){void 0;filterByNids(e.nids);}).on('search-results-loaded',function(e){filterByNids(e.results);}).on('search-closed',function(e){scrambleCollection();}).on('new-content-not-entree-ajax-loaded',function(e){if(_$entrees_block_termlinks.parents('li.opened').length){_$entrees_block_termlinks.parents('li').removeClass('opened').parents('.item-list').removeClass('opened');scrambleCollection();}}).on('visible-space-changed',function(e){moveEvolutionZone(e.left_limit,e.right_limit);});};function checkPreOpenedEntry(){_$entrees_block.find('li.entree').each(function(index,el){var $li=$(this);if($('a.is-active',$li).length){$li.addClass('opened').parents('.item-list').addClass('opened');filterEntree($li.attr('tid'));return false;}});};function initNodePopup(){_node_pop_up=new NodePopUp();};function NodePopUp(){this.visible=false;this.node;this.$dom=$('
    ').addClass('node-popup').attr('pos','top-right').appendTo('body');this.$content=$('
    ').addClass('inner').appendTo(this.$dom);if(typeof NodePopUp.initialized=="undefined"){NodePopUp.prototype.setNode=function(n){this.node=n;this.setPositioning();this.setContent();};NodePopUp.prototype.setPositioning=function(){switch(true){case this.node.x>this.node.wall_limits.right-350&&this.node.ythis.node.wall_limits.right-350:this.$dom.attr('pos','top-left');break;case this.node.y').addClass('entrees');for(var i=0;i').addClass('entree').attr('tid',tid));} -var $chutier_action=$('').addClass('chutier-icon').attr('action',this.node.chutier_action);this.$content.append($entrees).append('

    '+this.node.title+'

    ').append('
    '+this.node.description+'
    ').append($chutier_action);};NodePopUp.prototype.removeNode=function(){this.node=false;};NodePopUp.prototype.draw=function(){if(this.node){this.$dom.css({'display':"block",'left':this.node.x+"px",'top':this.node.y+"px",});}else{this.$dom.css({'display':"none",});}};NodePopUp.initialized=true;}} -function render(){_ctx.clearRect(0,0,_scene_props.width,_scene_props.height);checkParticulesCollisions();for(var i=0;i<_nodes.length;i++){_nodes[i].onUpdate();} -_node_pop_up.draw();if(_node_hover_id!=-1){_canvas.style.cursor='pointer';}else{_canvas.style.cursor='auto';} -highlightEntries();};function startAnime(){_physics.onUpdate(render);_physics.play() -$('body').attr('corpus','map-ready').trigger({'type':'corpus-map-ready','playlist':_playlist});};init();} -$(document).ready(function($){if(drupalSettings.path.isFront&&!edlp_mobile.device_is_mobile){var edlpcorpus=new EdlpCorpus();}});})(jQuery,Drupal,drupalSettings); \ No newline at end of file +// JS performance improvement http://archive.oreilly.com/pub/a/server-administration/excerpts/even-faster-websites/writing-efficient-javascript.html + +/** + * depends on : + * physics.js : http://jonobr1.com/Physics/# + */ + +(function($, Drupal, drupalSettings) { + + EdlpCorpus = function(){ + var _activated = true; + var _$body = $('body'); + var _$container = _$body; + var _$canvas = $('').appendTo(_$container); + var _canvas = _$canvas[0]; + var _ctx = _canvas.getContext('2d'); + var _dpi = window.devicePixelRatio; + var _scene_props = { + width:window.innerWidth, + height:window.innerHeight, + // 'margin_top':90, // with red border on head + 'margin_top':75, // without red border on head + // 'margin_top':0, + 'margin_right':0, + 'margin_bottom':65, + // 'margin_bottom':0, + 'margin_left':0 + }; + var _evolution_zone = { + left:_scene_props.width/4, + right:_scene_props.width - _scene_props.width/4, + center:_scene_props.width/2, + }; + + var _physics = new Physics(); + var _nodes = []; + var _articles_nodes = []; + var _no_articles_nodes = []; + var _articles_filter_on = false; + var _nodes_by_entries = {}; + var _nodes_by_nid = {}; + var _nodes_Nid_Id = {}; + var _nodes_centered = []; + var _nodes_centered_attractions = []; + + var _loaded = false; + + var _playlist = []; + + var _p_velocity_factor = 0.5; + var _mouse_in = true; + var _m_pos = {x:0, y:0}; + var _node_hover_id = -1; + var _node_opened_id = -1; + var _$entrees_block = $('#block-edlpentreesblock'); + var _$entrees_block_termlinks = $('a.term-link', _$entrees_block); + var _$articles_link; + var _node_pop_up; + // Colors depend on drupalSettings loaded by edlp_corpus.module + var _settings = drupalSettings.edlp_corpus; + var _ecolors = _settings.colors; + // Physics + var _attracter; + + var check_parts_colid_frq = 2; + var check_parts_colid_tick = 1; + + // ____ _ __ + // / _/___ (_) /______ + // / // __ \/ / __/ ___/ + // _/ // / / / / /_(__ ) + // /___/_/ /_/_/\__/____/ + function init(){ + initCanvas(); + if(_activated){ + loadCorpus(); + }else{ + _$canvas.addClass('de-activated'); + } + }; + + // ___ + // / __|__ _ _ ___ ____ _ ___ + // | (__/ _` | ' \ V / _` (_-< + // \___\__,_|_||_\_/\__,_/__/ + function initCanvas(){ + // resize the canvas to fill browser window dynamically + window.addEventListener('resize', onResizeCanvas, false); + onResizeCanvas(); + }; + function onResizeCanvas() { + // _dpi = 2; + _scene_props.width = window.innerWidth; + _scene_props.height = window.innerHeight; + _canvas.style.width = _scene_props.width+'px'; + _canvas.style.height = _scene_props.height+'px'; + _canvas.width = _scene_props.width*_dpi; + _canvas.height = _scene_props.height*_dpi; + _ctx.scale(_dpi, _dpi); + + moveEvolutionZone(); + + if(_loaded){ + for (var i = 0; i < _nodes.length; i++) { + _nodes[i].onResizeCanvas(); + } + // move _attracter and _repulser to their right places again + // moveEvolutionZone() will trigger resizePhysics() + // resizePhysics(); + } + + }; + + // ___ + // / __|___ _ _ _ __ _ _ ___ + // | (__/ _ \ '_| '_ \ || (_-< + // \___\___/_| | .__/\_,_/__/ + // |_| + function loadCorpus(){ + // console.log('drupalSettings',drupalSettings); + // console.log('window.location', window.location); + // var path = window.location.origin + drupalSettings.basepath + "edlp/corpus"; + var ajax_path = _settings.load_corpus_ajax_url; + var path = window.location.origin + Drupal.url(ajax_path); + $.getJSON(path, {}) + .done(function(data){ + onCorpusLoaded(data); + }) + .fail(function(jqxhr, textStatus, error){ + onCorpusLoadError(jqxhr, textStatus, error); + }); + }; + function onCorpusLoadError(jqxhr, textStatus, error){ + console.warn('corpus load failed', jqxhr.responseText); + }; + function onCorpusLoaded(data){ + console.log('corpus loaded : data', data); + // console.log('first node', data.nodes[0]); + // buildParticles(data.nodes); + initPhysics(); + buildNodes(data.nodes); + initArtilesLink(); + initNodePopup(); + initEvents(); + checkPreOpenedEntry(); + startAnime(); + _loaded = true; + }; + + // ___ _ _ + // | _ \ |_ _ _ __(_)__ ___ + // | _/ ' \ || (_-< / _(_-< + // |_| |_||_\_, /__/_\__/__/ + // |__/ + function initPhysics(){ + _attracter = _physics.makeParticle(1000); + _attracter.fixed = true; + // move _attracter on window resize + resizePhysics(); + }; + function resizePhysics(){ + // attracters + if(typeof _attracter != 'undefined'){ + _attracter.position = {x:_evolution_zone.center, y:_scene_props.height/2}; + } + }; + + // _ _ _ + // | \| |___ __| |___ ___ + // | .` / _ \/ _` / -_|_-< + // |_|\_\___/\__,_\___/__/ + function buildNodes(nodes){ + // console.log("buildNodes", nodes); + var d; + for (var i in nodes) { + d = i < 1 ? true : false; + // _nodes.push(new Node(i,nodes[i],d)); + new Node(i,nodes[i],d); + + _playlist.push({ + 'id':i, + 'nid':nodes[i].nid, + 'audio_url':nodes[i].audio_url + }); + } + }; + + function Node(i,node,d){ + this.id = i; + for(key in node) + this[key] = node[key]; + + // record the node in different lists + _nodes.push(this); + + _nodes_by_nid[this.nid] = this; + _nodes_Nid_Id[this.nid] = this.id; + + if(this.has_article == 1){ + _articles_nodes.push(this); + }else{ + _no_articles_nodes.push(this); + } + + for (var j = 0; j < this.entrees.length; j++) { + if(typeof _nodes_by_entries[this.entrees[j]] == 'undefined') + _nodes_by_entries[this.entrees[j]] = []; + + _nodes_by_entries[this.entrees[j]].push(this); + } + + this.debug = d; + this.mass = Math.max(1, this.entrees.length); //1; + this.velocity_threshold = 0.01; + // define radius regarding entries length + switch(true){ + case this.entrees.length > 3: + this.r = 8;//10; + break; + case this.entrees.length > 1 && this.entrees.length <= 3: + this.r = 5;//7; + break; + default: + this.r = 3;//4; + break; + } + this.d = this.r*2; + + this.e_color = 'e_col_'+this.entrees[Math.floor(Math.random(this.entrees.length))]; + + // pre-rendering node virtual canvas + this.canvas = document.createElement('canvas'); + this.canvas_ctx = this.canvas.getContext('2d'); + this.line_width = 1; + this.w = this.r*2+this.line_width*2; + this.w_2 = this.w/2; + this.canvas.width = this.w; + this.canvas.height = this.w; + this.canvas_ctx.fillStyle = 'rgb(255,255,255)'; + this.canvas_ctx.lineWidth = this.line_width; + + this.wall_bouncing_elasticity = 0.75; + + // node states + this.hover = false; + this.opened = false; + this.faded = false; + this.center = false; + this.aside = false; + this.scrambling = false; + + // prototypes + if (typeof Node.initialized == "undefined") { + + Node.prototype.init = function(){ + this.calcWallLimits(); + + this.x = this.wall_limits.left + Math.random()*(this.wall_limits.right - this.wall_limits.left); + this.y = this.wall_limits.top + Math.random()*(this.wall_limits.bottom - this.wall_limits.top); + + this.ori_pos = {x:this.x,y:this.y}; + // TODO: don't forget to move ori_pos on window resize + + //this.drawSprite(); + this.initPhysics(); + }; + + // Node.prototype.drawSprite = function(){ + // _ctx.clearRect(0, 0, this.w, this.w); + // + // this.canvas_ctx.beginPath(); + // // white background + // this.canvas_ctx.fillRect(0,0,this.w,this.w); + // + // this.canvas_ctx.globalAlpha = this.faded ? 0.15 : 1; + // + // if(this.opened){ + // // carre plein + // // this.canvas_ctx.lineWidth = '1px'; + // // this.canvas_ctx.strokeStyle = 'rgb(255,0,0)'; + // // this.canvas_ctx.strokeRect(this.x - this.r-3,this.y - this.r-3,this.r*2+6,this.r*2+6); + // // ou carre contour + // this.canvas_ctx.save(); // save the normal context state (fill white) + // this.canvas_ctx.fillStyle = _ecolors[this.e_color]; + // this.canvas_ctx.fillRect(this.line_width,this.line_width,this.d,this.d); + // this.canvas_ctx.restore(); // restore the normal context state (fill white) + // } + // // else{ + // // // carre plein + // // // this.canvas_ctx.fillStyle = _ecolors[this.e_color]; + // // // this.canvas_ctx.fillRect(this.x - this.r,this.y - this.r,this.d,this.d); + // // // ou carre contour + // // this.canvas_ctx.fillRect(this.line_width,this.line_width,this.d,this.d); + // // } + // this.canvas_ctx.strokeStyle = _ecolors[this.e_color]; + // this.canvas_ctx.strokeRect(this.line_width,this.line_width,this.d,this.d); + // // this.canvas_ctx.globalAlpha = 1; + // this.canvas_ctx.closePath(); + // }; + + Node.prototype.initPhysics = function(){ + // particule + this.p = _physics.makeParticle(this.mass, this.x, this.y); + this.p.velocity = new Physics.Vector((Math.random()-0.5)*_p_velocity_factor, (Math.random()-0.5)*_p_velocity_factor); + // origin position particule + this.ori_p = _physics.makeParticle(1000, this.ori_pos.x, this.ori_pos.y); + this.ori_p.fixed = true; + // TODO: don't forget to move ori_p on window resize + this.ori_p_attract = _physics.makeAttraction(this.ori_p, this.p, 1000, _scene_props.width*2); + this.ori_p_attract.on = false; + // attracter + this.attract = _physics.makeAttraction(_attracter, this.p, 1000, _scene_props.width*2); + this.attract.on = false; + }; + + Node.prototype.calcWallLimits = function(){ + this.wall_limits = { + top: _scene_props.margin_top +this.r, + right: _scene_props.width -_scene_props.margin_right -this.r, + bottom: _scene_props.height -_scene_props.margin_bottom -this.r, + left: _scene_props.margin_left +this.r + } + }; + + Node.prototype.onResizeCanvas = function(){ + this.calcWallLimits(); + // TODO: scramble only if not aside or centered + this.shuffleOriP(); + }; + + Node.prototype.shuffleOriP = function(){ + this.ori_pos.x = this.wall_limits.left + Math.random()*(this.wall_limits.right - this.wall_limits.left); + this.ori_pos.y = this.wall_limits.top + Math.random()*(this.wall_limits.bottom - this.wall_limits.top); + this.scramble(); + }; + + Node.prototype.onUpdate = function(){ + + // this.p.velocity.multiplyScalar(0.99); + if(this.hover || this.opened){ + this.p.fixed = true; + }else{ + this.p.fixed = false; + + if(this.center) + this.limitEvolutionZone(); + + // if(!this.p.resting()){ + // this.checkVelocityThreshold(); + this.checkWallBouncing(); + this.updatePos(); + if(this.scrambling){ + this.checkOriPDist(); + } + // } + } + + if(_mouse_in && !this.aside && !this.faded) + this.checkMouse(); + + // this.move(); + this.redraw(); + }; + + Node.prototype.checkVelocityThreshold = function(){ + if(!this.centered || !this.aside){ + if (Math.abs(this.p.velocity.x) < this.velocity_threshold + && Math.abs(this.p.velocity.y) < this.velocity_threshold){ + this.p.velocity.multiplyScalar(0); + // this.p.makeFixed(); + } + } + }; + + Node.prototype.checkWallBouncing = function(){ + switch(true){ + case this.x < this.wall_limits.left && this.p.velocity.x < 0: + this.p.position.x = this.wall_limits.left; + this.p.velocity + .multiplyScalarXY(-1, 1) + .multiplyScalar(this.wall_bouncing_elasticity); + break; + case this.x > this.wall_limits.right && this.p.velocity.x > 0: + this.p.position.x = this.wall_limits.right; + this.p.velocity + .multiplyScalarXY(-1, 1) + .multiplyScalar(this.wall_bouncing_elasticity); + break; + case this.y < this.wall_limits.top && this.p.velocity.y < 0 : + this.p.position.y = this.wall_limits.top; + this.p.velocity + .multiplyScalarXY(1,-1) + .multiplyScalar(this.wall_bouncing_elasticity); + break; + case this.y > this.wall_limits.bottom && this.p.velocity.y > 0 : + this.p.position.y = this.wall_limits.bottom; + this.p.velocity + .multiplyScalarXY(1,-1) + .multiplyScalar(this.wall_bouncing_elasticity); + break; + } + }; + + Node.prototype.updatePos = function(){ + this.x = this.p.position.x; + this.y = this.p.position.y; + }; + + Node.prototype.checkMouse = function(){ + + if( _m_pos.x > this.x - this.r + && _m_pos.x < this.x + this.r + && _m_pos.y > this.y - this.r + && _m_pos.y < this.y + this.r){ + if(_node_hover_id == -1 || _node_hover_id !== this.id){ + // console.log("Node hover", this.id); + this.setHover(); + } + }else{ + this.unsetHover(); + } + }; + + Node.prototype.setHover = function(){ + this.hover = true; + _node_hover_id = this.id; + _node_pop_up.setNode(this); + }; + Node.prototype.unsetHover = function(){ + this.hover = false; + if (_node_hover_id == this.id) { + _node_hover_id = -1; + _node_pop_up.removeNode(); + } + }; + + Node.prototype.open = function(){ + this.opened = true; + _node_opened_id = this.id; + //this.drawSprite(); + }; + Node.prototype.close = function(){ + this.opened = false; + //this.drawSprite(); + }; + + Node.prototype.fade = function(){ + this.faded = true; + //this.drawSprite(); + }; + Node.prototype.unFade = function(){ + this.faded = false; + //this.drawSprite(); + }; + + Node.prototype.setCenteredOnEntree = function(tid){ + this.e_color = 'e_col_'+tid; + this.setCentered(); + }; + + Node.prototype.setCentered = function(){ + this.center = true; + this.stopScrambling(); + this.unsetAside(); + this.attract.on = true; + //this.drawSprite(); + } + Node.prototype.unsetCentered = function(){ + this.center = false; + this.attract.on = false; + } + + Node.prototype.limitEvolutionZone = function(){ + // smouthly slow down node near center + // if(this.id == 1) + // console.log('this.p.velocity', this.p.velocity); + this.dist_to_attracter = this.p.distanceTo(_attracter); + if( this.dist_to_attracter < _scene_props.width/4){ + if( this.p.velocity.length() > 0.4 ){ + this.p.velocity.multiplyScalar(0.99); // 0.995 + } + } + // limit evolution zone + // if( Math.abs(_attracter.position.x - this.x) > _scene_props.width/4 + // || Math.abs(_attracter.position.y - this.y) > _scene_props.height/4){ + if( this.x < _evolution_zone.left || this.x > _evolution_zone.right + || Math.abs(_attracter.position.y - this.y) > _scene_props.height/4){ + this.attract.on = true; + }else{ + this.attract.on = false; + } + } + + Node.prototype.setAside = function(){ + this.aside = true; + // this.fade(); + this.stopScrambling(); + this.unsetCentered(); + this.ori_p.position.x = this.x < _scene_props.width /2 ? this.wall_limits.left : this.wall_limits.right; + this.ori_p_attract.on = true; + this.wall_bouncing_elasticity = 0.15; + } + Node.prototype.unsetAside = function(){ + // console.log('unsetAside'); + this.aside = false; + this.ori_p_attract.on = false; + this.ori_p.position.x = this.ori_pos.x; + this.wall_bouncing_elasticity = 0.75; + // this.unFade(); + } + + Node.prototype.resolveNormalPos = function(){ + // console.log("resolveNormalPos"); + switch(true){ + case this.center: + this.unsetCentered(); + break; + case this.aside: + this.unsetAside(); + break; + } + }; + + Node.prototype.scramble = function(){ + this.scrambling = true; + this.unsetCentered(); + this.unsetAside(); + this.ori_p.position.x = this.ori_pos.x; + this.ori_p.position.y = this.ori_pos.y; + this.ori_p_attract.on = true; + } + Node.prototype.checkOriPDist = function(){ + if(this.p.distanceTo(this.ori_p) < 50){ + this.stopScrambling(); + } + }; + Node.prototype.stopScrambling = function(){ + this.scrambling = false; + this.ori_p_attract.on = false; + // this.scramble_TL.on = false; + // this.scramble_TR.on = false; + // this.scramble_BR.on = false; + // this.scramble_BL.on = false; + // this.scramble_CR.on = false; + // this.scramble_CL.on = false; + } + + Node.prototype.move = function(){ + // just draw the virtual node canvas into the main scene canvas at the right position + _ctx.drawImage(this.canvas, this.x-this.w_2, this.y-this.w_2); + }; + + Node.prototype.redraw = function(){ + _ctx.beginPath(); + // white background + _ctx.fillStyle = 'rgb(255,255,255)'; + _ctx.fillRect(this.x-this.r,this.y-this.r,this.d,this.d); + + _ctx.globalAlpha = this.faded ? 0.15 : 1; + + if(this.opened){ + // carre plein + // _ctx.lineWidth = '1px'; + // _ctx.strokeStyle = 'rgb(255,0,0)'; + // _ctx.strokeRect(this.x - this.r-3,this.y - this.r-3,this.r*2+6,this.r*2+6); + // ou carre contour + // _ctx.save(); // save the normal context state (fill white) + _ctx.fillStyle = _ecolors[this.e_color]; + _ctx.fillRect(this.x-this.r,this.y-this.r,this.d,this.d); + // _ctx.restore(); // restore the normal context state (fill white) + } + // else{ + // // carre plein + // // _ctx.fillStyle = _ecolors[this.e_color]; + // // _ctx.fillRect(this.x - this.r,this.y - this.r,this.d,this.d); + // // ou carre contour + // _ctx.fillRect(this.line_width,this.line_width,this.d,this.d); + // } + _ctx.strokeStyle = _ecolors[this.e_color]; + _ctx.strokeRect(this.x-this.r,this.y-this.r,this.d,this.d); + // _ctx.globalAlpha = 1; + _ctx.closePath(); + }; + + Node.initialized = true; + } + + this.init(); + }; + + // TODO: we may convert a lot of computation into a web worker + // https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers + function checkParticulesCollisions(){ + + // do not run particule collision every frames + if(check_parts_colid_tick < check_parts_colid_frq){ + check_parts_colid_tick++; + return; + } + check_parts_colid_tick = 1; + + // pre create vars to save memory; + var na,nb, + ma,mb, + w,h,dx,dy, + makeup, + newVelX1, newVelY1, newVelX2, newVelY2, + Smamb; + // , angle; + // colisions between _particules + for (var n = 0, l = _nodes.length; n < l; n++) { + na = _nodes[n]; + // avoid colliding for scrambling nodes + // avoid colliding for aside nodes + // avoid colliding for centered nodes + if(na.scrambling || na.aside || na.center) continue; + + ma = na.p.mass; + + for (var q = n+1; q < l; q++) { + nb = _nodes[q]; + // avoid impact between center and aside particules + // if((na.center && nb.aside) || (na.aside && nb.center)) + // and between aside particules + if(nb.aside) + continue; + + + // avoid impact between two centered particulses that comes to the center + // if(na.center && nb.center){ + // if(Math.min(na.p.distanceTo(_attracter), nb.p.distanceTo(_attracter)) > 300){ + // if( Math.random()>0.3 ) continue; + // } + // } + + w = h = (na.r+nb.r); + // if(!na.aside && !nb.aside){ + w = h += 4; // add a saftey zone around squares eccept for aside squares + // } + + // if both dx and dy are inferior to w & h so squares are colliding (overlapping) + // if( Math.abs(dx) <= w && Math.abs(dy) <= h){ console.log('colliding'); } + // else not so skip + // if( Math.abs(dx) > w || Math.abs(dy) > h) continue; + dx = na.p.position.x - nb.p.position.x; + if( Math.abs(dx) > w ) continue; + dy = na.p.position.y - nb.p.position.y; + if(Math.abs(dy) > h) continue + + mb = nb.p.mass; + Smamb = ma+mb; + if(Math.abs(dx) < Math.abs(dy)){ // vertical collision + makeup = (h - Math.abs(dy))/2; + if(dy > 0){ // a is upper than b + na.p.position.y += makeup; + nb.p.position.y -= makeup; + }else{ // b is upper than a + na.p.position.y -= makeup; + nb.p.position.y += makeup; + } + // bounce + // https://en.wikipedia.org/wiki/Elastic_collision#One-dimensional_Newtonian + newVelY1 = (ma-mb)/Smamb*na.p.velocity.y+2*mb/Smamb*nb.p.velocity.y; + newVelY2 = (mb-ma)/Smamb*nb.p.velocity.y+2*ma/Smamb*na.p.velocity.y; + + na.p.velocity.y = newVelY1; + nb.p.velocity.y = newVelY2; + + }else{ // horizontal collision + makeup = (w - Math.abs(dx))/2; + if(dx > 0){ // a is at left of b + na.p.position.x += makeup; + nb.p.position.x -= makeup; + }else{ // b is at left of a + na.p.position.x -= makeup; + nb.p.position.x += makeup; + } + // bounce + // https://en.wikipedia.org/wiki/Elastic_collision#One-dimensional_Newtonian + newVelX1 = (ma-mb)/Smamb*na.p.velocity.x+2*mb/Smamb*nb.p.velocity.x; + newVelX2 = (mb-ma)/Smamb*nb.p.velocity.x+2*ma/Smamb*na.p.velocity.x; + + na.p.velocity.x = newVelX1; + nb.p.velocity.x = newVelX2; + } + + // slow down particule on impact + // na.p.velocity.multiplyScalar(na.center && na.p.velocity.length() < 1 ? 1.1 : 0.90); + // nb.p.velocity.multiplyScalar(nb.center && nb.p.velocity.length() < 1 ? 1.1 : 0.90); + na.p.velocity.multiplyScalar(0.90); + nb.p.velocity.multiplyScalar(0.90); + + } + } + }; + // show opened audio node + function openNodeByNid(nid){ + // console.log('Corpus openNode()', nid); + closeNode(); + if(typeof _nodes_Nid_Id[nid] != 'undefined'){ + // console.log('node exists'); + _node_opened_id = _nodes_Nid_Id[nid]; + _nodes[_nodes_Nid_Id[nid]].open(); + } + } + function closeNode(){ + if(_node_opened_id != -1){ + // if(typeof _nodes[_node_opened_id] !== 'undefined'){ + _nodes[_node_opened_id].close(); + // } + _node_opened_id = -1; + } + } + function createNodesRepulsions(){ + // how to delete all these attractions before creates new once + //console.log('_nodes_centered', _nodes_centered); + purgeNodesRepulsions(); + for (var n = 0; n < _nodes_centered.length; n++) { + for (var q = n+1; q < _nodes_centered.length; q++) { + _physics.makeAttraction(_nodes_centered[n].p, _nodes_centered[q].p, -0.4, 10); + } + } + }; + function purgeNodesRepulsions(){ + // console.log('_physics.attractions.length', _physics.attractions.length); + for (var a = _physics.attractions.length-1; a >= 0; a--) { + // assuming that only nodes repulsions have constant < 1 + // and are all at the end of array + if(Math.abs(_physics.attractions[a].constant) < 1){ + _physics.attractions.splice(a,1); + }else{ + break; + } + } + // console.log('_physics.attractions.length', _physics.attractions.length); + }; + + + + + // ___ _ _ _ ____ + // | __|_ _____| |_ _| |_(_)___ _ _ |_ /___ _ _ ___ + // | _|\ V / _ \ | || | _| / _ \ ' \ / // _ \ ' \/ -_) + // |___|\_/\___/_|\_,_|\__|_\___/_||_| /___\___/_||_\___| + function moveEvolutionZone(l, r){ + var left = l || 0; + var right = r || 0; + _evolution_zone.left = Math.max(_scene_props.width/5, left+20); + _evolution_zone.right = Math.min(_scene_props.width - _scene_props.width/5, _scene_props.width-right+20); + _evolution_zone.center = _evolution_zone.left + (_evolution_zone.right - _evolution_zone.left)/2; + // move _attracter to the center of the zone + resizePhysics(); + } + + // ___ _ ___ _ _ _ _ + // | _ \__ _ _ _ __| |___ _ __ | _ \ |__ _ _ _| (_)__| |_ + // | / _` | ' \/ _` / _ \ ' \ | _/ / _` | || | | (_-< _| + // |_|_\__,_|_||_\__,_\___/_|_|_| |_| |_\__,_|\_, |_|_/__/\__| + // |__/ + function updateRandomPlaylist(p){ + _$canvas.trigger({ + type:'update-random-playlist', + playlist:p + }) + }; + + // ___ _ + // | __|_ _| |_ _ _ ___ ___ ___ + // | _|| ' \ _| '_/ -_) -_|_-< + // |___|_||_\__|_| \___\___/__/ + function toggleEntree(tid, bubbling){ + var $link = _$entrees_block_termlinks.filter('[tid="'+tid+'"]'); + var $li = $link.parents('li'); + var sys_path = $link.attr('data-drupal-link-system-path'); + var url = $link.attr('href'); + var title = $link.text(); + if(!$li.is('.opened')){ + _$entrees_block_termlinks.parents('li').removeClass('opened'); + $li.addClass('opened'); + $li.parents('.item-list').addClass('opened') + filterEntree(tid); + if(bubbling){ + _$body.trigger({ + 'type':'open_entree', + 'tid':tid, + 'url':url, + 'sys_path':sys_path, + 'title':title + }); + } + // bubbling is true only when event is a real click on entree link + }else if(bubbling){ + $li.removeClass('opened'); + $li.parents('.item-list').removeClass('opened') + scrambleCollection(); + _$body.trigger({'type':'close_entree', 'tid':tid}); + } + }; + function filterEntree(t){ + shutDownArticles(); + + _nodes_centered = []; + for (var n = 0; n < _nodes.length; n++) { + if(_nodes[n].entrees.indexOf(t) == -1){ + _nodes[n].setAside(); + }else{ + _nodes[n].setCenteredOnEntree(t); + // record centered nodes for inter node repulsions + _nodes_centered.push(_nodes[n]); + } + } + updateRandomPlaylist(_nodes_centered); + createNodesRepulsions(); + }; + function highlightEntries(){ + _$entrees_block_termlinks + .parents('li').removeClass('highlighted') + .parents('.item-list').removeClass('highlighted'); + var id = -1; + if(_node_hover_id != -1){ + id = _node_hover_id; + }else if(_node_opened_id != -1){ + id = _node_opened_id; + } + var entree; + if(id != -1){ + for (var i = 0; i < _nodes[id].entrees.length; i++) { + entree = _nodes[id].entrees[i]; + _$entrees_block_termlinks.filter(function(){ + return $(this).attr('tid') == entree; + }).parents('li').addClass('highlighted') + .parents('.item-list').addClass('highlighted'); + } + } + }; + + // ___ _ + // / __| ___ __ _ _ _ __| |_ + // \__ \/ -_) _` | '_/ _| ' \ + // |___/\___\__,_|_| \__|_||_| + // and ajax modal content filtering + function filterByNids(nids){ + shutDownArticles(); + + _nodes_centered = []; + for (var n = 0; n < _nodes.length; n++) { + if(nids.indexOf(_nodes[n].nid) == -1){ + _nodes[n].setAside(); + }else{ + _nodes[n].setCentered(); + // record centered nodes for inter node repulsions + _nodes_centered.push(_nodes[n]); + } + } + updateRandomPlaylist(_nodes_centered); + createNodesRepulsions(); + }; + + // ___ _ _ _ + // / __| __ _ _ __ _ _ __ | |__| (_)_ _ __ _ + // \__ \/ _| '_/ _` | ' \| '_ \ | | ' \/ _` | + // |___/\__|_| \__,_|_|_|_|_.__/_|_|_||_\__, | + // |___/ + // function resolveNormalPosAllNodes(){ + // console.log('resolveNormalPosAllNodes'); + // for (var i = 0; i < _nodes.length; i++) { + // _nodes[i].resolveNormalPos(); + // } + // }; + + function scrambleCollection(){ + // console.log('scrambleCollection'); + for (var i = 0; i < _nodes.length; i++) { + _nodes[i].scramble(); + } + updateRandomPlaylist(_playlist); + // setTimeout(stopScrambling, 2000); + // stopScrambling(); + }; + + function closeAllEntries(){ + _$entrees_block_termlinks.each(function(index, el) { + if($(this).parents('li').is('.opened')){ + $(this).trigger('click'); + return false; + } + }); + }; + + // _ _ _ _ + // /_\ _ _| |_(_)__| |___ ___ + // / _ \| '_| _| / _| / -_|_-< + // /_/ \_\_| \__|_\__|_\___/__/ + function initArtilesLink(){ + // add "articles link to blockentrees" + _$articles_link = $('
    ') + .html('Articles') + .attr("href", "#articles") + .addClass('articles-link') + .on('click', onCLickedOnArticles); + + $('.item-list ul',_$entrees_block).append( + $('
  • ').append( + $('').append(_$articles_link) + ) + ); + }; + function onCLickedOnArticles(e){ + e.preventDefault(); + $(this).toggleClass('is-active'); + if($(this).is('.is-active')){ + activateArticlesFilter(); + closeAllEntries(); + }else{ + deactivateArticlesFilter(); + } + // _$canvas.trigger({ + // 'type':'corpus-cliqued-on-articles' + // }); + return false; + }; + function activateArticlesFilter(){ + //console.log('activateArticlesFilter'); + _articles_filter_on = true; + for (var i = 0; i < _no_articles_nodes.length; i++) { + _no_articles_nodes[i].fade(); + } + updateRandomPlaylist(_articles_nodes); + if(typeof _paq !== 'undefined'){ + // trackEvent(category, action, [name], [value]) + _paq.push(['trackEvent', 'Corpus Articles', 'on']); + } + }; + function deactivateArticlesFilter(){ + //console.log('deactivateArticlesFilter'); + _articles_filter_on = false; + for (var i = 0; i < _no_articles_nodes.length; i++) { + _no_articles_nodes[i].unFade(); + } + updateRandomPlaylist(_playlist); + if(typeof _paq !== 'undefined'){ + // trackEvent(category, action, [name], [value]) + _paq.push(['trackEvent', 'Corpus Articles', 'off']); + } + }; + function shutDownArticles(){ + // shutdown articles if active + if(_$articles_link.is('.is-active')) + _$articles_link.trigger('click'); + }; + + // ___ _ + // | __|_ _____ _ _| |_ ___ + // | _|\ V / -_) ' \ _(_-< + // |___|\_/\___|_||_\__/__/ + function initEvents(){ + console.log('Corpus, initEvents'); + _$canvas + .on('mousemove', function(event) { + event.preventDefault(); + _m_pos.x = event.originalEvent.clientX; + _m_pos.y = event.originalEvent.clientY; + }) + .on('mouseenter', function(event){ + // console.log('onMouseIN'); + _mouse_in = true; + }) + .on('mouseout', function(event){ + // console.log('onMouseOUT'); + _mouse_in = false; + _node_pop_up.removeNode(); + }) + .on('click', function(event) { + if(event.target.tagName != "A" && event.target.tagName != "INPUT"){ + // console.log("Corpus : click"); + event.preventDefault(); + if(_node_hover_id != -1){ + // console.log("corpus : click on node", _nodes[_node_hover_id]); + var event = { + 'type':'corpus-cliked-on-node', + 'target_node':_nodes[_node_hover_id], + 'article':_articles_filter_on + }; + _$canvas.trigger(event); + // instead of directly opening the doc, create an event listener (e.g. : audio played from random) + // openNode(_node_hover_id); + }else{ + // console.log('corpus : click on map'); + _$canvas.trigger('corpus-cliked-on-map'); + shutDownArticles(); + } + } + }) + .on('mouseover-audio-link', function(e){ + console.log("Corpus on mouseover-audio-link", e); + // _node_hover_id = _nodes_Nid_Id[e.nid]; + // _node_pop_up.setNode(_nodes_by_nid[e.nid]); + _nodes_by_nid[e.nid].setHover(); + }) + .on('mouseout-audio-link', function(e){ + console.log("Corpus on mouseover-audio-link", e); + // _node_hover_id = -1; + // _node_pop_up.removeNode(); + _nodes_by_nid[e.nid].unsetHover(); + }) + .on('audio-node-opened', function(e){ + // console.log('Corpus audio-node-opened', e); + openNodeByNid(e.nid); + }) + .on('audio-node-closed', function(e){ + closeNode(); + }) + .on('open-entree', function(e){ + toggleEntree(e.tid); + }) + .on('close-all-entree', function(e){ + closeAllEntries(); + }) + .on('scramble-collection', function(e){ + console.log('scramble-collection', e); + // resolveNormalPosAllNodes(); + scrambleCollection(); + }); + + _$entrees_block_termlinks.on('click', function(event) { + // console.log('_$entrees_block_termlinks click', this); + event.preventDefault(); + toggleEntree($(this).attr('tid'), true); + // var $link = $(this); + // var tid = $link.attr('tid'); + // var $li = $link.parents('li'); + // var sys_path = $link.attr('data-drupal-link-system-path'); + // var url = $link.attr('href'); + // if(!$li.is('.opened')){ + // _$entrees_block_termlinks.parents('li').removeClass('opened'); + // $li.addClass('opened'); + // toggleEntree(tid); + // _$body.trigger({'type':'open_entree', 'tid':tid, 'url':url, 'sys_path':sys_path}); + // }else{ + // $li.removeClass('opened'); + // scrambleCollection(); + // _$body.trigger({'type':'close_entree', 'tid':tid}); + // } + return false; + }); + + _$body + .on('chutier-action-done', function(e) { + _nodes_by_nid[e.target_id].chutier_action = e.new_action; + }) + .on('ajax-node-loaded-linked-documents', function(e){ + console.log("Edlp Corpus, ajax-node-loaded-linked-documents",e.nids); + // filter map's nodes + filterByNids(e.nids); + }) + .on('search-results-loaded', function(e){ + //console.log("Edlp Corpus, search-results-loaded",e.results); + // filter map's nodes + filterByNids(e.results); + }) + .on('search-closed', function(e){ + scrambleCollection(); + }) + .on('new-content-not-entree-ajax-loaded', function(e){ + // close all entries only if entry already opened + // TODO: user the function close all entries ? + // closeAllEntries(); not working, is closing also the ajax loaded content + if(_$entrees_block_termlinks.parents('li.opened').length){ + _$entrees_block_termlinks + .parents('li').removeClass('opened') + .parents('.item-list').removeClass('opened'); + scrambleCollection(); + } + }) + .on('visible-space-changed', function(e){ + // limits are absolute distance from each side (not positions from left) + moveEvolutionZone(e.left_limit, e.right_limit); + }); + }; + + function checkPreOpenedEntry(){ + _$entrees_block.find('li.entree').each(function(index, el) { + var $li = $(this); + if($('a.is-active', $li).length){ + $li.addClass('opened') + .parents('.item-list').addClass('opened'); + filterEntree($li.attr('tid')); + return false; + } + }); + }; + + // _ _ _ ___ _ _ + // | \| |___ __| |___| _ \___ _ __| | | |_ __ + // | .` / _ \/ _` / -_) _/ _ \ '_ \ |_| | '_ \ + // |_|\_\___/\__,_\___|_| \___/ .__/\___/| .__/ + // |_| |_| + function initNodePopup(){ + _node_pop_up = new NodePopUp(); + }; + function NodePopUp(){ + this.visible = false; + this.node; + this.$dom = $('
    ') + .addClass('node-popup') + .attr('pos', 'top-right') + .appendTo('body'); + this.$content = $('
    ').addClass('inner').appendTo(this.$dom); + + if (typeof NodePopUp.initialized == "undefined") { + + NodePopUp.prototype.setNode = function(n){ + // console.log('NodePopUp setNode()'); + this.node = n; + // positioning NodePopUp regarding node position + this.setPositioning(); + // update NodePopUp content + this.setContent(); + }; + + NodePopUp.prototype.setPositioning = function(){ + switch(true){ + case this.node.x > this.node.wall_limits.right-350 && this.node.y < this.node.wall_limits.top+200: + this.$dom.attr('pos', 'bottom-left'); + break; + case this.node.x > this.node.wall_limits.right-350: + this.$dom.attr('pos', 'top-left'); + break; + case this.node.y < this.node.wall_limits.top+200: + this.$dom.attr('pos', 'bottom-right'); + break; + default: + this.$dom.attr('pos', 'top-right'); + } + }; + + NodePopUp.prototype.setContent = function(){ + // console.log(this.node); + this.$content.html(''); + var $entrees = $('
    ').addClass('entrees'); + for (var i = 0; i < this.node.entrees.length; i++) { + var tid = this.node.entrees[i]; + $entrees.append($('').addClass('entree').attr('tid', tid)); + } + var $chutier_action = $('').addClass('chutier-icon').attr('action', this.node.chutier_action); + this.$content + .append($entrees) + .append('

    '+this.node.title+'

    ') + .append('
    '+this.node.description+'
    ') + .append($chutier_action); + }; + + NodePopUp.prototype.removeNode = function(){ + // console.log('NodePopUp removeNode()'); + this.node = false; + }; + + NodePopUp.prototype.draw = function(){ + if(this.node){ + this.$dom.css({ + 'display':"block", + 'left':this.node.x+"px", + 'top':this.node.y+"px", + }); + }else{ + this.$dom.css({ + 'display':"none", + }); + } + }; + + NodePopUp.initialized = true; + } + } + + // ___ _ + // | _ \___ _ _ __| |___ _ _ + // | / -_) ' \/ _` / -_) '_| + // |_|_\___|_||_\__,_\___|_| + function render(){ + _ctx.clearRect(0, 0, _scene_props.width, _scene_props.height); + + checkParticulesCollisions(); + + for (var i = 0; i < _nodes.length; i++) { + _nodes[i].onUpdate(); + } + + _node_pop_up.draw(); + + if(_node_hover_id != -1){ + _canvas.style.cursor = 'pointer'; + }else{ + _canvas.style.cursor = 'auto'; + } + // check for highlighted entries + highlightEntries(); + }; + + // ___ _ _ _ _ + // / __| |_ __ _ _ _| |_ /_\ _ _ (_)_ __ ___ + // \__ \ _/ _` | '_| _|/ _ \| ' \| | ' \/ -_) + // |___/\__\__,_|_| \__/_/ \_\_||_|_|_|_|_\___| + function startAnime(){ + _physics.onUpdate(render); + _physics.play() + $('body') + .attr('corpus', 'map-ready') + .trigger({ + 'type':'corpus-map-ready', + 'playlist':_playlist + }); + }; + + init(); + } + + + $(document).ready(function($) { + if(drupalSettings.path.isFront && !edlp_mobile.device_is_mobile){ + var edlpcorpus = new EdlpCorpus(); + } + }); + +})(jQuery, Drupal, drupalSettings); diff --git a/sites/all/modules/figli/edlp_corpus/assets/dist/scripts/physics.min.js b/sites/all/modules/figli/edlp_corpus/assets/dist/scripts/physics.min.js index 8e7487968..c3ddff68c 100644 --- a/sites/all/modules/figli/edlp_corpus/assets/dist/scripts/physics.min.js +++ b/sites/all/modules/figli/edlp_corpus/assets/dist/scripts/physics.min.js @@ -1,38 +1,1153 @@ +/** + * Physics + * A requirified port of Traer Physics from Processing to JavaScript. + * Copyright (C) 2012 jonobr1 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;othis.originalPositions.length){this.originalPositions.push(new Vector());this.originalVelocities.push(new Vector());this.k1Forces.push(new Vector());this.k1Velocities.push(new Vector());this.k2Forces.push(new Vector());this.k2Velocities.push(new Vector());this.k3Forces.push(new Vector());this.k3Velocities.push(new Vector());this.k4Forces.push(new Vector());this.k4Velocities.push(new Vector());} -return this;},step:function(dt){var s=this.s;var p,x,y;this.allocateParticles();_.each(s.particles,function(p,i){if(!p.fixed){this.originalPositions[i].copy(p.position);this.originalVelocities[i].copy(p.velocity);} -p.force.clear();},this);s.applyForces();_.each(s.particles,function(p,i){if(!p.fixed){this.k1Forces[i].copy(p.force);this.k1Velocities[i].copy(p.velocity);} -p.force.clear();},this);_.each(s.particles,function(p,i){if(!p.fixed){var op=this.originalPositions[i];var k1v=this.k1Velocities[i];x=op.x+k1v.x*0.5*dt;y=op.y+k1v.y*0.5*dt;p.position.set(x,y);var ov=this.originalVelocities[i];var k1f=this.k1Forces[i];x=ov.x+k1f.x*0.5*dt/p.mass;y=ov.y+k1f.y*0.5*dt/p.mass;p.velocity.set(x,y);}},this);s.applyForces();_.each(s.particles,function(p,i){if(!p.fixed){this.k2Forces[i].copy(p.force);this.k2Velocities[i].copy(p.velocity);} -p.force.clear();},this);_.each(s.particles,function(p,i){if(!p.fixed){var op=this.originalPositions[i];var k2v=this.k2Velocities[i];p.position.set(op.x+k2v.x*0.5*dt,op.y+k2v.y*0.5*dt);var ov=this.originalVelocities[i];var k2f=this.k2Forces[i];p.velocity.set(ov.x+k2f.x*0.5*dt/p.mass,ov.y+k2f.y*0.5*dt/p.mass);}},this);s.applyForces();_.each(s.particles,function(p,i){if(!p.fixed){this.k3Forces[i].copy(p.force);this.k3Velocities[i].copy(p.velocity);} -p.force.clear();},this);_.each(s.particles,function(p,i){if(!p.fixed){var op=this.originalPositions[i];var k3v=this.k3Velocities[i];p.position.set(op.x+k3v.x*dt,op.y+k3v.y*dt) -var ov=this.originalVelocities[i];var k3f=this.k3Forces[i];p.velocity.set(ov.x+k3f.x*dt/p.mass,ov.y+k3f.y*dt/p.mass);}},this);s.applyForces();_.each(s.particles,function(p,i){if(!p.fixed){this.k4Forces[i].copy(p.force);this.k4Velocities[i].copy(p.velocity);}},this);_.each(s.particles,function(p,i){p.age+=dt;if(!p.fixed){var op=this.originalPositions[i];var k1v=this.k1Velocities[i];var k2v=this.k2Velocities[i];var k3v=this.k3Velocities[i];var k4v=this.k4Velocities[i];var x=op.x+dt/6.0*(k1v.x+2.0*k2v.x+2.0*k3v.x+k4v.x);var y=op.y+dt/6.0*(k1v.y+2.0*k2v.y+2.0*k3v.y+k4v.y);p.position.set(x,y);var ov=this.originalVelocities[i];var k1f=this.k1Forces[i];var k2f=this.k2Forces[i];var k3f=this.k3Forces[i];var k4f=this.k4Forces[i];x=ov.x+dt/(6.0*p.mass)*(k1f.x+2.0*k2f.x+2.0*k3f.x+k4f.x);y=ov.y+dt/(6.0*p.mass)*(k1f.y+2.0*k2f.y+2.0*k3f.y+k4f.y);p.velocity.set(x,y);}},this);return this;}});module.exports=Integrator;},{"./common":8,"./vector":12}],3:[function(require,module,exports){var _=require('./common'),Vector=require('./vector');function Particle(mass){this.position=new Vector();this.velocity=new Vector();this.force=new Vector();this.mass=mass;this.fixed=false;this.age=0;this.dead=false;} -_.extend(Particle.prototype,{distanceTo:function(p){return this.position.distanceTo(p.position);},makeFixed:function(){this.fixed=true;this.velocity.clear();return this;},reset:function(){this.age=0;this.dead=false;this.position.clear();this.velocity.clear();this.force.clear();this.mass=1.0;return this;},resting:function(){return this.fixed||this.velocity.isZero()&&this.force.isZero();}});module.exports=Particle;},{"./common":8,"./vector":12}],4:[function(require,module,exports){var _=require('./common'),Vector=require('./Vector'),Particle=require('./Particle'),Spring=require('./Spring'),Attraction=require('./Attraction'),Integrator=require('./Integrator');function ParticleSystem(){this.__equilibriumCriteria={particles:true,springs:true,attractions:true};this.__equilibrium=false;this.__optimized=false;this.particles=[];this.springs=[];this.attractions=[];this.forces=[];this.integrator=new Integrator(this);this.hasDeadParticles=false;var args=arguments.length;if(args===1){this.gravity=new Vector(0,arguments[0]);this.drag=ParticleSystem.DEFAULT_DRAG;}else if(args===2){this.gravity=new Vector(0,arguments[0]);this.drag=arguments[1];}else if(args===3){this.gravity=new Vector(arguments[0],arguments[1]);this.drag=arguments[3];}else{this.gravity=new Vector(0,ParticleSystem.DEFAULT_GRAVITY);this.drag=ParticleSystem.DEFAULT_DRAG;}} -_.extend(ParticleSystem,{DEFAULT_GRAVITY:0,DEFAULT_DRAG:0.001,Attraction:Attraction,Integrator:Integrator,Particle:Particle,Spring:Spring,Vector:Vector});_.extend(ParticleSystem.prototype,{optimize:function(b){this.__optimized=!!b;return this;},setGravity:function(x,y){this.gravity.set(x,y);return this;},setEquilibriumCriteria:function(particles,springs,attractions){this.__equilibriumCriteria.particles=!!particles;this.__equilibriumCriteria.springs=!!springs;this.__equilibriumCriteria.attractions=!!attractions;},tick:function(){this.integrator.step(arguments.length===0?1:arguments[0]);if(this.__optimized){this.__equilibrium=!this.needsUpdate();} -return this;},needsUpdate:function(){var i=0;if(this.__equilibriumCriteria.particles){for(i=0,l=this.particles.length;i=0||!_.isFunction(func)){return this;} -this.animations.push(func);return this;},onEquilibrium:function(func){if(_.indexOf(this.equilibriumCallbacks,func)>=0||!_.isFunction(func)){return this;} -this.equilibriumCallbacks.push(func);return this;},update:function(){if(!this.__equilibrium){return this;} -this.__equilibrium=false;if(this.playing){update.call(this);} -return this;}});function update(){var _this=this;this.tick();_.each(this.animations,function(a){a();});if((this.__optimized&&!this.__equilibrium||!this.__optimized)&&this.playing){raf(function(){update.call(_this);});} -if(this.__optimized&&this.__equilibrium){_.each(this.equilibriumCallbacks,function(a){a();});}} -module.exports=Physics;},{"./ParticleSystem":4,"./common":8,"./requestAnimationFrame":11}],6:[function(require,module,exports){var _=require('./common'),Vector=require('./vector');function Spring(a,b,k,d,l){this.constant=k;this.damping=d;this.length=l;this.a=a;this.b=b;this.on=true;} -_.extend(Spring.prototype,{currentLength:function(){return this.a.position.distanceTo(this.b.position);},update:function(){var a=this.a;var b=this.b;if(!(this.on&&(!a.fixed||!b.fixed)))return this;var a2b=new Vector().sub(a.position,b.position);var d=a2b.length();if(d===0){a2b.clear();}else{a2b.divideScalar(d);} -var fspring=-1*(d-this.length)*this.constant;var va2b=new Vector().sub(a.velocity,b.velocity);var fdamping=-1*this.damping*va2b.dot(a2b);var fr=fspring+fdamping;a2b.multiplyScalar(fr);if(!a.fixed){a.force.addSelf(a2b);} -if(!b.fixed){b.force.subSelf(a2b);} -return this;},resting:function(){var a=this.a;var b=this.b;var l=this.length;return!this.on||(a.fixed&&b.fixed)||(a.fixed&&(l===0?b.position.equals(a.position):b.position.distanceTo(a.position)<=l)&&b.resting())||(b.fixed&&(l===0?a.position.equals(b.position):a.position.distanceTo(b.position)<=l)&&a.resting());}});module.exports=Spring;},{"./common":8,"./vector":12}],7:[function(require,module,exports){var _=require('./common');function Vector(x,y){this.x=x||0;this.y=y||0;} -_.extend(Vector.prototype,{set:function(x,y){this.x=x;this.y=y;return this;},copy:function(v){this.x=v.x;this.y=v.y;return this;},clear:function(){this.x=0;this.y=0;return this;},clone:function(){return new Vector(this.x,this.y);},add:function(v1,v2){this.x=v1.x+v2.x;this.y=v1.y+v2.y;return this;},addSelf:function(v){this.x+=v.x;this.y+=v.y;return this;},sub:function(v1,v2){this.x=v1.x-v2.x;this.y=v1.y-v2.y;return this;},subSelf:function(v){this.x-=v.x;this.y-=v.y;return this;},multiplySelf:function(v){this.x*=v.x;this.y*=v.y;return this;},multiplyScalar:function(s){this.x*=s;this.y*=s;return this;},multiplyScalarXY:function(sx,sy){this.x*=sx;this.y*=sy;return this;},divideScalar:function(s){if(s){this.x/=s;this.y/=s;}else{this.set(0,0);} -return this;},negate:function(){return this.multiplyScalar(-1);},dot:function(v){return this.x*v.x+this.y*v.y;},lengthSquared:function(){return this.x*this.x+this.y*this.y;},length:function(){return Math.sqrt(this.lengthSquared());},normalize:function(){return this.divideScalar(this.length());},distanceTo:function(v){return Math.sqrt(this.distanceToSquared(v));},distanceToSquared:function(v){var dx=this.x-v.x,dy=this.y-v.y;return dx*dx+dy*dy;},setLength:function(l){return this.normalize().multiplyScalar(l);},equals:function(v){return(this.distanceTo(v)<0.0001);},lerp:function(v,t){var x=(v.x-this.x)*t+this.x;var y=(v.y-this.y)*t+this.y;return this.set(x,y);},isZero:function(){return(this.length()<0.0001);}});module.exports=Vector;},{"./common":8}],8:[function(require,module,exports){var breaker={};var ArrayProto=Array.prototype;var ObjProto=Object.prototype;var hasOwnProperty=ObjProto.hasOwnProperty;var slice=ArrayProto.slice;var nativeForEach=ArrayProto.forEach;var nativeIndexOf=ArrayProto.indexOf;var toString=ObjProto.toString;var has=function(obj,key){return hasOwnProperty.call(obj,key);};var each=function(obj,iterator,context){if(obj==null)return;if(nativeForEach&&obj.forEach===nativeForEach){obj.forEach(iterator,context);}else if(obj.length===+obj.length){for(var i=0,l=obj.length;i>1;iterator(array[mid]) this.originalPositions.length) { + this.originalPositions.push(new Vector()); + this.originalVelocities.push(new Vector()); + this.k1Forces.push(new Vector()); + this.k1Velocities.push(new Vector()); + this.k2Forces.push(new Vector()); + this.k2Velocities.push(new Vector()); + this.k3Forces.push(new Vector()); + this.k3Velocities.push(new Vector()); + this.k4Forces.push(new Vector()); + this.k4Velocities.push(new Vector()); + } + + return this; + + }, + + step: function(dt) { + + var s = this.s; + var p, x, y; + + this.allocateParticles(); + + _.each(s.particles, function(p, i) { + if (!p.fixed) { + this.originalPositions[i].copy(p.position); + this.originalVelocities[i].copy(p.velocity); + } + p.force.clear(); + }, this); + + // K1 + + s.applyForces(); + + _.each(s.particles, function(p, i) { + if (!p.fixed) { + this.k1Forces[i].copy(p.force); + this.k1Velocities[i].copy(p.velocity); + } + p.force.clear(); + }, this); + + // K2 + + _.each(s.particles, function(p, i) { + if (!p.fixed) { + + var op = this.originalPositions[i]; + var k1v = this.k1Velocities[i]; + x = op.x + k1v.x * 0.5 * dt; + y = op.y + k1v.y * 0.5 * dt; + p.position.set(x, y); + + var ov = this.originalVelocities[i]; + var k1f = this.k1Forces[i]; + x = ov.x + k1f.x * 0.5 * dt / p.mass; + y = ov.y + k1f.y * 0.5 * dt / p.mass; + p.velocity.set(x, y); + + } + }, this); + + s.applyForces(); + + _.each(s.particles, function(p, i) { + if (!p.fixed) { + this.k2Forces[i].copy(p.force); + this.k2Velocities[i].copy(p.velocity); + } + p.force.clear(); + }, this); + + // K3 + + _.each(s.particles, function(p, i) { + if (!p.fixed) { + + var op = this.originalPositions[i]; + var k2v = this.k2Velocities[i]; + p.position.set(op.x + k2v.x * 0.5 * dt, op.y + k2v.y * 0.5 * dt); + + var ov = this.originalVelocities[i]; + var k2f = this.k2Forces[i]; + p.velocity.set(ov.x + k2f.x * 0.5 * dt / p.mass, ov.y + k2f.y * 0.5 * dt / p.mass); + } + }, this); + + s.applyForces(); + + _.each(s.particles, function(p, i) { + if (!p.fixed) { + this.k3Forces[i].copy(p.force); + this.k3Velocities[i].copy(p.velocity); + } + p.force.clear(); + }, this); + + // K4 + + _.each(s.particles, function(p, i) { + if (!p.fixed) { + + var op = this.originalPositions[i]; + var k3v = this.k3Velocities[i]; + p.position.set(op.x + k3v.x * dt, op.y + k3v.y * dt) + + var ov = this.originalVelocities[i]; + var k3f = this.k3Forces[i]; + p.velocity.set(ov.x + k3f.x * dt / p.mass, ov.y + k3f.y * dt / p.mass); + } + }, this); + + s.applyForces(); + + _.each(s.particles, function(p, i) { + if (!p.fixed) { + this.k4Forces[i].copy(p.force); + this.k4Velocities[i].copy(p.velocity); + } + }, this); + + // TOTAL + + _.each(s.particles, function(p, i) { + + p.age += dt; + + if (!p.fixed) { + + var op = this.originalPositions[i]; + var k1v = this.k1Velocities[i]; + var k2v = this.k2Velocities[i]; + var k3v = this.k3Velocities[i]; + var k4v = this.k4Velocities[i]; + + var x = op.x + dt / 6.0 * (k1v.x + 2.0 * k2v.x + 2.0 * k3v.x + k4v.x); + var y = op.y + dt / 6.0 * (k1v.y + 2.0 * k2v.y + 2.0 * k3v.y + k4v.y); + + p.position.set(x, y); + + var ov = this.originalVelocities[i]; + var k1f = this.k1Forces[i]; + var k2f = this.k2Forces[i]; + var k3f = this.k3Forces[i]; + var k4f = this.k4Forces[i]; + + x = ov.x + dt / (6.0 * p.mass) * (k1f.x + 2.0 * k2f.x + 2.0 * k3f.x + k4f.x); + y = ov.y + dt / (6.0 * p.mass) * (k1f.y + 2.0 * k2f.y + 2.0 * k3f.y + k4f.y); + + p.velocity.set(x, y); + + } + + }, this); + + return this; + + } + + }); + + module.exports = Integrator; + +},{"./common":8,"./vector":12}],3:[function(require,module,exports){ +var _ = require('./common') +, Vector = require('./vector') +; + + function Particle(mass) { + + this.position = new Vector(); + this.velocity = new Vector(); + this.force = new Vector(); + this.mass = mass; + this.fixed = false; + this.age = 0; + this.dead = false; + + } + + _.extend(Particle.prototype, { + + /** + * Get the distance between two particles. + */ + distanceTo: function(p) { + return this.position.distanceTo(p.position); + }, + + /** + * Make the particle fixed in 2D space. + */ + makeFixed: function() { + this.fixed = true; + this.velocity.clear(); + return this; + }, + + /** + * Reset a particle. + */ + reset: function() { + + this.age = 0; + this.dead = false; + this.position.clear(); + this.velocity.clear(); + this.force.clear(); + this.mass = 1.0; + + return this; + }, + + /** + * Returns a boolean describing whether the particle is in movement. + */ + resting: function() { + return this.fixed || this.velocity.isZero() && this.force.isZero(); + } + + }); + + module.exports = Particle; + +},{"./common":8,"./vector":12}],4:[function(require,module,exports){ +var _ = require('./common') +, Vector = require('./Vector') +, Particle = require('./Particle') +, Spring = require('./Spring') +, Attraction = require('./Attraction') +, Integrator = require('./Integrator') +; + + /** + * traer.js + * A particle-based physics engine ported from Jeff Traer's Processing + * library to JavaScript. This version is intended for use with the + * HTML5 canvas element. It is dependent on Three.js' Vector2 class, + * but can be overridden with any Vector2 class with the methods included. + * + * @author Jeffrey Traer Bernstein (original Java library) + * @author Adam Saponara (JavaScript port) + * @author Jono Brandel (requirified/optimization port) + * @author David Schoonover (Node/CommonJS/Browserify port) + * + * @version 0.3 + * @date March 25, 2012 + */ + + /** + * The whole kit and kaboodle. + * + * @class + */ + function ParticleSystem() { + + this.__equilibriumCriteria = { particles: true, springs: true, attractions: true }; + this.__equilibrium = false; // are we at equilibrium? + this.__optimized = false; + + this.particles = []; + this.springs = []; + this.attractions = []; + this.forces = []; + this.integrator = new Integrator(this); + this.hasDeadParticles = false; + + var args = arguments.length; + + if (args === 1) { + this.gravity = new Vector(0, arguments[0]); + this.drag = ParticleSystem.DEFAULT_DRAG; + } else if (args === 2) { + this.gravity = new Vector(0, arguments[0]); + this.drag = arguments[1]; + } else if (args === 3) { + this.gravity = new Vector(arguments[0], arguments[1]); + this.drag = arguments[3]; + } else { + this.gravity = new Vector(0, ParticleSystem.DEFAULT_GRAVITY); + this.drag = ParticleSystem.DEFAULT_DRAG; + } + + } + + _.extend(ParticleSystem, { + + DEFAULT_GRAVITY: 0, + + DEFAULT_DRAG: 0.001, + + Attraction: Attraction, + + Integrator: Integrator, + + Particle: Particle, + + Spring: Spring, + + Vector: Vector + + }); + + _.extend(ParticleSystem.prototype, { + + /** + * Set whether to optimize the simulation. This enables the check of whether + * particles are moving. + */ + optimize: function(b) { + this.__optimized = !!b; + return this; + }, + + /** + * Set the gravity of the ParticleSystem. + */ + setGravity: function(x, y) { + this.gravity.set(x, y); + return this; + }, + + /** + * Sets the criteria for equilibrium + */ + setEquilibriumCriteria: function(particles, springs, attractions) { + this.__equilibriumCriteria.particles = !!particles; + this.__equilibriumCriteria.springs = !!springs; + this.__equilibriumCriteria.attractions = !!attractions; + }, + + /** + * Update the integrator + */ + tick: function() { + this.integrator.step(arguments.length === 0 ? 1 : arguments[0]); + if (this.__optimized) { + this.__equilibrium = !this.needsUpdate(); + } + return this; + }, + + /** + * Checks all springs and attractions to see if the contained particles are + * inert / resting and returns a boolean. + */ + needsUpdate: function() { + var i = 0; + + if(this.__equilibriumCriteria.particles) { + for (i = 0, l = this.particles.length; i < l; i++) { + if (!this.particles[i].resting()) { + return true; + } + } + } + + if(this.__equilibriumCriteria.springs) { + for (i = 0, l = this.springs.length; i < l; i++) { + if (!this.springs[i].resting()) { + return true; + } + } + } + + if(this.__equilibriumCriteria.attractions) { + for (i = 0, l = this.attractions.length; i < l; i++) { + if (!this.attractions[i].resting()) { + return true; + } + } + } + + return false; + + }, + + /** + * Add a particle to the ParticleSystem. + */ + addParticle: function(p) { + + this.particles.push(p); + return this; + + }, + + /** + * Add a spring to the ParticleSystem. + */ + addSpring: function(s) { + + this.springs.push(s); + return this; + + }, + + /** + * Add an attraction to the ParticleSystem. + */ + addAttraction: function(a) { + + this.attractions.push(a); + return this; + + }, + + /** + * Makes and then adds Particle to ParticleSystem. + */ + makeParticle: function(m, x, y) { + + var mass = _.isNumber(m) ? m : 1.0; + var x = x || 0; + var y = y || 0; + + var p = new Particle(mass); + p.position.set(x, y); + this.addParticle(p); + return p; + + }, + + /** + * Makes and then adds Spring to ParticleSystem. + */ + makeSpring: function(a, b, k, d, l) { + + var s = new Spring(a, b, k, d, l); + this.addSpring(s); + return s; + + }, + + /** + * Makes and then adds Attraction to ParticleSystem. + */ + makeAttraction: function(a, b, k, d) { + + var a = new Attraction(a, b, k, d); + this.addAttraction(a); + return a; + + }, + + /** + * Wipe the ParticleSystem clean. + */ + clear: function() { + + this.particles.length = 0; + this.springs.length = 0; + this.attractions.length = 0; + + }, + + /** + * Calculate and apply forces. + */ + applyForces: function() { + + if (!this.gravity.isZero()) { + _.each(this.particles, function(p) { + p.force.addSelf(this.gravity); + }, this); + } + + var t = new Vector(); + + _.each(this.particles, function(p) { + t.set(p.velocity.x * -1 * this.drag, p.velocity.y * -1 * this.drag); + p.force.addSelf(t); + }, this); + + _.each(this.springs, function(s) { + s.update(); + }); + + _.each(this.attractions, function(a) { + a.update(); + }); + + _.each(this.forces, function(f) { + f.update(); + }); + + return this; + + }, + + /** + * Clear all particles in the system. + */ + clearForces: function() { + _.each(this.particles, function(p) { + p.clear(); + }); + return this; + } + + }); + + module.exports = ParticleSystem; + +},{"./Attraction":1,"./Integrator":2,"./Particle":3,"./Spring":6,"./Vector":7,"./common":8}],5:[function(require,module,exports){ +var _ = require('./common') +, raf = require('./requestAnimationFrame') +, ParticleSystem = require('./ParticleSystem') +; + + var updates = []; + + /** + * Extended singleton instance of ParticleSystem with convenience methods for + * Request Animation Frame. + * @class + */ + function Physics() { + + var _this = this; + + this.playing = false; + + ParticleSystem.apply(this, arguments); + + this.animations = []; + + this.equilibriumCallbacks = []; + + update.call(this); + + } + + _.extend(Physics, ParticleSystem, { + + superclass: ParticleSystem + + }); + + _.extend(Physics.prototype, ParticleSystem.prototype, { + + /** + * Play the animation loop. Doesn't affect whether in equilibrium or not. + */ + play: function() { + + if (this.playing) { + return this; + } + + this.playing = true; + this.__equilibrium = false; + update.call(this); + + return this; + + }, + + /** + * Pause the animation loop. Doesn't affect whether in equilibrium or not. + */ + pause: function() { + + this.playing = false; + return this; + + }, + + /** + * Toggle between playing and pausing the simulation. + */ + toggle: function() { + + if (this.playing) { + this.pause(); + } else { + this.play(); + } + + return this; + + }, + + onUpdate: function(func) { + + if (_.indexOf(this.animations, func) >= 0 || !_.isFunction(func)) { + return this; + } + + this.animations.push(func); + + return this; + + }, + + onEquilibrium: function(func) { + + if (_.indexOf(this.equilibriumCallbacks, func) >= 0 || !_.isFunction(func)) { + return this; + } + + this.equilibriumCallbacks.push(func); + + return this; + + }, + + /** + * Call update after values in the system have changed and this will fire + * it's own Request Animation Frame to update until things have settled + * to equilibrium — at which point the system will stop updating. + */ + update: function() { + + if (!this.__equilibrium) { + return this; + } + + this.__equilibrium = false; + if (this.playing) { + update.call(this); + } + + return this; + + } + + }); + + function update() { + + var _this = this; + + this.tick(); + + _.each(this.animations, function(a) { + a(); + }); + + if ((this.__optimized && !this.__equilibrium || !this.__optimized) && this.playing) { + + raf(function() { + update.call(_this); + }); + + } + + if (this.__optimized && this.__equilibrium){ + + _.each(this.equilibriumCallbacks, function(a) { + a(); + }); + + } + + } + + module.exports = Physics; + + +},{"./ParticleSystem":4,"./common":8,"./requestAnimationFrame":11}],6:[function(require,module,exports){ +var _ = require('./common') +, Vector = require('./vector') +; + + function Spring(a, b, k, d, l) { + + this.constant = k; + this.damping = d; + this.length = l; + this.a = a; + this.b = b; + this.on = true; + + } + + _.extend(Spring.prototype, { + + /** + * Returns the distance between particle a and particle b + * in 2D space. + */ + currentLength: function() { + return this.a.position.distanceTo(this.b.position); + }, + + /** + * Update spring logic. + */ + update: function() { + + var a = this.a; + var b = this.b; + if (!(this.on && (!a.fixed || !b.fixed))) return this; + + var a2b = new Vector().sub(a.position, b.position); + var d = a2b.length(); + + if (d === 0) { + a2b.clear(); + } else { + a2b.divideScalar(d); // Essentially normalize + } + + var fspring = -1 * (d - this.length) * this.constant; + + var va2b = new Vector().sub(a.velocity, b.velocity); + + var fdamping = -1 * this.damping * va2b.dot(a2b); + + var fr = fspring + fdamping; + + a2b.multiplyScalar(fr); + + if (!a.fixed) { + a.force.addSelf(a2b); + } + if (!b.fixed) { + b.force.subSelf(a2b); + } + + return this; + + }, + + /** + * Returns a boolean describing whether the spring is resting or not. + * Convenient for knowing whether or not the spring needs another update + * tick. + */ + resting: function() { + + var a = this.a; + var b = this.b; + var l = this.length; + + return !this.on || (a.fixed && b.fixed) + || (a.fixed && (l === 0 ? b.position.equals(a.position) : b.position.distanceTo(a.position) <= l) && b.resting()) + || (b.fixed && (l === 0 ? a.position.equals(b.position) : a.position.distanceTo(b.position) <= l) && a.resting()); + + } + + }); + + module.exports = Spring; + + +},{"./common":8,"./vector":12}],7:[function(require,module,exports){ +/** + * @author mr.doob / http://mrdoob.com/ + * @author philogb / http://blog.thejit.org/ + * @author egraether / http://egraether.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author jonobr1 / http://jonobr1.com/ + */ + +var _ = require('./common'); + + /** + * A two dimensional vector. + */ + function Vector(x, y) { + + this.x = x || 0; + this.y = y || 0; + + } + + _.extend(Vector.prototype, { + + set: function(x, y) { + this.x = x; + this.y = y; + return this; + }, + + copy: function(v) { + this.x = v.x; + this.y = v.y; + return this; + }, + + clear: function() { + this.x = 0; + this.y = 0; + return this; + }, + + clone: function() { + return new Vector(this.x, this.y); + }, + + add: function(v1, v2) { + this.x = v1.x + v2.x; + this.y = v1.y + v2.y; + return this; + }, + + addSelf: function(v) { + this.x += v.x; + this.y += v.y; + return this; + }, + + sub: function(v1, v2) { + this.x = v1.x - v2.x; + this.y = v1.y - v2.y; + return this; + }, + + subSelf: function(v) { + this.x -= v.x; + this.y -= v.y; + return this; + }, + + multiplySelf: function(v) { + this.x *= v.x; + this.y *= v.y; + return this; + }, + + multiplyScalar: function(s) { + this.x *= s; + this.y *= s; + return this; + }, + + multiplyScalarXY: function(sx,sy) { + this.x *= sx; + this.y *= sy; + return this; + }, + + divideScalar: function(s) { + if (s) { + this.x /= s; + this.y /= s; + } else { + this.set(0, 0); + } + return this; + }, + + negate: function() { + return this.multiplyScalar(-1); + }, + + dot: function(v) { + return this.x * v.x + this.y * v.y; + }, + + lengthSquared: function() { + return this.x * this.x + this.y * this.y; + }, + + length: function() { + return Math.sqrt(this.lengthSquared()); + }, + + normalize: function() { + return this.divideScalar(this.length()); + }, + + distanceTo: function(v) { + return Math.sqrt(this.distanceToSquared(v)); + }, + + distanceToSquared: function(v) { + var dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + }, + + setLength: function(l) { + return this.normalize().multiplyScalar(l); + }, + + equals: function(v) { + return (this.distanceTo(v) < 0.0001 /* almost same position */); + }, + + lerp: function(v, t) { + var x = (v.x - this.x) * t + this.x; + var y = (v.y - this.y) * t + this.y; + return this.set(x, y); + }, + + isZero: function() { + return (this.length() < 0.0001 /* almost zero */ ); + } + + }); + + module.exports = Vector; + +},{"./common":8}],8:[function(require,module,exports){ + + /** + * Pulled only what's needed from: + * + * Underscore.js 1.3.3 + * (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc. + * http://documentcloud.github.com/underscore + */ + + var breaker = {}; + var ArrayProto = Array.prototype; + var ObjProto = Object.prototype; + var hasOwnProperty = ObjProto.hasOwnProperty; + var slice = ArrayProto.slice; + var nativeForEach = ArrayProto.forEach; + var nativeIndexOf = ArrayProto.indexOf; + var toString = ObjProto.toString; + + var has = function(obj, key) { + return hasOwnProperty.call(obj, key); + }; + + var each = function(obj, iterator, context) { + + if (obj == null) return; + if (nativeForEach && obj.forEach === nativeForEach) { + obj.forEach(iterator, context); + } else if (obj.length === +obj.length) { + for (var i = 0, l = obj.length; i < l; i++) { + if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return; + } + } else { + for (var key in obj) { + if (_.has(obj, key)) { + if (iterator.call(context, obj[key], key, obj) === breaker) return; + } + } + } + + }; + + var identity = function(value) { + return value; + }; + + var sortedIndex = function(array, obj, iterator) { + iterator || (iterator = identity); + var low = 0, high = array.length; + while (low < high) { + var mid = (low + high) >> 1; + iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid; + } + return low; + }; + + module.exports = { + + has: has, + + each: each, + + extend: function(obj) { + each(slice.call(arguments, 1), function(source) { + for (var prop in source) { + obj[prop] = source[prop]; + } + }); + return obj; + }, + + indexOf: function(array, item, isSorted) { + if (array == null) return -1; + var i, l; + if (isSorted) { + i = sortedIndex(array, item); + return array[i] === item ? i : -1; + } + if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item); + for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i; + return -1; + }, + + sortedIndex: sortedIndex, + + identity: identity, + + isNumber: function(obj) { + return toString.call(obj) == '[object Number]'; + }, + + isFunction: function(obj) { + return toString.call(obj) == '[object Function]' || typeof obj == 'function'; + }, + + isUndefined: function(obj) { + return obj === void 0; + }, + + isNull: function(obj) { + return obj === null; + } + + }; + + +},{}],"H99CHA":[function(require,module,exports){ +var root = (function(){ return this; })() +, previousShortcut = root.Physics +; + +module.exports = root.Physics = require('./Physics'); + +},{"./Physics":5}],"physics":[function(require,module,exports){ +module.exports=require('H99CHA'); +},{}],11:[function(require,module,exports){ + /* + * Requirified version of Paul Irish's request animation frame. + * http://paulirish.com/2011/requestanimationframe-for-smart-animating/ + */ +module.exports = + window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function (callback) { + window.setTimeout(callback, 1000 / 60); + }; + +},{}],12:[function(require,module,exports){ +module.exports=require(7) +},{"./common":8}]},{},["H99CHA"]) diff --git a/sites/all/modules/figli/edlp_corpus/assets/dist/styles/corpus.min.css b/sites/all/modules/figli/edlp_corpus/assets/dist/styles/corpus.min.css index 9e7cd5c63..2c7c5979f 100644 --- a/sites/all/modules/figli/edlp_corpus/assets/dist/styles/corpus.min.css +++ b/sites/all/modules/figli/edlp_corpus/assets/dist/styles/corpus.min.css @@ -1 +1,71 @@ -canvas#corpus-map{position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;top:0;left:0;z-index:0}canvas#corpus-map.de-activated{background-color:#f4f4f4}div.node-popup{z-index:10;position:absolute;-webkit-box-sizing:content-box;box-sizing:content-box;width:300px;min-height:30px;top:60%;left:30%;pointer-events:none}div.node-popup .inner{padding:.6em;outline:red solid 1px;background-color:#fff}div.node-popup:before{content:"";position:absolute;width:60px;height:0;border-top:1px solid red}div.node-popup[pos=bottom-right]{-webkit-transform:translateY(42px) translateX(42px);transform:translateY(42px) translateX(42px)}div.node-popup[pos=bottom-right]:before{top:-1px;left:-61px;-webkit-transform-origin:bottom right;transform-origin:bottom right;-webkit-transform:rotateZ(45deg);transform:rotateZ(45deg)}div.node-popup[pos=bottom-left]{-webkit-transform:translateX(-100%) translateY(42px) translateX(-42px);transform:translateX(-100%) translateY(42px) translateX(-42px)}div.node-popup[pos=bottom-left]:before{top:calc(100% +1px);left:100%;-webkit-transform-origin:top left;transform-origin:top left;-webkit-transform:rotateZ(-45deg);transform:rotateZ(-45deg)}div.node-popup[pos=top-left]{-webkit-transform:translateY(-100%) translateX(-100%) translateY(-42px) translateX(-42px);transform:translateY(-100%) translateX(-100%) translateY(-42px) translateX(-42px)}div.node-popup[pos=top-left]:before{bottom:0;left:100%;-webkit-transform-origin:top left;transform-origin:top left;-webkit-transform:rotateZ(45deg);transform:rotateZ(45deg)}div.node-popup[pos=top-right]{-webkit-transform:translateY(-100%) translateY(-42px) translateX(42px);transform:translateY(-100%) translateY(-42px) translateX(42px)}div.node-popup[pos=top-right]:before{top:calc(100% + 1px);left:-61px;-webkit-transform-origin:top right;transform-origin:top right;-webkit-transform:rotateZ(-45deg);transform:rotateZ(-45deg)} \ No newline at end of file +canvas#corpus-map { + position: absolute; + -webkit-box-sizing: border-box; + box-sizing: border-box; + top: 0; + left: 0; + z-index: 0; } + canvas#corpus-map.de-activated { + background-color: #f4f4f4; } + +div.node-popup { + z-index: 10; + position: absolute; + -webkit-box-sizing: content-box; + box-sizing: content-box; + width: 300px; + min-height: 30px; + pointer-events: none; + top: 60%; + left: 30%; + pointer-events: none; } + div.node-popup .inner { + padding: 0.6em; + outline: 1px solid red; + background-color: white; } + div.node-popup:before { + content: ""; + position: absolute; + width: 60px; + height: 0; + border-top: 1px solid red; } + div.node-popup[pos="bottom-right"] { + -webkit-transform: translateY(42px) translateX(42px); + transform: translateY(42px) translateX(42px); } + div.node-popup[pos="bottom-right"]:before { + top: -1px; + left: -61px; + -webkit-transform-origin: bottom right; + transform-origin: bottom right; + -webkit-transform: rotateZ(45deg); + transform: rotateZ(45deg); } + div.node-popup[pos="bottom-left"] { + -webkit-transform: translateX(-100%) translateY(42px) translateX(-42px); + transform: translateX(-100%) translateY(42px) translateX(-42px); } + div.node-popup[pos="bottom-left"]:before { + top: calc(100% +1px); + left: 100%; + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-transform: rotateZ(-45deg); + transform: rotateZ(-45deg); } + div.node-popup[pos="top-left"] { + -webkit-transform: translateY(-100%) translateX(-100%) translateY(-42px) translateX(-42px); + transform: translateY(-100%) translateX(-100%) translateY(-42px) translateX(-42px); } + div.node-popup[pos="top-left"]:before { + bottom: 0; + left: 100%; + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-transform: rotateZ(45deg); + transform: rotateZ(45deg); } + div.node-popup[pos="top-right"] { + -webkit-transform: translateY(-100%) translateY(-42px) translateX(42px); + transform: translateY(-100%) translateY(-42px) translateX(42px); } + div.node-popup[pos="top-right"]:before { + top: calc(100% + 1px); + left: -61px; + -webkit-transform-origin: top right; + transform-origin: top right; + -webkit-transform: rotateZ(-45deg); + transform: rotateZ(-45deg); } diff --git a/sites/all/modules/figli/edlp_corpus/assets/scripts/corpus.js b/sites/all/modules/figli/edlp_corpus/assets/scripts/corpus.js index 7f8f61f23..8f0723737 100644 --- a/sites/all/modules/figli/edlp_corpus/assets/scripts/corpus.js +++ b/sites/all/modules/figli/edlp_corpus/assets/scripts/corpus.js @@ -144,7 +144,7 @@ console.warn('corpus load failed', jqxhr.responseText); }; function onCorpusLoaded(data){ - // console.log('corpus loaded : data', data); + console.log('corpus loaded : data', data); // console.log('first node', data.nodes[0]); // buildParticles(data.nodes); initPhysics(); diff --git a/sites/all/modules/figli/edlp_corpus/src/Controller/CorpusController.php b/sites/all/modules/figli/edlp_corpus/src/Controller/CorpusController.php index 29f707440..1e19df838 100644 --- a/sites/all/modules/figli/edlp_corpus/src/Controller/CorpusController.php +++ b/sites/all/modules/figli/edlp_corpus/src/Controller/CorpusController.php @@ -5,6 +5,7 @@ namespace Drupal\edlp_corpus\Controller; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Language\LanguageInterface; use Drupal\workflow\Entity\WorkflowManager; +use Drupal\Core\Url; use Drupal\File\Entity\File; // use Symfony\Component\HttpFoundation\JsonResponse; use Drupal\Core\Cache\CacheableJsonResponse; diff --git a/sites/all/modules/figli/edlp_home/edlp_home.module b/sites/all/modules/figli/edlp_home/edlp_home.module index 42082205a..9ac5f32f3 100644 --- a/sites/all/modules/figli/edlp_home/edlp_home.module +++ b/sites/all/modules/figli/edlp_home/edlp_home.module @@ -23,7 +23,8 @@ function edlp_home_theme($existing, $type, $theme, $path) { // 'last_fil_node' => NULL, // 'last_production_node' => NULL, 'promoted_nodes' => array(), - 'agenda_items' => NULL + 'agenda_items' => NULL, + 'entrees_items' => NULL, ), ), ); diff --git a/sites/all/modules/figli/edlp_home/edlp_home.routing.yml b/sites/all/modules/figli/edlp_home/edlp_home.routing.yml index d07818e96..fa538044f 100644 --- a/sites/all/modules/figli/edlp_home/edlp_home.routing.yml +++ b/sites/all/modules/figli/edlp_home/edlp_home.routing.yml @@ -13,3 +13,11 @@ edlp_home.home: _title: 'Home' requirements: _permission: 'access content' + +edlp_home.home_mobile: + path: '/home_m' + defaults: + _controller: '\Drupal\edlp_home\Controller\HomeController::home_mobile' + _title: 'Home' + requirements: + _permission: 'access content' diff --git a/sites/all/modules/figli/edlp_home/includes/edlp_home.inc b/sites/all/modules/figli/edlp_home/includes/edlp_home.inc index 80f60ed4c..d7ee7eb2b 100644 --- a/sites/all/modules/figli/edlp_home/includes/edlp_home.inc +++ b/sites/all/modules/figli/edlp_home/includes/edlp_home.inc @@ -3,7 +3,8 @@ use Drupal\Core\Url; function template_preprocess_edlp_home(&$vars){ - $view_builder = \Drupal::entityTypeManager()->getViewBuilder('node'); + $node_view_builder = \Drupal::entityTypeManager()->getViewBuilder('node'); + $term_view_builder = \Drupal::entityTypeManager()->getViewBuilder('taxonomy_term'); // dpm($vars); // render the promoted_nodes @@ -26,14 +27,14 @@ function template_preprocess_edlp_home(&$vars){ $vars['nodes'][] = array( 'vm'=>$vm, - 'build'=>$view_builder->view($node, $vm) + 'build'=>$node_view_builder->view($node, $vm) ); } // render the presentation column // $vars["presentation"] = array( // "#type"=>"container", - // "pres"=>$view_builder->view($vars["presentation_node"], 'default'), + // "pres"=>$node_view_builder->view($vars["presentation_node"], 'default'), // "link"=> array( // '#title' => t('Visiter la collection sonore.'), // '#type' => 'link', @@ -48,7 +49,7 @@ function template_preprocess_edlp_home(&$vars){ // render the last fil column // $vars["last_fil"] = array( // "#type" => "container", - // // 'fil' => $view_builder->view($vars['last_fil_node'], 'teaser'), + // // 'fil' => $node_view_builder->view($vars['last_fil_node'], 'teaser'), // 'title'=> array("#markup" => "

    Dernier Fil

    "), // 'fil' => $vars['last_fil_node'], // // 'links' => array( @@ -80,7 +81,7 @@ function template_preprocess_edlp_home(&$vars){ // render the last production column // $vars["last_production"] = array( // '#type' => 'container', - // 'prod' => $view_builder->view($vars['last_production_node'], 'teaser'), + // 'prod' => $node_view_builder->view($vars['last_production_node'], 'teaser'), // 'link'=> array( // '#title' => t('Voir toutes les productions.'), // '#type' => 'link', @@ -105,8 +106,25 @@ function template_preprocess_edlp_home(&$vars){ ); foreach($vars['agenda_items'] as $node){ - $agenda['list']['#items'][] = $view_builder->view($node, 'teaser'); + $agenda['list']['#items'][] = $node_view_builder->view($node, 'teaser'); } $vars['agenda'] = render($agenda); + if(isset($vars['entrees_items'])){ + $entrees = array( + '#type'=>"container", + // 'title'=>array( + // '#markup'=>"

    ".t("Entries")."

    ", + // ), + 'list'=> array( + '#theme' => 'item_list', + '#items' => [], + ), + ); + foreach($vars['entrees_items'] as $term){ + $entrees['list']['#items'][] = $term_view_builder->view($term, 'home_mobile'); + } + $vars['entrees'] = render($entrees); + } + } diff --git a/sites/all/modules/figli/edlp_home/src/Controller/HomeController.php b/sites/all/modules/figli/edlp_home/src/Controller/HomeController.php index 3dd86d176..a1c35d5a0 100644 --- a/sites/all/modules/figli/edlp_home/src/Controller/HomeController.php +++ b/sites/all/modules/figli/edlp_home/src/Controller/HomeController.php @@ -4,13 +4,15 @@ namespace Drupal\edlp_home\Controller; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Datetime\DrupalDateTime; +use Drupal\taxonomy\Entity\Term; +use Drupal\workflow\Entity\WorkflowManager; use Symfony\Component\HttpFoundation\JsonResponse; class HomeController extends ControllerBase { /** - * Display agenda as a page. + * Display home as a page. * * @return renderable array */ @@ -84,6 +86,153 @@ class HomeController extends ControllerBase { $events = $query->execute(); $contents['#agenda_items'] = entity_load_multiple('node', $events); + return $contents; + } + /** + * Display agenda as a page. + * + * @return renderable array + */ + public function home_mobile() { + + // $view_builder = \Drupal::entityTypeManager()->getViewBuilder('node'); + + $contents = array("#theme"=>'edlp_home'); + + // first get static pages + $query = \Drupal::entityQuery('node') + ->condition('status', 1) + ->condition('field_afficher_en_page_d_acceuil', 1) + ->condition('type', 'static'); + + $promoted_nids = $query->execute(); + $contents["#promoted_nodes"] = entity_load_multiple('node', $promoted_nids); + + // then get production pages + $query = \Drupal::entityQuery('node') + ->condition('status', 1) + ->condition('field_afficher_en_page_d_acceuil', 1) + ->condition('type', 'page'); + + $promoted_nids = $query->execute(); + $contents["#promoted_nodes"] += entity_load_multiple('node', $promoted_nids); + + // last fil + // $query = \Drupal::entityQuery('node') + // ->condition('status', 1) + // ->condition('type', 'fil') + // ->sort('created', 'DESC') + // ->range(0,1); + // + // $fil = $query->execute(); + // $contents["#last_fil_node"] = entity_load('node', array_pop($fil)); + // $contents["#last_fil_node"] = array('#markup'=>'En développement.'); + + // agenda + $now = new DrupalDateTime('now'); + $now->setTimezone(new \DateTimeZone(DATETIME_STORAGE_TIMEZONE)); + + $query = \Drupal::entityQuery('node') + ->condition('status', 1) + ->condition('type', 'evenement') + ->condition('field_date', $now->format(DATETIME_DATETIME_STORAGE_FORMAT), '>=') + ->range(0,5) + ->sort('field_date'); + + $events = $query->execute(); + $contents['#agenda_items'] = entity_load_multiple('node', $events); + + + // entrées + $language = \Drupal::languageManager()->getCurrentLanguage()->getId(); + + $query = \Drupal::entityQuery('taxonomy_term') + // ->sort('weight', 'DESC') + // ->sort('name', 'DESC') + ->condition('vid', 'entrees'); + + $tids = $query->execute(); + // $terms = entity_load_multiple('taxonomy_term', $tids); + // $terms = \Drupal::entityManager()->getStorage('taxonomy_term')->loadMultiple($t‌​erms); + $terms = Term::loadMultiple($tids); + + $ordered_terms = []; + foreach ($terms as $term) { + // remove masqué + $sid = WorkflowManager::getCurrentStateId($term, 'field_workflow'); + if($sid == 'generique_masque') continue; + // translate the term + $term = \Drupal::service('entity.repository')->getTranslationFromContext($term, $language); + $name = $term->getName(); + $ordered_trans_terms[$name] = $term; + } + + ksort($ordered_trans_terms); + + // dsm($terms); + // foreach ($ordered_trans_terms as $name => $term) { + // $tid = $term->id(); + // + // $entree = array( + // 'tid'=>$tid + // ); + + // term link + // $url = Url::fromRoute('entity.taxonomy_term.canonical', ['taxonomy_term'=>$tid]); + // $url->setOptions(array( + // 'attributes' => array( + // 'class' => ['term-'.$tid, 'term-link'], + // 'tid'=>$tid, + // 'selector' => 'entree-term-link-'.$tid, + // 'data-drupal-link-system-path' => $url->getInternalPath() + // ) + // )); + // $entree['term_link'] = Link::fromTextAndUrl($name, $url); + // index link + // $url = Url::fromRoute('entity.taxonomy_term.canonical', ['taxonomy_term'=>$tid]); + // $url->setOptions(array( + // 'attributes' => array( + // 'class' => ['index-link', 'ajax-link'], + // 'viewmode'=>'index', + // 'tid'=>$tid, + // 'selector' => 'entree-index-link-'.$tid, + // 'data-drupal-link-system-path' => $url->getInternalPath() + // ) + // )); + // $entree['index_link'] = Link::fromTextAndUrl('index', $url); + + // notice-link + // $url = Url::fromRoute('entity.taxonomy_term.canonical', ['taxonomy_term'=>$tid]); + // $url->setOptions(array( + // 'attributes' => array( + // 'class' => ['notice-link'], + // 'viewmode'=>'notice', + // 'tid'=>$tid, + // 'selector' => 'entree-notice-link-'.$tid, + // 'data-drupal-link-system-path' => $url->getInternalPath() + // ) + // )); + // $entree['notice_link'] = Link::fromTextAndUrl('notice', $url); + + // $entree['description'] = $term->get('description')->value; + // + // $entrees[] = $entree; + // } + + $contents['#entrees_items'] = $ordered_trans_terms; + + // = array ( + // '#theme' => 'blockentrees', + // '#entrees_items' => $entrees, + // '#attached'=>array( + // 'library' => array('edlp_corpus/corpus'), + // 'drupalSettings' => array( + // 'basepath' => base_path() + // ) + // ) + // ); + + return $contents; } diff --git a/sites/all/modules/figli/edlp_home/templates/edlp-home.html.twig b/sites/all/modules/figli/edlp_home/templates/edlp-home.html.twig index 3427e4d70..49661a863 100644 --- a/sites/all/modules/figli/edlp_home/templates/edlp-home.html.twig +++ b/sites/all/modules/figli/edlp_home/templates/edlp-home.html.twig @@ -6,3 +6,7 @@ {% endfor %} {{ agenda }} + +{% if entrees %} + {{ entrees }} +{% endif %} diff --git a/sites/all/modules/figli/edlp_search/assets/dist/scripts/edlp_search.min.js b/sites/all/modules/figli/edlp_search/assets/dist/scripts/edlp_search.min.js index c95d4fd4a..efc24608b 100644 --- a/sites/all/modules/figli/edlp_search/assets/dist/scripts/edlp_search.min.js +++ b/sites/all/modules/figli/edlp_search/assets/dist/scripts/edlp_search.min.js @@ -1,4 +1,125 @@ +(function ($, Drupal, drupalSettings) { -(function($,Drupal,drupalSettings){var settings=drupalSettings.edlp_search;var _$body=$('body');var _$container;var _$form;function init(){initEvents();initAjax();};function initEvents(){$('body').on('new-content-ajax-loaded',initAjax).on('edlp_search_search_form-col-closed',onSearchClosed);};function initAjax(){_$form=$('#edlp-search-form:not(.ajax-enabled)');if(!_$form.length)return false;_$form=$('#edlp-search-form:not(.ajax-enabled)').on('submit',onSubmitForm).addClass('ajax-enabled');_$container=_$form.parents('.row');if(!_$container.length){_$container=_$form.parent();}};function onSubmitForm(e){e.preventDefault();var args={};args.keys=$('input[type="search"]',this).val();args.entries=[];$('input[type="checkbox"]:checked','#edit-entries').each(function(index,el){args.entries.push($(this).val());});args.langues=$('input[name="language"]',this).val();args.genres=$('input[name="genres"]',this).val();loadResults(args);return false;};function loadResults(args){_$form.addClass('ajax-loading');_$body.addClass('ajax-loading');$('[theme="edlp_search_results"]',_$container).addClass('ajax-loading');var path=window.location.origin+drupalSettings.path.baseUrl+settings.results_ajax_url;$.getJSON(path,args).done(function(data){onResultsLoaded(data);}).fail(function(jqxhr,textStatus,error){onResultsLoadFail(jqxhr,textStatus,error);});};function onResultsLoaded(data){_$form.removeClass('ajax-loading');_$body.removeClass('ajax-loading');$prev_results=$('[theme="edlp_search_results"]',_$container);if($prev_results.length){$prev_results.replaceWith(data.rendered);}else{_$container.append(data.rendered);} -_$body.trigger({'type':'search-results-loaded','results':data.results_nids});if(typeof _paq!=='undefined'){var search_name=data.keys+';'+data.langues+';'+data.genres+';'+data.entry_names.join(',');_paq.push(['trackSiteSearch',search_name,'search',data.results_nids.length]);}};function onResultsLoadFail(jqxhr,textStatus,error){void 0;};function onSearchClosed(e){$('div[theme="edlp_search_results"]').remove();_$body.trigger({'type':'search-closed'});} -init();})(jQuery,Drupal,drupalSettings); \ No newline at end of file + var settings = drupalSettings.edlp_search; + var _$body = $('body'); + var _$container; + var _$form; + + function init(){ + // console.log('EdlpSearch Init', settings); + initEvents(); + initAjax(); + }; + + function initEvents(){ + $('body') + .on('new-content-ajax-loaded', initAjax) + .on('edlp_search_search_form-col-closed', onSearchClosed); + }; + + function initAjax(){ + _$form = $('#edlp-search-form:not(.ajax-enabled)'); + if(!_$form.length) return false; + + //console.log('EdlpSearch initAjaxForm()'); + _$form = $('#edlp-search-form:not(.ajax-enabled)') + .on('submit', onSubmitForm) + .addClass('ajax-enabled'); + _$container = _$form.parents('.row'); + if(!_$container.length){ + _$container = _$form.parent(); + } + }; + + function onSubmitForm(e){ + e.preventDefault(); + // console.log('onSubmitForm',e); + var args = {}; + + // search for key words + args.keys = $('input[type="search"]', this).val(); + + // entries filter + args.entries = []; + $('input[type="checkbox"]:checked', '#edit-entries').each(function(index, el) { + args.entries.push($(this).val()); + }); + + // langues + args.langues = $('input[name="language"]', this).val(); + + // genres + args.genres = $('input[name="genres"]', this).val(); + + //console.log('EdlpSearch onSubmitForm() : args',args); + + loadResults(args); + + return false; + }; + + function loadResults(args){ + //console.log('EdlpSearch loadResults() : args', args); + _$form.addClass('ajax-loading'); + _$body.addClass('ajax-loading'); + $('[theme="edlp_search_results"]', _$container).addClass('ajax-loading'); + var path = window.location.origin + drupalSettings.path.baseUrl +settings.results_ajax_url; + $.getJSON(path, args) + .done(function(data){ + onResultsLoaded(data); + }) + .fail(function(jqxhr, textStatus, error){ + onResultsLoadFail(jqxhr, textStatus, error); + }); + }; + + function onResultsLoaded(data){ + // console.log('EdlpSearch onResultsLoaded()', data); + _$form.removeClass('ajax-loading'); + _$body.removeClass('ajax-loading'); + + // insert results col + $prev_results = $('[theme="edlp_search_results"]', _$container); + if($prev_results.length){ + $prev_results.replaceWith(data.rendered); + }else{ + _$container.append(data.rendered); + } + + // trigger event + _$body.trigger({ + 'type':'search-results-loaded', + 'results':data.results_nids + }); + + + // piwik + if(typeof _paq !== 'undefined'){ + // page tracking + // https://matomo.org/blog/2017/02/how-to-track-single-page-websites-using-piwik-analytics/ + // _paq.push(['setCustomUrl', state.url]); + // _paq.push(['setDocumentTitle', data.title]); + // _paq.push(['trackPageView']); + + // trackEvent(category, action, [name], [value]) + var search_name = data.keys+';'+data.langues+';'+data.genres+';'+data.entry_names.join(','); + // _paq.push(['trackEvent', 'AjaxSearch', 'Results', search_name, data.results_nids.length]); + // piwik track searches + // trackSiteSearch(keyword, [category], [resultsCount]) + _paq.push(['trackSiteSearch', search_name, 'search', data.results_nids.length]); + } + }; + + function onResultsLoadFail(jqxhr, textStatus, error){ + console.warn('EdlpSearch : search results ajax load failed : '+error, jqxhr.responseText); + }; + + function onSearchClosed(e){ + // console.log('Edlp Search onSearchClosed()'); + $('div[theme="edlp_search_results"]').remove(); + // trigger event + _$body.trigger({'type':'search-closed'}); + } + + init(); +})(jQuery, Drupal, drupalSettings); diff --git a/sites/all/modules/figli/edlp_studio/assets/dist/scripts/edlp_studio.min.js b/sites/all/modules/figli/edlp_studio/assets/dist/scripts/edlp_studio.min.js index 02a7660bb..a01cc879c 100644 --- a/sites/all/modules/figli/edlp_studio/assets/dist/scripts/edlp_studio.min.js +++ b/sites/all/modules/figli/edlp_studio/assets/dist/scripts/edlp_studio.min.js @@ -1,10 +1,408 @@ +(function ($, Drupal, drupalSettings) { -(function($,Drupal,drupalSettings){var _settings=drupalSettings.edlp_studio;var $composer;function init(){initEvents();initStudio();};function initEvents(){$('body').on('new-audio-cartel-loaded',initAjaxChutierLinks).on('new-content-ajax-loaded',initStudio).on('all-modal-closed',initStudio);};function initStudio(){if($('#studio-ui').length){$composer=$('.composition_ui .composer','#studio-ui');initAjaxChutierLinks();initAjaxCompoLinks();initDragAndDropUI();$('body').trigger({'type':'studio-initialized'});}else{$('body').trigger({'type':'studio-not-active'});}} -function initAjaxChutierLinks(){$('.chutier-ajax-link:not(.ajax-enabled)').addClass('ajax-enabled').on('click',onClickChutierAjaxLink);};function onClickChutierAjaxLink(e){e.preventDefault();addRemoveToChutier($(this));return false;};function addRemoveToChutier($link){var ajax_path=$link.attr('data-drupal-link-system-path');var path=window.location.origin+drupalSettings.path.baseUrl+ajax_path;$link.addClass('ajax-loading');$.getJSON(path,{}).done(function(data){onActionToChutierDone($link,data);}).fail(function(jqxhr,textStatus,error){onErrorActionToChutier(jqxhr,textStatus,error,$link);});};function onActionToChutierDone($link,data){$('body').trigger({'type':'chutier-action-done','action_done':data.action_done,'new_action':data.action_done=='add'?'remove':'add','target_id':$link.attr('target_id'),});$link.replaceWith(data.new_link);initAjaxChutierLinks();updateStudioChutier();};function onErrorActionToChutier(jqxhr,textStatus,error,$link){void 0;};function initAjaxCompoLinks(){$('.new-composition-link:not(.ajax-enabled)').on('click',onClickNewCompoLink).addClass('ajax-enabled');$('.composition-link:not(.ajax-enabled)').on('click',onClickCompoLink).addClass('ajax-enabled');$('.delete-composition-link:not(.ajax-enabled)').on('click',onClickDeleteCompoLink).addClass('ajax-enabled');};function onClickCompoLink(e){e.preventDefault();openCompo($(this));return false;};function openCompo($link){var cid=$link.attr('cid');var ajax_path=_settings.open_compo_ajax_url+'/'+cid;var path=window.location.origin+Drupal.url(ajax_path);$link.addClass('ajax-loading');$composer.addClass('ajax-loading');$.getJSON(path,{}).done(function(data){onOpenCompoDone(data,$link);}).fail(function(jqxhr,textStatus,error){onErrorOpenCompo(jqxhr,textStatus,error,$link);});};function onOpenCompoDone(data,$link){$('.composition-link').removeClass('is-active');$link.removeClass('ajax-loading').addClass('is-active');if($('.composition',$composer).length){$('.composition',$composer).replaceWith(data.compo);}else{$('header',$composer).after(data.compo);} -$composer.removeClass('ajax-loading');initDragAndDropUI();$('body').trigger({'type':'on-studio-compo-opened'});};function onErrorOpenCompo(jqxhr,textStatus,error,$link){$link.removeClass('ajax-loading');void 0;};function onClickNewCompoLink(e){e.preventDefault();setInputForNewCompoName($(this));return false;};function setInputForNewCompoName($link){var $form=$('
    ').addClass('new-compo-form').append($('').attr('type','text').attr('placeholder','new name')).append($('