PageRenderTime 51ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 1ms

/clearly/chrome/content/browser.js

https://bitbucket.org/yangchen/evernote-firefox
JavaScript | 4027 lines | 2289 code | 837 blank | 901 comment | 324 complexity | 08951de513c95e3c8e30b51ba9caf12e MD5 | raw file
  1. // bind fast
  2. // =========
  3. // hooks
  4. // =====
  5. __readable_by_evernote.readable_by_evernote__menu__call = function () { __readable_by_evernote.__readable_by_evernote__launch(); };
  6. __readable_by_evernote.readable_by_evernote__context_menu__call = function () { __readable_by_evernote.__readable_by_evernote__launch(); };
  7. __readable_by_evernote.readable_by_evernote__button__call = function () { __readable_by_evernote.__readable_by_evernote__launch(); };
  8. // jquery, keyboard
  9. // ================
  10. window.addEventListener('load', function ()
  11. {
  12. // decode
  13. // encode
  14. // ======
  15. function __encodeURIComponentForReadable(_string)
  16. {
  17. // none
  18. if (_string == '') { return 'none'; }
  19. // encode
  20. return encodeURIComponent(_string)
  21. .replace(/!/g, '%21')
  22. .replace(/'/g, '%27')
  23. .replace(/\(/g, '%28')
  24. .replace(/\)/g, '%29')
  25. .replace(/\*/g, '%2A')
  26. ;
  27. }
  28. // decode
  29. // ======
  30. function __decodeURIComponentForReadable(_string)
  31. {
  32. // none
  33. if (_string == 'none') { return ''; }
  34. // decode
  35. return decodeURIComponent(_string);
  36. }
  37. // keyboard
  38. // ========
  39. var
  40. _vars = __readable_by_evernote.__get_saved__vars(),
  41. __key_activation = __decodeURIComponentForReadable(_vars['keys_activation']),
  42. __key_clip = __decodeURIComponentForReadable(_vars['keys_clip']),
  43. __key_highlight = __decodeURIComponentForReadable(_vars['keys_highlight'])
  44. ;
  45. gBrowser.addEventListener('keydown', function(_event)
  46. {
  47. // include key combo detection
  48. /*
  49. _event must be defined
  50. _key_combo and _key_code will be defined at end of code
  51. */
  52. var _key_code = 'NONE';
  53. switch (true)
  54. {
  55. case (_event.keyCode && (_event.keyCode >= 65 && _event.keyCode <= 90)):
  56. _key_code = String.fromCharCode(_event.keyCode).toUpperCase();
  57. break;
  58. case (_event.keyCode == 27): _key_code = 'Escape'; break;
  59. case (_event.keyCode == 37): _key_code = 'Left Arrow'; break;
  60. case (_event.keyCode == 39): _key_code = 'Right Arrow'; break;
  61. case (_event.keyCode == 38): _key_code = 'Up Arrow'; break;
  62. case (_event.keyCode == 40): _key_code = 'Down Arrow'; break;
  63. }
  64. // get
  65. // ===
  66. var _modifierKeys = (_event.originalEvent ? _event.originalEvent : _event);
  67. // jQuery screws up -- fucks up the metaKey property badly
  68. var _key_combo = ''
  69. + (_modifierKeys.ctrlKey ? 'Control + ' : '')
  70. + (_modifierKeys.shiftKey ? 'Shift + ' : '')
  71. + (_modifierKeys.altKey ? 'Alt + ' : '')
  72. + (_modifierKeys.metaKey ? 'Command + ' : '')
  73. + _key_code
  74. ;
  75. // needs a modifier -- if not just Escape key
  76. // ================
  77. if ((_key_code != 'Escape') && (_key_code == _key_combo))
  78. {
  79. _key_code = 'NONE';
  80. _key_combo = 'NONE';
  81. }
  82. switch (true)
  83. {
  84. case ((__key_activation > '') && (_key_combo == __key_activation)):
  85. case ((__key_clip > '') && (_key_combo == __key_clip)):
  86. case ((__key_highlight > '') && (_key_combo == __key_highlight)):
  87. // visible already; ignore
  88. // =======================
  89. var _body = gBrowser.contentDocument.getElementsByTagName('body')[0];
  90. if (_body && _body.className && _body.className.match(/readableVisible/))
  91. { break; }
  92. // also?
  93. // =====
  94. // clip
  95. var __clip_on_launch = ((__key_clip > '') && (_key_combo == __key_clip));
  96. // highlight
  97. var __highlight_on_launch = ((__key_highlight > '') && (_key_combo == __key_highlight));
  98. // stop
  99. // ====
  100. _event.stopPropagation();
  101. _event.preventDefault();
  102. // do
  103. // ==
  104. __readable_by_evernote.__readable_by_evernote__launch(__clip_on_launch, __highlight_on_launch);
  105. break;
  106. }
  107. }, true);
  108. // expose
  109. // ======
  110. // expose clearly
  111. // ==============
  112. gBrowser.addEventListener('DOMContentLoaded', function (_event)
  113. {
  114. // invalid
  115. if (_event.originalTarget.nodeName == "#document"); else { return; }
  116. // get page
  117. var
  118. _document = _event.originalTarget,
  119. _window = _document.defaultView
  120. ;
  121. // return
  122. if (_window.location.hostname.match(/(evernote|yinxiang).com$/gi)); else { return; }
  123. // add to head
  124. try
  125. {
  126. var _meta = _document.createElement("meta");
  127. _meta.name = "evernote-clearly-extension";
  128. _meta.content = "installed";
  129. _document.head.appendChild(meta);
  130. }
  131. catch (e) {}
  132. // add to body
  133. try
  134. {
  135. _document.body.className += ' evernote-clearly-extension';
  136. }
  137. catch (e) {}
  138. }, true);
  139. }, false);
  140. // launcher
  141. // ========
  142. __readable_by_evernote.__readable_by_evernote__launch = function (__clip_on_launch, __highlight_on_launch)
  143. {
  144. // default
  145. if (__clip_on_launch); else { __clip_on_launch = false; }
  146. if (__highlight_on_launch); else { __highlight_on_launch = false; }
  147. var
  148. _d = gBrowser.contentDocument,
  149. _b = _d.getElementsByTagName('body')[0],
  150. _o = _d.getElementById('__readable_extension_definitions'),
  151. _l = _d.createElement('script')
  152. ;
  153. // create, if not present
  154. // ======================
  155. if (_o); else
  156. {
  157. _o = _d.createElement('dl');
  158. _o.setAttribute('style', 'display: none;');
  159. _o.setAttribute('id', '__readable_extension_definitions');
  160. _b.appendChild(_o);
  161. }
  162. // set options
  163. // ===========
  164. var
  165. _options = __readable_by_evernote.__get_saved__options(),
  166. _vars = __readable_by_evernote.__get_saved__vars(),
  167. _translations = __readable_by_evernote.__get_translations(),
  168. __definition_items_html = __readable_by_evernote.__get__stuffAsDefinitionItemsHTML
  169. ({
  170. 'option': _options,
  171. 'var': _vars,
  172. 'translation': _translations
  173. })
  174. ;
  175. _o.innerHTML = __definition_items_html;
  176. // launch in context
  177. // =================
  178. _l.setAttribute('src', 'chrome://readable-by-evernote/content/js/__bookmarklet_to_inject'+(__clip_on_launch ? '__andClipOnLaunch' : (__highlight_on_launch ? '__andHighlightOnLaunch' : ''))+'.js');
  179. _l.className = 'bookmarklet_launch';
  180. _b.appendChild(_l);
  181. // custom events
  182. // =============
  183. __readable_by_evernote.__add_custom_events_handler();
  184. };
  185. // include
  186. // =======
  187. // options
  188. // get options
  189. // ===========
  190. __readable_by_evernote.__get_saved__options = function ()
  191. {
  192. // encode
  193. // ======
  194. function __encodeURIComponentForReadable(_string)
  195. {
  196. // none
  197. if (_string == '') { return 'none'; }
  198. // encode
  199. return encodeURIComponent(_string)
  200. .replace(/!/g, '%21')
  201. .replace(/'/g, '%27')
  202. .replace(/\(/g, '%28')
  203. .replace(/\)/g, '%29')
  204. .replace(/\*/g, '%2A')
  205. ;
  206. }
  207. // decode
  208. // ======
  209. function __decodeURIComponentForReadable(_string)
  210. {
  211. // none
  212. if (_string == 'none') { return ''; }
  213. // decode
  214. return decodeURIComponent(_string);
  215. }
  216. // __encodeURIComponentForReadable must be defined
  217. var __default_options =
  218. {
  219. 'text_font': __encodeURIComponentForReadable('"PT Serif"'),
  220. 'text_font_header': __encodeURIComponentForReadable('"PT Serif"'),
  221. 'text_font_monospace': __encodeURIComponentForReadable('Inconsolata'),
  222. 'text_size': __encodeURIComponentForReadable('16px'),
  223. 'text_line_height': __encodeURIComponentForReadable('1.5em'),
  224. 'box_width': __encodeURIComponentForReadable('36em'),
  225. 'color_background': __encodeURIComponentForReadable('#f3f2ee'),
  226. 'color_text': __encodeURIComponentForReadable('#1f0909'),
  227. 'color_links': __encodeURIComponentForReadable('#065588'),
  228. 'text_align': __encodeURIComponentForReadable('normal'),
  229. 'base': __encodeURIComponentForReadable('theme-1'),
  230. 'footnote_links': __encodeURIComponentForReadable('on_print'),
  231. 'large_graphics': __encodeURIComponentForReadable('do_nothing'),
  232. 'custom_css': __encodeURIComponentForReadable('')
  233. };
  234. var
  235. _prefs_service = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService),
  236. _prefs = _prefs_service.getBranch("extensions.readable-by-evernote.")
  237. ;
  238. var _return = {};
  239. for (var _x in __default_options) { _return[_x] = _prefs.getCharPref(_x); }
  240. return _return;
  241. };
  242. // get vars
  243. // ========
  244. __readable_by_evernote.__get_saved__vars = function ()
  245. {
  246. // encode
  247. // ======
  248. function __encodeURIComponentForReadable(_string)
  249. {
  250. // none
  251. if (_string == '') { return 'none'; }
  252. // encode
  253. return encodeURIComponent(_string)
  254. .replace(/!/g, '%21')
  255. .replace(/'/g, '%27')
  256. .replace(/\(/g, '%28')
  257. .replace(/\)/g, '%29')
  258. .replace(/\*/g, '%2A')
  259. ;
  260. }
  261. // decode
  262. // ======
  263. function __decodeURIComponentForReadable(_string)
  264. {
  265. // none
  266. if (_string == 'none') { return ''; }
  267. // decode
  268. return decodeURIComponent(_string);
  269. }
  270. // __encodeURIComponentForReadable must be defined
  271. var __default_vars =
  272. {
  273. 'theme': __encodeURIComponentForReadable('theme-1'), /* theme-1, theme-2, theme-3, custom */
  274. 'keys_activation': __encodeURIComponentForReadable('Control + Alt + Right Arrow'),
  275. 'keys_clip': __encodeURIComponentForReadable('Control + Alt + Up Arrow'),
  276. 'keys_highlight': __encodeURIComponentForReadable('Control + Alt + H'),
  277. 'clip_tag': __encodeURIComponentForReadable(''),
  278. 'clip_notebook': __encodeURIComponentForReadable(''),
  279. 'related_notes': __encodeURIComponentForReadable('enabled'), /* enabled, just_at_bottom, disabled */
  280. 'smart_filing': __encodeURIComponentForReadable('enabled'), /* enabled, just_notebooks, just_tags, disabled */
  281. 'custom_theme_options': __encodeURIComponentForReadable('') /* the custom theme options get serialized into this */
  282. };
  283. var
  284. _prefs_service = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService),
  285. _prefs = _prefs_service.getBranch("extensions.readable-by-evernote.")
  286. ;
  287. var _return = {};
  288. for (var _x in __default_vars) { _return[_x] = _prefs.getCharPref(_x); }
  289. return _return;
  290. };
  291. // save
  292. // ====
  293. __readable_by_evernote.__save_someStuff = function (_to_save)
  294. {
  295. var
  296. _prefs_service = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService),
  297. _prefs = _prefs_service.getBranch("extensions.readable-by-evernote.")
  298. ;
  299. for (var _x in _to_save)
  300. { _prefs.setCharPref(_x, _to_save[_x]); }
  301. };
  302. // get definitionList
  303. // ==================
  304. __readable_by_evernote.__get__stuffAsDefinitionItemsHTML = function (_stuffToTransform)
  305. {
  306. /*
  307. stuffToTransform = {
  308. 'prefix-id': {
  309. 'key': 'value'
  310. }
  311. };
  312. */
  313. // __escapeForHTML
  314. // escapeForHTML
  315. // =============
  316. function __escapeForHTML(_string)
  317. {
  318. var _replace = {
  319. "&": "amp",
  320. '"': "quot",
  321. "<": "lt",
  322. ">": "gt"
  323. };
  324. return _string.replace(
  325. /[&"<>]/g,
  326. function (_match) { return ("&" + _replace[_match] + ";"); }
  327. );
  328. }
  329. // create html
  330. var _html = '';
  331. for (var _prefix in _stuffToTransform)
  332. {
  333. for (var _x in _stuffToTransform[_prefix])
  334. {
  335. _html += ''
  336. + '<dd id="__readable_' + __escapeForHTML(_prefix) + '__' + __escapeForHTML(_x) + '">'
  337. + __escapeForHTML(_stuffToTransform[_prefix][_x])
  338. + '</dd>'
  339. ;
  340. }
  341. }
  342. return _html;
  343. };
  344. // set defaults -- are set in defaults/preferences/prefs.js to '--def--'
  345. // ============
  346. (function ()
  347. {
  348. // encode
  349. // ======
  350. function __encodeURIComponentForReadable(_string)
  351. {
  352. // none
  353. if (_string == '') { return 'none'; }
  354. // encode
  355. return encodeURIComponent(_string)
  356. .replace(/!/g, '%21')
  357. .replace(/'/g, '%27')
  358. .replace(/\(/g, '%28')
  359. .replace(/\)/g, '%29')
  360. .replace(/\*/g, '%2A')
  361. ;
  362. }
  363. // decode
  364. // ======
  365. function __decodeURIComponentForReadable(_string)
  366. {
  367. // none
  368. if (_string == 'none') { return ''; }
  369. // decode
  370. return decodeURIComponent(_string);
  371. }
  372. // __encodeURIComponentForReadable must be defined
  373. var __default_options =
  374. {
  375. 'text_font': __encodeURIComponentForReadable('"PT Serif"'),
  376. 'text_font_header': __encodeURIComponentForReadable('"PT Serif"'),
  377. 'text_font_monospace': __encodeURIComponentForReadable('Inconsolata'),
  378. 'text_size': __encodeURIComponentForReadable('16px'),
  379. 'text_line_height': __encodeURIComponentForReadable('1.5em'),
  380. 'box_width': __encodeURIComponentForReadable('36em'),
  381. 'color_background': __encodeURIComponentForReadable('#f3f2ee'),
  382. 'color_text': __encodeURIComponentForReadable('#1f0909'),
  383. 'color_links': __encodeURIComponentForReadable('#065588'),
  384. 'text_align': __encodeURIComponentForReadable('normal'),
  385. 'base': __encodeURIComponentForReadable('theme-1'),
  386. 'footnote_links': __encodeURIComponentForReadable('on_print'),
  387. 'large_graphics': __encodeURIComponentForReadable('do_nothing'),
  388. 'custom_css': __encodeURIComponentForReadable('')
  389. };
  390. // __encodeURIComponentForReadable must be defined
  391. var __default_vars =
  392. {
  393. 'theme': __encodeURIComponentForReadable('theme-1'), /* theme-1, theme-2, theme-3, custom */
  394. 'keys_activation': __encodeURIComponentForReadable('Control + Alt + Right Arrow'),
  395. 'keys_clip': __encodeURIComponentForReadable('Control + Alt + Up Arrow'),
  396. 'keys_highlight': __encodeURIComponentForReadable('Control + Alt + H'),
  397. 'clip_tag': __encodeURIComponentForReadable(''),
  398. 'clip_notebook': __encodeURIComponentForReadable(''),
  399. 'related_notes': __encodeURIComponentForReadable('enabled'), /* enabled, just_at_bottom, disabled */
  400. 'smart_filing': __encodeURIComponentForReadable('enabled'), /* enabled, just_notebooks, just_tags, disabled */
  401. 'custom_theme_options': __encodeURIComponentForReadable('') /* the custom theme options get serialized into this */
  402. };
  403. var
  404. _prefs_service = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService),
  405. _prefs = _prefs_service.getBranch("extensions.readable-by-evernote.")
  406. ;
  407. // mac or pc
  408. // =========
  409. var osString = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime).OS;
  410. if (osString.toLowerCase() == 'darwin')
  411. {
  412. __default_vars['keys_activation'] = __encodeURIComponentForReadable('Control + Command + Right Arrow');
  413. __default_vars['keys_clip'] = __encodeURIComponentForReadable('Control + Command + Up Arrow');
  414. __default_vars['keys_highlight'] = __encodeURIComponentForReadable('Control + Command + H');
  415. }
  416. // options
  417. // =======
  418. for (var _x in __default_options)
  419. {
  420. var
  421. _valueNow = _prefs.getCharPref(_x),
  422. _valueDefault = __default_options[_x]
  423. ;
  424. switch (true)
  425. {
  426. case (!(_valueNow > '')):
  427. case (_valueNow == '--def--'):
  428. _prefs.setCharPref(_x, _valueDefault);
  429. break;
  430. }
  431. }
  432. // vars
  433. // ====
  434. for (var _x in __default_vars)
  435. {
  436. var
  437. _valueNow = _prefs.getCharPref(_x),
  438. _valueDefault = __default_vars[_x]
  439. ;
  440. switch (true)
  441. {
  442. case (!(_valueNow > '')):
  443. case (_valueNow == '--def--'):
  444. _prefs.setCharPref(_x, _valueDefault);
  445. break;
  446. }
  447. }
  448. })();
  449. // evernote remote
  450. // namespace
  451. // =========
  452. __readable_by_evernote.__evernote_bootstrap =
  453. {
  454. /* predefined */
  455. 'servers': false,
  456. 'server_main': '', /* ends in slash */
  457. 'server_china': '', /* ends in slash */
  458. /* set on load */
  459. 'saved_server': false, /* main | china */
  460. 'client_locale': false,
  461. 'has_chinese_locale': false,
  462. 'simulate_chinese_locale': false,
  463. /* set on bootstrap() */
  464. 'rpc__userStore': false,
  465. 'profiles': false,
  466. 'profiles_as_string': false,
  467. 'server': false,
  468. 'remote_domain': false, /* ends in slash */
  469. 'remote_domain_marketing': false, /* ends in slash */
  470. 'connected': false
  471. };
  472. // servers
  473. // =======
  474. __readable_by_evernote.__evernote_bootstrap.servers =
  475. {
  476. 'live':
  477. {
  478. 'main': 'https://www.evernote.com/',
  479. 'china': 'https://app.yinxiang.com/'
  480. },
  481. 'stage':
  482. {
  483. 'main': 'https://stage.evernote.com/',
  484. 'china': 'https://stage-china.evernote.com/'
  485. }
  486. };
  487. // bootstrap
  488. // =========
  489. __readable_by_evernote.__evernote_bootstrap.bootstrap = function (_onSuccess, _onFailure)
  490. {
  491. // already connected
  492. // =================
  493. if (__readable_by_evernote.__evernote_bootstrap.connected) { _onSuccess(); return; }
  494. // figure out order
  495. // ================
  496. var _order = [];
  497. switch (true)
  498. {
  499. case (__readable_by_evernote.__evernote_bootstrap.saved_server == 'main'): _order = ['main', 'china']; break;
  500. case (__readable_by_evernote.__evernote_bootstrap.saved_server == 'china'): _order = ['china', 'main']; break;
  501. case (__readable_by_evernote.__evernote_bootstrap.has_chinese_locale): _order = ['china', 'main']; break;
  502. case (__readable_by_evernote.__evernote_bootstrap.simulate_chinese_locale): _order = ['china', 'main']; break;
  503. default: _order = ['main', 'china']; break;
  504. }
  505. // try connect to one
  506. // ==================
  507. var _try_connect_to_one = function (_order_number)
  508. {
  509. // invalid number; failed
  510. // ======================
  511. if (_order[_order_number]); else
  512. {
  513. // failed
  514. _onFailure('connection / invalid');
  515. // break
  516. return;
  517. };
  518. // try current number
  519. // ==================
  520. var _rpcBootstrapClient = new __readable_by_evernote.JSONRpcClient
  521. (
  522. function ()
  523. {
  524. // error / timeout
  525. // ===============
  526. if (this.UserStore); else
  527. {
  528. // next -- will kill self on invalid
  529. _try_connect_to_one(_order_number + 1);
  530. // break
  531. return;
  532. }
  533. // set conected
  534. // ============
  535. __readable_by_evernote.__evernote_bootstrap.connected = true;
  536. __readable_by_evernote.__evernote_bootstrap.rpc__userStore = this;
  537. // get profiles
  538. // ============
  539. __readable_by_evernote.__evernote_bootstrap.rpc__userStore.UserStore.getBootstrapInfo
  540. (
  541. function (_rpc_result, _rpc_exception)
  542. {
  543. var
  544. _bootstrapInfoResult = _rpc_result,
  545. _bootstrapInfoError = _rpc_exception
  546. ;
  547. // error
  548. // =====
  549. if (_bootstrapInfoError)
  550. {
  551. _bootstrapInfoResult = {
  552. 'profiles': {
  553. 'list': [ {
  554. 'name': 'Evernote',
  555. 'setName': true,
  556. 'setSettings': true,
  557. 'settings': {
  558. 'marketingUrl': 'http://www.evernote.com',
  559. 'serviceHost': 'www.evernote.com',
  560. 'supportUrl': 'https://evernote.com/contact/support/'
  561. }
  562. } ]
  563. }
  564. };
  565. }
  566. // result
  567. // ======
  568. // set profiles
  569. // ============
  570. __readable_by_evernote.__evernote_bootstrap.profiles = _bootstrapInfoResult.profiles.list;
  571. // profiles as string
  572. // ==================
  573. __readable_by_evernote.__evernote_bootstrap.profiles_as_string = '';
  574. for (var zz=0,_zz=__readable_by_evernote.__evernote_bootstrap.profiles.length; zz<_zz; zz++)
  575. { __readable_by_evernote.__evernote_bootstrap.profiles_as_string += '_' + __readable_by_evernote.__evernote_bootstrap.getProfileName__short(__readable_by_evernote.__evernote_bootstrap.profiles[zz]); }
  576. __readable_by_evernote.__evernote_bootstrap.profiles_as_string = __readable_by_evernote.__evernote_bootstrap.profiles_as_string.substr(1);
  577. // select first
  578. // ============
  579. __readable_by_evernote.__evernote_bootstrap.server = __readable_by_evernote.__evernote_bootstrap.getProfileName__long(__readable_by_evernote.__evernote_bootstrap.profiles[0]);
  580. __readable_by_evernote.__evernote_bootstrap.remote_domain = __readable_by_evernote.__evernote_bootstrap['server_' + __readable_by_evernote.__evernote_bootstrap.server];
  581. __readable_by_evernote.__evernote_bootstrap.remote_domain_marketing = __readable_by_evernote.__evernote_bootstrap.profiles[0].settings.marketingUrl + '/';
  582. // first different than saved -- switch
  583. // ==========================
  584. if (true
  585. && (__readable_by_evernote.__evernote_bootstrap.profiles_as_string == 'in_cn')
  586. && (__readable_by_evernote.__evernote_bootstrap.server == 'main')
  587. && (__readable_by_evernote.__evernote_bootstrap.saved_server == 'china')
  588. ){
  589. __readable_by_evernote.__evernote_bootstrap.server = 'china';
  590. __readable_by_evernote.__evernote_bootstrap.remote_domain = __readable_by_evernote.__evernote_bootstrap['server_' + 'china'];
  591. __readable_by_evernote.__evernote_bootstrap.remote_domain_marketing = __readable_by_evernote.__evernote_bootstrap.profiles[1].settings.marketingUrl + '/';
  592. __readable_by_evernote.__evernote_bootstrap.profiles_as_string == 'cn_in';
  593. }
  594. else if (true
  595. && (__readable_by_evernote.__evernote_bootstrap.profiles_as_string == 'cn_in')
  596. && (__readable_by_evernote.__evernote_bootstrap.server == 'china')
  597. && (__readable_by_evernote.__evernote_bootstrap.saved_server == 'main')
  598. ){
  599. __readable_by_evernote.__evernote_bootstrap.server = 'main';
  600. __readable_by_evernote.__evernote_bootstrap.remote_domain = __readable_by_evernote.__evernote_bootstrap['server_' + 'main'];
  601. __readable_by_evernote.__evernote_bootstrap.remote_domain_marketing = __readable_by_evernote.__evernote_bootstrap.profiles[1].settings.marketingUrl + '/';
  602. __readable_by_evernote.__evernote_bootstrap.profiles_as_string == 'in_cn';
  603. }
  604. // run sucess
  605. // ==========
  606. _onSuccess();
  607. },
  608. (__readable_by_evernote.__evernote_bootstrap.simulate_chinese_locale ? 'zh_cn' : __readable_by_evernote.__evernote_bootstrap.client_locale)
  609. );
  610. },
  611. __readable_by_evernote.__evernote_bootstrap['server_' + _order[_order_number]] + 'json'
  612. );
  613. };
  614. // try first
  615. // =========
  616. _try_connect_to_one(0);
  617. };
  618. // profile name
  619. // ============
  620. __readable_by_evernote.__evernote_bootstrap.getProfileName__short = function (_profile)
  621. {
  622. switch (_profile.name.toLowerCase())
  623. {
  624. case 'evernote': return 'in';
  625. case 'evernote-china': return 'cn';
  626. }
  627. return '';
  628. };
  629. __readable_by_evernote.__evernote_bootstrap.getProfileName__long = function (_profile)
  630. {
  631. switch (_profile.name.toLowerCase())
  632. {
  633. case 'evernote': return 'main';
  634. case 'evernote-china': return 'china';
  635. }
  636. return '';
  637. };
  638. // set locale
  639. // ==========
  640. __readable_by_evernote.__evernote_bootstrap.setLocale = function (_browser_locale)
  641. {
  642. // which
  643. var _locale = _browser_locale;
  644. _locale = _locale.replace(/[-]/gi, '_');
  645. _locale = _locale.replace(/\s+/gi, '');
  646. _locale = _locale.toLowerCase()
  647. // set
  648. __readable_by_evernote.__evernote_bootstrap.client_locale = _locale;
  649. // chinese?
  650. __readable_by_evernote.__evernote_bootstrap.has_chinese_locale = ('|zh|zh_cn|zh_hans|zh_hans_cn|'.indexOf('|'+_locale+'|') > -1);
  651. };
  652. // QA testing
  653. // ==========
  654. __readable_by_evernote.__evernote_bootstrap.set_servers_to_stage = function ()
  655. {
  656. __readable_by_evernote.__evernote_bootstrap['server_main'] = __readable_by_evernote.__evernote_bootstrap.servers['stage']['main'];
  657. __readable_by_evernote.__evernote_bootstrap['server_china'] = __readable_by_evernote.__evernote_bootstrap.servers['stage']['china'];
  658. };
  659. __readable_by_evernote.__evernote_bootstrap.set_servers_to_live = function ()
  660. {
  661. __readable_by_evernote.__evernote_bootstrap['server_main'] = __readable_by_evernote.__evernote_bootstrap.servers['live']['main'];
  662. __readable_by_evernote.__evernote_bootstrap['server_china'] = __readable_by_evernote.__evernote_bootstrap.servers['live']['china'];
  663. };
  664. __readable_by_evernote.__evernote_bootstrap.set_simulate_chinese_locale = function ()
  665. {
  666. __readable_by_evernote.__evernote_bootstrap.simulate_chinese_locale = true;
  667. };
  668. __readable_by_evernote.__evernote_bootstrap.set_do_not_simulate_chinese_locale = function ()
  669. {
  670. __readable_by_evernote.__evernote_bootstrap.simulate_chinese_locale = false;
  671. };
  672. __readable_by_evernote.__evernote_bootstrap.disconnect = function ()
  673. {
  674. __readable_by_evernote.__evernote_bootstrap['connected'] = false;
  675. __readable_by_evernote.__evernote_bootstrap['profiles'] = false;
  676. __readable_by_evernote.__evernote_bootstrap['server'] = false;
  677. __readable_by_evernote.__evernote_bootstrap['remote_domain'] = false;
  678. __readable_by_evernote.__evernote_bootstrap['rpc__userStore'] = false;
  679. };
  680. // included code
  681. // json-rpc must exist in context
  682. // namespace
  683. // =========
  684. __readable_by_evernote.__evernote_remote =
  685. {
  686. /* predefined */
  687. 'api__key': 'en-clearly',
  688. 'api__secret': '6798bce902c29b73',
  689. /* set on init */
  690. 'setting__related_notes': '',
  691. 'setting__smart_filing': '',
  692. 'setting__clip_tag': '',
  693. 'setting__clip_notebook': '',
  694. /* stores */
  695. 'store__id_to_guid': {},
  696. 'store__id_to_info': {},
  697. 'store__id_to_recommendation': {},
  698. /* set on login */
  699. 'rpc__userStore': false,
  700. 'rpc__noteStore': false,
  701. 'user__authToken': false,
  702. 'user__shardId': false,
  703. 'user__privilege': false,
  704. 'user__username': false,
  705. 'user__email': false,
  706. 'is__connected': false,
  707. 'is__loggedIn': false
  708. };
  709. // connect
  710. // =======
  711. __readable_by_evernote.__evernote_remote.connect = function (_onSuccess, _onFailure)
  712. {
  713. // bootstrap first
  714. // ===============
  715. __readable_by_evernote.__evernote_bootstrap.bootstrap
  716. (
  717. function ()
  718. {
  719. // bootstrap succesfull
  720. // ====================
  721. try
  722. {
  723. var _rpcUserStoreClient = new __readable_by_evernote.JSONRpcClient
  724. (
  725. function ()
  726. {
  727. // error / timeout
  728. // ===============
  729. if (this.UserStore); else
  730. {
  731. // fail
  732. _onFailure('connection / invalid');
  733. // break
  734. return;
  735. }
  736. // set conected
  737. // ============
  738. __readable_by_evernote.__evernote_remote.is__connected = true;
  739. __readable_by_evernote.__evernote_remote.rpc__userStore = this;
  740. // run success
  741. // ===========
  742. _onSuccess();
  743. },
  744. __readable_by_evernote.__evernote_bootstrap.remote_domain + 'json'
  745. );
  746. }
  747. catch (_error) { _onFailure('connection / invalid'); return; }
  748. },
  749. function () { _onFailure('connection / invalid'); }
  750. );
  751. };
  752. // logout
  753. // ======
  754. __readable_by_evernote.__evernote_remote.logout = function ()
  755. {
  756. __readable_by_evernote.__evernote_remote['rpc__userStore'] = false;
  757. __readable_by_evernote.__evernote_remote['rpc__noteStore'] = false;
  758. __readable_by_evernote.__evernote_remote['user__authToken'] = false;
  759. __readable_by_evernote.__evernote_remote['user__shardId'] = false;
  760. __readable_by_evernote.__evernote_remote['user__privilege'] = false;
  761. __readable_by_evernote.__evernote_remote['user__username'] = false;
  762. __readable_by_evernote.__evernote_remote['user__email'] = false;
  763. __readable_by_evernote.__evernote_remote['is__connected'] = false;
  764. __readable_by_evernote.__evernote_remote['is__loggedIn'] = false;
  765. };
  766. // login
  767. // =====
  768. __readable_by_evernote.__evernote_remote.login = function (_user, _pass, _onSuccess, _onFailure)
  769. {
  770. // login function
  771. // ===============
  772. var _loginFunction = function ()
  773. {
  774. // login
  775. // =====
  776. __readable_by_evernote.__evernote_remote.rpc__userStore.UserStore.authenticate
  777. (
  778. function (_rpc_result, _rpc_exception)
  779. {
  780. var
  781. _loginResult = _rpc_result,
  782. _loginError = _rpc_exception
  783. ;
  784. // error
  785. // =====
  786. if (_loginError)
  787. {
  788. // unknown error
  789. // =============
  790. switch (true)
  791. {
  792. case (!(_loginError.trace)):
  793. case (!(_loginError.trace.indexOf)):
  794. case (!(_loginError.trace.indexOf(')') > -1)):
  795. _onFailure('login / exception / no trace');
  796. return;
  797. }
  798. // figure out error
  799. // ================
  800. var _trace = _loginError.trace.substr(0, _loginError.trace.indexOf(')')+1);
  801. switch (_trace)
  802. {
  803. case 'EDAMUserException(errorCode:INVALID_AUTH, parameter:username)':
  804. _onFailure('username');
  805. return;
  806. case 'EDAMUserException(errorCode:INVALID_AUTH, parameter:password)':
  807. _onFailure('password');
  808. return;
  809. }
  810. // could not figure out error
  811. // ==========================
  812. _onFailure('login / exception / unknown');
  813. return;
  814. }
  815. // result
  816. // ======
  817. // check
  818. // =====
  819. switch (true)
  820. {
  821. case (!(_loginResult.authenticationToken)):
  822. case (!(_loginResult.user)):
  823. case (!(_loginResult.user.shardId)):
  824. _onFailure('login / invalid result');
  825. return;
  826. }
  827. // set userInfo
  828. // ============
  829. __readable_by_evernote.__evernote_remote.user__authToken = _loginResult.authenticationToken;
  830. __readable_by_evernote.__evernote_remote.user__shardId = _loginResult.user.shardId;
  831. __readable_by_evernote.__evernote_remote.user__privilege = _loginResult.user.privilege.value;
  832. __readable_by_evernote.__evernote_remote.user__name = _loginResult.user.name;
  833. __readable_by_evernote.__evernote_remote.user__username = _loginResult.user.username;
  834. __readable_by_evernote.__evernote_remote.user__email = _loginResult.user.email;
  835. __readable_by_evernote.__evernote_remote.is__loggedIn = true;
  836. // note store
  837. // ==========
  838. // make connection
  839. var _rpcNoteStoreClient = new __readable_by_evernote.JSONRpcClient
  840. (
  841. function ()
  842. {
  843. // error / timeout
  844. // ===============
  845. if (this.NoteStore); else
  846. {
  847. // failed
  848. _onFailure('login / note store / invalid');
  849. // break
  850. return;
  851. }
  852. // set connected
  853. // =============
  854. __readable_by_evernote.__evernote_remote.rpc__noteStore = this;
  855. // run success
  856. // ===========
  857. _onSuccess();
  858. },
  859. __readable_by_evernote.__evernote_bootstrap.remote_domain + 'shard/' + __readable_by_evernote.__evernote_remote.user__shardId + '/json'
  860. );
  861. },
  862. _user, // username
  863. _pass, // password
  864. __readable_by_evernote.__evernote_remote.api__key, // consumer key
  865. __readable_by_evernote.__evernote_remote.api__secret // consumer secret
  866. );
  867. };
  868. // allready connected, connect, or error
  869. // =====================================
  870. if (__readable_by_evernote.__evernote_remote.is__connected)
  871. {
  872. // do
  873. _loginFunction();
  874. }
  875. else
  876. {
  877. // connect
  878. __readable_by_evernote.__evernote_remote.connect
  879. (
  880. function () { _loginFunction(); },
  881. function () { _onFailure('connection / invalid'); }
  882. );
  883. }
  884. };
  885. // clip
  886. // ====
  887. __readable_by_evernote.__evernote_remote.clip = function (_id, _url, _title, _body, _onSuccess, _onFailure)
  888. {
  889. // preliminary check
  890. // =================
  891. switch (true)
  892. {
  893. case (!(__readable_by_evernote.__evernote_remote.rpc__noteStore.NoteStore)):
  894. case (!(__readable_by_evernote.__evernote_remote.is__connected)):
  895. case (!(__readable_by_evernote.__evernote_remote.is__loggedIn)):
  896. _onFailure('login');
  897. return;
  898. }
  899. // smart filing -- and the recommendation hasn't been requested yet
  900. // ============
  901. if (__readable_by_evernote.__evernote_remote.setting__smart_filing == 'disabled'); else
  902. {
  903. switch (true)
  904. {
  905. case (__readable_by_evernote.__evernote_remote.setting__smart_filing == 'enabled'):
  906. case (__readable_by_evernote.__evernote_remote.setting__smart_filing == 'just_notebooks'):
  907. case (__readable_by_evernote.__evernote_remote.setting__smart_filing == 'just_tags'):
  908. if (__readable_by_evernote.__evernote_remote.store__id_to_recommendation[_id]); else
  909. {
  910. __readable_by_evernote.__evernote_remote.get_recommendation
  911. (
  912. _id,
  913. _url,
  914. _body,
  915. function ()
  916. {
  917. // do it again; recommendatin was added to the global store
  918. __readable_by_evernote.__evernote_remote.clip(
  919. _id, _url, _title, _body, _onSuccess, _onFailure
  920. );
  921. },
  922. function ()
  923. {
  924. // set to dummy; only try this once
  925. __readable_by_evernote.__evernote_remote.store__id_to_recommendation[_id] = true;
  926. // do with no smart filing
  927. __readable_by_evernote.__evernote_remote.clip(
  928. _id, _url, _title, _body, _onSuccess, _onFailure
  929. );
  930. }
  931. );
  932. return;
  933. }
  934. }
  935. }
  936. // create tags array
  937. // =================
  938. var
  939. _tags = __readable_by_evernote.__evernote_remote.setting__clip_tag,
  940. _tags_we_should_set = _tags.split(','),
  941. _tags_we_will_set__array = [],
  942. _tags_we_will_set__object = {}
  943. ;
  944. for (var i=0, _i=_tags_we_should_set.length; i<_i;i++)
  945. {
  946. var _t = _tags_we_should_set[i].replace(/^ /, '').replace(/ $/, '')
  947. // invalid
  948. if (_t > ''); else { continue; }
  949. // already in there
  950. if (_tags_we_will_set__object[_t]) { continue; }
  951. // set
  952. _tags_we_will_set__array.push(_t);
  953. _tags_we_will_set__object[_t] = true;
  954. }
  955. // Smart Filing :: set tags
  956. // ============
  957. if (__readable_by_evernote.__evernote_remote.setting__smart_filing == 'enabled' || __readable_by_evernote.__evernote_remote.setting__smart_filing == 'just_tags')
  958. {
  959. if (__readable_by_evernote.__evernote_remote.store__id_to_recommendation[_id].tags && __readable_by_evernote.__evernote_remote.store__id_to_recommendation[_id].tags.list)
  960. {
  961. for (var i=0, _t='', _i=__readable_by_evernote.__evernote_remote.store__id_to_recommendation[_id].tags.list.length; i<_i;i++)
  962. {
  963. // get
  964. _t = __readable_by_evernote.__evernote_remote.store__id_to_recommendation[_id].tags.list[i].name;
  965. // invalid
  966. if (_t > ''); else { continue; }
  967. // already in there
  968. if (_tags_we_will_set__object[_t]) { continue; }
  969. // set
  970. _tags_we_will_set__array.push(_t);
  971. _tags_we_will_set__object[_t] = true;
  972. }
  973. }
  974. }
  975. // try and clip
  976. // ============
  977. // filing info
  978. // ===========
  979. var _filingInfo =
  980. {
  981. 'tagNameList': _tags_we_will_set__array,
  982. 'createTags': true,
  983. 'source': 'Clearly'
  984. };
  985. // previous version
  986. if (_id in __readable_by_evernote.__evernote_remote.store__id_to_guid)
  987. {
  988. _filingInfo['originalNoteGuid'] = __readable_by_evernote.__evernote_remote.store__id_to_guid[_id];
  989. }
  990. // set notebook
  991. if (__readable_by_evernote.__evernote_remote.setting__clip_notebook > '')
  992. {
  993. _filingInfo['notebookName'] = __readable_by_evernote.__evernote_remote.setting__clip_notebook;
  994. _filingInfo['createNotebook'] = true;
  995. }
  996. // Smart Filing :: set notebook
  997. if (__readable_by_evernote.__evernote_remote.setting__smart_filing == 'enabled' || __readable_by_evernote.__evernote_remote.setting__smart_filing == 'just_notebooks')
  998. {
  999. if (__readable_by_evernote.__evernote_remote.store__id_to_recommendation[_id].notebook && __readable_by_evernote.__evernote_remote.store__id_to_recommendation[_id].notebook.name)
  1000. {
  1001. _filingInfo['notebookName'] = __readable_by_evernote.__evernote_remote.store__id_to_recommendation[_id].notebook.name;
  1002. _filingInfo['createNotebook'] = false;
  1003. }
  1004. }
  1005. // clip do
  1006. // =======
  1007. var _clip_do = function (_default_notebook_name)
  1008. {
  1009. // set default notebook
  1010. if (_filingInfo['notebookName']); else
  1011. {
  1012. _filingInfo['notebookName'] = _default_notebook_name;
  1013. _filingInfo['createNotebook'] = false;
  1014. }
  1015. // clip
  1016. __readable_by_evernote.__evernote_remote.rpc__noteStore.NoteStoreExtra.clipNote
  1017. (
  1018. function (_rpc_result, _rpc_exception)
  1019. {
  1020. var
  1021. _clipResult = _rpc_result,
  1022. _clipError = _rpc_exception
  1023. ;
  1024. // error
  1025. // =====
  1026. if (_clipError)
  1027. {
  1028. // Firebug.Console.log(_clipError);
  1029. // console.log(_clipError);
  1030. // unknown error
  1031. // =============
  1032. switch (true)
  1033. {
  1034. case (!(_clipError.trace)):
  1035. case (!(_clipError.trace.indexOf)):
  1036. case (!(_clipError.trace.indexOf(')') > -1)):
  1037. _onFailure('clip / exception / no trace');
  1038. return;
  1039. }
  1040. // figure out error
  1041. // ================
  1042. var _trace = _clipError.trace.substr(0, _clipError.trace.indexOf(')')+1);
  1043. switch (_trace)
  1044. {
  1045. case 'EDAMUserException(errorCode:BAD_DATA_FORMAT, parameter:authenticationToken)':
  1046. case 'EDAMSystemException(errorCode:INVALID_AUTH, message:authenticationToken)':
  1047. case 'EDAMUserException(errorCode:AUTH_EXPIRED, parameter:authenticationToken)':
  1048. _onFailure('login');
  1049. return;
  1050. }
  1051. // could not figure out error
  1052. // ==========================
  1053. _onFailure('clip / exception / unknown');
  1054. return;
  1055. }
  1056. // result
  1057. // ======
  1058. // check
  1059. // =====
  1060. switch (true)
  1061. {
  1062. case (!(_clipResult > '')):
  1063. case (!(_clipResult.split('-').length == 5)):
  1064. _onFailure('clip / invalid result');
  1065. return;
  1066. }
  1067. // store this version
  1068. // ==================
  1069. __readable_by_evernote.__evernote_remote.store__id_to_guid[_id] = _clipResult;
  1070. __readable_by_evernote.__evernote_remote.store__id_to_info[_id] =
  1071. {
  1072. 'guid': __readable_by_evernote.__evernote_remote.store__id_to_guid[_id],
  1073. 'tag_names': _filingInfo['tagNameList'],
  1074. 'notebook_name': _filingInfo['notebookName'],
  1075. 'url_view': ''
  1076. + __readable_by_evernote.__evernote_bootstrap.remote_domain
  1077. + 'setAuthToken?auth=' + encodeURIComponent(__readable_by_evernote.__evernote_remote.user__authToken)
  1078. + '&redirect=' + encodeURIComponent(''
  1079. + __readable_by_evernote.__evernote_bootstrap.remote_domain
  1080. + 'view/'
  1081. + __readable_by_evernote.__evernote_remote.store__id_to_guid[_id]
  1082. ),
  1083. 'url_edit': ''
  1084. + __readable_by_evernote.__evernote_bootstrap.remote_domain
  1085. + 'setAuthToken?auth=' + encodeURIComponent(__readable_by_evernote.__evernote_remote.user__authToken)
  1086. + '&redirect=' + encodeURIComponent(''
  1087. + __readable_by_evernote.__evernote_bootstrap.remote_domain
  1088. + 'edit/'
  1089. + __readable_by_evernote.__evernote_remote.store__id_to_guid[_id]
  1090. )
  1091. };
  1092. // success
  1093. // =======
  1094. _onSuccess();
  1095. },
  1096. __readable_by_evernote.__evernote_remote.user__authToken, // authentification token
  1097. _filingInfo, // filing information
  1098. (_title > '' ? _title : _url), // title
  1099. _url, // url
  1100. _body // html
  1101. );
  1102. };
  1103. // do the actual clip
  1104. // ==================
  1105. if (_filingInfo['notebookName'])
  1106. {
  1107. _clip_do('');
  1108. }
  1109. else
  1110. {
  1111. __readable_by_evernote.__evernote_remote.rpc__noteStore.NoteStore.getDefaultNotebook
  1112. (
  1113. function (_rpc_result, _rpc_exception)
  1114. {
  1115. var
  1116. _getResult = _rpc_result,
  1117. _getError = _rpc_exception
  1118. ;
  1119. // set default
  1120. var _default_notebook = (_getError ? '' : ((_getResult && _getResult.name) ? _getResult.name : ''));
  1121. // do clip
  1122. _clip_do(_default_notebook);
  1123. },
  1124. __readable_by_evernote.__evernote_remote.user__authToken // authentification token
  1125. );
  1126. }
  1127. };
  1128. // recommendation
  1129. // ==============
  1130. __readable_by_evernote.__evernote_remote.get_recommendation = function (_id, _url, _body, _onSuccess, _onFailure)
  1131. {
  1132. // preliminary check
  1133. // =================
  1134. switch (true)
  1135. {
  1136. case (!(__readable_by_evernote.__evernote_remote.rpc__noteStore.NoteStore)):
  1137. case (!(__readable_by_evernote.__evernote_remote.is__connected)):
  1138. case (!(__readable_by_evernote.__evernote_remote.is__loggedIn)):
  1139. _onFailure('login');
  1140. return;
  1141. }
  1142. // _body -- just text
  1143. // =====
  1144. // just text
  1145. _body = _body.replace(/<[^>]+?>/gi, ' ');
  1146. // remove spaces
  1147. _body = _body.replace(/\s+/gi, ' ');
  1148. _body = _body.replace(/^\s+/gi, '');
  1149. // cut off
  1150. _body = _body.substr(0, 5000);
  1151. // log
  1152. // ===
  1153. /* console.log('NoteStoreExtra.getFilingRecommendations Called with:');
  1154. console.log({
  1155. 'url': _url,
  1156. 'text': _body,
  1157. 'relatedNotesResultSpec':
  1158. {
  1159. 'includeTitle': true,
  1160. 'includeSnippet': true,
  1161. 'includeCreated': true,
  1162. 'includeLargestResourceMime': true,
  1163. 'includeLargestResourceSize': true,
  1164. 'includeAttributes': false,
  1165. 'includeTagNames': false
  1166. }
  1167. }); */
  1168. // try and get -- a FilingReccomendation object
  1169. // ===========
  1170. __readable_by_evernote.__evernote_remote.rpc__noteStore.NoteStoreExtra.getFilingRecommendations
  1171. (
  1172. function (_rpc_result, _rpc_exception)
  1173. {
  1174. var
  1175. _getResult = _rpc_result,
  1176. _getError = _rpc_exception
  1177. ;
  1178. // error
  1179. // =====
  1180. if (_getError)
  1181. {
  1182. // Firebug.Console.log(_getError);
  1183. // console.log(_getError);
  1184. // unknown error
  1185. // =============
  1186. switch (true)
  1187. {
  1188. case (!(_getError.trace)):
  1189. case (!(_getError.trace.indexOf)):
  1190. case (!(_getError.trace.indexOf(')') > -1)):
  1191. _onFailure('get_recommendation / exception / no trace');
  1192. return;
  1193. }
  1194. // figure out error
  1195. // ================
  1196. var _trace = _getError.trace.substr(0, _getError.trace.indexOf(')')+1);
  1197. switch (_trace)
  1198. {
  1199. case 'EDAMUserException(errorCode:BAD_DATA_FORMAT, parameter:authenticationToken)':
  1200. case 'EDAMSystemException(errorCode:INVALID_AUTH, message:authenticationToken)':
  1201. case 'EDAMUserException(errorCode:AUTH_EXPIRED, parameter:authenticationToken)':
  1202. _onFailure('login');
  1203. return;
  1204. }
  1205. // could not figure out error
  1206. // ==========================
  1207. _onFailure('get_recommendation / exception / unknown');
  1208. return;
  1209. }
  1210. // result
  1211. // ======
  1212. // check
  1213. // =====
  1214. switch (true)
  1215. {
  1216. case (!(_getResult.notebook) && !(_getResult.tags) && !(_getResult.relatedNotes)):
  1217. _onFailure('get_recommendation / invalid result');
  1218. return;
  1219. }
  1220. // fill in
  1221. // =======
  1222. if (_getResult.notebook); else { _getResult.notebook = false; }
  1223. if (_getResult.tags); else { _getResult.tags = false; }
  1224. if (_getResult.relatedNotes); else { _getResult.relatedNotes = false; }
  1225. // add absoluteURLs
  1226. // ================
  1227. if (_getResult.relatedNotes && _getResult.relatedNotes.list && _getResult.relatedNotes.list.length > 0)
  1228. {
  1229. for (var i=0, _i=_getResult.relatedNotes.list.length; i<_i; i++)
  1230. {
  1231. // absoluteURL__thumbnail
  1232. _getResult.relatedNotes.list[i]['absoluteURL__thumbnail'] = ''
  1233. + __readable_by_evernote.__evernote_bootstrap.remote_domain
  1234. + 'shard/'
  1235. + __readable_by_evernote.__evernote_remote.user__shardId + '/'
  1236. + 'thm/note/'
  1237. + _getResult.relatedNotes.list[i].guid
  1238. + '?auth=' + encodeURIComponent(__readable_by_evernote.__evernote_remote.user__authToken)
  1239. + '&size=75'
  1240. ;
  1241. // absoluteURL__noteView
  1242. _getResult.relatedNotes.list[i]['absoluteURL__noteView'] = ''
  1243. + __readable_by_evernote.__evernote_bootstrap.remote_domain
  1244. + 'setAuthToken?auth=' + encodeURIComponent(__readable_by_evernote.__evernote_remote.user__authToken)
  1245. + '&redirect=' + encodeURIComponent(''
  1246. + __readable_by_evernote.__evernote_bootstrap.remote_domain
  1247. + 'view/'
  1248. + _getResult.relatedNotes.list[i].guid
  1249. )
  1250. ;
  1251. }
  1252. }
  1253. // store result
  1254. // ============
  1255. __readable_by_evernote.__evernote_remote.store__id_to_recommendation[_id] = _getResult;
  1256. // success
  1257. // =======
  1258. _onSuccess(_getResult);
  1259. // log
  1260. // ===
  1261. // console.log(_getResult);
  1262. },
  1263. __readable_by_evernote.__evernote_remote.user__authToken, // authentification token
  1264. { // recommendation request
  1265. 'url': _url,
  1266. 'text': _body,
  1267. 'relatedNotesResultSpec':
  1268. {
  1269. 'includeTitle': true,
  1270. 'includeSnippet': true,
  1271. 'includeCreated': true,
  1272. 'includeLargestResourceMime': true,
  1273. 'includeLargestResourceSize': true,
  1274. 'includeAttributes': false,
  1275. 'includeTagNames': false
  1276. }
  1277. }
  1278. );
  1279. };
  1280. // recommendation
  1281. // ==============
  1282. __readable_by_evernote.__evernote_remote.get_notebooks = function (_onSuccess, _onFailure)
  1283. {
  1284. // preliminary check
  1285. // =================
  1286. switch (true)
  1287. {
  1288. case (!(__readable_by_evernote.__evernote_remote.rpc__noteStore.NoteStore)):
  1289. case (!(__readable_by_evernote.__evernote_remote.is__connected)):
  1290. case (!(__readable_by_evernote.__evernote_remote.is__loggedIn)):
  1291. _onFailure('login');
  1292. return;
  1293. }
  1294. // try and get -- a list of notebooks
  1295. // ===========
  1296. __readable_by_evernote.__evernote_remote.rpc__noteStore.NoteStore.listNotebooks
  1297. (
  1298. function (_rpc_result, _rpc_exception)
  1299. {
  1300. var
  1301. _getResult = _rpc_result,
  1302. _getError = _rpc_exception
  1303. ;
  1304. // error
  1305. // =====
  1306. if (_getError)
  1307. {
  1308. // Firebug.Console.log(_getError);
  1309. // console.log(_getError);
  1310. // unknown error
  1311. // =============
  1312. switch (true)
  1313. {
  1314. case (!(_getError.trace)):
  1315. case (!(_getError.trace.indexOf)):
  1316. case (!(_getError.trace.indexOf(')') > -1)):
  1317. _onFailure('get_notebooks / exception / no trace');
  1318. return;
  1319. }
  1320. // figure out error
  1321. // ================
  1322. var _trace = _getError.trace.substr(0, _getError.trace.indexOf(')')+1);
  1323. switch (_trace)
  1324. {
  1325. case 'EDAMUserException(errorCode:BAD_DATA_FORMAT, parameter:authenticationToken)':
  1326. case 'EDAMSystemException(errorCode:INVALID_AUTH, message:authenticationToken)':
  1327. case 'EDAMUserException(errorCode:AUTH_EXPIRED, parameter:authenticationToken)':
  1328. _onFailure('login');
  1329. return;
  1330. }
  1331. // could not figure out error
  1332. // ==========================
  1333. _onFailure('get_notebooks / exception / unknown');
  1334. return;
  1335. }
  1336. // result
  1337. // ======
  1338. // check
  1339. // =====
  1340. switch (true)
  1341. {
  1342. case (!(_getResult.list)):
  1343. case (!(_getResult.list.length)):
  1344. _onFailure('get_notebooks / invalid result');
  1345. return;
  1346. }
  1347. // success
  1348. // =======
  1349. _onSuccess(_getResult);
  1350. },
  1351. __readable_by_evernote.__evernote_remote.user__authToken // authentification token
  1352. );
  1353. };
  1354. // disconnect -- QA testing
  1355. // ==========
  1356. __readable_by_evernote.__evernote_remote.disconnect = function ()
  1357. {
  1358. __readable_by_evernote.__evernote_remote['rpc__userStore'] = false;
  1359. __readable_by_evernote.__evernote_remote['rpc__noteStore'] = false;
  1360. __readable_by_evernote.__evernote_remote['user__authToken'] = false;
  1361. __readable_by_evernote.__evernote_remote['user__shardId'] = false;
  1362. __readable_by_evernote.__evernote_remote['user__privilege'] = false;
  1363. __readable_by_evernote.__evernote_remote['is__connected'] = false;
  1364. __readable_by_evernote.__evernote_remote['is__loggedIn'] = false;
  1365. };
  1366. /*
  1367. * Evernote.XORCrypt
  1368. * Evernote
  1369. *
  1370. * Created by Pavel Skaldin on 3/7/10
  1371. * Copyright 2010-2012 Evernote Corp. All rights reserved
  1372. */
  1373. /**
  1374. * Naive implementation of XOR encryption with padding. It is not meant to be a
  1375. * strong encryption of any kind, just an obfuscation. The algorithm uses a seed
  1376. * string for XORing. The string to be encrypted is first XOR'd with a random
  1377. * number to avoid recognizable patterns; the result is then padded and then
  1378. * XOR'd with the seed string.
  1379. *
  1380. * Make sure that XORCrypt.LENGTH is larger than the strings you're trying to
  1381. * encrypt.
  1382. *
  1383. * <pre>
  1384. * Usage:
  1385. * var enc = Evernote.XORCrypt.encrypt(secret, seed);
  1386. * var dec = Evernote.XORCrypt.decrypt(enc, seed);
  1387. * </pre>
  1388. */
  1389. __readable_by_evernote.__evernote_xor = {
  1390. DELIMIT : ":",
  1391. LENGTH : 128,
  1392. /**
  1393. * Pads string to make it XORCrypt.LENGTH characters in length. Padding is
  1394. * done by prepending the string with random chars from a range of printable
  1395. * ascii chars.
  1396. */
  1397. _padString : function(str) {
  1398. var counter = 0;
  1399. if (str.length < 128) {
  1400. for ( var i = str.length; i <= 128; i++) {
  1401. str = String.fromCharCode(this._randomForChar()) + str;
  1402. counter++;
  1403. }
  1404. }
  1405. return counter + this.DELIMIT + str;
  1406. },
  1407. /**
  1408. * Returns random number that would correspond to a printable ascii char.
  1409. */
  1410. _randomForChar : function() {
  1411. var r = 0;
  1412. var c = 0;
  1413. while (r < 33 || r > 126) {
  1414. // just a waiting... this shouldn't happen frequently
  1415. r = parseInt(Math.random() * 150);
  1416. c++;
  1417. }
  1418. return r;
  1419. },
  1420. /**
  1421. * Returns random non-zero integer.
  1422. */
  1423. _randomNonZero : function() {
  1424. var r = 0;
  1425. while ((r = parseInt(Math.random() * 100)) == 0) {
  1426. // just a waiting... this shouldn't happen frequently
  1427. }
  1428. return r;
  1429. },
  1430. /**
  1431. * Shifts string by XOR'ing it with a number larger than 100 so as to avoid
  1432. * non-printable characters. The resulting string will be prepended with the
  1433. * number used to XOR followed by DELIMITER.
  1434. */
  1435. _shiftString : function(str) {
  1436. var delta = this._randomNonZero() + 100;
  1437. var shifted = [];
  1438. for ( var i = 0; i < str.length; i++) {
  1439. shifted.push(String.fromCharCode(str.charCodeAt(i) + delta));
  1440. }
  1441. return delta + this.DELIMIT + shifted.join("");
  1442. },
  1443. /**
  1444. * Unshifts and returns a shifted string. The argument should be in a format
  1445. * produced by _shitString(), i.e. begin with the shift coefficient followed
  1446. * by DELIMITER, followed by the shifted string.
  1447. */
  1448. _unshiftString : function(str) {
  1449. var delta = parseInt(str.substring(0, str.indexOf(this.DELIMIT)));
  1450. var unshifted = [];
  1451. if (!isNaN(delta)) {
  1452. for ( var i = ((delta + "").length + this.DELIMIT.length); i < str.length; i++) {
  1453. unshifted.push(String.fromCharCode(str.charCodeAt(i) - delta));
  1454. }
  1455. }
  1456. return unshifted.join("");
  1457. },
  1458. /**
  1459. * Encrypts string with a seed string and returns encrypted string padded to
  1460. * be XORCrypt.LENGTH characters long.
  1461. */
  1462. encrypt : function(str, seed) {
  1463. str += "";
  1464. seed += "";
  1465. var newStr = this._padString(this._shiftString(str));
  1466. var enc = [];
  1467. for ( var i = 0; i < newStr.length; i++) {
  1468. var e = newStr.charCodeAt(i);
  1469. for ( var j = 0; j < seed.length; j++) {
  1470. e = seed.charCodeAt(j) ^ e;
  1471. }
  1472. enc.push(String.fromCharCode(e + 100));
  1473. }
  1474. return enc.join("");
  1475. },
  1476. /**
  1477. * Decrypts string using seed string. The seed string has to be the same
  1478. * string that was used in encrypt()ing.
  1479. */
  1480. decrypt : function(str, seed) {
  1481. str += "";
  1482. seed += "";
  1483. var dec = [];
  1484. for ( var i = 0; i < str.length; i++) {
  1485. var e = str.charCodeAt(i) - 100;
  1486. for ( var j = seed.length - 1; j >= 0; j--) {
  1487. e = seed.charCodeAt(j) ^ e;
  1488. }
  1489. dec.push(String.fromCharCode(e));
  1490. }
  1491. var decStr = dec.join("");
  1492. var pad = parseInt(decStr.substring(0, decStr.indexOf(this.DELIMIT)));
  1493. if (!isNaN(pad)) {
  1494. return this._unshiftString(decStr.substring(("" + pad).length
  1495. + this.DELIMIT.length + pad));
  1496. }
  1497. return "";
  1498. }
  1499. };
  1500. // stored credentials
  1501. // get/set stored evernote credentials
  1502. // requires __evernote_xor present in context
  1503. // ==========================================
  1504. // get
  1505. // ===
  1506. __readable_by_evernote.__get_stored_evernote_credentials = function ()
  1507. {
  1508. var
  1509. _prefs_service = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService),
  1510. _prefs = _prefs_service.getBranch("extensions.readable-by-evernote.")
  1511. ;
  1512. var
  1513. _username = _prefs.getCharPref('storedEvernoteUsername'),
  1514. _server = _prefs.getCharPref('storedEvernoteServer'),
  1515. _password = ''
  1516. //_unicodeEncodedPassword = _prefs.getComplexValue("storedEvernotePassword", Components.interfaces.nsISupportsString)
  1517. //_password = (_unicodeEncodedPassword.data > '' ? _unicodeEncodedPassword.data : '')
  1518. ;
  1519. var
  1520. _login_service = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager),
  1521. _logins = _login_service.findLogins({}, 'chrome://readable-by-evernote', '', 'Evernote Login')
  1522. ;
  1523. for (var i=0, _i=_logins.length; i<_i; i++)
  1524. {
  1525. if (_logins[i].username == _username)
  1526. { _password = _logins[i].password; break; }
  1527. }
  1528. switch (true)
  1529. {
  1530. case (!(_username > '')):
  1531. case (!(_password > '')):
  1532. return false;
  1533. }
  1534. var _r = {};
  1535. _r.username = _username;
  1536. _r.server = ((_server == 'main' || _server == 'china') ? _server : 'none');
  1537. _r.password = _password;
  1538. //_r.password = __readable_by_evernote.__evernote_xor.decrypt(_password, _r.username);
  1539. return _r;
  1540. };
  1541. // set
  1542. // ===
  1543. __readable_by_evernote.__set_stored_evernote_credentials = function (_o)
  1544. {
  1545. var
  1546. _prefs_service = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService),
  1547. _prefs = _prefs_service.getBranch("extensions.readable-by-evernote.")
  1548. ;
  1549. switch (true)
  1550. {
  1551. case (!(_o['username'] > '')):
  1552. case (!(_o['password'] > '')):
  1553. return false;
  1554. }
  1555. var
  1556. _login_service = Components.classes["@mozilla.org/login-manager;1"].getService(Components.interfaces.nsILoginManager),
  1557. _login_info__class = new Components.Constructor("@mozilla.org/login-manager/loginInfo;1", Components.interfaces.nsILoginInfo, "init")
  1558. _login_info = new _login_info__class('chrome://readable-by-evernote', null, 'Evernote Login', _o.username, _o.password, '', '')
  1559. _logins = _login_service.findLogins({}, 'chrome://readable-by-evernote', '', 'Evernote Login')
  1560. ;
  1561. _prefs.setCharPref('storedEvernoteServer', __readable_by_evernote.__evernote_bootstrap.server);
  1562. _prefs.setCharPref('storedEvernoteUsername', _o.username);
  1563. try
  1564. {
  1565. // remove all logins
  1566. for (var i=0, _i=_logins.length; i<_i; i++)
  1567. {
  1568. if (_logins[i].username == _o.username)
  1569. { _login_service.removeLogin(_logins[i]); break; }
  1570. }
  1571. // add new login
  1572. _login_service.addLogin(_login_info);
  1573. }
  1574. catch (e) { }
  1575. // var _unicodeEncodedPassword = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
  1576. // _unicodeEncodedPassword.data = __readable_by_evernote.__evernote_xor.encrypt(_o['password'], _o['username']);
  1577. // _prefs.setComplexValue('storedEvernotePassword', Components.interfaces.nsISupportsString, _unicodeEncodedPassword);
  1578. return true;
  1579. };
  1580. // logout on next action
  1581. // =====================
  1582. __readable_by_evernote.__get_stored_evernote_logoutOnNextAction = function ()
  1583. {
  1584. var
  1585. _prefs_service = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService),
  1586. _prefs = _prefs_service.getBranch("extensions.readable-by-evernote.")
  1587. ;
  1588. if (_prefs.getCharPref('storedEvernoteLogoutOnNextAction') > ''); else { return false; }
  1589. if (_prefs.getCharPref('storedEvernoteLogoutOnNextAction') == 'yes'); else { return false; }
  1590. // reset
  1591. _prefs.setCharPref('storedEvernoteLogoutOnNextAction', '');
  1592. // return true
  1593. return true;
  1594. };
  1595. __readable_by_evernote.__set_stored_evernote_logoutOnNextAction = function ()
  1596. {
  1597. var
  1598. _prefs_service = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService),
  1599. _prefs = _prefs_service.getBranch("extensions.readable-by-evernote.")
  1600. ;
  1601. // set
  1602. _prefs.setCharPref('storedEvernoteLogoutOnNextAction', 'yes');
  1603. };
  1604. // select theme and size
  1605. // select theme
  1606. // ============
  1607. __readable_by_evernote.__save__select_theme = function (_theme_id)
  1608. {
  1609. // the themes
  1610. // encode
  1611. // ======
  1612. function __encodeURIComponentForReadable(_string)
  1613. {
  1614. // none
  1615. if (_string == '') { return 'none'; }
  1616. // encode
  1617. return encodeURIComponent(_string)
  1618. .replace(/!/g, '%21')
  1619. .replace(/'/g, '%27')
  1620. .replace(/\(/g, '%28')
  1621. .replace(/\)/g, '%29')
  1622. .replace(/\*/g, '%2A')
  1623. ;
  1624. }
  1625. // decode
  1626. // ======
  1627. function __decodeURIComponentForReadable(_string)
  1628. {
  1629. // none
  1630. if (_string == 'none') { return ''; }
  1631. // decode
  1632. return decodeURIComponent(_string);
  1633. }
  1634. // __encodeURIComponentForReadable must be defined
  1635. var __the_themes =
  1636. {
  1637. 'theme-1':
  1638. {
  1639. 'text_font': __encodeURIComponentForReadable('"PT Serif"'),
  1640. 'text_font_header': __encodeURIComponentForReadable('"PT Serif"'),
  1641. 'text_font_monospace': __encodeURIComponentForReadable('Inconsolata'),
  1642. 'text_size': __encodeURIComponentForReadable('16px'),
  1643. 'text_line_height': __encodeURIComponentForReadable('1.5em'),
  1644. 'box_width': __encodeURIComponentForReadable('36em'),
  1645. 'color_background': __encodeURIComponentForReadable('#f3f2ee'),
  1646. 'color_text': __encodeURIComponentForReadable('#1f0909'),
  1647. 'color_links': __encodeURIComponentForReadable('#065588'),
  1648. 'text_align': __encodeURIComponentForReadable('normal'),
  1649. 'base': __encodeURIComponentForReadable('theme-1'),
  1650. 'footnote_links': __encodeURIComponentForReadable('on_print'),
  1651. 'large_graphics': __encodeURIComponentForReadable('do_nothing'),
  1652. 'custom_css': __encodeURIComponentForReadable('')
  1653. },
  1654. 'theme-2':
  1655. {
  1656. 'text_font': __encodeURIComponentForReadable('Helvetica, Arial'),
  1657. 'text_font_header': __encodeURIComponentForReadable('Helvetica, Arial'),
  1658. 'text_font_monospace': __encodeURIComponentForReadable('"Droid Sans Mono"'),
  1659. 'text_size': __encodeURIComponentForReadable('14px'),
  1660. 'text_line_height': __encodeURIComponentForReadable('1.5em'),
  1661. 'box_width': __encodeURIComponentForReadable('42em'),
  1662. 'color_background': __encodeURIComponentForReadable('#fff'),
  1663. 'color_text': __encodeURIComponentForReadable('#333'),
  1664. 'color_links': __encodeURIComponentForReadable('#090'),
  1665. 'text_align': __encodeURIComponentForReadable('normal'),
  1666. 'base': __encodeURIComponentForReadable('theme-2'),
  1667. 'footnote_links': __encodeURIComponentForReadable('on_print'),
  1668. 'large_graphics': __encodeURIComponentForReadable('do_nothing'),
  1669. 'custom_css': __encodeURIComponentForReadable('')
  1670. },
  1671. 'theme-3':
  1672. {
  1673. 'text_font': __encodeURIComponentForReadable('"PT Serif"'),
  1674. 'text_font_header': __encodeURIComponentForReadable('"PT Serif"'),
  1675. 'text_font_monospace': __encodeURIComponentForReadable('Inconsolata'),
  1676. 'text_size': __encodeURIComponentForReadable('16px'),
  1677. 'text_line_height': __encodeURIComponentForReadable('1.5em'),
  1678. 'box_width': __encodeURIComponentForReadable('36em'),
  1679. 'color_background': __encodeURIComponentForReadable('#2d2d2d'),
  1680. 'color_text': __encodeURIComponentForReadable('#e3e3e3'),
  1681. 'color_links': __encodeURIComponentForReadable('#e3e3e3'),
  1682. 'text_align': __encodeURIComponentForReadable('normal'),
  1683. 'base': __encodeURIComponentForReadable('theme-3'),
  1684. 'footnote_links': __encodeURIComponentForReadable('on_print'),
  1685. 'large_graphics': __encodeURIComponentForReadable('do_nothing'),
  1686. 'custom_css': __encodeURIComponentForReadable('')
  1687. }
  1688. };
  1689. var _to_save = __the_themes[_theme_id];
  1690. _to_save['theme'] = _theme_id;
  1691. // save
  1692. __readable_by_evernote.__save_someStuff(_to_save);
  1693. }
  1694. __readable_by_evernote.__save__select_theme__custom = function ()
  1695. {
  1696. // the themes
  1697. // encode
  1698. // ======
  1699. function __encodeURIComponentForReadable(_string)
  1700. {
  1701. // none
  1702. if (_string == '') { return 'none'; }
  1703. // encode
  1704. return encodeURIComponent(_string)
  1705. .replace(/!/g, '%21')
  1706. .replace(/'/g, '%27')
  1707. .replace(/\(/g, '%28')
  1708. .replace(/\)/g, '%29')
  1709. .replace(/\*/g, '%2A')
  1710. ;
  1711. }
  1712. // decode
  1713. // ======
  1714. function __decodeURIComponentForReadable(_string)
  1715. {
  1716. // none
  1717. if (_string == 'none') { return ''; }
  1718. // decode
  1719. return decodeURIComponent(_string);
  1720. }
  1721. // to save
  1722. var _to_save = {};
  1723. _to_save['theme'] = 'custom';
  1724. // get custom
  1725. var _vars = __readable_by_evernote.__get_saved__vars();
  1726. __decodeURIComponentForReadable(_vars['custom_theme_options']).replace
  1727. (
  1728. /\[\[=(.*?)\]\[=(.*?)\]\]/gi,
  1729. function (_match, _name, _value) { _to_save[_name] = _value; }
  1730. );
  1731. // save
  1732. __readable_by_evernote.__save_someStuff(_to_save);
  1733. }
  1734. // select size
  1735. // ===========
  1736. __readable_by_evernote.__save__select_size = function (_size)
  1737. {
  1738. // the sizes
  1739. // encode
  1740. // ======
  1741. function __encodeURIComponentForReadable(_string)
  1742. {
  1743. // none
  1744. if (_string == '') { return 'none'; }
  1745. // encode
  1746. return encodeURIComponent(_string)
  1747. .replace(/!/g, '%21')
  1748. .replace(/'/g, '%27')
  1749. .replace(/\(/g, '%28')
  1750. .replace(/\)/g, '%29')
  1751. .replace(/\*/g, '%2A')
  1752. ;
  1753. }
  1754. // decode
  1755. // ======
  1756. function __decodeURIComponentForReadable(_string)
  1757. {
  1758. // none
  1759. if (_string == 'none') { return ''; }
  1760. // decode
  1761. return decodeURIComponent(_string);
  1762. }
  1763. var __the_sizes =
  1764. {
  1765. 'small':
  1766. {
  1767. 'theme-1': '12px',
  1768. 'theme-2': '12px',
  1769. 'theme-3': '12px',
  1770. 'custom': '12px'
  1771. },
  1772. 'medium':
  1773. {
  1774. 'theme-1': '16px',
  1775. 'theme-2': '16px',
  1776. 'theme-3': '16px',
  1777. 'custom': '16px'
  1778. },
  1779. 'large':
  1780. {
  1781. 'theme-1': '20px',
  1782. 'theme-2': '20px',
  1783. 'theme-3': '20px',
  1784. 'custom': '20px'
  1785. }
  1786. };
  1787. // current vars
  1788. var _current_vars = __readable_by_evernote.__get_saved__vars();
  1789. // save
  1790. __readable_by_evernote.__save_someStuff(
  1791. { 'text_size': __the_sizes[_size][_current_vars['theme']] }
  1792. );
  1793. }
  1794. // select related notes
  1795. // ====================
  1796. __readable_by_evernote.__save__select_related_notes = function (_setting)
  1797. {
  1798. // encode
  1799. // encode
  1800. // ======
  1801. function __encodeURIComponentForReadable(_string)
  1802. {
  1803. // none
  1804. if (_string == '') { return 'none'; }
  1805. // encode
  1806. return encodeURIComponent(_string)
  1807. .replace(/!/g, '%21')
  1808. .replace(/'/g, '%27')
  1809. .replace(/\(/g, '%28')
  1810. .replace(/\)/g, '%29')
  1811. .replace(/\*/g, '%2A')
  1812. ;
  1813. }
  1814. // decode
  1815. // ======
  1816. function __decodeURIComponentForReadable(_string)
  1817. {
  1818. // none
  1819. if (_string == 'none') { return ''; }
  1820. // decode
  1821. return decodeURIComponent(_string);
  1822. }
  1823. // save
  1824. __readable_by_evernote.__save_someStuff(
  1825. { 'related_notes': __encodeURIComponentForReadable(_setting) }
  1826. );
  1827. }
  1828. // translations
  1829. __readable_by_evernote.__get_translations = function ()
  1830. {
  1831. // include
  1832. // encode
  1833. // ======
  1834. function __encodeURIComponentForReadable(_string)
  1835. {
  1836. // none
  1837. if (_string == '') { return 'none'; }
  1838. // encode
  1839. return encodeURIComponent(_string)
  1840. .replace(/!/g, '%21')
  1841. .replace(/'/g, '%27')
  1842. .replace(/\(/g, '%28')
  1843. .replace(/\)/g, '%29')
  1844. .replace(/\*/g, '%2A')
  1845. ;
  1846. }
  1847. // decode
  1848. // ======
  1849. function __decodeURIComponentForReadable(_string)
  1850. {
  1851. // none
  1852. if (_string == 'none') { return ''; }
  1853. // decode
  1854. return decodeURIComponent(_string);
  1855. }
  1856. // translations include
  1857. function __get_translations_inside()
  1858. {
  1859. var
  1860. _return = {},
  1861. _list =
  1862. [
  1863. 'menu__close__tooltip',
  1864. 'menu__clip_to_evernote__tooltip',
  1865. 'menu__highlight_to_evernote__tooltip',
  1866. 'menu__print__tooltip',
  1867. 'menu__settings__tooltip',
  1868. 'menu__fitts__tooltip',
  1869. 'rtl__main__label',
  1870. 'rtl__ltr__label',
  1871. 'rtl__rtl__label',
  1872. 'blank_error__heading',
  1873. 'blank_error__body',
  1874. 'related_notes__title',
  1875. 'related_notes__disable_short',
  1876. 'related_notes__disable_long',
  1877. 'filing_info__title_normal',
  1878. 'filing_info__title_smart',
  1879. 'filing_info__default_notebook',
  1880. 'filing_info__view',
  1881. 'filing_info__edit',
  1882. 'filing_info__sentence',
  1883. 'filing_info__sentence_no_tags',
  1884. 'filing_info__sentence_and',
  1885. 'filing_info__sentence_other_tags',
  1886. 'evernote_clipping',
  1887. 'evernote_clipping_failed',
  1888. 'evernote_login__heading',
  1889. 'evernote_login__spinner',
  1890. 'evernote_login__create_account',
  1891. 'evernote_login__button_do__label',
  1892. 'evernote_login__button_cancel__label',
  1893. 'evernote_login__username__label',
  1894. 'evernote_login__password__label',
  1895. 'evernote_login__rememberMe__label',
  1896. 'evernote_login__username__error__required',
  1897. 'evernote_login__username__error__length',
  1898. 'evernote_login__username__error__format',
  1899. 'evernote_login__username__error__invalid',
  1900. 'evernote_login__password__error__required',
  1901. 'evernote_login__password__error__length',
  1902. 'evernote_login__password__error__format',
  1903. 'evernote_login__password__error__invalid',
  1904. 'evernote_login__general__error',
  1905. 'settings__theme__1',
  1906. 'settings__theme__2',
  1907. 'settings__theme__3',
  1908. 'settings__theme__custom',
  1909. 'settings__fontSize__small',
  1910. 'settings__fontSize__medium',
  1911. 'settings__fontSize__large',
  1912. 'features__title__new',
  1913. 'features__title__all',
  1914. 'features__clipping__title',
  1915. 'features__clipping__text',
  1916. 'features__highlighting__title',
  1917. 'features__highlighting__text',
  1918. 'features__related_notes__title',
  1919. 'features__related_notes__text',
  1920. 'features__smart_filing__title',
  1921. 'features__smart_filing__text',
  1922. 'misc__page'
  1923. ]
  1924. ;
  1925. for (var i=0,_i=_list.length; i<_i; i++) {
  1926. _return[_list[i]] = __get_translations_inside__getForKey(_list[i]);
  1927. }
  1928. return _return;
  1929. }
  1930. // translation function
  1931. function __get_translations_inside__getForKey(_key)
  1932. {
  1933. // will fail on missing string
  1934. try {
  1935. var _t = document.getElementById('readable_by_evernote__string_bundle__inside').getString('inside__'+_key);
  1936. return (_t > '' ? _t : '');
  1937. }
  1938. catch (e) { }
  1939. return '';
  1940. }
  1941. return __get_translations_inside();
  1942. }
  1943. // events
  1944. // ======
  1945. __readable_by_evernote.__add_custom_events_handler = function ()
  1946. {
  1947. // include
  1948. // encode
  1949. // ======
  1950. function __encodeURIComponentForReadable(_string)
  1951. {
  1952. // none
  1953. if (_string == '') { return 'none'; }
  1954. // encode
  1955. return encodeURIComponent(_string)
  1956. .replace(/!/g, '%21')
  1957. .replace(/'/g, '%27')
  1958. .replace(/\(/g, '%28')
  1959. .replace(/\)/g, '%29')
  1960. .replace(/\*/g, '%2A')
  1961. ;
  1962. }
  1963. // decode
  1964. // ======
  1965. function __decodeURIComponentForReadable(_string)
  1966. {
  1967. // none
  1968. if (_string == 'none') { return ''; }
  1969. // decode
  1970. return decodeURIComponent(_string);
  1971. }
  1972. // document
  1973. var _d = gBrowser.contentDocument;
  1974. // just once
  1975. if (_d.__readable_event_monitor_attached) { return; }
  1976. _d.__readable_event_monitor_attached = true;
  1977. // include events
  1978. /*
  1979. first three variables will be defined
  1980. */
  1981. var
  1982. __custom_events__names_to_keys = {},
  1983. __custom_events__keys_to_names = {},
  1984. __custom_events__names_to_objects = {},
  1985. __custom_events =
  1986. [
  1987. ['to-extension--open-settings', 'click-111-111-111-111-1-1-1'],
  1988. ['to-extension--open-settings-theme', 'click-112-112-112-112-1-1-1'],
  1989. ['to-extension--evernote-clip', 'click-121-121-121-121-1-1-1'],
  1990. ['to-extension--evernote-clip-highlights', 'click-122-122-122-122-1-1-1'],
  1991. /*['to-extension--evernote-unset-tag', 'click-123-123-123-123-1-1-1'],*/
  1992. /*['to-extension--evernote-unset-notebook', 'click-124-124-124-124-1-1-1'],*/
  1993. ['to-extension--evernote-login', 'click-131-131-131-131-1-1-1'],
  1994. ['to-extension--evernote-login--switch-to-cn', 'click-132-132-132-132-1-1-1'],
  1995. ['to-extension--evernote-login--switch-to-in', 'click-133-133-133-133-1-1-1'],
  1996. ['to-extension--evernote-get-recommendation', 'click-141-141-141-141-1-1-1'],
  1997. ['to-extension--evernote-get-user', 'click-142-142-142-142-1-1-1'],
  1998. ['to-extension--select-theme-1', 'click-151-151-151-151-1-1-1'],
  1999. ['to-extension--select-theme-2', 'click-152-152-152-152-1-1-1'],
  2000. ['to-extension--select-theme-3', 'click-153-153-153-153-1-1-1'],
  2001. ['to-extension--select-theme-custom', 'click-154-154-154-154-1-1-1'],
  2002. ['to-extension--select-size-small', 'click-161-161-161-161-1-1-1'],
  2003. ['to-extension--select-size-medium', 'click-162-162-162-162-1-1-1'],
  2004. ['to-extension--select-size-large', 'click-163-163-163-163-1-1-1'],
  2005. ['to-extension--select-related-notes-just-at-bottom', 'click-171-171-171-171-1-1-1'],
  2006. ['to-extension--select-related-notes-disabled', 'click-172-172-172-172-1-1-1'],
  2007. ['to-extension--track--view', 'click-181-181-181-181-1-1-1'],
  2008. ['to-extension--track--clip', 'click-182-182-182-182-1-1-1'],
  2009. ['to-extension--track--theme-popup', 'click-183-183-183-183-1-1-1'],
  2010. ['to-extension--track--settings', 'click-184-184-184-184-1-1-1'],
  2011. ['to-extension--first-show--check', 'click-191-191-191-191-1-1-1'],
  2012. ['to-extension--first-show--mark', 'click-192-192-192-192-1-1-1'],
  2013. /* ================================================================================= */
  2014. ['to-browser--evernote-login-show', 'click-211-211-211-211-1-1-1'],
  2015. ['to-browser--evernote-login-show--in', 'click-212-212-212-212-1-1-1'],
  2016. ['to-browser--evernote-login-show--in-cn', 'click-213-213-213-213-1-1-1'],
  2017. ['to-browser--evernote-login-show--cn', 'click-214-214-214-214-1-1-1'],
  2018. ['to-browser--evernote-login-show--cn-in', 'click-215-215-215-215-1-1-1'],
  2019. ['to-browser--evernote-login-failed', 'click-221-221-221-221-1-1-1'],
  2020. ['to-browser--evernote-login-failed--username', 'click-222-222-222-222-1-1-1'],
  2021. ['to-browser--evernote-login-failed--password', 'click-223-223-223-223-1-1-1'],
  2022. ['to-browser--evernote-login-successful', 'click-224-224-224-224-1-1-1'],
  2023. ['to-browser--evernote-clip-successful', 'click-231-231-231-231-1-1-1'],
  2024. ['to-browser--evernote-clip-failed', 'click-232-232-232-232-1-1-1'],
  2025. ['to-browser--evernote-clip-highlights-successful', 'click-241-241-241-241-1-1-1'],
  2026. ['to-browser--evernote-clip-highlights-failed', 'click-242-242-242-242-1-1-1'],
  2027. ['to-browser--evernote-get-recommendation-successful', 'click-251-251-251-251-1-1-1'],
  2028. ['to-browser--evernote-get-recommendation-failed', 'click-252-252-252-252-1-1-1'],
  2029. ['to-browser--first-show--all-features', 'click-261-261-261-261-1-1-1'],
  2030. ['to-browser--first-show--new-features', 'click-262-262-262-262-1-1-1']
  2031. ]
  2032. ;
  2033. for (var i=0,_i=__custom_events.length,e=false,k=false; i<_i; i++)
  2034. {
  2035. e = __custom_events[i];
  2036. k = e[1].split('-');
  2037. __custom_events__names_to_keys[e[0]] = e[1];
  2038. __custom_events__keys_to_names[e[1]] = e[0];
  2039. __custom_events__names_to_objects[e[0]] =
  2040. {
  2041. '_1': k[1],
  2042. '_2': k[2],
  2043. '_3': k[3],
  2044. '_4': k[4],
  2045. '_5': (k[5] == 1 ? true : false),
  2046. '_6': (k[6] == 1 ? true : false),
  2047. '_7': (k[7] == 1 ? true : false)
  2048. };
  2049. }
  2050. var __custom_events__get_key = function (_event)
  2051. {
  2052. return 'click'
  2053. +'-'+_event.screenX
  2054. +'-'+_event.screenY
  2055. +'-'+_event.clientX
  2056. +'-'+_event.clientY
  2057. +'-'+(_event.ctrlKey ? 1 : 0)
  2058. +'-'+(_event.altKey ? 1 : 0)
  2059. +'-'+(_event.shiftKey ? 1 : 0)
  2060. ;
  2061. };
  2062. var __custom_events__dispatch = function (_custom_event_object, _document, _window)
  2063. {
  2064. var _e = _document.createEvent("MouseEvents");
  2065. _e.initMouseEvent(
  2066. "click", true, true, _window, 0,
  2067. _custom_event_object['_1'], _custom_event_object['_2'],
  2068. _custom_event_object['_3'], _custom_event_object['_4'],
  2069. _custom_event_object['_5'],
  2070. _custom_event_object['_6'],
  2071. _custom_event_object['_7'],
  2072. false, 0, null
  2073. );
  2074. _document.dispatchEvent(_e);
  2075. };
  2076. var __event_dispatch = function (_event_name, _arguments)
  2077. {
  2078. // custom logic
  2079. switch (true)
  2080. {
  2081. case (_event_name == 'to-browser--evernote-get-recommendation-successful'):
  2082. var
  2083. _iframe = _d.getElementById('readable_iframe'),
  2084. _recommendationInject_documentToInjectInto = (_iframe.contentDocument || _iframe.contentWindow.document),
  2085. _recommendationInject_filingRecommendation = __readable_by_evernote.__evernote_remote.store__id_to_recommendation[_arguments['_page_id']]
  2086. ;
  2087. // include
  2088. // global vars
  2089. // _recommendationInject_documentToInjectInto
  2090. // _recommendationInject_filingRecommendation
  2091. // log
  2092. // console.log(_recommendationInject_filingRecommendation);
  2093. // RelatedNotes
  2094. // ============
  2095. (function ()
  2096. {
  2097. // escapeForHTML
  2098. // =============
  2099. function __escapeForHTML(_string)
  2100. {
  2101. var _replace = {
  2102. "&": "amp",
  2103. '"': "quot",
  2104. "<": "lt",
  2105. ">": "gt"
  2106. };
  2107. return _string.replace(
  2108. /[&"<>]/g,
  2109. function (_match) { return ("&" + _replace[_match] + ";"); }
  2110. );
  2111. }
  2112. // return?
  2113. // =======
  2114. var _injected_element = _recommendationInject_documentToInjectInto.getElementById('relatedNotes__injected');
  2115. // check
  2116. if (_injected_element.innerHTML == 'yup') { return; }
  2117. // set
  2118. _injected_element.innerHTML = 'yup';
  2119. // inject RelatedNote function
  2120. // ===========================
  2121. var _recommendationInject_injectRelatedNote = function (_html_id, _note_index)
  2122. {
  2123. var
  2124. _element = _recommendationInject_documentToInjectInto.getElementById(_html_id),
  2125. _data = _recommendationInject_filingRecommendation.relatedNotes.list[_note_index]
  2126. ;
  2127. // invalid
  2128. if (_element && _data); else { return; }
  2129. // thumbnail
  2130. var _thumbnail = _data.absoluteURL__thumbnail;
  2131. // thumbnail retina
  2132. if (true
  2133. && (_recommendationInject_documentToInjectInto.defaultView)
  2134. && (_recommendationInject_documentToInjectInto.defaultView.devicePixelRatio)
  2135. && (_recommendationInject_documentToInjectInto.defaultView.devicePixelRatio == 2))
  2136. { _thumbnail = _thumbnail.replace(/size=75$/, 'size=150'); }
  2137. // write
  2138. _element.innerHTML = ''
  2139. + '<div class="text">'
  2140. + '<a target="_blank" href="'+__escapeForHTML(_data.absoluteURL__noteView)+'" class="title">'+__escapeForHTML(_data.title)+'</a>'
  2141. //+ '<a target="_blank" href="'+__escapeForHTML(_data.absoluteURL__noteView)+'" class="date">'+__escapeForHTML(((new Date(_data.created)).toDateString()))+'</a>'
  2142. + '<a target="_blank" href="'+__escapeForHTML(_data.absoluteURL__noteView)+'" class="snippet">'+__escapeForHTML(_data.snippet)+'</a>'
  2143. + '<a target="_blank" href="'+__escapeForHTML(_data.absoluteURL__noteView)+'" class="img" style="background-image: url(\''+__escapeForHTML(_thumbnail)+'\')"></a>'
  2144. + '</div>'
  2145. ;
  2146. };
  2147. // inject RelatedNotes
  2148. // ===================
  2149. if (true
  2150. && _recommendationInject_filingRecommendation.relatedNotes
  2151. && _recommendationInject_filingRecommendation.relatedNotes.list
  2152. && _recommendationInject_filingRecommendation.relatedNotes.list.length
  2153. ){
  2154. // show
  2155. var _notes = _recommendationInject_documentToInjectInto.getElementById('relatedNotes');
  2156. if (_notes) { _notes.className = 'none'; }
  2157. // need to be in this order
  2158. _recommendationInject_injectRelatedNote('relatedNotes__first', 0);
  2159. _recommendationInject_injectRelatedNote('relatedNotes__second', 1);
  2160. }
  2161. })();
  2162. break;
  2163. case (_event_name == 'to-browser--evernote-clip-successful'):
  2164. case (_event_name == 'to-browser--evernote-clip-highlights-successful'):
  2165. var
  2166. _iframe = _d.getElementById('readable_iframe'),
  2167. _infoInject_documentToInjectInto = (_iframe.contentDocument || _iframe.contentWindow.document),
  2168. _infoInject_filingInfo = __readable_by_evernote.__evernote_remote.store__id_to_info[_arguments['_page_id']]
  2169. ;
  2170. // include
  2171. // global vars
  2172. // _infoInject_documentToInjectInto
  2173. // _infoInject_filingInfo
  2174. // log
  2175. // console.log(_infoInject_filingInfo);
  2176. // FilingInfo
  2177. // ==========
  2178. (function ()
  2179. {
  2180. // escapeForHTML
  2181. // =============
  2182. function __escapeForHTML(_string)
  2183. {
  2184. var _replace = {
  2185. "&": "amp",
  2186. '"': "quot",
  2187. "<": "lt",
  2188. ">": "gt"
  2189. };
  2190. return _string.replace(
  2191. /[&"<>]/g,
  2192. function (_match) { return ("&" + _replace[_match] + ";"); }
  2193. );
  2194. }
  2195. // return?
  2196. // =======
  2197. var _injected_element = _infoInject_documentToInjectInto.getElementById('filingInfo_injected');
  2198. // check
  2199. if (_injected_element.innerHTML == 'yup') { return; }
  2200. // set
  2201. _injected_element.innerHTML = 'yup';
  2202. // notebook
  2203. // ========
  2204. var _notebook_name = (_infoInject_filingInfo.notebook_name);
  2205. _notebook_name = (_notebook_name > '' ? _notebook_name : _infoInject_documentToInjectInto.getElementById('filingInfo_notebook_default').innerHTML);
  2206. _infoInject_documentToInjectInto.getElementById('filingInfo_notebook').innerHTML = __escapeForHTML(_notebook_name);
  2207. // tags
  2208. // ====
  2209. var _tags_element = _infoInject_documentToInjectInto.getElementById('filingInfo_tags');
  2210. for (var _s=false, i=0, _i=_infoInject_filingInfo.tag_names.length; i<_i; i++)
  2211. {
  2212. _s = _infoInject_documentToInjectInto.createElement('span');
  2213. _s.innerHTML = __escapeForHTML(_infoInject_filingInfo.tag_names[i]);
  2214. _tags_element.appendChild(_s);
  2215. }
  2216. // url
  2217. // ===
  2218. var _links = _infoInject_documentToInjectInto.getElementById('filingInfo_links');
  2219. _links.innerHTML = _links.innerHTML.replace('#url-edit', __escapeForHTML(_infoInject_filingInfo.url_edit));
  2220. //_links.innerHTML = _links.innerHTML.replace('#url-view', __escapeForHTML(_infoInject_filingInfo.url_view));
  2221. })();
  2222. break;
  2223. }
  2224. __custom_events__dispatch(
  2225. __custom_events__names_to_objects[_event_name],
  2226. _d,
  2227. _d.defaultView
  2228. );
  2229. };
  2230. // custom events
  2231. _d.addEventListener('click', function(_event)
  2232. {
  2233. var
  2234. _event_key = __custom_events__get_key(_event),
  2235. _event_name = __custom_events__keys_to_names[_event_key],
  2236. _stop = false
  2237. ;
  2238. switch (_event_name)
  2239. {
  2240. /* select theme */
  2241. /* ============ */
  2242. case 'to-extension--select-theme-1': __readable_by_evernote.__save__select_theme('theme-1'); _stop = true; break;
  2243. case 'to-extension--select-theme-2': __readable_by_evernote.__save__select_theme('theme-2'); _stop = true; break;
  2244. case 'to-extension--select-theme-3': __readable_by_evernote.__save__select_theme('theme-3'); _stop = true; break;
  2245. case 'to-extension--select-theme-custom': __readable_by_evernote.__save__select_theme__custom(); _stop = true; break;
  2246. /* select size */
  2247. /* =========== */
  2248. case 'to-extension--select-size-small': __readable_by_evernote.__save__select_size('small'); _stop = true; break;
  2249. case 'to-extension--select-size-medium': __readable_by_evernote.__save__select_size('medium'); _stop = true; break;
  2250. case 'to-extension--select-size-large': __readable_by_evernote.__save__select_size('large'); _stop = true; break;
  2251. /* related notes */
  2252. /* ============= */
  2253. case 'to-extension--select-related-notes-just-at-bottom': __readable_by_evernote.__save__select_related_notes('just_at_bottom'); _stop = true; break;
  2254. case 'to-extension--select-related-notes-disabled': __readable_by_evernote.__save__select_related_notes('disabled'); _stop = true; break;
  2255. /* evernote */
  2256. /* ======== */
  2257. case 'to-extension--evernote-get-recommendation':
  2258. // global
  2259. // _d
  2260. // check login
  2261. // if not logged in, fail
  2262. // on failed login, fail
  2263. //
  2264. // try get
  2265. // on fail, fail
  2266. // ============================================================
  2267. // update settings
  2268. // ===============
  2269. // set evernote remote settings
  2270. // ============================
  2271. (function ()
  2272. {
  2273. // encode
  2274. // ======
  2275. function __encodeURIComponentForReadable(_string)
  2276. {
  2277. // none
  2278. if (_string == '') { return 'none'; }
  2279. // encode
  2280. return encodeURIComponent(_string)
  2281. .replace(/!/g, '%21')
  2282. .replace(/'/g, '%27')
  2283. .replace(/\(/g, '%28')
  2284. .replace(/\)/g, '%29')
  2285. .replace(/\*/g, '%2A')
  2286. ;
  2287. }
  2288. // decode
  2289. // ======
  2290. function __decodeURIComponentForReadable(_string)
  2291. {
  2292. // none
  2293. if (_string == 'none') { return ''; }
  2294. // decode
  2295. return decodeURIComponent(_string);
  2296. }
  2297. var _storedVars = __readable_by_evernote.__get_saved__vars();
  2298. __readable_by_evernote.__evernote_remote.setting__related_notes = __decodeURIComponentForReadable(_storedVars['related_notes']);
  2299. __readable_by_evernote.__evernote_remote.setting__smart_filing = __decodeURIComponentForReadable(_storedVars['smart_filing']);
  2300. __readable_by_evernote.__evernote_remote.setting__clip_tag = __decodeURIComponentForReadable(_storedVars['clip_tag']);
  2301. __readable_by_evernote.__evernote_remote.setting__clip_notebook = __decodeURIComponentForReadable(_storedVars['clip_notebook']);
  2302. })();
  2303. // logout on next action
  2304. // =====================
  2305. if (__readable_by_evernote.__get_stored_evernote_logoutOnNextAction()) { __readable_by_evernote.__evernote_remote.logout(); }
  2306. // stored login
  2307. // ============
  2308. var _storedLogin = __readable_by_evernote.__get_stored_evernote_credentials();
  2309. // success function
  2310. // ================
  2311. var _get_successful = function (_id)
  2312. {
  2313. // send event
  2314. __event_dispatch(
  2315. 'to-browser--evernote-get-recommendation-successful',
  2316. { '_page_id': _id }
  2317. );
  2318. };
  2319. // failed function
  2320. // ===============
  2321. var _get_failed = function ()
  2322. {
  2323. // send event
  2324. __event_dispatch('to-browser--evernote-get-recommendation-failed');
  2325. };
  2326. var
  2327. _iframe = _d.getElementById('readable_iframe'),
  2328. _doc = (_iframe.contentDocument || _iframe.contentWindow.document),
  2329. _bodyElement = _doc.getElementById('text'),
  2330. __id = _doc.getElementById('body').getAttribute('readable__page_id'),
  2331. __url = _d.defaultView.location.href,
  2332. __body = _bodyElement.innerHTML
  2333. ;
  2334. // include prepare/clean
  2335. // global vars
  2336. /*
  2337. __id
  2338. __url
  2339. __title
  2340. __body
  2341. */
  2342. // remove all spans
  2343. // ================
  2344. __body = __body.replace(/<span([^>]*?)>/gi, '');
  2345. __body = __body.replace(/<\/span>/gi, '');
  2346. // remove delete buttons
  2347. // =====================
  2348. __body = __body.replace(/<em ([^>]*?)highlight([^>]*?)><a ([^>]*?)delete([^>]*?)><\/a>([\s\S]*?)<\/em>/gi, '<em class="highlight">$5</em>');
  2349. // highlight element
  2350. // =================
  2351. __body = __body.replace(/<em ([^>]*?)highlight([^>]*?)>([^>]+?)<\/em>/gi, '<highlight>$3</highlight>');
  2352. // double EMs
  2353. // ==========
  2354. while (true && __body.match(/<highlight>([\s\S]*?)<\/highlight>([\n\r\t]*?)<highlight>([\s\S]*?)<\/highlight>/gi)) {
  2355. __body = __body.replace(/<highlight>([\s\S]*?)<\/highlight>([\n\r\t]*?)<highlight>([\s\S]*?)<\/highlight>/gi, '<highlight>$1$3</highlight>');
  2356. }
  2357. // replace EMs
  2358. // ===========
  2359. __body = __body.replace(/<highlight>([\s\S]*?)<\/highlight>/gi, '<span style="x-evernote: highlighted; background-color: #f6ee96">$1</span>');
  2360. // remove link footnotes
  2361. // =====================
  2362. __body = __body.replace(/<sup class="readableLinkFootnote">([^<]*)<\/sup>/gi, '');
  2363. // remove extraneous stuff -- nothing after footnoted links
  2364. // =======================
  2365. var
  2366. __f_marker = '<ol id="footnotedLinks"',
  2367. __f_marker_pos = __body.lastIndexOf(__f_marker)
  2368. ;
  2369. if (__f_marker_pos > -1) {
  2370. __body = __body.substr(0, __f_marker_pos);
  2371. }
  2372. // do
  2373. switch (true)
  2374. {
  2375. // not connected / logged-in
  2376. // and we know this -- so do connect/login
  2377. // =======================================
  2378. case (!(__readable_by_evernote.__evernote_remote.is__connected)):
  2379. case (!(__readable_by_evernote.__evernote_remote.is__loggedIn)):
  2380. // no stored login
  2381. // ===============
  2382. if (_storedLogin == false) { _get_failed(); return; }
  2383. // do stored login
  2384. // ================
  2385. __readable_by_evernote.__evernote_remote.login
  2386. (
  2387. _storedLogin.username,
  2388. _storedLogin.password,
  2389. // success | login
  2390. function ()
  2391. {
  2392. __readable_by_evernote.__evernote_remote.get_recommendation
  2393. (
  2394. __id,
  2395. __url,
  2396. __body,
  2397. // success | get
  2398. function (_recommendation) { _get_successful(__id); },
  2399. // failure | get
  2400. function (_failReason) { _get_failed(); }
  2401. );
  2402. },
  2403. // failure | login
  2404. function (_failReason) { _get_failed(); }
  2405. );
  2406. break;
  2407. // should be both connected and logged in
  2408. // in case it fails because of login, we try another stored login
  2409. // ===================================================================
  2410. default:
  2411. __readable_by_evernote.__evernote_remote.get_recommendation
  2412. (
  2413. __id,
  2414. __url,
  2415. __body,
  2416. // success | get
  2417. function (_recommendation) { _get_successful(__id); },
  2418. // failure | get
  2419. function (_failReason) { _get_failed(); }
  2420. );
  2421. break;
  2422. }
  2423. _stop = true;
  2424. break;
  2425. case 'to-extension--evernote-clip':
  2426. // global
  2427. // _d
  2428. // check login
  2429. // if not logged in, try stored log in
  2430. // on successfull login, do clip again
  2431. // on failed login, or no stored login, show login form
  2432. //
  2433. // try clip
  2434. // on fail, because of login, try stored login
  2435. // on successfull login, try clip again
  2436. // on failed login, or no stored login, show login form
  2437. // ============================================================
  2438. // update settings
  2439. // ===============
  2440. // set evernote remote settings
  2441. // ============================
  2442. (function ()
  2443. {
  2444. // encode
  2445. // ======
  2446. function __encodeURIComponentForReadable(_string)
  2447. {
  2448. // none
  2449. if (_string == '') { return 'none'; }
  2450. // encode
  2451. return encodeURIComponent(_string)
  2452. .replace(/!/g, '%21')
  2453. .replace(/'/g, '%27')
  2454. .replace(/\(/g, '%28')
  2455. .replace(/\)/g, '%29')
  2456. .replace(/\*/g, '%2A')
  2457. ;
  2458. }
  2459. // decode
  2460. // ======
  2461. function __decodeURIComponentForReadable(_string)
  2462. {
  2463. // none
  2464. if (_string == 'none') { return ''; }
  2465. // decode
  2466. return decodeURIComponent(_string);
  2467. }
  2468. var _storedVars = __readable_by_evernote.__get_saved__vars();
  2469. __readable_by_evernote.__evernote_remote.setting__related_notes = __decodeURIComponentForReadable(_storedVars['related_notes']);
  2470. __readable_by_evernote.__evernote_remote.setting__smart_filing = __decodeURIComponentForReadable(_storedVars['smart_filing']);
  2471. __readable_by_evernote.__evernote_remote.setting__clip_tag = __decodeURIComponentForReadable(_storedVars['clip_tag']);
  2472. __readable_by_evernote.__evernote_remote.setting__clip_notebook = __decodeURIComponentForReadable(_storedVars['clip_notebook']);
  2473. })();
  2474. // logout on next action
  2475. // =====================
  2476. if (__readable_by_evernote.__get_stored_evernote_logoutOnNextAction()) { __readable_by_evernote.__evernote_remote.logout(); }
  2477. // stored login
  2478. // ============
  2479. var _storedLogin = __readable_by_evernote.__get_stored_evernote_credentials();
  2480. // success function
  2481. // ================
  2482. var _clipping_successful = function (_id)
  2483. {
  2484. // send event
  2485. __event_dispatch(
  2486. 'to-browser--evernote-clip-successful',
  2487. { '_page_id': _id }
  2488. );
  2489. };
  2490. // failed function
  2491. // ===============
  2492. var _clipping_failed = function ()
  2493. {
  2494. // send event
  2495. __event_dispatch('to-browser--evernote-clip-failed');
  2496. };
  2497. // bootstrap + show login
  2498. // ======================
  2499. var _request_login = function ()
  2500. {
  2501. __readable_by_evernote.__evernote_bootstrap.bootstrap(
  2502. function ()
  2503. {
  2504. if (__readable_by_evernote.__evernote_bootstrap.profiles_as_string)
  2505. {
  2506. __event_dispatch(''
  2507. + 'to-browser--evernote-login-show--'
  2508. + (__readable_by_evernote.__evernote_bootstrap.profiles_as_string.replace('_', '-'))
  2509. );
  2510. }
  2511. else
  2512. {
  2513. __event_dispatch('to-browser--evernote-login-show--in');
  2514. }
  2515. },
  2516. function () { _clipping_failed(); }
  2517. );
  2518. };
  2519. var
  2520. _iframe = _d.getElementById('readable_iframe'),
  2521. _doc = (_iframe.contentDocument || _iframe.contentWindow.document),
  2522. _bodyElement = _doc.getElementById('text'),
  2523. __id = _doc.getElementById('body').getAttribute('readable__page_id'),
  2524. __url = _d.defaultView.location.href,
  2525. __title = _d.title,
  2526. __body = _bodyElement.innerHTML
  2527. ;
  2528. // include prepare/clean
  2529. // global vars
  2530. /*
  2531. __id
  2532. __url
  2533. __title
  2534. __body
  2535. */
  2536. // remove all spans
  2537. // ================
  2538. __body = __body.replace(/<span([^>]*?)>/gi, '');
  2539. __body = __body.replace(/<\/span>/gi, '');
  2540. // remove delete buttons
  2541. // =====================
  2542. __body = __body.replace(/<em ([^>]*?)highlight([^>]*?)><a ([^>]*?)delete([^>]*?)><\/a>([\s\S]*?)<\/em>/gi, '<em class="highlight">$5</em>');
  2543. // highlight element
  2544. // =================
  2545. __body = __body.replace(/<em ([^>]*?)highlight([^>]*?)>([^>]+?)<\/em>/gi, '<highlight>$3</highlight>');
  2546. // double EMs
  2547. // ==========
  2548. while (true && __body.match(/<highlight>([\s\S]*?)<\/highlight>([\n\r\t]*?)<highlight>([\s\S]*?)<\/highlight>/gi)) {
  2549. __body = __body.replace(/<highlight>([\s\S]*?)<\/highlight>([\n\r\t]*?)<highlight>([\s\S]*?)<\/highlight>/gi, '<highlight>$1$3</highlight>');
  2550. }
  2551. // replace EMs
  2552. // ===========
  2553. __body = __body.replace(/<highlight>([\s\S]*?)<\/highlight>/gi, '<span style="x-evernote: highlighted; background-color: #f6ee96">$1</span>');
  2554. // remove link footnotes
  2555. // =====================
  2556. __body = __body.replace(/<sup class="readableLinkFootnote">([^<]*)<\/sup>/gi, '');
  2557. // remove extraneous stuff -- nothing after footnoted links
  2558. // =======================
  2559. var
  2560. __f_marker = '<ol id="footnotedLinks"',
  2561. __f_marker_pos = __body.lastIndexOf(__f_marker)
  2562. ;
  2563. if (__f_marker_pos > -1) {
  2564. __body = __body.substr(0, __f_marker_pos);
  2565. }
  2566. switch (true)
  2567. {
  2568. // not connected / logged-in
  2569. // and we know this -- so do connect/login
  2570. // =======================================
  2571. case (!(__readable_by_evernote.__evernote_remote.is__connected)):
  2572. case (!(__readable_by_evernote.__evernote_remote.is__loggedIn)):
  2573. // no stored login
  2574. // ===============
  2575. if (_storedLogin == false) { _request_login(); return; }
  2576. // do stored login
  2577. // ================
  2578. __readable_by_evernote.__evernote_remote.login
  2579. (
  2580. _storedLogin.username,
  2581. _storedLogin.password,
  2582. // success | login
  2583. function ()
  2584. {
  2585. __readable_by_evernote.__evernote_remote.clip
  2586. (
  2587. __id,
  2588. __url,
  2589. __title,
  2590. __body,
  2591. // success | clip
  2592. function () { _clipping_successful(__id); },
  2593. // failure | clip
  2594. function (_failReason) { _clipping_failed(); }
  2595. );
  2596. },
  2597. // failure | login
  2598. function (_failReason) { _request_login(); }
  2599. );
  2600. break;
  2601. // should be both connected and logged in
  2602. // in case it fails because of login, we try another stored login
  2603. // ===================================================================
  2604. default:
  2605. __readable_by_evernote.__evernote_remote.clip
  2606. (
  2607. __id,
  2608. __url,
  2609. __title,
  2610. __body,
  2611. // success | clip
  2612. function () { _clipping_successful(__id); },
  2613. // failure | clip
  2614. function (_failReason)
  2615. {
  2616. // failure because of soemthing else
  2617. if (_failReason == 'login'); else { _clipping_failed(); return; }
  2618. // no stored login
  2619. if (_storedLogin == false) { _request_login(); return; }
  2620. // try stored login
  2621. __readable_by_evernote.__evernote_remote.login
  2622. (
  2623. _storedLogin.username,
  2624. _storedLogin.password,
  2625. // success | login
  2626. function ()
  2627. {
  2628. __readable_by_evernote.__evernote_remote.clip
  2629. (
  2630. __id,
  2631. __url,
  2632. __title,
  2633. __body,
  2634. // success | clip
  2635. function () { _clipping_successful(__id); },
  2636. // failure | clip
  2637. function (_failReason) { _clipping_failed(); }
  2638. );
  2639. },
  2640. // failure | login
  2641. function (_failReason) { _request_login(); }
  2642. );
  2643. }
  2644. );
  2645. break;
  2646. }
  2647. _stop = true;
  2648. break;
  2649. case 'to-extension--evernote-clip-highlights':
  2650. // global
  2651. // _d
  2652. // check login
  2653. // if not logged in, fail
  2654. // on failed login, fail
  2655. //
  2656. // try clip
  2657. // on fail, fail
  2658. // ============================================================
  2659. // update settings
  2660. // ===============
  2661. // set evernote remote settings
  2662. // ============================
  2663. (function ()
  2664. {
  2665. // encode
  2666. // ======
  2667. function __encodeURIComponentForReadable(_string)
  2668. {
  2669. // none
  2670. if (_string == '') { return 'none'; }
  2671. // encode
  2672. return encodeURIComponent(_string)
  2673. .replace(/!/g, '%21')
  2674. .replace(/'/g, '%27')
  2675. .replace(/\(/g, '%28')
  2676. .replace(/\)/g, '%29')
  2677. .replace(/\*/g, '%2A')
  2678. ;
  2679. }
  2680. // decode
  2681. // ======
  2682. function __decodeURIComponentForReadable(_string)
  2683. {
  2684. // none
  2685. if (_string == 'none') { return ''; }
  2686. // decode
  2687. return decodeURIComponent(_string);
  2688. }
  2689. var _storedVars = __readable_by_evernote.__get_saved__vars();
  2690. __readable_by_evernote.__evernote_remote.setting__related_notes = __decodeURIComponentForReadable(_storedVars['related_notes']);
  2691. __readable_by_evernote.__evernote_remote.setting__smart_filing = __decodeURIComponentForReadable(_storedVars['smart_filing']);
  2692. __readable_by_evernote.__evernote_remote.setting__clip_tag = __decodeURIComponentForReadable(_storedVars['clip_tag']);
  2693. __readable_by_evernote.__evernote_remote.setting__clip_notebook = __decodeURIComponentForReadable(_storedVars['clip_notebook']);
  2694. })();
  2695. // logout on next action
  2696. // =====================
  2697. if (__readable_by_evernote.__get_stored_evernote_logoutOnNextAction()) { __readable_by_evernote.__evernote_remote.logout(); }
  2698. // stored login
  2699. // ============
  2700. var _storedLogin = __readable_by_evernote.__get_stored_evernote_credentials();
  2701. // success function
  2702. // ================
  2703. var _clipping_successful = function (_id)
  2704. {
  2705. // send event
  2706. __event_dispatch(
  2707. 'to-browser--evernote-clip-highlights-successful',
  2708. { '_page_id': _id }
  2709. );
  2710. };
  2711. // failed function
  2712. // ===============
  2713. var _clipping_failed = function ()
  2714. {
  2715. // send event
  2716. __event_dispatch('to-browser--evernote-clip-highlights-failed');
  2717. };
  2718. // bootstrap + show login
  2719. // ======================
  2720. var _request_login = function ()
  2721. {
  2722. __readable_by_evernote.__evernote_bootstrap.bootstrap(
  2723. function ()
  2724. {
  2725. if (__readable_by_evernote.__evernote_bootstrap.profiles_as_string)
  2726. {
  2727. __event_dispatch(''
  2728. + 'to-browser--evernote-login-show--'
  2729. + (__readable_by_evernote.__evernote_bootstrap.profiles_as_string.replace('_', '-'))
  2730. );
  2731. }
  2732. else
  2733. {
  2734. __event_dispatch('to-browser--evernote-login-show--in');
  2735. }
  2736. },
  2737. function () { _clipping_failed(); }
  2738. );
  2739. };
  2740. var
  2741. _iframe = _d.getElementById('readable_iframe'),
  2742. _doc = (_iframe.contentDocument || _iframe.contentWindow.document),
  2743. _bodyElement = _doc.getElementById('text'),
  2744. __id = _doc.getElementById('body').getAttribute('readable__page_id'),
  2745. __url = _d.defaultView.location.href,
  2746. __title = _d.title,
  2747. __body = _bodyElement.innerHTML
  2748. ;
  2749. // include prepare/clean
  2750. // global vars
  2751. /*
  2752. __id
  2753. __url
  2754. __title
  2755. __body
  2756. */
  2757. // remove all spans
  2758. // ================
  2759. __body = __body.replace(/<span([^>]*?)>/gi, '');
  2760. __body = __body.replace(/<\/span>/gi, '');
  2761. // remove delete buttons
  2762. // =====================
  2763. __body = __body.replace(/<em ([^>]*?)highlight([^>]*?)><a ([^>]*?)delete([^>]*?)><\/a>([\s\S]*?)<\/em>/gi, '<em class="highlight">$5</em>');
  2764. // highlight element
  2765. // =================
  2766. __body = __body.replace(/<em ([^>]*?)highlight([^>]*?)>([^>]+?)<\/em>/gi, '<highlight>$3</highlight>');
  2767. // double EMs
  2768. // ==========
  2769. while (true && __body.match(/<highlight>([\s\S]*?)<\/highlight>([\n\r\t]*?)<highlight>([\s\S]*?)<\/highlight>/gi)) {
  2770. __body = __body.replace(/<highlight>([\s\S]*?)<\/highlight>([\n\r\t]*?)<highlight>([\s\S]*?)<\/highlight>/gi, '<highlight>$1$3</highlight>');
  2771. }
  2772. // replace EMs
  2773. // ===========
  2774. __body = __body.replace(/<highlight>([\s\S]*?)<\/highlight>/gi, '<span style="x-evernote: highlighted; background-color: #f6ee96">$1</span>');
  2775. // remove link footnotes
  2776. // =====================
  2777. __body = __body.replace(/<sup class="readableLinkFootnote">([^<]*)<\/sup>/gi, '');
  2778. // remove extraneous stuff -- nothing after footnoted links
  2779. // =======================
  2780. var
  2781. __f_marker = '<ol id="footnotedLinks"',
  2782. __f_marker_pos = __body.lastIndexOf(__f_marker)
  2783. ;
  2784. if (__f_marker_pos > -1) {
  2785. __body = __body.substr(0, __f_marker_pos);
  2786. }
  2787. switch (true)
  2788. {
  2789. // not connected / logged-in
  2790. // and we know this -- so do connect/login
  2791. // =======================================
  2792. case (!(__readable_by_evernote.__evernote_remote.is__connected)):
  2793. case (!(__readable_by_evernote.__evernote_remote.is__loggedIn)):
  2794. // no stored login
  2795. // ===============
  2796. if (_storedLogin == false) { _request_login(); return; }
  2797. // do stored login
  2798. // ================
  2799. __readable_by_evernote.__evernote_remote.login
  2800. (
  2801. _storedLogin.username,
  2802. _storedLogin.password,
  2803. // success | login
  2804. function ()
  2805. {
  2806. __readable_by_evernote.__evernote_remote.clip
  2807. (
  2808. __id,
  2809. __url,
  2810. __title,
  2811. __body,
  2812. // success | clip
  2813. function () { _clipping_successful(__id); },
  2814. // failure | clip
  2815. function (_failReason) { _clipping_failed(); }
  2816. );
  2817. },
  2818. // failure | login
  2819. function (_failReason) { _request_login(); }
  2820. );
  2821. break;
  2822. // should be both connected and logged in
  2823. // in case it fails because of login, we try another stored login
  2824. // ===================================================================
  2825. default:
  2826. __readable_by_evernote.__evernote_remote.clip
  2827. (
  2828. __id,
  2829. __url,
  2830. __title,
  2831. __body,
  2832. // success | clip
  2833. function () { _clipping_successful(__id); },
  2834. // failure | clip
  2835. function (_failReason)
  2836. {
  2837. // failure because of soemthing else
  2838. if (_failReason == 'login'); else { _clipping_failed(); return; }
  2839. // no stored login
  2840. if (_storedLogin == false) { _request_login(); return; }
  2841. // try stored login
  2842. __readable_by_evernote.__evernote_remote.login
  2843. (
  2844. _storedLogin.username,
  2845. _storedLogin.password,
  2846. // success | login
  2847. function ()
  2848. {
  2849. __readable_by_evernote.__evernote_remote.clip
  2850. (
  2851. __id,
  2852. __url,
  2853. __title,
  2854. __body,
  2855. // success | clip
  2856. function () { _clipping_successful(__id); },
  2857. // failure | clip
  2858. function (_failReason) { _clipping_failed(); }
  2859. );
  2860. },
  2861. // failure | login
  2862. function (_failReason) { _request_login(); }
  2863. );
  2864. }
  2865. );
  2866. break;
  2867. }
  2868. _stop = true;
  2869. break;
  2870. /*case 'to-extension--evernote-unset-tag':
  2871. alert('unset tag');
  2872. _stop = true;
  2873. break;*/
  2874. /*case 'to-extension--evernote-unset-notebook':
  2875. alert('unset notebook');
  2876. _stop = true;
  2877. break;*/
  2878. case 'to-extension--evernote-login':
  2879. // do login
  2880. // store login, if rememberMe
  2881. // ==============================
  2882. // update settings
  2883. // ===============
  2884. // set evernote remote settings
  2885. // ============================
  2886. (function ()
  2887. {
  2888. // encode
  2889. // ======
  2890. function __encodeURIComponentForReadable(_string)
  2891. {
  2892. // none
  2893. if (_string == '') { return 'none'; }
  2894. // encode
  2895. return encodeURIComponent(_string)
  2896. .replace(/!/g, '%21')
  2897. .replace(/'/g, '%27')
  2898. .replace(/\(/g, '%28')
  2899. .replace(/\)/g, '%29')
  2900. .replace(/\*/g, '%2A')
  2901. ;
  2902. }
  2903. // decode
  2904. // ======
  2905. function __decodeURIComponentForReadable(_string)
  2906. {
  2907. // none
  2908. if (_string == 'none') { return ''; }
  2909. // decode
  2910. return decodeURIComponent(_string);
  2911. }
  2912. var _storedVars = __readable_by_evernote.__get_saved__vars();
  2913. __readable_by_evernote.__evernote_remote.setting__related_notes = __decodeURIComponentForReadable(_storedVars['related_notes']);
  2914. __readable_by_evernote.__evernote_remote.setting__smart_filing = __decodeURIComponentForReadable(_storedVars['smart_filing']);
  2915. __readable_by_evernote.__evernote_remote.setting__clip_tag = __decodeURIComponentForReadable(_storedVars['clip_tag']);
  2916. __readable_by_evernote.__evernote_remote.setting__clip_notebook = __decodeURIComponentForReadable(_storedVars['clip_notebook']);
  2917. })();
  2918. var
  2919. _iframe = _d.getElementById('readable_iframe'),
  2920. _doc = (_iframe.contentDocument || _iframe.contentWindow.document),
  2921. _userElement = _doc.getElementById('evernote_login__username'),
  2922. _passElement = _doc.getElementById('evernote_login__password'),
  2923. _rememberMeElement = _doc.getElementById('evernote_login__rememberMe'),
  2924. __user = (_userElement.value > '' ? _userElement.value : ''),
  2925. __pass = (_userElement.value > '' ? _passElement.value : ''),
  2926. __rememberMe = (_rememberMeElement.checked == true ? true : false)
  2927. ;
  2928. __readable_by_evernote.__evernote_remote.login
  2929. (
  2930. __user,
  2931. __pass,
  2932. // success | login
  2933. function ()
  2934. {
  2935. // save credentials
  2936. // ================
  2937. if (__rememberMe)
  2938. {
  2939. __readable_by_evernote.__set_stored_evernote_credentials({
  2940. 'username': __user,
  2941. 'password': __pass
  2942. });
  2943. }
  2944. // raise event
  2945. __event_dispatch('to-browser--evernote-login-successful');
  2946. },
  2947. // fail | login
  2948. function (_failReason)
  2949. {
  2950. switch (_failReason)
  2951. {
  2952. case 'username': __event_dispatch('to-browser--evernote-login-failed--username'); break;
  2953. case 'password': __event_dispatch('to-browser--evernote-login-failed--password'); break;
  2954. default: __event_dispatch('to-browser--evernote-login-failed'); break;
  2955. }
  2956. }
  2957. );
  2958. _stop = true;
  2959. break;
  2960. /* first show */
  2961. /* ========== */
  2962. case 'to-extension--first-show--check':
  2963. switch (true)
  2964. {
  2965. case (!(__readable_by_evernote['firstShow'])):
  2966. _stop = true;
  2967. break;
  2968. case (__readable_by_evernote['firstShow'] == 'new-features'):
  2969. __event_dispatch('to-browser--first-show--new-features');
  2970. _stop = true;
  2971. break;
  2972. case (__readable_by_evernote['firstShow'] == 'all-features'):
  2973. __event_dispatch('to-browser--first-show--all-features');
  2974. _stop = true;
  2975. break;
  2976. }
  2977. break;
  2978. case 'to-extension--first-show--mark':
  2979. // this instance
  2980. __readable_by_evernote['firstShow'] = true;
  2981. // include
  2982. // Options:
  2983. // "the curent version number"
  2984. // "nope"
  2985. var __first_show_identifier = '3346.272.754';
  2986. // __first_show_identifier = 'nope';
  2987. // set
  2988. var
  2989. _prefs_service = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService),
  2990. _prefs = _prefs_service.getBranch("extensions.readable-by-evernote.")
  2991. ;
  2992. _prefs.setCharPref('firstShowIdentifier', __first_show_identifier);
  2993. _stop = true;
  2994. break;
  2995. /* switch login */
  2996. /* ============ */
  2997. case 'to-extension--evernote-login--switch-to-cn':
  2998. if (__readable_by_evernote.__evernote_bootstrap.profiles_as_string == 'in_cn')
  2999. {
  3000. __readable_by_evernote.__evernote_bootstrap.profiles_as_string = 'cn_in';
  3001. __readable_by_evernote.__evernote_bootstrap.server = 'china';
  3002. __readable_by_evernote.__evernote_bootstrap.remote_domain = __readable_by_evernote.__evernote_bootstrap['server_'+'china'];
  3003. __readable_by_evernote.__evernote_bootstrap.remote_domain_marketing = false;
  3004. __readable_by_evernote.__evernote_remote.disconnect();
  3005. __event_dispatch('to-browser--evernote-login-show--cn-in');
  3006. sendResponse({});
  3007. }
  3008. break;
  3009. case 'to-extension--evernote-login--switch-to-in':
  3010. if (__readable_by_evernote.__evernote_bootstrap.profiles_as_string == 'cn_in')
  3011. {
  3012. __readable_by_evernote.__evernote_bootstrap.profiles_as_string = 'in_cn';
  3013. __readable_by_evernote.__evernote_bootstrap.server = 'main';
  3014. __readable_by_evernote.__evernote_bootstrap.remote_domain = __readable_by_evernote.__evernote_bootstrap['server_'+'main'];
  3015. __readable_by_evernote.__evernote_bootstrap.remote_domain_marketing = false;
  3016. __readable_by_evernote.__evernote_remote.disconnect();
  3017. __event_dispatch('to-browser--evernote-login-show--in-cn');
  3018. sendResponse({});
  3019. }
  3020. break;
  3021. /* settings */
  3022. /* ======== */
  3023. case 'to-extension--open-settings-theme':
  3024. window.openDialog('chrome://readable-by-evernote/content/options.xul#showCustom');
  3025. _stop = true;
  3026. break;
  3027. case 'to-extension--open-settings':
  3028. window.openDialog('chrome://readable-by-evernote/content/options.xul');
  3029. _stop = true;
  3030. break;
  3031. }
  3032. if (_stop)
  3033. {
  3034. _event.stopPropagation();
  3035. _event.preventDefault();
  3036. }
  3037. }, true);
  3038. }
  3039. // set bootstrap info
  3040. // ==================
  3041. // set to live
  3042. __readable_by_evernote.__evernote_bootstrap.set_servers_to_live();
  3043. // set locale
  3044. __readable_by_evernote.__evernote_bootstrap.setLocale(window.navigator.language);
  3045. //mike.c.yang@gmail.com: Force using zh_CN local to make sure clearly bootstrap with yinxiang.com
  3046. __readable_by_evernote.__evernote_bootstrap.setLocale("zh_CN");
  3047. // saved server
  3048. (function ()
  3049. {
  3050. var _storedCredentialsForBootstrap = __readable_by_evernote.__get_stored_evernote_credentials();
  3051. if (_storedCredentialsForBootstrap && _storedCredentialsForBootstrap.server)
  3052. { __readable_by_evernote.__evernote_bootstrap.saved_server = _storedCredentialsForBootstrap.server; }
  3053. })();
  3054. // get settings
  3055. // ============
  3056. // set evernote remote settings
  3057. // ============================
  3058. (function ()
  3059. {
  3060. // encode
  3061. // ======
  3062. function __encodeURIComponentForReadable(_string)
  3063. {
  3064. // none
  3065. if (_string == '') { return 'none'; }
  3066. // encode
  3067. return encodeURIComponent(_string)
  3068. .replace(/!/g, '%21')
  3069. .replace(/'/g, '%27')
  3070. .replace(/\(/g, '%28')
  3071. .replace(/\)/g, '%29')
  3072. .replace(/\*/g, '%2A')
  3073. ;
  3074. }
  3075. // decode
  3076. // ======
  3077. function __decodeURIComponentForReadable(_string)
  3078. {
  3079. // none
  3080. if (_string == 'none') { return ''; }
  3081. // decode
  3082. return decodeURIComponent(_string);
  3083. }
  3084. var _storedVars = __readable_by_evernote.__get_saved__vars();
  3085. __readable_by_evernote.__evernote_remote.setting__related_notes = __decodeURIComponentForReadable(_storedVars['related_notes']);
  3086. __readable_by_evernote.__evernote_remote.setting__smart_filing = __decodeURIComponentForReadable(_storedVars['smart_filing']);
  3087. __readable_by_evernote.__evernote_remote.setting__clip_tag = __decodeURIComponentForReadable(_storedVars['clip_tag']);
  3088. __readable_by_evernote.__evernote_remote.setting__clip_notebook = __decodeURIComponentForReadable(_storedVars['clip_notebook']);
  3089. })();
  3090. // first run
  3091. // =========
  3092. window.addEventListener('load', function ()
  3093. {
  3094. // include
  3095. // =======
  3096. // Options:
  3097. // "the curent version number"
  3098. // "nope"
  3099. var __first_show_identifier = '3346.272.754';
  3100. // __first_show_identifier = 'nope';
  3101. // check
  3102. // =====
  3103. // already done -- somehow
  3104. if (__readable_by_evernote['firstShow']) { return; }
  3105. var
  3106. _prefs_service = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService),
  3107. _prefs = _prefs_service.getBranch("extensions.readable-by-evernote.")
  3108. ;
  3109. // check -- maybe return
  3110. if (_prefs.getCharPref('notFirstRun') != 'yes')
  3111. {
  3112. __readable_by_evernote['firstShow'] = 'all-features';
  3113. return;
  3114. }
  3115. else
  3116. {
  3117. if (_prefs.getCharPref('firstShowIdentifier') == __first_show_identifier); else
  3118. {
  3119. __readable_by_evernote['firstShow'] = 'new-features';
  3120. return;
  3121. }
  3122. }
  3123. }, false);
  3124. window.addEventListener('load', function ()
  3125. {
  3126. // check
  3127. // =====
  3128. var
  3129. _prefs_service = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService),
  3130. _prefs = _prefs_service.getBranch("extensions.readable-by-evernote.")
  3131. ;
  3132. // check -- maybe return
  3133. if (_prefs.getCharPref('notFirstRun') == 'yes') { return; }
  3134. // set
  3135. _prefs.setCharPref('notFirstRun', 'yes');
  3136. // First Run
  3137. // =========
  3138. // add button
  3139. // ==========
  3140. __readable_by_evernote.installButtonForReadable("nav-bar", "readable_by_evernote__button");
  3141. // open info url
  3142. // =============
  3143. var defaultInfoURL = 'http://www.evernote.com/clearly/';
  3144. // bootstrap first
  3145. // ===============
  3146. __readable_by_evernote.__evernote_bootstrap.bootstrap
  3147. (
  3148. function ()
  3149. {
  3150. var url = '';
  3151. url = (url > '' ? url : __readable_by_evernote.__evernote_bootstrap.remote_domain_marketing);
  3152. url = (url > '' ? url + 'clearly/' : defaultInfoURL);
  3153. gBrowser.selectedTab = gBrowser.addTab(url);
  3154. },
  3155. function ()
  3156. {
  3157. gBrowser.selectedTab = gBrowser.addTab(defaultInfoURL);
  3158. }
  3159. );
  3160. }, false);
  3161. /**
  3162. * https://developer.mozilla.org/en/Code_snippets/Toolbar#Adding_button_by_default
  3163. * + the old toolbar-button-init.js in the Firefox Evernote Cliper
  3164. * + some meddling
  3165. */
  3166. __readable_by_evernote.installButtonForReadable = function (_toolbarId, _buttonId)
  3167. {
  3168. // already exists
  3169. if (document.getElementById(_buttonId)) { return; }
  3170. // toolbar
  3171. var _toolbar = document.getElementById(_toolbarId);
  3172. if (_toolbar); else { return; }
  3173. // insert
  3174. var _set = _toolbar.getAttribute('currentset');
  3175. _set = (_set > '' ? _set : _toolbar.getAttribute('defaultset'));
  3176. _set += ',' + _buttonId;
  3177. // add
  3178. _toolbar.insertItem(_buttonId, null, null, false);
  3179. _toolbar.setAttribute('currentset', _set);
  3180. _toolbar.currentset = _set;
  3181. // persist
  3182. try { BrowserToolboxCustomizeDone(true); } catch (e) { }
  3183. document.persist(_toolbarId, 'currentset');
  3184. };