123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713 |
- // @codekit-prepend "gui.js"
- // @koala-prepend "gui.js"
- (function($) {
- MaterioFlag = function(){
- var _isLoadingList = false ;
- /**
- * init()
- */
- function init(){
- //trace('MaterioFlag :: init MaterioFlag');
- buildBlocks();
- $(document)
- .bind('flagGlobalAfterLinkUpdate', onFlaging)
- .bind('resultscompleted resultschanged previewloaded', onResultsUpdated)
- .bind('init-scroller-pager', onInitScrollerPager)
- .bind('load-scroller-pager', onLoadScrollerPager)
- .bind('view-mode-changed', onViewModeChanged)
- .bind('history-state-change', onHistoryStateChange);
- // ajaxifyLinks();
- // trigger updated event for direct html loading
- if(isList()){
- setTimeout(function(){
- triggerContentChanged();
- }, 10);
- }
- };
- function onFlaging(event){
- //trace('MaterioFlag :: onFlaging', event);
- refreshBlocks();
- };
- function onResultsUpdated(event){
- //trace('MaterioFlag :: onResultsUpdated', event);
- ajaxifyLinks(event.container);
- };
- function buildBlocks(activename){
- //trace('MaterioFlag :: buildBlocks | activename', activename);
- if($('#block-materio-flag-materio-flag-mybookmarks').length){
- var type = 'bookmarks';
- var block = '#block-materio-flag-materio-flag-mybookmarks';
- }else if($('#block-materio-flag-materio-flag-mylists').length){
- var type = 'lists';
- var block = '#block-materio-flag-materio-flag-mylists';
- }
- switch(type){
- case 'bookmarks':
- var name = type;
- $('h2 .listname', block).attr('name', name).bind('click', onClickShowPreview);
- $('<i class="icon-remove"></i>').appendTo($('h2', block)).attr('name', name).bind('click', onClickClosePreview);
- // $('<span class="preview"><i class="icon-eye-open"></i></span>').appendTo($('h2', block)).bind('click', onClickShowPreview);
- // if(!readCookie('materiobookmarkspreviewopened')){
- // showPreview('bookmarks', block);
- // }else{
- // }
- break;
- case 'lists':
- // nav block
- $('a.open-list:not(.ajax-processed)', '#block-materio-flag-materio-flag-mylists-nav').each(function(index){
- //trace('nav block a.open-list this', this);
- $this = $(this)
- .bind('click', onClickOpenLink)
- .addClass('ajax-processed');
- var name = $this.attr('class').match(/flag_lists_[^_]+_[0-9]+/);
- // trace('MaterioFlag :: name', name);
- $('<span class="preview"><i class="icon-eye-open"></i></span>').attr('name', name).insertAfter($this).bind('click', onClickShowPreview);
- });
- $('a.edit-list:not(.ajax-processed)', '#block-materio-flag-materio-flag-mylists-nav')
- .bind('click', onCLickEditList)
- .addClass('ajax-processed');
- $('a.flag-lists-create:not(.ajax-processed)', '#block-materio-flag-materio-flag-mylists-nav')
- .bind('click', onClickCreatLink)
- .addClass('ajax-processed');
- // preview block
- $('section.flag-list:not(.ajax-processed)', '#block-materio-flag-materio-flag-mylists').each(function(index){
- var name = $(this).attr('class').match(/flag_lists_[^_]+_[0-9]+/);
- $('<i class="icon-remove"></i>').appendTo($('h2.listname', this)).attr('name', name).bind('click', onClickClosePreview);
- $('a.open-list', this).bind('click', onClickOpenLink);
- }).addClass('ajax-processed');
- break;
- }
- // trigger refresh block event for enabling lazyload images
- setTimeout(function(){
- $.event.trigger({
- type : 'my'+type+'-block-builded',
- block : block,
- name : name
- });
- },10);
- // trace('MaterioFlag :: activename', activename);
- if(activename == undefined)
- activename = readCookie('materiomyflaglistsopened');
- // trace('MaterioFlag :: activename', activename);
- if(activename)
- showPreview(activename, block);
- };
- function refreshBlocks(name){
- //trace('MaterioFlag :: refreshBlocks | name', name);
- if($('#block-materio-flag-materio-flag-mybookmarks').length){
- var type = 'bookmarks';
- }else if($('#block-materio-flag-materio-flag-mylists').length){
- var type = 'lists';
- }
- if(type != undefined){
- var id = '#block-materio-flag-materio-flag-my'+type;
- var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/refresh/block/'+type;
- $.getJSON(url, function(json){
- // trace('MaterioFlag :: block refreshed '+type, json);
- $(id).replaceWith(json.block);
- $('#block-materio-flag-materio-flag-mylists-nav').replaceWith(json.block_nav);
- buildBlocks(name);
- $.event.trigger({
- type : 'my'+type+'-block-updated',
- listname : name
- });
- });
- }
- };
- function ajaxifyLinks(container){
- //trace('MaterioFlag :: ajaxifyLinks', container);
- container = ((container != null) ? container : 'body');
- // trace('MaterioFlag :: typeof Drupal.flagLink', typeof Drupal.flagLink);
- if (typeof Drupal.flagLink != 'undefined')
- Drupal.flagLink(container);
- if(isList()){
- var fid = $('.materio-flags-list', '#content').attr('fid');
- $('li.unflag-action.fid-'+fid+' a:not(.ajax-processed), li.flag-bookmarks a.unflag-action:not(.ajax-processed)')
- .bind('click', onUnflagList)
- .addClass('ajax-processed');
- }
- $('a.flag-lists-create:not(.ajax-processed)', container)
- .bind('click', onClickCreatLink)
- .addClass('ajax-processed');
- };
- /**
- * show hide preview
- */
- function onClickShowPreview(event){
- //trace('MaterioFlag :: onClickShowPreview', event);
- showPreview($(this).attr('name'), $(this).parent('.block').attr('id'));
- };
- function showPreview(name, block){
- //trace('MaterioFlag :: showPreview', name);
- $('section.'+name, block).addClass('active')
- .siblings('section').removeClass('active');
- createCookie('materiomyflaglistsopened', name, 1);
- $.event.trigger('init-layout');
- };
- function onClickClosePreview(event){
- //trace('MaterioFlag :: onClickClosePreview', event);
- eraseCookie('materiomyflaglistsopened');
- if($(this).attr('name') == 'bookmarks'){
- $(this).parents('.block').find('section.bookmarks').removeClass('active');
- }else{
- $(this).parents('section.flag-list').removeClass('active');
- }
- $.event.trigger('init-layout');
- };
- /**
- * onClickOpenLink
- */
- function onClickOpenLink(event){
- event.preventDefault();
- var $link = $(event.currentTarget);
- var fid = $link.attr('href').match(/lists\/([0-9]+)$/);
- // trace('MaterioFlag :: type', type);
- loadList(fid[1]);
- return false;
- };
- function loadList(fid){
- //trace('MaterioFlag :: loadList | fid', fid);
- var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/ajax/list/'+fid;
- $.event.trigger('loading-content');
- $.getJSON(url, {'current_path':document.location.href},function(json){
- //trace('MaterioFlag :: json', json);
- if(json.redirect){
- window.location = json.redirect;
- }else{
- changeContent(json);
- }
- });
- };
- function changeContent(json){
- if(json.rendered){
- $('.inner-content','#content').html(json.rendered);
- $.event.trigger('loaded-content');
- // no need of ajaxifylinks because it's triggered with resultschanged
- // ajaxifyLinks('#content');
- var path = Drupal.settings.basePath + Drupal.settings.pathPrefix + json.path;
- $.event.trigger({
- type : 'new-history-page',
- path : path,
- title : json.title,
- content : json.rendered
- });
- // TODO: change language links for folders
- // for (language in Drupal.settings.materio_search_api_ajax.languages) {
- // var l = Drupal.settings.materio_search_api_ajax.languages[language];
- // $('#block-locale-language li.'+language+' a').attr('href', Drupal.settings.basePath + l.prefix+'/' + json.search_path + '/' + json.keys)
- // };
- triggerContentChanged();
- }else{
- //trace('MaterioFlag :: no results');
- }
- };
- function triggerContentChanged(){
- $.event.trigger({
- type: 'resultschanged',
- container : '#content .flaglist-items'
- });
- };
- /**
- * onClickCreatLink(event)
- */
- function onClickCreatLink(event){
- //trace('MaterioFlag :: onClickCreatLink | event', event);
- event.preventDefault();
- var $link = $(event.currentTarget);
- var type = $link.attr('href').match(/[^\/]*$/);
- // trace('MaterioFlag :: type', type);
- var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/createlist/form/'+type[0];
- $.getJSON(url, function(json){
- //trace('MaterioFlag :: creat list : json', json);
- showCreateListForm(json, $link);
- });
- return false;
- };
- function showCreateListForm(json, $link){
- //trace('MaterioFlag :: showCreateListForm | json', json);
- // google analytics
- $.event.trigger({
- type:"record-stat",
- categorie:"flagLists",
- action: 'show create form'
- });
- var $modal = $('<div id="modal" class="modal"/>').appendTo('body');
- $modal
- .css({
- position:'absolute',
- top:'40%', left:'50%',
- marginLeft:'-150px', width:'300px',
- zIndex:"99999"
- })
- .append(json.rendered_form)
- .find('input[type="submit"]', '#materio-flag-create-list-form').bind('click', function(event) {
- event.preventDefault();
- switch($(this).attr('name')){
- case 'cancel':
- //trace('MaterioFlag :: cancel',event);
- $(this).parents('#modal').remove();
- // google analytics
- $.event.trigger({
- type:"record-stat",
- categorie:"flagLists",
- action: 'cancel create form'
- });
- break;
- case 'create':
- //trace('MaterioFlag :: create',event);
- var title = $(this).parents('form').find('input[name*="flag-lists-name"]').val();
- var type = $(this).parents('form').find('input[name*="type"]').val();
- // google analytics
- $.event.trigger({
- type : "record-stat",
- categorie : "flagLists",
- action : "submit create form",
- label : 'title : '+title
- });
- createList($modal, type, title, $link);
- break;
- }
- return false;
- })
- .parents('form').find('input[type="text"]').focus();
- // TODO: esc keypressed close the form
- };
- function createList($modal, type, title, $link){
- //trace('materioflag :: createList | title', title);
- $('.flag-lists-create').addClass('loading');
- var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'flag-lists/add/'+type+'/js';
- $.getJSON(url, {name:title}, function(data) {
- if (data.error) {
- //trace(data.error);
- }
- else {
- // select.append('<option value="'+data.flag.fid+'">'+data.flag.title+'</option>');
- // $('input.name', $(this)).val('');
- // dialog.dialog('close');
- //trace('MaterioFlag :: created list : data', data);
- if($link.attr('nid') && $link.attr('token')){
- flagEntityWithList(data.flag.name, $link.attr('nid'), $link.attr('token'));
- }else{
- refreshBlocks(data.flag.name);
- refreshNodeLinks();
- }
- $modal.remove();
- }
- });
- };
- function flagEntityWithList(name, nid, token){
- //trace('MaterioFlag :: flagEntityWithList | name', name);
- // var ret;
- // Send POST request
- $.ajax({
- type: 'POST',
- url: Drupal.settings.basePath+Drupal.settings.pathPrefix+'flag-lists/flag/'+name+'/'+nid,
- data: { js: true, token: token },
- dataType: 'json',
- success: function (data2) {
- //trace('MaterioFlag :: node taged with newly created list : data2', data2)
- if (data2.status) {
- // google analytics
- $.event.trigger({
- type : "record-stat",
- categorie : 'FlagLists',
- action : 'node flaged',
- label : 'nid : '+nid+' | flag : '+name
- });
- refreshBlocks(name);
- refreshNodeLinks();
- }else {
- // Failure.
- alert(data2.errorMessage);
- }
- },
- error: function (xmlhttp) {
- alert('An HTTP error '+ xmlhttp.status +' occurred.\n'+ element.href);
- }
- });
- };
- function refreshNodeLinks(){
- //trace('MaterioFlag :: refreshNodeLinks');
- var nids = new Array();
- $('.flag-lists-entity-links')
- // .addClass('loading')
- .parents('.node')
- .each(function(index) {
- nids.push($(this).attr('class').match(/node-([0-9]+)/)[1]);
- });
- // trace('MaterioFlag :: nids', nids);
- var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/nodelinks';
- $.getJSON(url, {nids:nids.join(";")}, function(data) {
- // trace('MaterioFlag :: data', data);
- for(nid in data.links){
- // trace('MaterioFlag :: nid', nid);
- // trace('MaterioFlag :: data.links[nid]', data.links[nid]);
- $('.node-'+nid+' .flag-lists-entity-links').replaceWith(data.links[nid]);
- // trace('MaterioFlag :: typeof Drupal.flagLink', typeof Drupal.flagLink);
- // if (typeof Drupal.flagLink != 'undefined')
- // Drupal.flagLink($('.node-'+nid+' .flag-lists-entity-links'));
- // TODO: sortir ajaxifyLinks de la boucle, je pense que ça prend trop de ressources
- ajaxifyLinks('.node-'+nid+' .flag-lists-entity-links');
- }
- });
- $.event.trigger({
- type : 'materioflag-nodelinks-updated',
- nids : nids
- });
- };
- /**
- * onCLickEditList(event)
- */
- function onCLickEditList(event){
- //trace('MaterioFlag :: onCLickEditList | event', event);
- // TODO: empécher le double formulaire
- event.preventDefault();
- var $link = $(event.currentTarget);
- var lid = $link.attr('href').match(/[^\/]*$/);
- var type = 'materiau'; // this is cheap
- var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/editlistform/'+type+'/'+lid[0];
- $.getJSON(url, function(json){
- //trace('MaterioFlag :: editlist : json', json);
- showEditListForm(json, $link);
- });
- return false;
- };
- function showEditListForm(json, $link){
- //trace('MaterioFlag :: showEditListForm | json', json);
- // google analytics
- $.event.trigger({
- type:"record-stat",
- categorie:"flagLists",
- action: 'show edit form'
- });
- var $modal = $('<div id="modal" class="modal"/>').appendTo('body');
- $modal
- .css({
- position:'absolute',
- top:'40%', left:'50%',
- marginLeft:'-150px', width:'300px',
- zIndex:"99999"
- })
- .append(json.rendered_form)
- .find('input[type="submit"]', '#materio-flag-edit-list-form').bind('click', function(event) {
- event.preventDefault();
- var $form = $(this).parents('form');
- var title = $form.find('input[name*="flag-lists-title"]').val();
- var fid = $form.find('input[name*="fid"]').val();
- var name = $form.find('input[name*="name"]').val();
- switch($(this).attr('name')){
- case 'cancel':
- //trace('MaterioFlag :: cancel',event);
- $(this).parents('#modal').remove();
- // google analytics
- var action = 'cancel edit form';
- break;
- case 'save':
- //trace('MaterioFlag :: create',event);
- // google analytics
- var action = "submit edit form";
- saveList($modal, fid, name, title);
- break;
- case 'delete':
- //trace('MaterioFlag :: delete',event);
- if(confirm('Do you realy want to delete your '+title+' folder ?')){
- var action = "submit delete form";
- deleteList($modal, fid);
- }else{
- var action = "cancel delete form";
- }
- break;
- }
- // google analytics
- $.event.trigger({
- type:"record-stat",
- categorie:"flagLists",
- action: action
- });
- return false;
- })
- .parents('form').find('input[type="text"]').focus();
- // TODO: esc keypressed close the form
- };
- function saveList($modal, fid, name, title){
- //trace('MaterioFlag :: saveList | fid : '+fid+'| name', name);
- $('.flag-lists-link.fid-'+fid).addClass('loading');
- var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/editlist/'+fid+'/'+name+'/'+title;
- $.getJSON(url, function(data) {
- if (data.error) {
- // trace(data.error);
- if(data.message)
- alert(data.message);
- }
- else {
- //trace('MaterioFlag :: saved list : data', data);
- $.event.trigger({
- type : 'list-edited',
- name : data.listname,
- title : data.title,
- });
- refreshBlocks();
- refreshNodeLinks();
- $modal.remove();
- }
- });
- };
- function deleteList($modal, fid){
- //trace('MaterioFlag :: deletelist | fid', fid);
- $('.flag-lists-link.fid-'+fid).hide();
- var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/deletelist/'+fid;
- $.getJSON(url, function(data) {
- if (data.error) {
- // trace(data.error);
- if(data.message)
- alert(data.message);
- }
- else {
- //trace('MaterioFlag :: deleted list : data', data);
- refreshBlocks();
- refreshNodeLinks();
- // TODO: if the deleted list was the current displayed list ??
- $modal.remove();
- }
- });
- };
- /**
- * onUnflagList()
- */
- function onUnflagList(event){
- //trace('onUnflagList', event);
- $(this).parents('article.node').addClass('removed');
- };
- /**
- *
- */
- function onInitScrollerPager(event){
- // trace('MaterioFlag :: MaterioFlag :: onInitScrollerPager');
- if (isList()){
- // trace('MaterioFlag :: event.pager', event);
- event.pager.hide();
- }
- };
- function onLoadScrollerPager(event){
- if (isList())
- loadNextListPage(event.href);
- };
- function loadNextListPage(href){
- // trace('MaterioFlag :: loadNextListPage', href);
- if(!_isLoadingList){
- var fid = href.match(/lists\/([^\/|\?]+)/);
- var page = href.match(/\?page=([0-9]+)/);
- var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/ajax/list/'+fid[1]+'/'+page[1];
- // trace('MaterioFlag :: url', url);
- loadNextPage(url, $('.materio-flags-list', '#content'), '.flaglist-items');
- }
- };
- function loadNextPage(url, $container, target){
- //trace('MaterioFlag :: loadNextPage');
- _isLoadingList = true;
- $container.addClass('loading');
- $.getJSON(url, function(json){
- //trace('json', json);
- _isLoadingList = false;
- $container.removeClass('loading');
- addNextpage(json, target);
- });
- };
- function addNextpage(json, container_class){
- var $newcontent = $(json.rendered),
- $newitems = $(container_class, $newcontent).children('article').addClass('just-added'),
- $newpager = $('ul.pager', $newcontent);
- $(container_class, '#content').append($newitems);
- $('ul.pager', '#content').replaceWith($newpager.hide());
- // TODO: animation, this should be on theme side
- $(container_class, '#content').children('.just-added').each(function(i){
- // $(this).delay(5000*i).removeClass('just-added');
- var $this = $(this);
- setTimeout(function(){
- $this.removeClass('just-added');
- }, 150*i);
- });
- $.event.trigger({
- type : 'resultscompleted',
- container : $(container_class, '#content')
- });
- };
- function onViewModeChanged(event){
- if (isList())
- loadList(getFid());
- };
- /**
- * history
- */
- function onHistoryStateChange(event){
- if(isList())
- triggerContentChanged();
- };
- /**
- * Helpers
- */
- function getFid(){
- return $('.materio-flags-list', '#content').attr('fid');;
- };
- function isList(){
- return $('.materio-flags-list', '#content').length;
- };
- /**
- * cookies
- */
- function createCookie(name,value,days) {
- if (days) {
- var date = new Date();
- date.setTime(date.getTime()+(days*24*60*60*1000));
- var expires = "; expires="+date.toGMTString();
- }
- else var expires = "";
- document.cookie = name+"="+value+expires+"; path=/";
- }
- function readCookie(name) {
- var nameEQ = name + "=";
- var ca = document.cookie.split(';');
- for(var i=0;i < ca.length;i++) {
- var c = ca[i];
- while (c.charAt(0)==' ') c = c.substring(1,c.length);
- if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
- }
- return null;
- }
- function eraseCookie(name) {
- createCookie(name,"",-1);
- }
- init();
- };
- $(document).ready(function() {
- var materioflag = new MaterioFlag();
- });
- })(jQuery);
|