PageRenderTime 61ms CodeModel.GetById 23ms 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

Large files files are truncated, but you can click here to view the full 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

Large files files are truncated, but you can click here to view the full file