materio_flag.min.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709
  1. (function($) {
  2. MaterioFlag = function(){
  3. var _isLoadingList = false ;
  4. /**
  5. * init()
  6. */
  7. function init(){
  8. //trace('MaterioFlag :: init MaterioFlag');
  9. buildBlocks();
  10. $(document)
  11. .bind('flagGlobalAfterLinkUpdate', onFlaging)
  12. .bind('resultscompleted resultschanged previewloaded', onResultsUpdated)
  13. .bind('init-scroller-pager', onInitScrollerPager)
  14. .bind('load-scroller-pager', onLoadScrollerPager)
  15. .bind('view-mode-changed', onViewModeChanged)
  16. .bind('history-state-change', onHistoryStateChange);
  17. // ajaxifyLinks();
  18. // trigger updated event for direct html loading
  19. if(isList()){
  20. setTimeout(function(){
  21. triggerContentChanged();
  22. }, 10);
  23. }
  24. };
  25. function onFlaging(event){
  26. //trace('MaterioFlag :: onFlaging', event);
  27. refreshBlocks();
  28. };
  29. function onResultsUpdated(event){
  30. //trace('MaterioFlag :: onResultsUpdated', event);
  31. ajaxifyLinks(event.container);
  32. };
  33. function buildBlocks(activename){
  34. //trace('MaterioFlag :: buildBlocks | activename', activename);
  35. if($('#block-materio-flag-materio-flag-mybookmarks').length){
  36. var type = 'bookmarks';
  37. var block = '#block-materio-flag-materio-flag-mybookmarks';
  38. }else if($('#block-materio-flag-materio-flag-mylists').length){
  39. var type = 'lists';
  40. var block = '#block-materio-flag-materio-flag-mylists';
  41. }
  42. switch(type){
  43. case 'bookmarks':
  44. var name = type;
  45. $('h2 .listname', block).attr('name', name).bind('click', onClickShowPreview);
  46. $('<i class="icon-remove"></i>').appendTo($('h2', block)).attr('name', name).bind('click', onClickClosePreview);
  47. // $('<span class="preview"><i class="icon-eye-open"></i></span>').appendTo($('h2', block)).bind('click', onClickShowPreview);
  48. // if(!readCookie('materiobookmarkspreviewopened')){
  49. // showPreview('bookmarks', block);
  50. // }else{
  51. // }
  52. break;
  53. case 'lists':
  54. // nav block
  55. $('a.open-list:not(.ajax-processed)', '#block-materio-flag-materio-flag-mylists-nav').each(function(index){
  56. //trace('nav block a.open-list this', this);
  57. $this = $(this)
  58. .bind('click', onClickOpenLink)
  59. .addClass('ajax-processed');
  60. var name = $this.attr('class').match(/flag_lists_[^_]+_[0-9]+/);
  61. // trace('MaterioFlag :: name', name);
  62. $('<span class="preview"><i class="icon-eye-open"></i></span>').attr('name', name).insertAfter($this).bind('click', onClickShowPreview);
  63. });
  64. $('a.edit-list:not(.ajax-processed)', '#block-materio-flag-materio-flag-mylists-nav')
  65. .bind('click', onCLickEditList)
  66. .addClass('ajax-processed');
  67. $('a.flag-lists-create:not(.ajax-processed)', '#block-materio-flag-materio-flag-mylists-nav')
  68. .bind('click', onClickCreatLink)
  69. .addClass('ajax-processed');
  70. // preview block
  71. $('section.flag-list:not(.ajax-processed)', '#block-materio-flag-materio-flag-mylists').each(function(index){
  72. var name = $(this).attr('class').match(/flag_lists_[^_]+_[0-9]+/);
  73. $('<i class="icon-remove"></i>').appendTo($('h2.listname', this)).attr('name', name).bind('click', onClickClosePreview);
  74. $('a.open-list', this).bind('click', onClickOpenLink);
  75. }).addClass('ajax-processed');
  76. break;
  77. }
  78. // trigger refresh block event for enabling lazyload images
  79. setTimeout(function(){
  80. $.event.trigger({
  81. type : 'my'+type+'-block-builded',
  82. block : block,
  83. name : name
  84. });
  85. },10);
  86. // trace('MaterioFlag :: activename', activename);
  87. if(activename == undefined)
  88. activename = readCookie('materiomyflaglistsopened');
  89. // trace('MaterioFlag :: activename', activename);
  90. if(activename)
  91. showPreview(activename, block);
  92. };
  93. function refreshBlocks(name){
  94. //trace('MaterioFlag :: refreshBlocks | name', name);
  95. if($('#block-materio-flag-materio-flag-mylists').length){
  96. var type = 'lists';
  97. }else if($('#block-materio-flag-materio-flag-mybookmarks').length){
  98. var type = 'bookmarks';
  99. }
  100. if(type != undefined){
  101. var id = '#block-materio-flag-materio-flag-my'+type;
  102. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/refresh/block/'+type;
  103. $.getJSON(url, function(json){
  104. // trace('MaterioFlag :: block refreshed '+type, json);
  105. $(id).replaceWith(json.block);
  106. $('#block-materio-flag-materio-flag-mylists-nav').replaceWith(json.block_nav);
  107. buildBlocks(name);
  108. $.event.trigger({
  109. type : 'my'+type+'-block-updated',
  110. listname : name
  111. });
  112. });
  113. }
  114. };
  115. function ajaxifyLinks(container){
  116. //trace('MaterioFlag :: ajaxifyLinks', container);
  117. container = ((container != null) ? container : 'body');
  118. // trace('MaterioFlag :: typeof Drupal.flagLink', typeof Drupal.flagLink);
  119. if (typeof Drupal.flagLink != 'undefined')
  120. Drupal.flagLink(container);
  121. if(isList()){
  122. var fid = $('.materio-flags-list', '#content').attr('fid');
  123. $('li.unflag-action.fid-'+fid+' a:not(.ajax-processed), li.flag-bookmarks a.unflag-action:not(.ajax-processed)')
  124. .bind('click', onUnflagList)
  125. .addClass('ajax-processed');
  126. }
  127. $('a.flag-lists-create:not(.ajax-processed)', container)
  128. .bind('click', onClickCreatLink)
  129. .addClass('ajax-processed');
  130. };
  131. /**
  132. * show hide preview
  133. */
  134. function onClickShowPreview(event){
  135. //trace('MaterioFlag :: onClickShowPreview', event);
  136. showPreview($(this).attr('name'), $(this).parent('.block').attr('id'));
  137. };
  138. function showPreview(name, block){
  139. //trace('MaterioFlag :: showPreview', name);
  140. $('section.'+name, block).addClass('active')
  141. .siblings('section').removeClass('active');
  142. createCookie('materiomyflaglistsopened', name, 1);
  143. $.event.trigger('init-layout');
  144. };
  145. function onClickClosePreview(event){
  146. //trace('MaterioFlag :: onClickClosePreview', event);
  147. eraseCookie('materiomyflaglistsopened');
  148. if($(this).attr('name') == 'bookmarks'){
  149. $(this).parents('.block').find('section.bookmarks').removeClass('active');
  150. }else{
  151. $(this).parents('section.flag-list').removeClass('active');
  152. }
  153. $.event.trigger('init-layout');
  154. };
  155. /**
  156. * onClickOpenLink
  157. */
  158. function onClickOpenLink(event){
  159. event.preventDefault();
  160. var $link = $(event.currentTarget);
  161. var fid = $link.attr('href').match(/lists\/([0-9]+)$/);
  162. // trace('MaterioFlag :: type', type);
  163. loadList(fid[1]);
  164. return false;
  165. };
  166. function loadList(fid){
  167. //trace('MaterioFlag :: loadList | fid', fid);
  168. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/ajax/list/'+fid;
  169. $.event.trigger('loading-content');
  170. $.getJSON(url, {'current_path':document.location.href},function(json){
  171. //trace('MaterioFlag :: json', json);
  172. if(json.redirect){
  173. window.location = json.redirect;
  174. }else{
  175. changeContent(json);
  176. }
  177. });
  178. };
  179. function changeContent(json){
  180. if(json.rendered){
  181. $('.inner-content','#content').html(json.rendered);
  182. $.event.trigger('loaded-content');
  183. // no need of ajaxifylinks because it's triggered with resultschanged
  184. // ajaxifyLinks('#content');
  185. var path = Drupal.settings.basePath + Drupal.settings.pathPrefix + json.path;
  186. $.event.trigger({
  187. type : 'new-history-page',
  188. path : path,
  189. title : json.title,
  190. content : json.rendered
  191. });
  192. // TODO: change language links for folders
  193. // for (language in Drupal.settings.materio_search_api_ajax.languages) {
  194. // var l = Drupal.settings.materio_search_api_ajax.languages[language];
  195. // $('#block-locale-language li.'+language+' a').attr('href', Drupal.settings.basePath + l.prefix+'/' + json.search_path + '/' + json.keys)
  196. // };
  197. triggerContentChanged();
  198. }else{
  199. //trace('MaterioFlag :: no results');
  200. }
  201. };
  202. function triggerContentChanged(){
  203. $.event.trigger({
  204. type: 'resultschanged',
  205. container : '#content .flaglist-items'
  206. });
  207. };
  208. /**
  209. * onClickCreatLink(event)
  210. */
  211. function onClickCreatLink(event){
  212. //trace('MaterioFlag :: onClickCreatLink | event', event);
  213. event.preventDefault();
  214. var $link = $(event.currentTarget);
  215. var type = $link.attr('href').match(/[^\/]*$/);
  216. // trace('MaterioFlag :: type', type);
  217. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/createlist/form/'+type[0];
  218. $.getJSON(url, function(json){
  219. //trace('MaterioFlag :: creat list : json', json);
  220. showCreateListForm(json, $link);
  221. });
  222. return false;
  223. };
  224. function showCreateListForm(json, $link){
  225. //trace('MaterioFlag :: showCreateListForm | json', json);
  226. // google analytics
  227. $.event.trigger({
  228. type:"record-stat",
  229. categorie:"flagLists",
  230. action: 'show create form'
  231. });
  232. var $modal = $('<div id="modal" class="modal"/>').appendTo('body');
  233. $modal
  234. .css({
  235. position:'absolute',
  236. top:'40%', left:'50%',
  237. marginLeft:'-150px', width:'300px',
  238. zIndex:"99999"
  239. })
  240. .append(json.rendered_form)
  241. .find('input[type="submit"]', '#materio-flag-create-list-form').bind('click', function(event) {
  242. event.preventDefault();
  243. switch($(this).attr('name')){
  244. case 'cancel':
  245. //trace('MaterioFlag :: cancel',event);
  246. $(this).parents('#modal').remove();
  247. // google analytics
  248. $.event.trigger({
  249. type:"record-stat",
  250. categorie:"flagLists",
  251. action: 'cancel create form'
  252. });
  253. break;
  254. case 'create':
  255. //trace('MaterioFlag :: create',event);
  256. var title = $(this).parents('form').find('input[name*="flag-lists-name"]').val();
  257. var type = $(this).parents('form').find('input[name*="type"]').val();
  258. // google analytics
  259. $.event.trigger({
  260. type : "record-stat",
  261. categorie : "flagLists",
  262. action : "submit create form",
  263. label : 'title : '+title
  264. });
  265. createList($modal, type, title, $link);
  266. break;
  267. }
  268. return false;
  269. })
  270. .parents('form').find('input[type="text"]').focus();
  271. // TODO: esc keypressed close the form
  272. };
  273. function createList($modal, type, title, $link){
  274. //trace('materioflag :: createList | title', title);
  275. $('.flag-lists-create').addClass('loading');
  276. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'flag-lists/add/'+type+'/js';
  277. $.getJSON(url, {name:title}, function(data) {
  278. if (data.error) {
  279. //trace(data.error);
  280. }
  281. else {
  282. // select.append('<option value="'+data.flag.fid+'">'+data.flag.title+'</option>');
  283. // $('input.name', $(this)).val('');
  284. // dialog.dialog('close');
  285. //trace('MaterioFlag :: created list : data', data);
  286. if($link.attr('nid') && $link.attr('token')){
  287. flagEntityWithList(data.flag.name, $link.attr('nid'), $link.attr('token'));
  288. }else{
  289. refreshBlocks(data.flag.name);
  290. refreshNodeLinks();
  291. }
  292. $modal.remove();
  293. }
  294. });
  295. };
  296. function flagEntityWithList(name, nid, token){
  297. //trace('MaterioFlag :: flagEntityWithList | name', name);
  298. // var ret;
  299. // Send POST request
  300. $.ajax({
  301. type: 'POST',
  302. url: Drupal.settings.basePath+Drupal.settings.pathPrefix+'flag-lists/flag/'+name+'/'+nid,
  303. data: { js: true, token: token },
  304. dataType: 'json',
  305. success: function (data2) {
  306. //trace('MaterioFlag :: node taged with newly created list : data2', data2)
  307. if (data2.status) {
  308. // google analytics
  309. $.event.trigger({
  310. type : "record-stat",
  311. categorie : 'FlagLists',
  312. action : 'node flaged',
  313. label : 'nid : '+nid+' | flag : '+name
  314. });
  315. refreshBlocks(name);
  316. refreshNodeLinks();
  317. }else {
  318. // Failure.
  319. alert(data2.errorMessage);
  320. }
  321. },
  322. error: function (xmlhttp) {
  323. alert('An HTTP error '+ xmlhttp.status +' occurred.\n'+ element.href);
  324. }
  325. });
  326. };
  327. function refreshNodeLinks(){
  328. //trace('MaterioFlag :: refreshNodeLinks');
  329. var nids = new Array();
  330. $('.flag-lists-entity-links')
  331. // .addClass('loading')
  332. .parents('.node')
  333. .each(function(index) {
  334. nids.push($(this).attr('class').match(/node-([0-9]+)/)[1]);
  335. });
  336. // trace('MaterioFlag :: nids', nids);
  337. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/nodelinks';
  338. $.getJSON(url, {nids:nids.join(";")}, function(data) {
  339. // trace('MaterioFlag :: data', data);
  340. for(nid in data.links){
  341. // trace('MaterioFlag :: nid', nid);
  342. // trace('MaterioFlag :: data.links[nid]', data.links[nid]);
  343. $('.node-'+nid+' .flag-lists-entity-links').replaceWith(data.links[nid]);
  344. // trace('MaterioFlag :: typeof Drupal.flagLink', typeof Drupal.flagLink);
  345. // if (typeof Drupal.flagLink != 'undefined')
  346. // Drupal.flagLink($('.node-'+nid+' .flag-lists-entity-links'));
  347. // TODO: sortir ajaxifyLinks de la boucle, je pense que ça prend trop de ressources
  348. ajaxifyLinks('.node-'+nid+' .flag-lists-entity-links');
  349. }
  350. });
  351. $.event.trigger({
  352. type : 'materioflag-nodelinks-updated',
  353. nids : nids
  354. });
  355. };
  356. /**
  357. * onCLickEditList(event)
  358. */
  359. function onCLickEditList(event){
  360. //trace('MaterioFlag :: onCLickEditList | event', event);
  361. // TODO: empécher le double formulaire
  362. event.preventDefault();
  363. var $link = $(event.currentTarget);
  364. var lid = $link.attr('href').match(/[^\/]*$/);
  365. var type = 'materiau'; // this is cheap
  366. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/editlistform/'+type+'/'+lid[0];
  367. $.getJSON(url, function(json){
  368. //trace('MaterioFlag :: editlist : json', json);
  369. showEditListForm(json, $link);
  370. });
  371. return false;
  372. };
  373. function showEditListForm(json, $link){
  374. //trace('MaterioFlag :: showEditListForm | json', json);
  375. // google analytics
  376. $.event.trigger({
  377. type:"record-stat",
  378. categorie:"flagLists",
  379. action: 'show edit form'
  380. });
  381. var $modal = $('<div id="modal" class="modal"/>').appendTo('body');
  382. $modal
  383. .css({
  384. position:'absolute',
  385. top:'40%', left:'50%',
  386. marginLeft:'-150px', width:'300px',
  387. zIndex:"99999"
  388. })
  389. .append(json.rendered_form)
  390. .find('input[type="submit"]', '#materio-flag-edit-list-form').bind('click', function(event) {
  391. event.preventDefault();
  392. var $form = $(this).parents('form');
  393. var title = $form.find('input[name*="flag-lists-title"]').val();
  394. var fid = $form.find('input[name*="fid"]').val();
  395. var name = $form.find('input[name*="name"]').val();
  396. switch($(this).attr('name')){
  397. case 'cancel':
  398. //trace('MaterioFlag :: cancel',event);
  399. $(this).parents('#modal').remove();
  400. // google analytics
  401. var action = 'cancel edit form';
  402. break;
  403. case 'save':
  404. //trace('MaterioFlag :: create',event);
  405. // google analytics
  406. var action = "submit edit form";
  407. saveList($modal, fid, name, title);
  408. break;
  409. case 'delete':
  410. //trace('MaterioFlag :: delete',event);
  411. if(confirm('Do you realy want to delete your '+title+' folder ?')){
  412. var action = "submit delete form";
  413. deleteList($modal, fid);
  414. }else{
  415. var action = "cancel delete form";
  416. }
  417. break;
  418. }
  419. // google analytics
  420. $.event.trigger({
  421. type:"record-stat",
  422. categorie:"flagLists",
  423. action: action
  424. });
  425. return false;
  426. })
  427. .parents('form').find('input[type="text"]').focus();
  428. // TODO: esc keypressed close the form
  429. };
  430. function saveList($modal, fid, name, title){
  431. //trace('MaterioFlag :: saveList | fid : '+fid+'| name', name);
  432. $('.flag-lists-link.fid-'+fid).addClass('loading');
  433. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/editlist/'+fid+'/'+name+'/'+title;
  434. $.getJSON(url, function(data) {
  435. if (data.error) {
  436. // trace(data.error);
  437. if(data.message)
  438. alert(data.message);
  439. }
  440. else {
  441. //trace('MaterioFlag :: saved list : data', data);
  442. $.event.trigger({
  443. type : 'list-edited',
  444. name : data.listname,
  445. title : data.title,
  446. });
  447. refreshBlocks();
  448. refreshNodeLinks();
  449. $modal.remove();
  450. }
  451. });
  452. };
  453. function deleteList($modal, fid){
  454. //trace('MaterioFlag :: deletelist | fid', fid);
  455. $('.flag-lists-link.fid-'+fid).hide();
  456. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/deletelist/'+fid;
  457. $.getJSON(url, function(data) {
  458. if (data.error) {
  459. // trace(data.error);
  460. if(data.message)
  461. alert(data.message);
  462. }
  463. else {
  464. //trace('MaterioFlag :: deleted list : data', data);
  465. refreshBlocks();
  466. refreshNodeLinks();
  467. // TODO: if the deleted list was the current displayed list ??
  468. $modal.remove();
  469. }
  470. });
  471. };
  472. /**
  473. * onUnflagList()
  474. */
  475. function onUnflagList(event){
  476. //trace('onUnflagList', event);
  477. $(this).parents('article.node').addClass('removed');
  478. };
  479. /**
  480. *
  481. */
  482. function onInitScrollerPager(event){
  483. // trace('MaterioFlag :: MaterioFlag :: onInitScrollerPager');
  484. if (isList()){
  485. // trace('MaterioFlag :: event.pager', event);
  486. event.pager.hide();
  487. }
  488. };
  489. function onLoadScrollerPager(event){
  490. if (isList())
  491. loadNextListPage(event.href);
  492. };
  493. function loadNextListPage(href){
  494. // trace('MaterioFlag :: loadNextListPage', href);
  495. if(!_isLoadingList){
  496. var fid = href.match(/lists\/([^\/|\?]+)/);
  497. var page = href.match(/\?page=([0-9]+)/);
  498. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/ajax/list/'+fid[1]+'/'+page[1];
  499. // trace('MaterioFlag :: url', url);
  500. loadNextPage(url, $('.materio-flags-list', '#content'), '.flaglist-items');
  501. }
  502. };
  503. function loadNextPage(url, $container, target){
  504. //trace('MaterioFlag :: loadNextPage');
  505. _isLoadingList = true;
  506. $container.addClass('loading');
  507. $.getJSON(url, function(json){
  508. //trace('json', json);
  509. _isLoadingList = false;
  510. $container.removeClass('loading');
  511. addNextpage(json, target);
  512. });
  513. };
  514. function addNextpage(json, container_class){
  515. var $newcontent = $(json.rendered),
  516. $newitems = $(container_class, $newcontent).children('article').addClass('just-added'),
  517. $newpager = $('ul.pager', $newcontent);
  518. $(container_class, '#content').append($newitems);
  519. $('ul.pager', '#content').replaceWith($newpager.hide());
  520. // TODO: animation, this should be on theme side
  521. $(container_class, '#content').children('.just-added').each(function(i){
  522. // $(this).delay(5000*i).removeClass('just-added');
  523. var $this = $(this);
  524. setTimeout(function(){
  525. $this.removeClass('just-added');
  526. }, 150*i);
  527. });
  528. $.event.trigger({
  529. type : 'resultscompleted',
  530. container : $(container_class, '#content')
  531. });
  532. };
  533. function onViewModeChanged(event){
  534. if (isList())
  535. loadList(getFid());
  536. };
  537. /**
  538. * history
  539. */
  540. function onHistoryStateChange(event){
  541. if(isList())
  542. triggerContentChanged();
  543. };
  544. /**
  545. * Helpers
  546. */
  547. function getFid(){
  548. return $('.materio-flags-list', '#content').attr('fid');;
  549. };
  550. function isList(){
  551. return $('.materio-flags-list', '#content').length;
  552. };
  553. /**
  554. * cookies
  555. */
  556. function createCookie(name,value,days) {
  557. if (days) {
  558. var date = new Date();
  559. date.setTime(date.getTime()+(days*24*60*60*1000));
  560. var expires = "; expires="+date.toGMTString();
  561. }
  562. else var expires = "";
  563. document.cookie = name+"="+value+expires+"; path=/";
  564. }
  565. function readCookie(name) {
  566. var nameEQ = name + "=";
  567. var ca = document.cookie.split(';');
  568. for(var i=0;i < ca.length;i++) {
  569. var c = ca[i];
  570. while (c.charAt(0)==' ') c = c.substring(1,c.length);
  571. if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  572. }
  573. return null;
  574. }
  575. function eraseCookie(name) {
  576. createCookie(name,"",-1);
  577. }
  578. init();
  579. };
  580. $(document).ready(function() {
  581. var materioflag = new MaterioFlag();
  582. });
  583. })(jQuery);