braiam

background.js

Aug 6th, 2012
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //jQuery.noConflict();
  2. var mangaList;
  3. var mirrors;
  4. var ctxIds = [];
  5. var bookmarks;
  6. var actMirrors;
  7. var timeoutChap;
  8. var timeoutMg;
  9. //Init databases
  10. pstat.init();
  11. wssql.init();
  12. //var betaversion = "1.3.14b02";
  13. /**
  14.  * Returns the week number for this date.  dowOffset is the day of week the week
  15.  * "starts" on for your locale - it can be from 0 to 6. If dowOffset is 1 (Monday),
  16.  * the week returned is the ISO 8601 week number.
  17.  * @param int dowOffset
  18.  * @return int
  19.  */
  20. Date.prototype.getWeek = function (dowOffset) {
  21.     /*getWeek() was developed by Nick Baicoianu at MeanFreePath: http://www.meanfreepath.com */
  22.     dowOffset = typeof (dowOffset) == 'int' ? dowOffset : 0; //default dowOffset to zero
  23.     var newYear = new Date(this.getFullYear(), 0, 1);
  24.     var day = newYear.getDay() - dowOffset; //the day of week the year begins on
  25.     day = (day >= 0 ? day : day + 7);
  26.     var daynum = Math.floor((this.getTime() - newYear.getTime() - (this.getTimezoneOffset() - newYear.getTimezoneOffset()) * 60000) / 86400000) + 1;
  27.     var weeknum;
  28.     //if the year starts before the middle of a week
  29.     if (day < 4) {
  30.         weeknum = Math.floor((daynum + day - 1) / 7) + 1;
  31.         if (weeknum > 52) {
  32.             nYear = new Date(this.getFullYear() + 1, 0, 1);
  33.             nday = nYear.getDay() - dowOffset;
  34.             nday = nday >= 0 ? nday : nday + 7;
  35.             /*if the next year starts before the middle of
  36.               the week, it is week #1 of that year*/
  37.             weeknum = nday < 4 ? 1 : 53;
  38.         }
  39.     } else {
  40.         weeknum = Math.floor((daynum + day - 1) / 7);
  41.     }
  42.     return weeknum;
  43. };
  44. var sync = new BSync({
  45.     getUpdate: function () {
  46.         //console.log('GET UPDATE');
  47.         var params = getParameters();
  48.         return params.updated;
  49.     },
  50.     onRead: function (json, bookmark) {
  51.         console.log('Reading incoming synchronisation');
  52.         if (!(json == undefined || json == null || json == "null")) {
  53.             console.log(' - Updating incoming entries');
  54.             var lstTmp = $A(eval('(' + json.mangas + ')'));
  55.             for (var i = 0; i < lstTmp.length; i++) {
  56.                 var tmpManga = new MangaElt(lstTmp[i]);
  57.                 console.log("\t - Reading manga entry : " + tmpManga.name + " in mirror : " + tmpManga.mirror);
  58.                 var mangaExist = isInMangaList(tmpManga.url);
  59.                 if (mangaExist == null) {
  60.                     console.log("\t  --> Manga not found in current list, adding manga... ");
  61.                     if (!isMirrorActivated(tmpManga.mirror)) {
  62.                         activateMirror(tmpManga.mirror);
  63.                     }
  64.                     var last = mangaList.length;
  65.                     mangaList[last] = tmpManga;
  66.                     mangaList[last].refreshLast();
  67.                     try {
  68.                         _gaq.push(['_trackEvent', 'AddManga', tmpManga.mirror, tmpManga.name]);
  69.                         //pageTracker._trackEvent('AddManga', newManga.name);
  70.                     } catch (e) {}
  71.                 } else {
  72.                     //Verify chapter last
  73.                     console.log("\t  --> Manga found in current list, verify last chapter read. incoming : " + tmpManga.lastChapterReadURL + "; current : " + mangaExist.lastChapterReadURL);
  74.                     mangaExist.consult(tmpManga);
  75.                     saveList();
  76.                 }
  77.             }
  78.             console.log(' - Deleting mangas not in incoming list');
  79.             var deleteAr = [];
  80.             for (var i = 0; i < mangaList.length; i++) {
  81.                 var found = false;
  82.                 for (var j = 0; j < lstTmp.length; j++) {
  83.                     var tmpManga = new MangaElt(lstTmp[j]);
  84.                     if (mangaList[i].url == tmpManga.url) {
  85.                         found = true;
  86.                         break;
  87.                     }
  88.                 }
  89.                 if (!found) {
  90.                     console.log("\t - Deleting manga entry in current list : " + mangaList[i].name + " in mirror : " + mangaList[i].mirror);
  91.                     deleteAr[deleteAr.length] = i;
  92.                 }
  93.             }
  94.             for (var i = deleteAr.length - 1; i >= 0; i--) {
  95.                 mangaList.remove(deleteAr[i], deleteAr[i]);
  96.             }
  97.         }
  98.         saveList();
  99.         refreshUpdateWith(this.syncedAt);
  100.         refreshSync();
  101.     },
  102.     onWrite: function () {
  103.         console.log('Writing current configuration to synchronise');
  104.         var params = getParameters();
  105.         this.write({
  106.             'mangas': getJSONListToSync(),
  107.             'updated': params.updated,
  108.         });
  109.         refreshSync();
  110.     }
  111. });
  112.  
  113. function replaceInUrls(url, find, rep) {
  114.     var res = url;
  115.     if (url != undefined && url != null && url.indexOf(find) != -1) {
  116.         res = url.replace(find, rep);
  117.     }
  118.     return res;
  119. }
  120. /* Initialise the list of followed mangas */
  121. function init() {
  122.     //Test notif
  123.     /*var mangaData = {name: "This is a long manga name... very long", mirror: "ThisIsALongMirror", url: "tets.com"}
  124.   var notification = window.webkitNotifications.createHTMLNotification('notification.html#' + JSON.stringify(mangaData));
  125.   notification.show();*/
  126.     getMirrors(function (mirrorsT) {
  127.         mirrors = mirrorsT;
  128.         //Do not store mangas in mirrors.
  129.         var doDeleteMirs = false;
  130.         for (var i = 0; i < mirrors.length; i++) {
  131.             if (localStorage[mirrors[i].mirrorName]) {
  132.                 doDeleteMirs = true;
  133.                 localStorage.removeItem(mirrors[i].mirrorName);
  134.             }
  135.         }
  136.         if (doDeleteMirs) {
  137.             //Do refresh manga lists...
  138.             localStorage.removeItem("lastMangasUpdate");
  139.         }
  140.         initMirrorState();
  141.         actMirrors = [];
  142.         for (var i = 0; i < mirrors.length; i++) {
  143.             if (isMirrorActivated(mirrors[i].mirrorName)) {
  144.                 actMirrors[actMirrors.length] = mirrors[i];
  145.             }
  146.         }
  147.         //console.log("init");
  148.         //resetUpdate();
  149.         list = localStorage["mangas"];
  150.         mangaList = new Array();
  151.         if (!(list == undefined || list == null || list == "null")) {
  152.             //console.log("Liste de mangas : " + list);
  153.             var lstTmp = $A(eval('(' + list + ')'));
  154.             //console.log("Taille de la liste de mangas : " + lstTmp.length);
  155.             for (var i = 0; i < lstTmp.length; i++) {
  156.                 //if (lstTmp[i].urlListChaps == undefined || lstTmp[i].urlListChaps == null || lstTmp[i].urlListChaps == "null" || lstTmp[i].urlListChaps == "") {
  157.                 //This test is done to remove inconsistent entries
  158.                 //} else {
  159.                 //if (lstTmp[i].mirror) {
  160.                 // ########### CONVERSION submanga.com en submanga.me
  161.                 lstTmp[i].url = replaceInUrls(lstTmp[i].url, "submanga.com", "submanga.me");
  162.                 lstTmp[i].lastChapterReadURL = replaceInUrls(lstTmp[i].lastChapterReadURL, "submanga.com", "submanga.me");
  163.                 lstTmp[i].url = replaceInUrls(lstTmp[i].url, "www.mangafox.com", "mangafox.me");
  164.                 lstTmp[i].lastChapterReadURL = replaceInUrls(lstTmp[i].lastChapterReadURL, "www.mangafox.com", "mangafox.me");
  165.                 // ################
  166.                 mangaList[i] = new MangaElt(lstTmp[i]);
  167.                 //  }
  168.                 //}
  169.             }
  170.         }
  171.         //Load bookmarks
  172.         var bms = localStorage["bookmarks"];
  173.         bookmarks = $A(eval('(' + bms + ')'));
  174.         var pars = getParameters();
  175.         //console.log("Determine version ");
  176.         var ancVersion = localStorage["version"];
  177.         if (ancVersion == undefined || ancVersion == null || ancVersion == "null") {
  178.             ancVersion = null;
  179.         }
  180.         var curVersion = chrome.extension.getVersion();
  181.         if (ancVersion == null || curVersion != ancVersion) {
  182.             localStorage["version"] = curVersion;
  183.             if (pars.openupdate == 1) {
  184.                 chrome.tabs.create({
  185.                     "url": "/release.html"
  186.                 });
  187.                 localStorage["versionViewRelease"] = localStorage["version"];
  188.             }
  189.             try {
  190.                 _gaq.push(['_trackEvent', 'Install', curVersion]);
  191.                 //pageTracker._trackEvent('Install', curVersion);
  192.             } catch (e) {}
  193.         }
  194.         if (typeof betaversion != 'undefined') {
  195.             chrome.browserAction.setTitle({
  196.                 title: "All Mangas Reader " + betaversion
  197.             });
  198.         } else {
  199.             chrome.browserAction.setTitle({
  200.                 title: "All Mangas Reader " + curVersion
  201.             });
  202.         }
  203.         //Log daily users
  204.         var dailyStr = getDailyStr();
  205.         var weeklyStr = getWeeklyStr();
  206.         var monthlyStr = getMonthlyStr();
  207.         if (localStorage["dailyStr"] == undefined || localStorage["dailyStr"] != dailyStr) {
  208.             try {
  209.                 _gaq.push(['_trackEvent', 'Active', 'Day', dailyStr]);
  210.                 localStorage["dailyStr"] = dailyStr;
  211.             } catch (e) {}
  212.         }
  213.         if (localStorage["weeklyStr"] == undefined || localStorage["weeklyStr"] != weeklyStr) {
  214.             try {
  215.                 _gaq.push(['_trackEvent', 'Active', 'Week', weeklyStr]);
  216.                 localStorage["weeklyStr"] = weeklyStr;
  217.             } catch (e) {}
  218.         }
  219.         if (localStorage["monthlyStr"] == undefined || localStorage["monthlyStr"] != monthlyStr) {
  220.             try {
  221.                 _gaq.push(['_trackEvent', 'Active', 'Month', monthlyStr]);
  222.                 localStorage["monthlyStr"] = monthlyStr;
  223.             } catch (e) {}
  224.         }
  225.         //console.log("Save current localSto ");
  226.         saveList();
  227.         if (pars.sync == 1) {
  228.             console.log("synchronization started");
  229.             sync.start();
  230.         }
  231.         //console.log("Refresh last chapters ");
  232.         if (!localStorage["lastChaptersUpdate"]) {
  233.             refreshAllLasts();
  234.         } else {
  235.             if (pars.checkmgstart == 1) {
  236.                 refreshAllLasts();
  237.             } else {
  238.                 var nextTime = new Date().getTime() - localStorage["lastChaptersUpdate"] - pars.updatechap;
  239.                 if (nextTime > 0) {
  240.                     refreshAllLasts();
  241.                 } else {
  242.                     console.log("Next time to refresh chapters list : " + (-nextTime));
  243.                     timeoutChap = setTimeout(function () {
  244.                         refreshAllLasts();
  245.                     }, - nextTime);
  246.                 }
  247.             }
  248.         }
  249.         if (!localStorage["lastMangasUpdate"]) {
  250.             refreshMangaLists();
  251.         } else {
  252.             var nextTime = new Date().getTime() - localStorage["lastMangasUpdate"] - pars.updatemg;
  253.             if (nextTime > 0) {
  254.                 refreshMangaLists();
  255.             } else {
  256.                 console.log("Next time to refresh manga list : " + (-nextTime));
  257.                 timeoutMg = setTimeout(function () {
  258.                     refreshMangaLists();
  259.                 }, - nextTime);
  260.                 //Test if there is new mirrors
  261.                 refreshNewMirrorsMangaLists();
  262.             }
  263.         }
  264.     });
  265. }
  266.  
  267. function getDailyStr() {
  268.     var d = new Date();
  269.     var m = d.getMonth() + 1;
  270.     var mstr = "" + m;
  271.     if (m < 10) {
  272.         mstr = "0" + mstr;
  273.     }
  274.     var j = d.getDate();
  275.     var jstr = "" + j;
  276.     if (j < 10) {
  277.         jstr = "0" + jstr;
  278.     }
  279.     return d.getFullYear() + "/" + mstr + "/" + jstr;
  280. }
  281.  
  282. function getWeeklyStr() {
  283.     var d = new Date();
  284.     var w = d.getWeek();
  285.     var wstr = "" + w;
  286.     if (w < 10) {
  287.         wstr = "0" + wstr;
  288.     }
  289.     return d.getFullYear() + "/" + wstr;
  290. }
  291.  
  292. function getMonthlyStr() {
  293.     var d = new Date();
  294.     var m = d.getMonth() + 1;
  295.     var mstr = "" + m;
  296.     if (m < 10) {
  297.         mstr = "0" + mstr;
  298.     }
  299.     return d.getFullYear() + "/" + mstr;
  300. }
  301.  
  302. function formatMgName(name) {
  303.     if (name == undefined || name == null || name == "null") return "";
  304.     return name.trim().replace(/[^0-9A-Za-z]/g, '').toUpperCase();
  305. }
  306.  
  307. function getSimilarMangaTitles(mg) {
  308.     var res = [];
  309.     var titMg = formatMgName(mg.name);
  310.     for (var i = 0; i < mangaList.length; i++) {
  311.         if (formatMgName(mangaList[i].name) == titMg) {
  312.             res[res.length] = mangaList[i];
  313.         }
  314.     }
  315.     return res;
  316. }
  317.  
  318. function readManga(request, callback, doSave) {
  319.     //console.log("READ MANGA : " + $H(request).toJSON());
  320.     var mangaExist = isInMangaList(request.url);
  321.     if (mangaExist == null) {
  322.         //Add the new Manga
  323.         var newManga = new MangaElt(request);
  324.         //Search for similar manga names to mark read top
  325.         var simMgs = getSimilarMangaTitles(newManga);
  326.         if (simMgs.length > 0) {
  327.             for (var i = 0; i < simMgs.length; i++) {
  328.                 if (simMgs[i].read == 1) {
  329.                     newManga.read = 1;
  330.                     break;
  331.                 }
  332.                 if (simMgs[i].update == 0) {
  333.                     newManga.update = 0;
  334.                     break;
  335.                 }
  336.             }
  337.         }
  338.         //Add new manga
  339.         mangaList[mangaList.length] = newManga;
  340.         //Refresh chapters
  341.         newManga.refreshLast();
  342.         refreshUpdate();
  343.         saveList();
  344.         try {
  345.             _gaq.push(['_trackEvent', 'AddManga', newManga.mirror, newManga.name]);
  346.             //pageTracker._trackEvent('AddManga', newManga.name);
  347.         } catch (e) {}
  348.     } else {
  349.         var ancLstChap = mangaExist.lastChapterReadURL;
  350.         if (ancLstChap != undefined) {
  351.             //Refresh manga item
  352.             mangaExist.consult(request);
  353.             if (doSave) {
  354.                 saveList();
  355.             }
  356.             if (mangaExist.lastChapterReadURL != ancLstChap) {
  357.                 refreshUpdate();
  358.             }
  359.             try {
  360.                 _gaq.push(['_trackEvent', 'ReadManga', request.mirror, request.name]);
  361.                 _gaq.push(['_trackEvent', 'ReadMangaChapter', request.name, request.lastChapterReadName]);
  362.                 //pageTracker._trackEvent('ReadManga', request.name, request.lastChapterReadName);
  363.             } catch (e) {}
  364.         }
  365.     }
  366.     callback();
  367. }
  368.  
  369. function killManga(request, callback, doSave) {
  370.     var mangaExist = isInMangaListId(request.url);
  371.     if (mangaExist != -1) {
  372.         var mirName = mangaList[mangaExist].mirror;
  373.         var mgName = mangaList[mangaExist].name;
  374.         mangaList.remove(mangaExist, mangaExist);
  375.         if (doSave) {
  376.             saveList();
  377.             refreshUpdate();
  378.         }
  379.         try {
  380.             _gaq.push(['_trackEvent', 'DeleteManga', mirName, mgName]);
  381.             //pageTracker._trackEvent('DeleteManga', request.name);
  382.         } catch (e) {}
  383.     }
  384.     callback();
  385. }
  386.  
  387. function resetManga(request, callback, doSave) {
  388.     var mangaExist = isInMangaList(request.url);
  389.     if (mangaExist != null) {
  390.         if (mangaExist.listChaps.length > 0) {
  391.             mangaExist.lastChapterReadURL = mangaExist.listChaps[mangaExist.listChaps.length - 1][1];
  392.             mangaExist.lastChapterReadName = mangaExist.listChaps[mangaExist.listChaps.length - 1][0];
  393.             if (doSave) {
  394.                 saveList();
  395.                 refreshUpdate();
  396.             }
  397.             try {
  398.                 _gaq.push(['_trackEvent', 'ResetManga', mangaExist.mirror, mangaExist.name]);
  399.                 //pageTracker._trackEvent('DeleteManga', request.name);
  400.             } catch (e) {}
  401.         }
  402.     }
  403.     callback();
  404. }
  405.  
  406. function markReadTop(request, callback, doSave) {
  407.     var mangaExist = isInMangaList(request.url);
  408.     if (mangaExist != null) {
  409.         mangaExist.read = request.read;
  410.         if (doSave) {
  411.             saveList();
  412.             refreshUpdate();
  413.         }
  414.         try {
  415.             if (request.read == 1) {
  416.                 _gaq.push(['_trackEvent', 'SetReadState', mangaExist.mirror, mangaExist.name]);
  417.             } else {
  418.                 _gaq.push(['_trackEvent', 'ReleaseReadState', mangaExist.mirror, mangaExist.name]);
  419.             }
  420.             //pageTracker._trackEvent('DeleteManga', request.name);
  421.         } catch (e) {}
  422.     }
  423.     callback();
  424. }
  425.  
  426. function markUpdateTop(request, callback, doSave) {
  427.     var mangaExist = isInMangaList(request.url);
  428.     if (mangaExist != null) {
  429.         mangaExist.update = request.update;
  430.         if (doSave) {
  431.             saveList();
  432.             refreshUpdate();
  433.         }
  434.         try {
  435.             if (request.update == 1) {
  436.                 _gaq.push(['_trackEvent', 'SetUpdateState', mangaExist.mirror, mangaExist.name]);
  437.             } else {
  438.                 _gaq.push(['_trackEvent', 'ReleaseUpdateState', mangaExist.mirror, mangaExist.name]);
  439.             }
  440.             //pageTracker._trackEvent('DeleteManga', request.name);
  441.         } catch (e) {}
  442.     }
  443.     callback();
  444. }
  445.  
  446. function addCategory(request, callback, doSave) {
  447.     var mangaExist = isInMangaList(request.url);
  448.     if (mangaExist != null) {
  449.         var isFound = false;
  450.         if (mangaExist.cats.length > 0) {
  451.             for (var i = 0; i < mangaExist.cats.length; i++) {
  452.                 if (mangaExist.cats[i] == request.cat) {
  453.                     isFound = true;
  454.                     break;
  455.                 }
  456.             }
  457.         }
  458.         if (!isFound) {
  459.             mangaExist.cats[mangaExist.cats.length] = request.cat;
  460.         }
  461.         if (doSave) {
  462.             saveList();
  463.             refreshUpdate();
  464.         }
  465.     }
  466.     callback();
  467. }
  468.  
  469. function removeCatManga(request, callback, doSave) {
  470.     var mangaExist = isInMangaList(request.url);
  471.     if (mangaExist != null) {
  472.         var isFound = -1;
  473.         if (mangaExist.cats.length > 0) {
  474.             for (var i = 0; i < mangaExist.cats.length; i++) {
  475.                 if (mangaExist.cats[i] == request.cat) {
  476.                     isFound = i;
  477.                     break;
  478.                 }
  479.             }
  480.         }
  481.         if (isFound != -1) {
  482.             mangaExist.cats.remove(isFound, isFound);
  483.         }
  484.         if (doSave) {
  485.             saveList();
  486.             refreshUpdate();
  487.         }
  488.     }
  489.     callback();
  490. }
  491.  
  492. function removeCategory(request, callback) {
  493.     if (mangaList.length > 0) {
  494.         for (var i = 0; i < mangaList.length; i++) {
  495.             if (mangaList[i].cats.length > 0) {
  496.                 var toRem = [];
  497.                 for (var j = 0; j < mangaList[i].cats.length; j++) {
  498.                     if (mangaList[i].cats[j] == request.cat) {
  499.                         toRem[toRem.length] = j;
  500.                     }
  501.                 }
  502.                 for (var j = toRem.length - 1; j >= 0; j--) {
  503.                     mangaList[i].cats.remove(toRem[j], toRem[j]);
  504.                 }
  505.             }
  506.         }
  507.     }
  508.     saveList();
  509.     refreshUpdate();
  510.     callback();
  511. }
  512.  
  513. function editCategory(request, callback) {
  514.     if (mangaList.length > 0) {
  515.         for (var i = 0; i < mangaList.length; i++) {
  516.             if (mangaList[i].cats.length > 0) {
  517.                 var toRem = [];
  518.                 for (var j = 0; j < mangaList[i].cats.length; j++) {
  519.                     if (mangaList[i].cats[j] == request.cat) {
  520.                         mangaList[i].cats[j] = request.newcat;
  521.                     }
  522.                 }
  523.             }
  524.         }
  525.     }
  526.     saveList();
  527.     refreshUpdate();
  528.     callback();
  529. }
  530. chrome.extension.onRequest.addListener(
  531.  
  532. function (request, sender, sendResponse) {
  533.     if (request.action == "readManga") {
  534.         readManga(request, function () {
  535.             sendResponse({});
  536.         }, true);
  537.     }
  538.     if (request.action == "readMangas") {
  539.         $.each(request.list, function (index, val) {
  540.             readManga(val, function () {}, false);
  541.         });
  542.         saveList();
  543.         refreshUpdate();
  544.         sendResponse({});
  545.     }
  546.     if (request.action == "killManga") {
  547.         killManga(request, function () {
  548.             sendResponse({});
  549.         }, true);
  550.     }
  551.     if (request.action == "killMangas") {
  552.         $.each(request.list, function (index, val) {
  553.             killManga(val, function () {}, false);
  554.         });
  555.         saveList();
  556.         refreshUpdate();
  557.         sendResponse({});
  558.     }
  559.     if (request.action == "resetManga") {
  560.         resetManga(request, function () {
  561.             sendResponse({});
  562.         }, true);
  563.     }
  564.     if (request.action == "resetMangas") {
  565.         $.each(request.list, function (index, val) {
  566.             resetManga(val, function () {}, false);
  567.         });
  568.         saveList();
  569.         refreshUpdate();
  570.         sendResponse({});
  571.     }
  572.     if (request.action == "setMangaChapter") {
  573.         resetManga(request, function () {
  574.             readManga(request, function () {
  575.                 sendResponse({});
  576.             }, true);
  577.         }, false);
  578.     }
  579.     if (request.action == "markReadTop") {
  580.         markReadTop(request, function () {
  581.             if (request.updatesamemangas) {
  582.                 //If group mode
  583.                 if (getParameters().groupmgs == 1) {
  584.                     //Look for mangas with same name...
  585.                     var mangaExist = isInMangaList(request.url);
  586.                     if (mangaExist != null) {
  587.                         var othMg = getSimilarMangaTitles(mangaExist);
  588.                         if (othMg.length > 0) {
  589.                             for (var i = 0; i < othMg.length; i++) {
  590.                                 othMg.read = request.read;
  591.                             }
  592.                             saveList();
  593.                             refreshUpdate();
  594.                         }
  595.                     }
  596.                 }
  597.                 sendResponse({});
  598.             } else {
  599.                 sendResponse({});
  600.             }
  601.         }, true);
  602.     }
  603.     if (request.action == "markReadTops") {
  604.         $.each(request.list, function (index, val) {
  605.             markReadTop(val, function () {}, false);
  606.         });
  607.         saveList();
  608.         refreshUpdate();
  609.         sendResponse({});
  610.     }
  611.     if (request.action == "markUpdateTop") {
  612.         markUpdateTop(request, function () {
  613.             if (request.updatesamemangas) {
  614.                 //If group mode
  615.                 if (getParameters().groupmgs == 1) {
  616.                     //Look for mangas with same name...
  617.                     var mangaExist = isInMangaList(request.url);
  618.                     if (mangaExist != null) {
  619.                         var othMg = getSimilarMangaTitles(mangaExist);
  620.                         if (othMg.length > 0) {
  621.                             for (var i = 0; i < othMg.length; i++) {
  622.                                 othMg.update = request.update;
  623.                             }
  624.                             saveList();
  625.                             refreshUpdate();
  626.                         }
  627.                     }
  628.                 }
  629.                 sendResponse({});
  630.             } else {
  631.                 sendResponse({});
  632.             }
  633.         }, true);
  634.     }
  635.     if (request.action == "markUpdateTops") {
  636.         $.each(request.list, function (index, val) {
  637.             markUpdateTop(val, function () {}, false);
  638.         });
  639.         saveList();
  640.         refreshUpdate();
  641.         sendResponse({});
  642.     }
  643.     if (request.action == "addCategory") {
  644.         addCategory(request, function () {
  645.             sendResponse({});
  646.         }, true);
  647.     }
  648.     if (request.action == "addCategories") {
  649.         $.each(request.list, function (index, val) {
  650.             addCategory(val, function () {}, false);
  651.         });
  652.         saveList();
  653.         refreshUpdate();
  654.         sendResponse({});
  655.     }
  656.     if (request.action == "removeCategory") {
  657.         removeCategory(request, function () {
  658.             sendResponse({});
  659.         });
  660.     }
  661.     if (request.action == "removeCatManga") {
  662.         removeCatManga(request, function () {
  663.             sendResponse({});
  664.         }, true);
  665.     }
  666.     if (request.action == "removeCatMangas") {
  667.         $.each(request.list, function (index, val) {
  668.             removeCatManga(val, function () {}, false);
  669.         });
  670.         saveList();
  671.         refreshUpdate();
  672.         sendResponse({});
  673.     }
  674.     if (request.action == "editCategory") {
  675.         editCategory(request, function () {
  676.             sendResponse({});
  677.         });
  678.     }
  679.     if (request.action == "mangaInfos") {
  680.         var mangaExist = isInMangaList(request.url);
  681.         if (mangaExist != null) {
  682.             sendResponse({
  683.                 read: mangaExist.read,
  684.                 display: mangaExist.display
  685.             });
  686.         } else {
  687.             sendResponse(null);
  688.         }
  689.     }
  690.     if (request.action == "setDisplayMode") {
  691.         var mangaExist = isInMangaList(request.url);
  692.         if (mangaExist != null) {
  693.             mangaExist.display = request.display;
  694.             saveList();
  695.             refreshUpdate();
  696.             sendResponse({});
  697.         } else {
  698.             sendResponse({});
  699.         }
  700.     }
  701.     if (request.action == "parameters") {
  702.         sendResponse(getParameters());
  703.     }
  704.     if (request.action == "saveparameters") {
  705.         var obj = {};
  706.         obj.displayAdds = request.displayAdds;
  707.         obj.displayChapters = request.displayChapters;
  708.         obj.displayMode = request.displayMode;
  709.         obj.popupMode = request.popupMode;
  710.         obj.omSite = request.omSite;
  711.         obj.newTab = request.newTab;
  712.         obj.sync = request.sync;
  713.         obj.displayzero = request.displayzero;
  714.         obj.pub = request.pub;
  715.         obj.dev = request.dev;
  716.         obj.load = request.load;
  717.         obj.resize = request.resize;
  718.         obj.color = request.color;
  719.         obj.imgorder = request.imgorder;
  720.         obj.groupmgs = request.groupmgs;
  721.         obj.openupdate = request.openupdate;
  722.         obj.updatechap = request.updatechap;
  723.         obj.updatemg = request.updatemg;
  724.         obj.newbar = request.newbar;
  725.         obj.addauto = request.addauto;
  726.         obj.lrkeys = request.lrkeys;
  727.         obj.size = request.size;
  728.         obj.autobm = request.autobm;
  729.         obj.prefetch = request.prefetch;
  730.         obj.shownotifications = request.shownotifications;
  731.         obj.notificationtimer = request.notificationtimer;
  732.         obj.rightnext = request.rightnext;
  733.         obj.refreshspin = request.refreshspin;
  734.         obj.savebandwidth = request.savebandwidth;
  735.         obj.checkmgstart = request.checkmgstart;
  736.         obj.nocount = request.nocount;
  737.         obj.displastup = request.displastup;
  738.         obj.markwhendownload = request.markwhendownload;
  739.         obj.sendstats = request.sendstats;
  740.         var ancParams = getParameters();
  741.         obj.updated = ancParams.updated;
  742.         obj.syncAMR = ancParams.syncAMR;
  743.         // start sync or stop sync if different
  744.         if (ancParams.sync != obj.sync) {
  745.             if (obj.sync == 1) {
  746.                 console.log("synchronization started (parameter update)");
  747.                 sync.start();
  748.                 try {
  749.                     _gaq.push(['_trackEvent', 'Sync', 'activate']);
  750.                     //pageTracker._trackEvent('DeleteManga', request.name);
  751.                 } catch (e) {}
  752.             } else {
  753.                 console.log("synchronization stopped (parameter update)");
  754.                 sync.stop();
  755.                 try {
  756.                     _gaq.push(['_trackEvent', 'Sync', 'desactivate']);
  757.                     //pageTracker._trackEvent('DeleteManga', request.name);
  758.                 } catch (e) {}
  759.             }
  760.         }
  761.         localStorage["parameters"] = $H(obj).toJSON();
  762.         if (ancParams.displayzero != obj.displayzero) {
  763.             refreshTag();
  764.         }
  765.         if (ancParams.nocount != obj.nocount) {
  766.             drawIcon(false);
  767.             refreshTag();
  768.         }
  769.         if (ancParams.groupmgs != obj.groupmgs) {
  770.             refreshTag();
  771.         }
  772.         if (ancParams.updatechap != obj.updatechap) {
  773.             refreshAllLasts(true, false);
  774.         }
  775.         if (ancParams.updatemg != obj.updatemg) {
  776.             refreshMangaLists(true, false);
  777.         }
  778.         sendResponse({});
  779.     }
  780.     if (request.action == "opentab") {
  781.         chrome.tabs.create({
  782.             "url": request.url
  783.         });
  784.         sendResponse({});
  785.     }
  786.     if (request.action == "openExtensionMainPage") {
  787.         //TO_CHANGE
  788.         chrome.tabs.create({
  789.             "url": "http://www.allmangasreader.com/"
  790.         });
  791.         try {
  792.             //_gaq.push(['_trackEvent', 'ClickPub', 'OneMangaBanner']);
  793.             //pageTracker._trackEvent('ClickPub', 'OneMangaBanner');
  794.         } catch (e) {}
  795.         sendResponse({});
  796.     }
  797.     if (request.action == "save") {
  798.         saveList();
  799.         sendResponse({});
  800.     }
  801.     if (request.action == "mirrors") {
  802.         getFilledMirrorsDesc(activatedMirrors(), function (mirrorsDesc) {
  803.             sendResponse(mirrorsDesc);
  804.         });
  805.     }
  806.     if (request.action == "actmirrors") {
  807.         getActivatedMirrorsWithList({
  808.             list: activatedMirrors()
  809.         }, function (mirrorsDesc) {
  810.             // getActivatedMirrorsWithList fills listmgs for each mirror
  811.             /*for (var i = 0; i < mirrorsDesc.length; i++) {
  812.           if (mirrorsDesc[i].canListFullMangas) {
  813.             mirrorsDesc[i].listmgs = localStorage[mirrorsDesc[i].mirrorName];
  814.           }
  815.         }*/
  816.             sendResponse(mirrorsDesc);
  817.         });
  818.     }
  819.     if (request.action == "searchManga") {
  820.         if (getMangaMirror(request.mirrorName) != null) {
  821.             getMangaMirror(request.mirrorName).getMangaList(request.search, function (mirror, lst) {
  822.                 request.list = lst;
  823.                 sendResponse(request);
  824.             });
  825.         } else {
  826.             request.list = [];
  827.             sendResponse(request);
  828.         }
  829.     }
  830.     if (request.action == "searchMirrorsState") {
  831.         sendResponse({
  832.             res: localStorage["searchMirrorsState"]
  833.         });
  834.     }
  835.     if (request.action == "pagematchurls") {
  836.         doesCurrentPageMatchManga(request.url, activatedMirrors(), function (isOk) {
  837.             sendResponse(isOk);
  838.         });
  839.     }
  840.     if (request.action == "deletepub") {
  841.         var params = getParameters();
  842.         params.pub = 0;
  843.         localStorage["parameters"] = $H(params).toJSON();
  844.         sendResponse({});
  845.     }
  846.     if (request.action == "getListManga") {
  847.         wssql.webdb.getMangaList(request.mirror, function (list) {
  848.             var mangas = list;
  849.             if (mangas != undefined && mangas != null && mangas.length > 0) {
  850.                 sendResponse(mangas);
  851.             } else {
  852.                 if (getMangaMirror(request.mirror) != null) {
  853.                     getMangaMirror(request.mirror).getMangaList("", function (name, lst) {
  854.                         sendResponse(lst);
  855.                     });
  856.                 } else {
  857.                     sendResponse([]);
  858.                 }
  859.             }
  860.         });
  861.     }
  862.     if (request.action == "getListChap") {
  863.         var mangaExist = isInMangaList(request.url);
  864.         if (mangaExist == null) {
  865.             if (getMangaMirror(request.mirror) != null) {
  866.                 getMangaMirror(request.mirror).getListChaps(request.mangaUrl, request.mangaName, null, function (lst, obj) {
  867.                     sendResponse(lst);
  868.                 });
  869.             } else {
  870.                 sendResponse([]);
  871.             }
  872.         } else {
  873.             sendResponse(mangaExist.listChaps);
  874.         }
  875.     }
  876.     if (request.action == "nbMangaInMirror") {
  877.         var nb = 0;
  878.         for (var i = 0; i < mangaList.length; i++) {
  879.             if (mangaList[i].mirror == request.mirror) {
  880.                 nb++;
  881.             }
  882.         }
  883.         sendResponse({
  884.             number: nb,
  885.             mirror: request.mirror
  886.         });
  887.     }
  888.     if (request.action == "activateMirror") {
  889.         activateMirror(request.mirror);
  890.         try {
  891.             _gaq.push(['_trackEvent', 'ActivateMirror', request.mirror]);
  892.         } catch (e) {}
  893.         sendResponse({});
  894.     }
  895.     if (request.action == "desactivateMirror") {
  896.         desactivateMirror(request.mirror);
  897.         try {
  898.             _gaq.push(['_trackEvent', 'DesactivateMirror', request.mirror]);
  899.         } catch (e) {}
  900.         sendResponse({});
  901.     }
  902.     if (request.action == "isMirrorActivated") {
  903.         sendResponse({
  904.             mirror: request.mirror,
  905.             activated: isMirrorActivated(request.mirror)
  906.         });
  907.     }
  908.     if (request.action == "activatedMirrors") {
  909.         var lst = activatedMirrors();
  910.         sendResponse({
  911.             list: lst
  912.         });
  913.     }
  914.     if (request.action == "addUpdateBookmark") {
  915.         addBookmark(request);
  916.         sendResponse({});
  917.     }
  918.     if (request.action == "deleteBookmark") {
  919.         deleteBookmark(request);
  920.         sendResponse({});
  921.     }
  922.     if (request.action == "getBookmarkNote") {
  923.         var noteBM = getBookmark(request);
  924.         sendResponse({
  925.             isBooked: noteBM.booked,
  926.             note: noteBM.note,
  927.             scanSrc: noteBM.scanSrc
  928.         });
  929.     }
  930.     if (request.action == "createContextMenu") {
  931.         var isFound = false;
  932.         if (ctxIds.length > 0) {
  933.             for (var i = 0; i < ctxIds.length; i++) {
  934.                 if (ctxIds[i] == request.lstUrls[0]) {
  935.                     isFound = true;
  936.                     break;
  937.                 }
  938.             }
  939.         }
  940.         if (!isFound) {
  941.             ctxIds[ctxIds.length] = request.lstUrls[0];
  942.             var id = chrome.contextMenus.create({
  943.                 title: "Bookmark in AMR",
  944.                 contexts: ["image"],
  945.                 onclick: function (info, tab) {
  946.                     chrome.tabs.executeScript(tab.id, {
  947.                         code: "clickOnBM(\"" + info.srcUrl + "\")"
  948.                     }, function () {});
  949.                 },
  950.                 targetUrlPatterns: [encodeURI(request.lstUrls[0]), request.lstUrls[0]]
  951.             }, function () {
  952.                 //console.log("Id : " + id + "; url : " + request.lstUrls[0]);
  953.                 sendResponse({});
  954.             });
  955.         } else {
  956.             sendResponse({});
  957.         }
  958.     }
  959.     if (request.action == "importMangas") {
  960.         sendResponse({
  961.             out: importMangas(request.mangas, request.merge)
  962.         });
  963.     }
  964.     if (request.action == "importBookmarks") {
  965.         sendResponse({
  966.             out: importBookmarks(request.bookmarks, request.merge)
  967.         });
  968.     }
  969.     if (request.action == "hideBar") {
  970.         if (localStorage["isBarVisible"] == 1) {
  971.             localStorage["isBarVisible"] = 0;
  972.         } else {
  973.             localStorage["isBarVisible"] = 1;
  974.         }
  975.         sendResponse({
  976.             res: localStorage["isBarVisible"]
  977.         });
  978.     }
  979.     if (request.action == "showBar") {
  980.         localStorage["isBarVisible"] = 1;
  981.         sendResponse({});
  982.     }
  983.     if (request.action == "barState") {
  984.         if (localStorage["isBarVisible"] == undefined) {
  985.             sendResponse({
  986.                 barVis: 1
  987.             });
  988.         } else {
  989.             sendResponse({
  990.                 barVis: localStorage["isBarVisible"]
  991.             });
  992.         }
  993.     }
  994.     if (request.action == "getNextChapterImages") {
  995.         $.ajax({
  996.             url: request.url,
  997.             success: function (data) {
  998.                 var div = document.createElement("iframe");
  999.                 div.style.display = "none";
  1000.                 var id = "mangaNextChap";
  1001.                 var i = 0;
  1002.                 while ($("#" + id + i).size() > 0) {
  1003.                     i++;
  1004.                 }
  1005.                 id = id + i;
  1006.                 $(div).attr("id", id);
  1007.                 document.body.appendChild(div);
  1008.                 document.getElementById(id).contentWindow.document.documentElement.innerHTML = data;
  1009.                 $(document.getElementById(id).contentWindow.document).ready(function () {
  1010.                     //Get images urls
  1011.                     var imagesUrl = getMangaMirror(request.mirrorName).getListImages(document.getElementById(id).contentWindow.document, request.url);
  1012.                     sendResponse({
  1013.                         images: imagesUrl
  1014.                     });
  1015.                     $("#" + id).remove();
  1016.                 });
  1017.             },
  1018.             error: function () {
  1019.                 sendResponse({
  1020.                     images: null
  1021.                 });
  1022.             }
  1023.         });
  1024.     }
  1025.     if (request.action == "mangaList") {
  1026.         sendResponse({
  1027.             lst: mangaList,
  1028.             ts: ((getParameters().syncAMR) ? getParameters().syncAMR : 0),
  1029.             haschange: (getParameters().changesSinceSync == 1)
  1030.         });
  1031.     }
  1032.     if (request.action == "updateFromSite") {
  1033.         //Import new or updated mangas
  1034.         updateFromSite(request.lst, true);
  1035.         refreshUpdateSyncSite(request.ts);
  1036.         sendResponse({});
  1037.     }
  1038.     if (request.action == "replaceFromSite") {
  1039.         //Erase manga list
  1040.         updateFromSite(request.lst, false);
  1041.         refreshUpdateSyncSite(request.ts);
  1042.         sendResponse({});
  1043.     }
  1044.     if (request.action == "siteUpdated") {
  1045.         refreshUpdateSyncSite(request.ts);
  1046.         sendResponse({});
  1047.     }
  1048.     if (request.action == "readMgForStat") {
  1049.         pstat.webdb.addStat(request, function (ltId) {
  1050.             sendResponse({
  1051.                 id: ltId
  1052.             });
  1053.         });
  1054.     }
  1055.     if (request.action == "updateMgForStat") {
  1056.         pstat.webdb.updateStat(request.id, request.time_spent, function () {
  1057.             sendResponse({});
  1058.         });
  1059.     }
  1060.     /*
  1061.     if (request.action == "createZipFile") {
  1062.       ZipGen.createZipFile(request, function(cont) {
  1063.         sendResponse({content: cont});
  1064.       });
  1065.     }*/
  1066. });
  1067. /*
  1068. HTMLImageElement.prototype.zipGen = null;
  1069.  
  1070. var ZipGen = {
  1071.   cmpt: 0,
  1072.   zip: null,
  1073.   callbac: null,
  1074.  
  1075.   createZipFile: function(request, callback) {
  1076.     this.callbac = callback;
  1077.    
  1078.     if (!document.getElementById('canvas')) {
  1079.       var ctxObj = document.createElement('canvas');
  1080.       ctxObj.setAttribute("id", "canvas");
  1081.       ctxObj.setAttribute("width", "1000px");
  1082.       ctxObj.setAttribute("height", "1000px");
  1083.       document.body.appendChild(ctxObj);
  1084.     }
  1085.    
  1086.     this.cmpt = 1;//request.lst.length;
  1087.     this.zip = new JSZip("DEFLATE");
  1088.    
  1089.     for (var i = 0; i < 1; i++) { //request.lst.length
  1090.       var img = new Image();
  1091.       img.zipGen = this;
  1092.       img.onload = function() {
  1093.         console.log("image loaded" + this.getAttribute("dataNumber"));
  1094.         var ctx = document.getElementById('canvas').getContext('2d');
  1095.         ctx.drawImage(this, 0, 0);
  1096.         var dataurl = document.getElementById('canvas').toDataURL("image/png", "");
  1097.         //console.log(this.getAttribute("dataNumber") + " --> " + dataurl);
  1098.         this.zipGen.zip.add("scan" + this.getAttribute("dataNumber") + ".png", dataurl, {base64: true});
  1099.         this.zipGen.cmpt--;
  1100.       }
  1101.       img.onerror = function(){
  1102.         console.log("image error");
  1103.         this.zipGen.cmpt--;
  1104.       }
  1105.       img.setAttribute("dataNumber", i);
  1106.       console.log(i + " --> " + request.lst[i]);
  1107.       img.src = request.lst[i];
  1108.     }
  1109.     this.waitForLoaded();
  1110.   },
  1111.   waitForLoaded: function() {
  1112.     if (this.cmpt == 0) {
  1113.       console.log("sending...");
  1114.       var content = this.zip.generate(true);
  1115.       this.callbac(content);
  1116.     } else {
  1117.       console.log("waiting...");
  1118.       var _th = this;
  1119.       setTimeout(function() {
  1120.         _th.waitForLoaded();
  1121.         }, 100);
  1122.     }
  1123.   }
  1124. }
  1125. */
  1126. //bookmark : obj {mirror, url, chapUrl, type(chapter, scan), name, chapName, scanUrl, scanName, note}
  1127. function getBookmark(obj) {
  1128.     if (bookmarks.length > 0) {
  1129.         for (var j = 0; j < bookmarks.length; j++) {
  1130.             if (obj.mirror == bookmarks[j].mirror && obj.url == bookmarks[j].url && obj.chapUrl == bookmarks[j].chapUrl && obj.type == bookmarks[j].type) {
  1131.                 if (obj.type == "chapter") {
  1132.                     //console.log("chapter booked get");
  1133.                     return {
  1134.                         booked: true,
  1135.                         note: bookmarks[j].note
  1136.                     };
  1137.                 } else {
  1138.                     if (obj.scanUrl == bookmarks[j].scanUrl || encodeURI(obj.scanUrl) == bookmarks[j].scanUrl) {
  1139.                         //console.log({booked: true, note: lstTmp[j].note, scanSrc: obj.scanUrl});
  1140.                         return {
  1141.                             booked: true,
  1142.                             note: bookmarks[j].note,
  1143.                             scanSrc: obj.scanUrl
  1144.                         };
  1145.                     }
  1146.                 }
  1147.             }
  1148.         }
  1149.     }
  1150.     return {
  1151.         booked: false,
  1152.         note: ""
  1153.     };
  1154. }
  1155.  
  1156. function addBookmark(obj) {
  1157.     var isFound = false;
  1158.     var posFound;
  1159.     if (bookmarks.length > 0) {
  1160.         for (var j = 0; j < bookmarks.length; j++) {
  1161.             if (obj.mirror == bookmarks[j].mirror && obj.url == bookmarks[j].url && obj.chapUrl == bookmarks[j].chapUrl && obj.type == bookmarks[j].type) {
  1162.                 if (obj.type == "chapter") {
  1163.                     isFound = true;
  1164.                     posFound = j;
  1165.                     break;
  1166.                 } else {
  1167.                     if (obj.scanUrl == bookmarks[j].scanUrl) {
  1168.                         isFound = true;
  1169.                         posFound = j;
  1170.                         break;
  1171.                     }
  1172.                 }
  1173.             }
  1174.         }
  1175.     }
  1176.     if (!isFound) {
  1177.         bookmarks[bookmarks.length] = {
  1178.             mirror: obj.mirror,
  1179.             url: obj.url,
  1180.             chapUrl: obj.chapUrl,
  1181.             type: obj.type,
  1182.             name: obj.name,
  1183.             chapName: obj.chapName,
  1184.             scanUrl: obj.scanUrl,
  1185.             scanName: obj.scanName,
  1186.             note: obj.note
  1187.         };
  1188.     } else {
  1189.         bookmarks[posFound].note = obj.note;
  1190.     }
  1191.     localStorage["bookmarks"] = $A(bookmarks).toJSON();
  1192. }
  1193.  
  1194. function deleteBookmark(obj) {
  1195.     var isFound = false;
  1196.     var posFound;
  1197.     if (bookmarks.length > 0) {
  1198.         for (var j = 0; j < bookmarks.length; j++) {
  1199.             if (obj.mirror == bookmarks[j].mirror && obj.url == bookmarks[j].url && obj.chapUrl == bookmarks[j].chapUrl && obj.type == bookmarks[j].type) {
  1200.                 if (obj.type == "chapter") {
  1201.                     isFound = true;
  1202.                     posFound = j;
  1203.                     break;
  1204.                 } else {
  1205.                     if (obj.scanUrl == bookmarks[j].scanUrl) {
  1206.                         isFound = true;
  1207.                         posFound = j;
  1208.                         break;
  1209.                     }
  1210.                 }
  1211.             }
  1212.         }
  1213.     }
  1214.     if (isFound) {
  1215.         bookmarks.remove(posFound, posFound);
  1216.         localStorage["bookmarks"] = $A(bookmarks).toJSON();
  1217.     }
  1218. }
  1219.  
  1220. function activateMirror(mirrorName) {
  1221.     var states = localStorage["mirrorStates"];
  1222.     var lstTmp = $A(eval('(' + states + ')'));
  1223.     if (lstTmp.length > 0) {
  1224.         for (var j = 0; j < lstTmp.length; j++) {
  1225.             if (lstTmp[j].mirror == mirrorName) {
  1226.                 lstTmp[j] = {
  1227.                     mirror: mirrorName,
  1228.                     activated: true
  1229.                 };
  1230.                 localStorage["mirrorStates"] = $A(lstTmp).toJSON();
  1231.                 // Load refreshMirror
  1232.                 try {
  1233.                     for (var i = 0; i < mirrors.length; i++) {
  1234.                         if (mirrors[i].mirrorName == mirrorName) {
  1235.                             actMirrors[actMirrors.length] = mirrors[i];
  1236.                             if (mirrors[i].canListFullMangas) {
  1237.                                 mirrors[i].getMangaList("", mangaListLoaded);
  1238.                             }
  1239.                         }
  1240.                     }
  1241.                 } catch (e) {
  1242.                     //
  1243.                 }
  1244.                 break;
  1245.             }
  1246.         }
  1247.     }
  1248. }
  1249.  
  1250. function desactivateMirror(mirrorName) {
  1251.     var nb = 0;
  1252.     for (var i = 0; i < mangaList.length; i++) {
  1253.         if (mangaList[i].mirror == mirrorName) {
  1254.             nb++;
  1255.         }
  1256.     }
  1257.     if (nb == 0) {
  1258.         var states = localStorage["mirrorStates"];
  1259.         var lstTmp = $A(eval('(' + states + ')'));
  1260.         if (lstTmp.length > 0) {
  1261.             for (var j = 0; j < lstTmp.length; j++) {
  1262.                 if (lstTmp[j].mirror == mirrorName) {
  1263.                     lstTmp[j] = {
  1264.                         mirror: mirrorName,
  1265.                         activated: false
  1266.                     };
  1267.                     localStorage["mirrorStates"] = $A(lstTmp).toJSON();
  1268.                     // Delete from localStorage
  1269.                     wssql.webdb.empty(mirrorName, function () {});
  1270.                     //localStorage[mirrorName] = null;
  1271.                     break;
  1272.                 }
  1273.             }
  1274.         }
  1275.         var toRemove = -1;
  1276.         for (var j = 0; j < actMirrors.length; j++) {
  1277.             if (actMirrors[j].mirrorName == mirrorName) {
  1278.                 toRemove = j;
  1279.             }
  1280.         }
  1281.         if (toRemove != -1) {
  1282.             actMirrors.remove(toRemove, toRemove);
  1283.         }
  1284.     }
  1285. }
  1286.  
  1287. function initMirrorState() {
  1288.     var states = localStorage["mirrorStates"];
  1289.     if (states == undefined || states == null || states == "null") {
  1290.         instantiateMirrors();
  1291.     } else {
  1292.         var lstTmp = $A(eval('(' + states + ')'));
  1293.         if (lstTmp.length > 0) {
  1294.             var toUpdate = false;
  1295.             for (var i = 0; i < mirrors.length; i++) {
  1296.                 //console.log("SEARCH : " + mirrors[i].mirrorName);
  1297.                 var isFound = false;
  1298.                 for (var j = 0; j < lstTmp.length; j++) {
  1299.                     //console.log(lstTmp[j].mirror + " --> " + mirrors[i].mirrorName);
  1300.                     if (lstTmp[j].mirror == mirrors[i].mirrorName) {
  1301.                         isFound = true;
  1302.                         break;
  1303.                     }
  1304.                 }
  1305.                 if (!isFound) {
  1306.                     //console.log("NOT FOUND : " + mirrors[i].mirrorName);
  1307.                     lstTmp[lstTmp.length] = {
  1308.                         mirror: mirrors[i].mirrorName,
  1309.                         activated: true
  1310.                     };
  1311.                     toUpdate = true;
  1312.                 }
  1313.             }
  1314.             if (toUpdate) {
  1315.                 localStorage["mirrorStates"] = $A(lstTmp).toJSON();
  1316.             }
  1317.         } else {
  1318.             instantiateMirrors();
  1319.         }
  1320.     }
  1321. }
  1322.  
  1323. function instantiateMirrors() {
  1324.     var lst = new Array();
  1325.     for (var i = 0; i < mirrors.length; i++) {
  1326.         lst[lst.length] = {
  1327.             mirror: mirrors[i].mirrorName,
  1328.             activated: true
  1329.         };
  1330.     }
  1331.     localStorage["mirrorStates"] = $A(lst).toJSON();
  1332. }
  1333.  
  1334. function isMirrorActivated(mirrorName) {
  1335.     var states = localStorage["mirrorStates"];
  1336.     var lstTmp = $A(eval('(' + states + ')'));
  1337.     if (lstTmp.length > 0) {
  1338.         for (var j = 0; j < lstTmp.length; j++) {
  1339.             if (lstTmp[j].mirror == mirrorName) {
  1340.                 return lstTmp[j].activated;
  1341.             }
  1342.         }
  1343.     }
  1344.     return false;
  1345. }
  1346.  
  1347. function hasDesactivatedOnce() {
  1348.     var states = localStorage["mirrorStates"];
  1349.     var lstTmp = $A(eval('(' + states + ')'));
  1350.     var nbActi = 0;
  1351.     if (lstTmp.length > 0) {
  1352.         for (var j = 0; j < lstTmp.length; j++) {
  1353.             if (lstTmp[j].activated) {
  1354.                 nbActi++;
  1355.             }
  1356.         }
  1357.     }
  1358.     return (nbActi <= 25);
  1359. }
  1360.  
  1361. function activatedMirrors() {
  1362.     var list = new Array();
  1363.     var states = localStorage["mirrorStates"];
  1364.     var lstTmp = $A(eval('(' + states + ')'));
  1365.     if (lstTmp.length > 0) {
  1366.         for (var j = 0; j < lstTmp.length; j++) {
  1367.             if (lstTmp[j].activated == true) {
  1368.                 list[list.length] = lstTmp[j];
  1369.             }
  1370.         }
  1371.     }
  1372.     return list;
  1373. }
  1374.  
  1375. function initParam(object, paramName, defaultVal) {
  1376.     if (object[paramName] == undefined || object[paramName] == null || object[paramName] == "null") {
  1377.         object[paramName] = defaultVal;
  1378.     }
  1379. }
  1380.  
  1381. function getParameters() {
  1382.     var params = localStorage["parameters"];
  1383.     var res;
  1384.     if (params == undefined || params == null || params == "null") {
  1385.         res = defaultParams();
  1386.         localStorage["parameters"] = $H(res).toJSON();
  1387.     } else {
  1388.         res = eval('(' + params + ')');
  1389.         initParam(res, "omSite", 0);
  1390.         initParam(res, "newTab", 0);
  1391.         initParam(res, "sync", 0);
  1392.         initParam(res, "displayzero", 1);
  1393.         initParam(res, "pub", 1);
  1394.         initParam(res, "dev", 0);
  1395.         initParam(res, "load", 0);
  1396.         initParam(res, "resize", 1);
  1397.         initParam(res, "color", 0);
  1398.         initParam(res, "imgorder", 0);
  1399.         initParam(res, "groupmgs", 1);
  1400.         initParam(res, "openupdate", 0);
  1401.         initParam(res, "updatechap", 6 * 60 * 60000);
  1402.         initParam(res, "updatemg", 24 * 60 * 60000);
  1403.         initParam(res, "newbar", 1);
  1404.         initParam(res, "addauto", 1);
  1405.         initParam(res, "lrkeys", 1);
  1406.         initParam(res, "size", 1);
  1407.         initParam(res, "autobm", 1);
  1408.         initParam(res, "prefetch", 1);
  1409.         initParam(res, "shownotifications", 1);
  1410.         initParam(res, "notificationtimer", 0);
  1411.         initParam(res, "rightnext", 1);
  1412.         initParam(res, "refreshspin", 1);
  1413.         initParam(res, "savebandwidth", 0);
  1414.         initParam(res, "checkmgstart", 0);
  1415.         initParam(res, "nocount", 0);
  1416.         initParam(res, "displastup", 1);
  1417.         initParam(res, "markwhendownload", 0);
  1418.         initParam(res, "sendstats", 1);
  1419.         localStorage["parameters"] = $H(res).toJSON();
  1420.     }
  1421.     return res;
  1422. }
  1423.  
  1424. function defaultParams() {
  1425.     var obj = {};
  1426.     obj.displayAdds = 0;
  1427.     obj.displayChapters = 1;
  1428.     obj.displayMode = 1;
  1429.     obj.popupMode = 1;
  1430.     obj.omSite = 0;
  1431.     obj.newTab = 0;
  1432.     obj.sync = 0;
  1433.     obj.displayzero = 1;
  1434.     obj.pub = 1;
  1435.     obj.dev = 0;
  1436.     obj.load = 0;
  1437.     obj.resize = 1;
  1438.     obj.color = 0;
  1439.     obj.imgorder = 0;
  1440.     obj.groupmgs = 1;
  1441.     obj.openupdate = 0;
  1442.     obj.updatechap = 30 * 60000;
  1443.     obj.updatemg = 24 * 60 * 60000;
  1444.     obj.newbar = 1;
  1445.     obj.addauto = 1;
  1446.     obj.lrkeys = 1;
  1447.     obj.size = 1;
  1448.     obj.autobm = 1;
  1449.     obj.prefetch = 1;
  1450.     obj.shownotifications = 1;
  1451.     obj.notificationtimer = 0;
  1452.     obj.rightnext = 1;
  1453.     obj.refreshspin = 1;
  1454.     obj.savebandwidth = 0;
  1455.     obj.checkmgstart = 0;
  1456.     obj.nocount = 0;
  1457.     obj.displastup = 1;
  1458.     obj.markwhendownload = 0;
  1459.     obj.sendstats = 1;
  1460.     return obj;
  1461. }
  1462. /* Return the existing manga in the follow list that match with the request */
  1463. function isInMangaList(url) {
  1464.     for (var i = 0; i < mangaList.length; i++) {
  1465.         if (mangaList[i].url == url) {
  1466.             return mangaList[i];
  1467.         }
  1468.     }
  1469.     return null;
  1470. }
  1471.  
  1472. function isInMangaListId(url) {
  1473.     for (var i = 0; i < mangaList.length; i++) {
  1474.         if (mangaList[i].url == url) {
  1475.             return i;
  1476.         }
  1477.     }
  1478.     return -1;
  1479. }
  1480. var canvas;
  1481. var canvasContext;
  1482. var animationFrames = 20;
  1483. var animationSpeed = 30;
  1484. var rotation = 0;
  1485. var sharinganImage;
  1486.  
  1487. function ease(x) {
  1488.     return (1 - Math.sin(Math.PI / 2 + x * Math.PI)) / 2;
  1489. }
  1490.  
  1491. function grayscale(cnv, w, h) {
  1492.     var imageData = cnv.getImageData(0, 0, w, h);
  1493.     for (var j = 0; j < imageData.height; j++) {
  1494.         for (var i = 0; i < imageData.width; i++) {
  1495.             var index = (i * 4) * imageData.width + (j * 4);
  1496.             var average = (imageData.data[index] + imageData.data[index + 1] + imageData.data[index + 2]) / 3 + 75;
  1497.             if (average > 255) average = 255;
  1498.             imageData.data[index] = average;
  1499.             imageData.data[index + 1] = average;
  1500.             imageData.data[index + 2] = average;
  1501.         }
  1502.     }
  1503.     cnv.putImageData(imageData, 0, 0, 0, 0, imageData.width, imageData.height);
  1504. }
  1505.  
  1506. function drawIcon(isgrey) {
  1507.     if (canvas == undefined) {
  1508.         canvas = document.getElementById('canvas');
  1509.         sharinganImage = document.getElementById('sharingan');
  1510.         canvasContext = canvas.getContext('2d');
  1511.     }
  1512.     //console.log("drawIcon " + isgrey);
  1513.     canvasContext.save();
  1514.     canvasContext.clearRect(0, 0, canvas.width, canvas.height);
  1515.     canvasContext.translate(
  1516.     canvas.width / 2,
  1517.     canvas.height / 2);
  1518.     canvasContext.drawImage(sharinganImage, - canvas.width / 2, - canvas.height / 2);
  1519.     if (isgrey) {
  1520.         //console.log("Grey !");
  1521.         grayscale(canvasContext, canvas.width, canvas.height);
  1522.     }
  1523.     canvasContext.restore();
  1524.     //console.log("set it");
  1525.     chrome.browserAction.setIcon({
  1526.         imageData: canvasContext.getImageData(0, 0,
  1527.         canvas.width, canvas.height)
  1528.     });
  1529.     //console.log("done");
  1530. }
  1531.  
  1532. function drawIconAtRotation(doEase) {
  1533.     if (doEase == undefined) {
  1534.         doEase = false;
  1535.     }
  1536.     canvasContext.save();
  1537.     canvasContext.clearRect(0, 0, canvas.width, canvas.height);
  1538.     canvasContext.translate(
  1539.     canvas.width / 2,
  1540.     canvas.height / 2);
  1541.     canvasContext.rotate(2 * Math.PI * (doEase ? ease(rotation) : rotation));
  1542.     canvasContext.drawImage(sharinganImage, - canvas.width / 2, - canvas.height / 2);
  1543.     if (getParameters().nocount == 1 && !hasNew()) {
  1544.         grayscale(canvasContext, canvas.width, canvas.height);
  1545.     }
  1546.     canvasContext.restore();
  1547.     chrome.browserAction.setIcon({
  1548.         imageData: canvasContext.getImageData(0, 0,
  1549.         canvas.width, canvas.height)
  1550.     });
  1551. }
  1552.  
  1553. function WaitForAllLists(_sizeAll, _onFinish, _doSpin) {
  1554.     this.nbMade = 0;
  1555.     this.sizeAll = _sizeAll;
  1556.     this.onFinish = _onFinish;
  1557.     this.doSpin = _doSpin;
  1558.     this.hasStart = false;
  1559.     this.doEase = true;
  1560. }
  1561. WaitForAllLists.prototype.incMade = function () {
  1562.     this.nbMade++;
  1563. };
  1564. WaitForAllLists.prototype.wait = function () {
  1565.     if (!this.hasStart) {
  1566.         //First call
  1567.         if (this.doSpin) {
  1568.             canvas = document.getElementById('canvas');
  1569.             sharinganImage = document.getElementById('sharingan');
  1570.             canvasContext = canvas.getContext('2d');
  1571.         }
  1572.         this.hasStart = true;
  1573.     }
  1574.     if (this.sizeAll <= this.nbMade) {
  1575.         //Finished
  1576.         if (this.doSpin) {
  1577.             rotation += 1 / animationFrames;
  1578.             if (rotation > 1) {
  1579.                 rotation = 0;
  1580.                 drawIconAtRotation(true);
  1581.                 //console.log("Finished loading list... the sharingan may have stopped spinning... nbMade : " + this.nbMade + " ; sizeAll : " + this.sizeAll);
  1582.                 this.onFinish();
  1583.             } else {
  1584.                 drawIconAtRotation();
  1585.                 var _self = this;
  1586.                 setTimeout(function () {
  1587.                     _self.wait();
  1588.                 }, animationSpeed);
  1589.             }
  1590.         } else {
  1591.             this.onFinish();
  1592.         }
  1593.     } else {
  1594.         if (this.doSpin) {
  1595.             rotation += 1 / animationFrames;
  1596.             if (rotation > 1) {
  1597.                 rotation = rotation - 1;
  1598.                 this.doEase = false;
  1599.             }
  1600.             drawIconAtRotation(this.doEase);
  1601.         }
  1602.         var _self = this;
  1603.         setTimeout(function () {
  1604.             _self.wait();
  1605.         }, animationSpeed);
  1606.     }
  1607. };
  1608. //savebandwidth
  1609. function refreshManga(mg, waiter, pos) {
  1610.     if (getMangaMirror(mg.mirror) == null) return;
  1611.     if (getParameters().savebandwidth == 1 || (getMangaMirror(mg.mirror).savebandwidth != undefined && getMangaMirror(mg.mirror).savebandwidth)) {
  1612.         if (waiter.nbMade == pos) {
  1613.             //console.log("Savebandwidth mode --> call refresh for " + mg.url + " pos " + pos);
  1614.             mg.refreshLast(false, function (obj) {
  1615.                 //console.log("Finish nbMade : " + waiter.nbMade + " ; sizeAll : " + waiter.sizeAll + " for " + obj.url);
  1616.                 waiter.incMade();
  1617.             });
  1618.         } else {
  1619.             //console.log("Savebandwidth mode --> wait for refresh " + pos);
  1620.             setTimeout(function () {
  1621.                 refreshManga(mg, waiter, pos);
  1622.             }, 100);
  1623.         }
  1624.     } else {
  1625.         //console.log("NOT Savebandwidth mode --> load refresh " + pos);
  1626.         //console.log("Call refresh for " + mg.url + " pos " + pos);
  1627.         mg.refreshLast(false, function (obj) {
  1628.             //console.log("Finish nbMade : " + waiter.nbMade + " ; sizeAll : " + waiter.sizeAll + " for " + obj.url);
  1629.             waiter.incMade();
  1630.         });
  1631.     }
  1632. }
  1633. //If refreshTimer is true, the frequency have change, recalculate frequency and set new Timeout for timeoutChap
  1634. //If perform is true, update list now and set new timeout
  1635. //change option : refreshAllLasts(true, false);
  1636. //refresh now : refreshAllLasts(true, true);
  1637. //normal : refreshAllLasts();
  1638. function refreshAllLasts(refreshTimer, perform) {
  1639.     try {
  1640.         if (perform == undefined || perform == true) {
  1641.             console.log("Refreshing chapters at " + new Date());
  1642.             localStorage["lastChaptersUpdate"] = new Date().getTime();
  1643.             var nbToRef = 0;
  1644.             for (var i = 0; i < mangaList.length; i++) {
  1645.                 if (getMangaMirror(mangaList[i].mirror) != null) nbToRef++
  1646.             }
  1647.             var waiter = new WaitForAllLists(nbToRef, function () {
  1648.                 saveList();
  1649.             }, getParameters().refreshspin);
  1650.             var pos = 0;
  1651.             // Not forced bandwidth safe first
  1652.             for (var i = 0; i < mangaList.length; i++) {
  1653.                 if (getMangaMirror(mangaList[i].mirror) != null) {
  1654.                     if (getMangaMirror(mangaList[i].mirror).savebandwidth == undefined || !getMangaMirror(mangaList[i].mirror).savebandwidth) {
  1655.                         //console.log("Launch refresh for " + mangaList[i].url + " pos " + pos);
  1656.                         refreshManga(mangaList[i], waiter, pos);
  1657.                         pos++;
  1658.                     }
  1659.                 }
  1660.             }
  1661.             // Forced bandwidth safe
  1662.             for (var i = 0; i < mangaList.length; i++) {
  1663.                 if (getMangaMirror(mangaList[i].mirror) != null) {
  1664.                     if (getMangaMirror(mangaList[i].mirror).savebandwidth != undefined && getMangaMirror(mangaList[i].mirror).savebandwidth) {
  1665.                         //console.log("Launch refresh for " + mangaList[i].url + " pos " + pos);
  1666.                         refreshManga(mangaList[i], waiter, pos);
  1667.                         pos++;
  1668.                     }
  1669.                 }
  1670.             }
  1671.             waiter.wait();
  1672.         }
  1673.     } catch (e) {
  1674.         //
  1675.     }
  1676.     var nextTime = getParameters().updatechap;
  1677.     if (refreshTimer) {
  1678.         clearTimeout(timeoutChap);
  1679.         //Change nextTime calcultate it...
  1680.         nextTime = -(new Date().getTime() - localStorage["lastChaptersUpdate"] - nextTime);
  1681.     }
  1682.     console.log("Next time to refresh chapters list : " + nextTime);
  1683.     timeoutChap = setTimeout(function () {
  1684.         refreshAllLasts();
  1685.     }, nextTime);
  1686. }
  1687. //If refreshTimer is true, the frequency have change, recalculate frequency and set new Timeout for timeoutMg
  1688. //If perform is true, update list now and set new timeout
  1689. //change option : refreshMangaLists(true, false);
  1690. //refresh now : refreshMangaLists(true, true);
  1691. //normal : refreshMangaLists();
  1692. function refreshMangaLists(refreshTimer, perform) {
  1693.     try {
  1694.         if (perform == undefined || perform == true) {
  1695.             console.log("Refreshing mangas lists at " + new Date());
  1696.             localStorage["lastMangasUpdate"] = new Date().getTime();
  1697.             for (var i = 0; i < mirrors.length; i++) {
  1698.                 if (mirrors[i].canListFullMangas && isMirrorActivated(mirrors[i].mirrorName)) {
  1699.                     mirrors[i].getMangaList("", mangaListLoaded);
  1700.                 }
  1701.             }
  1702.         }
  1703.     } catch (e) {
  1704.         //
  1705.     }
  1706.     var nextTime = getParameters().updatemg;
  1707.     if (refreshTimer) {
  1708.         clearTimeout(timeoutMg);
  1709.         //Change nextTime calcultate it...
  1710.         nextTime = -(new Date().getTime() - localStorage["lastMangasUpdate"] - nextTime);
  1711.     }
  1712.     console.log("Next time to refresh manga list : " + nextTime);
  1713.     timeoutMg = setTimeout(function () {
  1714.         refreshMangaLists();
  1715.     }, nextTime);
  1716. }
  1717. //On launch --> test if new mirrors have been added. If so, download list for them
  1718. function refreshNewMirrorsMangaLists() {
  1719.     for (var i = 0; i < mirrors.length; i++) {
  1720.         if (mirrors[i].canListFullMangas && isMirrorActivated(mirrors[i].mirrorName)) {
  1721.             wssql.webdb.getMangaList(mirrors[i].mirrorName, function (list, mirror) {
  1722.                 if (!list || list == null || list.length == 0) {
  1723.                     console.log("New web site added : " + mirror + " --> loading manga list");
  1724.                     getMangaMirror(mirror).getMangaList("", mangaListLoaded);
  1725.                 }
  1726.             });
  1727.         }
  1728.     }
  1729. }
  1730.  
  1731. function mangaListLoaded(mirror, lst) {
  1732.     console.log("mirror manga list loaded for " + mirror + " list size : " + lst.length);
  1733.     wssql.webdb.empty(mirror, function () {
  1734.         wssql.webdb.storeMangaList(mirror, lst);
  1735.     });
  1736. }
  1737.  
  1738. function getMangaMirror(mirror) {
  1739.     //console.log("get Manga mirror called");
  1740.     for (var i = 0; i < mirrors.length; i++) {
  1741.         //console.log(mirrors[i].mirrorName + " --> " + mirror);
  1742.         if (mirrors[i].mirrorName == mirror) {
  1743.             return mirrors[i];
  1744.         }
  1745.     }
  1746.     return null;
  1747. }
  1748. /* Save the manga list in storage */
  1749. function saveList() {
  1750.     //console.log("saving current list");
  1751.     try {
  1752.         localStorage["mangas"] = getJSONList();
  1753.         try {
  1754.             refreshTag();
  1755.         } catch (e) {
  1756.             //
  1757.         }
  1758.     } catch (e) {
  1759.         //
  1760.     }
  1761. }
  1762.  
  1763. function refreshTag() {
  1764.     var nbNews = 0;
  1765.     //console.log("refreshTag");
  1766.     var listDone = [];
  1767.     for (var i = 0; i < mangaList.length; i++) {
  1768.         if (mangaList[i].listChaps.length > 0) {
  1769.             var shortName = formatMgName(mangaList[i].name);
  1770.             var found = false;
  1771.             for (var j = 0; j < listDone.length; j++) {
  1772.                 if (listDone[j] == shortName) {
  1773.                     found = true;
  1774.                     break;
  1775.                 }
  1776.             }
  1777.             if (!found || getParameters().groupmgs == 0) {
  1778.                 var lastName = mangaList[i].listChaps[0][1];
  1779.                 if (lastName != mangaList[i].lastChapterReadURL && mangaList[i].read == 0) {
  1780.                     listDone[listDone.length] = shortName;
  1781.                     nbNews++;
  1782.                 }
  1783.             }
  1784.         }
  1785.     }
  1786.     var params = getParameters();
  1787.     if (nbNews == 0) {
  1788.         if (params.nocount == 1) {
  1789.             drawIcon(true);
  1790.             chrome.browserAction.setBadgeText({
  1791.                 text: ""
  1792.             });
  1793.         } else {
  1794.             if (params.displayzero == 1) {
  1795.                 chrome.browserAction.setBadgeText({
  1796.                     text: "0"
  1797.                 });
  1798.             } else {
  1799.                 chrome.browserAction.setBadgeText({
  1800.                     text: ""
  1801.                 });
  1802.             }
  1803.             chrome.browserAction.setBadgeBackgroundColor({
  1804.                 color: [127, 127, 127, 255]
  1805.             });
  1806.         }
  1807.     } else {
  1808.         if (params.nocount == 1) {
  1809.             drawIcon(false);
  1810.             chrome.browserAction.setBadgeText({
  1811.                 text: ""
  1812.             });
  1813.         } else {
  1814.             chrome.browserAction.setBadgeText({
  1815.                 text: nbNews.toString()
  1816.             });
  1817.             chrome.browserAction.setBadgeBackgroundColor({
  1818.                 color: [255, 0, 0, 255]
  1819.             });
  1820.         }
  1821.     }
  1822. }
  1823.  
  1824. function hasNew() {
  1825.     for (var i = 0; i < mangaList.length; i++) {
  1826.         if (mangaList[i].listChaps.length > 0) {
  1827.             var lastName = mangaList[i].listChaps[0][1];
  1828.             if (lastName != mangaList[i].lastChapterReadURL && mangaList[i].read == 0) {
  1829.                 return true;
  1830.             }
  1831.         }
  1832.     }
  1833.     return false;
  1834. }
  1835.  
  1836. function refreshUpdate() {
  1837.     try {
  1838.         var params = getParameters();
  1839.         params.updated = new Date().getTime();
  1840.         params.changesSinceSync = 1;
  1841.         localStorage["parameters"] = $H(params).toJSON();
  1842.     } catch (e) {}
  1843. }
  1844.  
  1845. function refreshUpdateSyncSite(update) {
  1846.     try {
  1847.         var params = getParameters();
  1848.         params.syncAMR = update;
  1849.         params.changesSinceSync = 0;
  1850.         localStorage["parameters"] = $H(params).toJSON();
  1851.     } catch (e) {}
  1852. }
  1853.  
  1854. function refreshUpdateWith(update) {
  1855.     try {
  1856.         var params = getParameters();
  1857.         params.updated = update;
  1858.         localStorage["parameters"] = $H(params).toJSON();
  1859.     } catch (e) {}
  1860. }
  1861.  
  1862. function resetUpdate() {
  1863.     try {
  1864.         var params = getParameters();
  1865.         params.updated = undefined;
  1866.         localStorage["parameters"] = $H(params).toJSON();
  1867.     } catch (e) {}
  1868. }
  1869.  
  1870. function refreshSync() {
  1871.     try {
  1872.         var params = getParameters();
  1873.         params.lastsync = new Date().getTime();
  1874.         localStorage["parameters"] = $H(params).toJSON();
  1875.     } catch (e) {}
  1876. }
  1877.  
  1878. function getJSONList() {
  1879.     var results = [];
  1880.     mangaList.each(function (object) {
  1881.         var value = jsonmangaelt(object);
  1882.         if (!Object.isUndefined(value)) results.push(value);
  1883.     });
  1884.     return '[' + results.join(', ') + ']';
  1885. }
  1886.  
  1887. function jsonmangaelt(mangaelt) {
  1888.     var obj = {};
  1889.     //console.log("before manga mirror save");
  1890.     obj.mirror = mangaelt.mirror;
  1891.     //console.log("aftre");
  1892.     obj.name = mangaelt.name;
  1893.     obj.url = mangaelt.url;
  1894.     obj.lastChapterReadURL = mangaelt.lastChapterReadURL;
  1895.     obj.lastChapterReadName = mangaelt.lastChapterReadName;
  1896.     obj.read = mangaelt.read;
  1897.     obj.update = mangaelt.update;
  1898.     obj.display = mangaelt.display;
  1899.     obj.ts = mangaelt.ts;
  1900.     obj.upts = mangaelt.upts;
  1901.     //console.log("before saving length : " + mangaelt.listChaps.length);
  1902.     obj.listChaps = $A(mangaelt.listChaps).toJSON();
  1903.     obj.cats = $A(mangaelt.cats).toJSON();
  1904.     return $H(obj).toJSON();
  1905. }
  1906.  
  1907. function getJSONListToSync() {
  1908.     var results = [];
  1909.     mangaList.each(function (object) {
  1910.         var value = jsonmangaelttosync(object);
  1911.         if (!Object.isUndefined(value)) results.push(value);
  1912.     });
  1913.     return '[' + results.join(', ') + ']';
  1914. }
  1915.  
  1916. function jsonmangaelttosync(mangaelt) {
  1917.     var obj = {};
  1918.     obj.mirror = mangaelt.mirror;
  1919.     obj.name = mangaelt.name;
  1920.     obj.url = mangaelt.url;
  1921.     obj.lastChapterReadURL = mangaelt.lastChapterReadURL;
  1922.     obj.lastChapterReadName = mangaelt.lastChapterReadName;
  1923.     obj.read = mangaelt.read;
  1924.     obj.update = mangaelt.update;
  1925.     obj.ts = mangaelt.ts;
  1926.     obj.display = mangaelt.display;
  1927.     obj.cats = $A(mangaelt.cats).toJSON();
  1928.     return $H(obj).toJSON();
  1929. }
  1930. chrome.extension.getVersion = function () {
  1931.     if (!chrome.extension.version_) {
  1932.         var xhr = new XMLHttpRequest();
  1933.         xhr.open("GET", chrome.extension.getURL('manifest.json'), false);
  1934.         xhr.onreadystatechange = function () {
  1935.             if (this.readyState == 4) {
  1936.                 var manifest = JSON.parse(this.responseText);
  1937.                 chrome.extension.version_ = manifest.version;
  1938.             }
  1939.         };
  1940.         xhr.send();
  1941.     }
  1942.     return chrome.extension.version_;
  1943. }
  1944.  
  1945. function setclipboard(text) {
  1946.     var txt = document.createElement('textarea');
  1947.     txt.value = text;
  1948.     document.body.appendChild(txt);
  1949.     txt.select();
  1950.     document.execCommand('Copy');
  1951.     document.body.removeChild(txt);
  1952. }
  1953.  
  1954. function deleteMangas(mangasToDel) {
  1955.     var deleteAr = [];
  1956.     for (var i = 0; i < mangasToDel.length; i++) {
  1957.         var tmpManga = new MangaElt(mangasToDel[i]);
  1958.         var mangaExist = isInMangaListId(tmpManga.url);
  1959.         if (mangaExist != -1) {
  1960.             deleteAr[deleteAr.length] = mangaExist;
  1961.         }
  1962.     }
  1963.     deleteAr.sort(function (a, b) {
  1964.         return ((a < b) ? -1 : ((a == b) ? 0 : 1));
  1965.     });
  1966.     for (var i = deleteAr.length - 1; i >= 0; i--) {
  1967.         mangaList.remove(deleteAr[i], deleteAr[i]);
  1968.     }
  1969. }
  1970.  
  1971. function importMangas(mangas, merge) {
  1972.     var textOut = "";
  1973.     if (!merge) {
  1974.         textOut += 'Deleting all mangas...\n';
  1975.         var deleteAr = [];
  1976.         for (var i = 0; i < mangaList.length; i++) {
  1977.             textOut += "\t - Deleting manga entry in current list : " + mangaList[i].name + " in mirror : " + mangaList[i].mirror + "\n";
  1978.             deleteAr[deleteAr.length] = i;
  1979.             try {
  1980.                 _gaq.push(['_trackEvent', 'DeleteManga', mangaList[i].mirror, mangaList[i].name]);
  1981.                 //pageTracker._trackEvent('DeleteManga', request.name);
  1982.             } catch (e) {}
  1983.         }
  1984.         for (var i = deleteAr.length - 1; i >= 0; i--) {
  1985.             mangaList.remove(deleteAr[i], deleteAr[i]);
  1986.         }
  1987.     }
  1988.     textOut += 'Adding mangas...\n';
  1989.     //console.log('Adding mangas...');
  1990.     var lstTmp = mangas;
  1991.     for (var i = 0; i < lstTmp.length; i++) {
  1992.         var tmpManga = new MangaElt(lstTmp[i]);
  1993.         textOut += "\t - Reading manga entry : " + tmpManga.name + " in mirror : " + tmpManga.mirror + "\n";
  1994.         //console.log("\t - Reading manga entry : " + tmpManga.name + " in mirror : " + tmpManga.mirror);
  1995.         var mangaExist = isInMangaList(tmpManga.url);
  1996.         if (mangaExist == null) {
  1997.             textOut += "\t  --> Manga not found in current list, adding manga... " + "\n";
  1998.             //console.log("\t  --> Manga not found in current list, adding manga... ");
  1999.             if (!isMirrorActivated(tmpManga.mirror)) {
  2000.                 activateMirror(tmpManga.mirror);
  2001.             }
  2002.             var last = mangaList.length;
  2003.             mangaList[last] = tmpManga;
  2004.             //mangaList[last].refreshLast();
  2005.             try {
  2006.                 _gaq.push(['_trackEvent', 'AddManga', tmpManga.mirror, tmpManga.name]);
  2007.                 //pageTracker._trackEvent('AddManga', newManga.name);
  2008.             } catch (e) {}
  2009.         } else {
  2010.             //Verify chapter last
  2011.             textOut += "\t  --> Manga found in current list, verify last chapter read. incoming : " + tmpManga.lastChapterReadURL + "; current : " + mangaExist.lastChapterReadURL + "\n";
  2012.             //console.log("\t  --> Manga found in current list, verify last chapter read. incoming : " + tmpManga.lastChapterReadURL + "; current : " + mangaExist.lastChapterReadURL);
  2013.             mangaExist.consult(tmpManga);
  2014.             //saveList();
  2015.             try {
  2016.                 _gaq.push(['_trackEvent', 'ReadManga', tmpManga.mirror, tmpManga.name]);
  2017.                 _gaq.push(['_trackEvent', 'ReadMangaChapter', tmpManga.name, tmpManga.lastChapterReadName]);
  2018.                 //pageTracker._trackEvent('ReadManga', request.name, request.lastChapterReadName);
  2019.             } catch (e) {}
  2020.         }
  2021.     }
  2022.     refreshAllLasts();
  2023.     return textOut;
  2024. }
  2025.  
  2026. function updateFromSite(mangas, merge) {
  2027.     if (!merge) {
  2028.         var deleteAr = [];
  2029.         for (var i = 0; i < mangaList.length; i++) {
  2030.             deleteAr[deleteAr.length] = i;
  2031.             try {
  2032.                 _gaq.push(['_trackEvent', 'DeleteManga', mangaList[i].mirror, mangaList[i].name]);
  2033.             } catch (e) {}
  2034.         }
  2035.         for (var i = deleteAr.length - 1; i >= 0; i--) {
  2036.             mangaList.remove(deleteAr[i], deleteAr[i]);
  2037.         }
  2038.     }
  2039.     //Treat manga entries
  2040.     for (var i = 0; i < mangas.length; i++) {
  2041.         var mg = mangas[i];
  2042.         if (mg.change == "new") {
  2043.             var tmpManga = new MangaElt(mg);
  2044.             if (!isMirrorActivated(tmpManga.mirror)) {
  2045.                 activateMirror(tmpManga.mirror);
  2046.             }
  2047.             var last = mangaList.length;
  2048.             mangaList[last] = tmpManga;
  2049.             //mangaList[last].refreshLast();
  2050.             try {
  2051.                 _gaq.push(['_trackEvent', 'AddManga', tmpManga.mirror, tmpManga.name]);
  2052.             } catch (e) {}
  2053.         } else if (mg.change == "delete") {
  2054.             var mangaExist = isInMangaListId(mg.url);
  2055.             if (mangaExist != -1) {
  2056.                 try {
  2057.                     _gaq.push(['_trackEvent', 'DeleteManga', mg.mirror, mg.name]);
  2058.                 } catch (e) {}
  2059.                 mangaList.remove(mangaExist, mangaExist);
  2060.             }
  2061.         } else {
  2062.             var tmpManga = new MangaElt(mg);
  2063.             var mangaExist = isInMangaList(tmpManga.url);
  2064.             if (mangaExist != null) {
  2065.                 mangaExist.consult(tmpManga, true);
  2066.                 try {
  2067.                     _gaq.push(['_trackEvent', 'ReadManga', tmpManga.mirror, tmpManga.name]);
  2068.                     _gaq.push(['_trackEvent', 'ReadMangaChapter', tmpManga.name, tmpManga.lastChapterReadName]);
  2069.                 } catch (e) {}
  2070.             }
  2071.         }
  2072.     }
  2073.     refreshAllLasts();
  2074.     //saveList();
  2075. }
  2076.  
  2077. function importBookmarks(bms, merge) {
  2078.     var textOut = "";
  2079.     if (!merge) {
  2080.         textOut += 'Deleting all bookmarks...\n';
  2081.         var deleteAr = [];
  2082.         for (var i = 0; i < bookmarks.length; i++) {
  2083.             textOut += "\t - Deleting bookmark entry in current list : (type: " + bookmarks[i].type + ", url: " + bookmarks[i].url + ", chapter url: " + bookmarks[i].chapUrl + ", mirror: " + bookmarks[i].mirror + ((bookmarks[i].type == "chapter") ? "" : ", scanName: " + bookmarks[i].scanName) + ", note: " + bookmarks[i].note + ")" + "\n";
  2084.             deleteAr[deleteAr.length] = i;
  2085.         }
  2086.         for (var i = deleteAr.length - 1; i >= 0; i--) {
  2087.             bookmarks.remove(deleteAr[i], deleteAr[i]);
  2088.         }
  2089.     }
  2090.     textOut += 'Adding bookmarks...\n';
  2091.     var lstTmp = bms;
  2092.     for (var i = 0; i < lstTmp.length; i++) {
  2093.         textOut += "\t - Reading bookmark entry : (type: " + lstTmp[i].type + ", url: " + lstTmp[i].url + ", chapter url: " + lstTmp[i].chapUrl + ", mirror: " + lstTmp[i].mirror + ((lstTmp[i].type == "chapter") ? "" : ", scanName: " + lstTmp[i].scanName) + ", note: " + lstTmp[i].note + ")" + "\n"
  2094.         var isFound = false;
  2095.         var posFound;
  2096.         var obj = lstTmp[i];
  2097.         if (bookmarks.length > 0) {
  2098.             for (var j = 0; j < bookmarks.length; j++) {
  2099.                 if (obj.mirror == bookmarks[j].mirror && obj.url == bookmarks[j].url && obj.chapUrl == bookmarks[j].chapUrl && obj.type == bookmarks[j].type) {
  2100.                     if (obj.type == "chapter") {
  2101.                         isFound = true;
  2102.                         posFound = j;
  2103.                         break;
  2104.                     } else {
  2105.                         if (obj.scanUrl == bookmarks[j].scanUrl) {
  2106.                             isFound = true;
  2107.                             posFound = j;
  2108.                             break;
  2109.                         }
  2110.                     }
  2111.                 }
  2112.             }
  2113.         }
  2114.         if (!isFound) {
  2115.             textOut += "\t  --> Bookmark not found in current list, adding bookmark... " + "\n";
  2116.             bookmarks[bookmarks.length] = {
  2117.                 mirror: obj.mirror,
  2118.                 url: obj.url,
  2119.                 chapUrl: obj.chapUrl,
  2120.                 type: obj.type,
  2121.                 name: obj.name,
  2122.                 chapName: obj.chapName,
  2123.                 scanUrl: obj.scanUrl,
  2124.                 scanName: obj.scanName,
  2125.                 note: obj.note
  2126.             };
  2127.         } else {
  2128.             textOut += "\t  --> Bookmark already exist, update note.. " + "\n";
  2129.             bookmarks[posFound].note = obj.note;
  2130.         }
  2131.     }
  2132.     localStorage["bookmarks"] = $A(bookmarks).toJSON();
  2133.     return textOut;
  2134. }
  2135. init();
  2136. //console.log("After init");
Add Comment
Please, Sign In to add comment