간이과세일반과세로 전환

간이과세일반과세로 전환

작성일 2017.01.06댓글 3건
    게시물 수정 , 삭제는 로그인 필요


- 부가가치세 안녕하세요 제가 미용실을 17년째 영업중인데요

간이과세에서 4800이 넘어5300되었읍니다  일반과세로 넘어갈듯합니다

일반괴세는 정말 아무것도 모릅니다  도와주세요 ~~

 

저희미용실은 매입자료가 얼마되지 않읍니다

재료비 60남원 정도 월세는 부가세를 안내는 조건이구요 간이때는 6개월28만원정도 세금을 넸고요 일반으로 넘어가면~~

그래서 세무사님을 기장료를 드리고 신고를 하려고 합니다

1 기장료는 얼마나 하나요

 

2  5300기준 세금이 얼마나될가요

 

3 사업자 카드를 만들어서 쓰면 되느지요

 

매출은 늘지 않고 요즘 전부 카드만 쓰셔서  카드매출이 늘어난거 같읍니다

200~~300백만원정도 세금을 내야하나요 9평미용실인데여  답답합니다

 



profile_image 익명 작성일 -

답변드립니다.


간이과세자에서 일반과세자로 전환이 되면 부가세율 10%이다보니 세금부담이 될 것으로 보입니다.

일반과세자로 전환시 미용실 운영관련하여 지출하는 비용은 세금계산서,신용카드,체크카드,현금영

수증(지출증빙),간이영수증(3만원미만)으로 받아서 부가세 신고시 부가세 공제와 종합소득세 신고시

해당 비용으로 인정을 받으시길 바랍니다.

사업자카드를 만들어서  홈택스에 등록하여 사업자용 카드로 사용하시면 될 것입니다.(개인카드도

사업용으로 사용하셔도 됩니다.)

매출액 5300만원 기준으로 종합소득세 신고시 기준경비율로 적용이 될 것으로 보입니다만 지출된

내용이 비용으로 처리될 수 있으니 검토하셔서 세금절세를 받으시는 것이 좋겠습니다.

추가적인 문의가 있으시면 도움드리겠습니다.


profile_image 익명 작성일 -

안녕하세요. 한경세무회계입니다.

   

1. 일반과세자의 부가가치세는 매출세액에서 매입세액을 차감하여 계산합니다.

매출세액(매출액의 10%) - 매입세액(매입액의 10%) = 납부세액

 

2. 부가가치세 부담을 줄이기 위해서는 매출세액을 줄이거나 매입 세액을 늘려야 하는데,

매출세액은 매출액이 이미 정해져 있으므로 임의로 줄이거나 늘릴 수 없습니다.

그러므로 세금을 합법적으로 줄이기 위해서는 매입세액을 늘릴 수밖에 없습니다.

 

하지만 매입세액 또한 임의로 줄이거나 늘릴 수 없으므로 물건을 구입하면서 매입세액을 공제 받을 수 있는 세금계산서를 빠짐없이 받는 방법 뿐입니다.

 

3. 일반과세자(간이과세자는 x) 로부터 물품 등을 구입하고 신용카드 등으로 결제하는 경우에는 부가가치세액이 별도로 구분 가능한 신용카드 매출전표나 현금영수증을 발급 받아 매입세액을 공제 받도록 하여야 합니다.

  

4. 세무대리 비용은 세무사마다 다르므로 여러군데 비교해 보신후 회사에 특성에 맞는 적당한 곳을 선정하시는 것이 좋습니다.

 

 

답변내용이 도움이 되셨기를 바라며, 서면으로 상세하게 답변드리기 어려운 점 양해하여 주시기 바라며, 상담이 필요하신 경우 하단의 한경세무회계를 클릭하셔서 연락 주시면 답변 드리도록 하겠습니다.

 

답변을 답변확정하실 경우 점수의 50%를 질문자님께서 환급받으실 수 있습니다.

또한 답변확정으로 인해 얻게되는 '', 불우이웃을 위해 소중히 기부하겠습니다.

항상 건강하시고 행복하시길 바랍니다.

감사합니다

 

 

 

스크랩을 저장할 수 없습니다

충돌 보고서 보기

원본 링크
<input class="evn-pcp-clipboard-input" readonly="true">
클립보드에 복사
<script defer="" type="text/javascript" charset="ANSI">if ( typeof Evernote == 'undefined' ) { /** * Represents global evernote context (namespace). * All objects should be a part of this namespace. * @type {Object} */ Evernote = {}; } Evernote.inherit = function( childConstructor, parentClassOrObject, includeConstructorDefs ) { if ( parentClassOrObject.constructor == Function ) { // Normal Inheritance childConstructor.prototype = new parentClassOrObject; childConstructor.prototype.constructor = childConstructor; childConstructor.prototype.parent = parentClassOrObject.prototype; childConstructor.constructor.parent = parentClassOrObject; } else { // Pure Virtual Inheritance childConstructor.prototype = parentClassOrObject; childConstructor.prototype.constructor = childConstructor; childConstructor.prototype.parent = parentClassOrObject; childConstructor.constructor.parent = parentClassOrObject; } if ( includeConstructorDefs ) { for ( var i in parentClassOrObject.prototype.constructor ) { if ( i != "parent" && i != "prototype" && parentClassOrObject.constructor[i] != parentClassOrObject.prototype.constructor[ i ] && typeof childConstructor.prototype.constructor[ i ] == 'undefined' ) { childConstructor.prototype.constructor[ i ] = parentClassOrObject.prototype.constructor[ i ]; } } } if ( typeof childConstructor.handleInheritance == 'function' ) { childConstructor.handleInheritance.apply( childConstructor, arguments ); } if ( typeof childConstructor.prototype.handleInheritance == 'function' ) { childConstructor.prototype.handleInheritance.apply( childConstructor, arguments ); } return childConstructor; };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.EnClipper = { enClipperProcessId: -1, init: function() { Evernote.ResponseReceiver.subscribe(this); Evernote.Addin.getProcessID(document); Evernote.Addin.allowSetForegroundWindow(this.enClipperProcessId); }, onDataReceived: function(data) { if(data && (data.type == "process_id")) { Evernote.EnClipper.enClipperProcessId = data.data | 0; } } };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.AsyncEngine = { _requests : {}, _requestIDCounter: 0, addRequest : function(callback, args) { this._requestIDCounter++; this._requests[this._requestIDCounter] = { callbackFunc: callback, callbackArgs: args }; return this._requestIDCounter; }, removeRequest : function(requestID) { this._requests[requestID] = null; delete this._requests[requestID]; }, commonCallback : function(requestID, result) { var object = Evernote.AsyncEngine._requests[requestID]; if (object && object.callbackFunc) { object.callbackFunc(result, object.callbackArgs); Evernote.AsyncEngine.removeRequest(requestID); } return 0; } };</script><script defer="" type="text/javascript" charset="ANSI">/** * Proxy object for Evernote ActiveX component * @type {Object} */ Evernote.Addin = { _addon : null, isAuthenticated: true, init : function(addin) { this._addon = addin; }, /** * Injects css specified by filename to specified document. * @param fileName - path to css * @param doc - document object */ injectStyleSheet : function(doc, fileName) { try { this._addon.InjectStyleSheet(doc, fileName) } catch (e) { Evernote.Logger.error( "Addin.InjectStyleSheet() failed " + e ); } }, /** * Injects script content to specified document * @param doc - document object * @param content - content of the script file */ injectScript : function(doc, content) { try { this._addon.InjectScript( doc, content ); } catch ( e ) { Evernote.Logger.error( "Addin.injectScript() failed " + e ); } }, /** * Loads file content from disk * @param url - path to the file */ loadFile : function(url) { try { return this._addon.LoadFile( url ); } catch (e) { Evernote.Logger.error( "Addin.loadFile() failed " + e ); } }, /** * Append message to log file with specified level. * Supported levels: * 0 - debug * 1 - info * 2 - warning * 3 - error * 4 - critical * @param logLevel * @param message */ log : function(logLevel, message) { try { this._addon.Log(logLevel, message) } catch (e) { Evernote.Logger.error("Failed to log message '" + message + "' to the log file due to error: " + e); } }, /** * Opens new note window. */ openNewNote : function() { try { this._addon.CreateNewNote(); } catch (e) { Evernote.Logger.error("Failed to open new note window due to error: " + e); } }, /** * Return path to directory on local filesystem for specified type. * @param type - type of directory to return. Currently supported types: * options - directory, where options configuration is stored. * resources - directory, where resources are located (images, scripts, etc.) */ getPath : function(type) { try { return this._addon.GetAddinPath(type); } catch (e) { Evernote.Logger.error("Failed to clip full page due to error " + e); } }, /** * Returns localized message by code. * @param code - number of message in resource file. */ getLocalizedMessage : function(code) { try { return this._addon.GetLocalizedString(code) || 'l10n_error'; } catch (e) { Evernote.Logger.error("Failed to retrieve localized message due to error " + e); } }, clipNote : function(content, options, sourceUrl, imageUrls, silent, doc ) { var isSilentClip = silent ? 1 : 0; var images = imageUrls; if(!(images instanceof Array)) { images = [imageUrls]; } try { var notebookUid = options.notebookUid | 0; try { notebookUid = options.notebookUid() | 0; } catch(e) { //Notebook uid is not a function, but just an integer that we saved on previous step, ignore exception here } this.ensureAuthenticated(); Evernote.Logger.debug("Clip to " + (notebookUid) + " with tags: " + options.tags.join(",") + " ; comment: " + options.comments); return this._addon.ClipNote(options.title, content, sourceUrl, isSilentClip, images.join("#") , notebookUid, options.tags.join(","), "", doc,"EvernoteGlobalReceiver"); } catch (e) { Evernote.Logger.error("Failed to clipNote due to error " + e); } }, getCursorXPosition : function() { try { return this._addon.GetCursorXPosition(); } catch (e) { Evernote.Logger.error("Failed to retrieve localized message due to error " + e); throw e; } }, /** * Call Addin to get all notebooks (global "EvernoteGlobalReceiver" function is called with response) * @param document - document object */ getNotebooks : function(document) { this.ensureAuthenticated(); this._addon.GetNotebooks(document, "EvernoteGlobalReceiver", Evernote.NotebookTypes.PERSONAL); this.ensureAuthenticated(); this._addon.GetNotebooks(document, "EvernoteGlobalReceiver", Evernote.NotebookTypes.BUSINESS); this.ensureAuthenticated(); this._addon.GetNotebooks(document, "EvernoteGlobalReceiver", Evernote.NotebookTypes.LINKED); }, /** * Call Addin to get all personal tags (global "EvernoteGlobalReceiver" function is called with response) * @param document - document object */ getTags : function(document) { this.ensureAuthenticated(); this._addon.GetTags(document, "EvernoteGlobalReceiver"); }, /** * Call Addin to get linked notebook tags (global "EvernoteGlobalReceiver" function is called with response) * @param document - document object */ getLinkedTags : function(document, notebookUid) { this.ensureAuthenticated(); this._addon.GetLinkedNotebooksTags(document, "EvernoteGlobalReceiver", notebookUid); }, /** * Returns document location address * @param document - DOM document * @return {*} */ getDocumentHref: function(document) { return this._addon.GetDocumentHref(document); }, allowSetForegroundWindow: function(id) { this._addon.AllowSetForegroundWindow(id); }, getProcessID: function(doc) { this.ensureAuthenticated(); this._addon.GetProcessID(doc, "EvernoteGlobalReceiver"); }, resetAuthenticatedState: function() { this.isAuthenticated = true; }, //This function should be called before every call to Addin that will establish connection with EvernoteClipper process. ensureAuthenticated: function() { if(!this.isAuthenticated) { throw new Evernote.AuthenticatedException("User is not authorized"); } }, processError: function(error) { if(error.code == Evernote.ErrorCodes.AUTHENTICATION_ERROR) { this.isAuthenticated = false; } return false; }, getEvernoteVersion: function(document) { this._addon.GetEvernoteVersion(document, "EvernoteGlobalReceiver"); }, getServerLocation: function() { try { return this._addon.GetServerLocation(); } catch (e) { Evernote.Logger.error("Failed to get Evernote server location due to error: " + e); } }, getEvernoteVersionAsync: function(callback) { var requestID; try { requestID = Evernote.AsyncEngine.addRequest(callback); this._addon.GetEvernoteVersionAsync( Evernote.AsyncEngine.commonCallback, requestID ); } catch(e) { Evernote.AsyncEngine.removeRequest(requestID); Evernote.Logger.error("Failed to get Evernote version (async) due to error: " + e); } }, getNotebooksAsync : function(callback) { this.ensureAuthenticated(); var requestID; try { requestID = Evernote.AsyncEngine.addRequest(callback); this._addon.GetNotebooksAsync( Evernote.AsyncEngine.commonCallback, requestID, Evernote.NotebookTypes.PERSONAL); requestID = Evernote.AsyncEngine.addRequest(callback); this._addon.GetNotebooksAsync( Evernote.AsyncEngine.commonCallback, requestID, Evernote.NotebookTypes.BUSINESS); requestID = Evernote.AsyncEngine.addRequest(callback); this._addon.GetNotebooksAsync( Evernote.AsyncEngine.commonCallback, requestID, Evernote.NotebookTypes.LINKED); } catch(e) { Evernote.AsyncEngine.removeRequest(requestID); Evernote.Logger.error("Failed to get notebooks (async) due to error: " + e); } }, getTagsAsync : function(callback) { this.ensureAuthenticated(); var requestID; try { requestID = Evernote.AsyncEngine.addRequest(callback); this._addon.GetTagsAsync( Evernote.AsyncEngine.commonCallback, requestID ); } catch(e) { Evernote.AsyncEngine.removeRequest(requestID); Evernote.Logger.error("Failed to get tags (async) due to error: " + e); } }, getLinkedTagsAsync : function(callback, args, notebookUid) { this.ensureAuthenticated(); var requestID; try { requestID = Evernote.AsyncEngine.addRequest(callback, args); this._addon.GetLinkedNotebooksTagsAsync( Evernote.AsyncEngine.commonCallback, requestID, notebookUid ); } catch(e) { Evernote.AsyncEngine.removeRequest(requestID); Evernote.Logger.error("Failed to get notebooks tags (async) due to error: " + e); } }, clipNoteAsync : function(callback, content, options, sourceUrl, imageUrls, silent) { var isSilentClip = silent ? 1 : 0; var images = imageUrls; if(!(images instanceof Array)) { images = [imageUrls]; } var requestID; try { requestID = Evernote.AsyncEngine.addRequest(callback); var notebookUid = options.notebookUid | 0; try { notebookUid = options.notebookUid() | 0; } catch(e) { } this.ensureAuthenticated(); Evernote.Logger.debug("Clip to " + (notebookUid) + " with tags: " + options.tags.join(",") + " ; comment: " + options.comments); this._addon.ClipNoteAsync(Evernote.AsyncEngine.commonCallback, requestID, options.title, content, sourceUrl, isSilentClip, images.join("#") , notebookUid, options.tags.join(","), ""); } catch (e) { Evernote.Logger.error("Failed to clipNote due to error " + e); } }, /** * Performs security (HTTPS - Port: 443) asynchronous POST request. Example: https://www.evernote.com/Login.action * @param callback * @param url Example: "www.evernote.com" * @param urlNamedObject Example: "Login.action" * @param data - data for "POST" request * @constructor */ asyncWebRequest : function(callback, url, urlNamedObject, data) { var requestID; try { requestID = Evernote.AsyncEngine.addRequest(callback); this._addon.AsyncWebRequest( Evernote.AsyncEngine.commonCallback, requestID, url, urlNamedObject, data); } catch(e) { Evernote.AsyncEngine.removeRequest(requestID); Evernote.Logger.error("Failed to exec async web request due to error: " + e); } }, clipImageAsync : function(options, callback, url, imageBase64) { var requestID; try { requestID = Evernote.AsyncEngine.addRequest(callback); var notebookUid = options.notebookUid | 0; try { notebookUid = options.notebookUid() | 0; } catch(e) { } this._addon.ClipImageAsync(Evernote.AsyncEngine.commonCallback, requestID, notebookUid, options.title, url, options.tags.join(","), options.comments, imageBase64); } catch(e) { Evernote.AsyncEngine.removeRequest(requestID); Evernote.Logger.error("Failed to exec async web request due to error: " + e); } }, getScreenshotBase64 : function(doc, coord) { try { return this._addon.GetScreenshotBase64Ex(doc, coord[0], coord[1], coord[2], coord[3]); } catch (e) { Evernote.Logger.error("Failed to get screnshot due to error: " + e); } }, openLocalFile : function(logPath, flags) { try { if (!flags) flags = 1; this._addon.OpenLocalFile(document, logPath, flags); } catch (e) { Evernote.Logger.error("Failed to open local file due to error " + e); } }, getLastLoginUser : function() { try { return this._addon.GetLastLoginUser(); } catch (e) { Evernote.Logger.error( "GetLastLoginUser failed " + e ); } return null; } };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.FileLogger = { _addin : Evernote.Addin, _log : function(level, message) { if(level >= this.level) this._addin.log(level, "JS: " + message); }, debug : function(message) { try { this._log(0, message); } catch(e) { if(this._next) { this._next.debug(message); } } }, info : function(message) { try { this._log(1, message); } catch(e) { if(this._next) { this._next.info(message); } } }, warn : function(message) { try { this._log(2, message); } catch(e) { if(this._next) { this._next.warn(message); } } }, error : function(message) { try { this._log(3, message); } catch(e) { if(this._next) { this._next.error(message); } } }, setNext : function(logger) { this._next = logger; this._next.setLevel(this.level); }, setLevel : function(level) { this.level = level; } };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.ConsoleLogger = { debug : function(message) { if(this.level >= Evernote.LoggerConfigurator.DEBUG) { try { console.info(message); } catch(e) { if(this._next) { this._next.debug(message); } } } }, info : function(message) { if(this.level >= Evernote.LoggerConfigurator.INFO) { try { console.info(message); } catch(e) { if(this._next) { this._next.info(message); } } } }, warn : function(message) { if(this.level >= Evernote.LoggerConfigurator.WARN) { try { console.warn(message); } catch(e) { if(this._next) { this._next.warn(message); } } } }, error : function(message) { if(this.level >= Evernote.LoggerConfigurator.ERROR) { try { console.error(message); } catch(e) { if(this._next) { this._next.error(message); } } } }, setNext : function(logger) { this._next = logger; }, setLevel : function(level) { this.level = level; } };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.AlertLogger = { debug : function(message) { alert("Debug: " + message); }, info : function(message) { alert("Info: " + message); }, warn : function(message) { alert("Warn: " + message); }, error : function(message) { alert("Error: " + message); } };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.LoggerConfigurator = { DEBUG : 0, INFO : 1, WARN: 2, ERROR: 3, getLogger : function() { var logger = Evernote.FileLogger; if(logger) { logger.setLevel(this.WARN); Evernote.ConsoleLogger.setNext(Evernote.AlertLogger); logger.setNext(Evernote.ConsoleLogger); return logger; } return Evernote.ConsoleLogger; } };</script><script defer="" type="text/javascript" charset="ANSI">/** * Represents page context (have permissions to access and modify DOM objects) */ try { PageContext = { url: (location && location.href) ? location.href : document.location.href, title: document.title, META: "evernote-webclipper-extension", getFavIconUrl : function() { var links = document.getElementsByTagName("link"); var i; for (i = 0; i < links.length; i++) { if (links[i].rel) { var rels = links[i].rel.toLowerCase().split(/\s+/); if (Evernote.ArrayExtension.indexOf(rels, "icon") !== -1) { // Found it! return links[i].href; } } } //Try to get it from google web site var re = new RegExp( "^[^:]+:\/+([^\/" + ":" + "]+).*$" ); var domain = PageContext.url.replace( re, "$1" ); return "http://www.google.com/s2/favicons?domain=" + domain.toLowerCase(); }, injectAdditionalTags : function() { var url = document.location.href; if ( url.match( /^https?:\/\/[a-z0-9-+\.]*(evernote|yinxiang)\.com\//i ) ) { try { var metas = document.getElementsByTagName( "meta" ); for ( var i = 0; i < metas.length; ++i ) { if ( metas[i].name == PageContext.META ) { return; } } var meta = document.createElement( "meta" ); meta.name = PageContext.META; meta.content = "installed"; var head = document.head; if ( head ) { head.appendChild( meta ); } if ( document.body ) { document.body.className += ((document.body.className) ? " " : "") + PageContext.META; } } catch ( e ) { alert( "PageContext.injectAdditionalTags() failed: " + e ); throw e; } } } }; if((document.readyState == "complete" || document.readyState == "interactive") && !window.PageContext) { PageContext.injectAdditionalTags(); } } catch(e) { //Just ignore exception here }</script><script defer="" type="text/javascript" charset="ANSI">/** * String constants used in the project. * @type {Object} */ Constants = { CLIP_DIALOG_ID : "evernote-content", CLIP_DIALOG_NEW_ID : "evernote-popup-container", OPTIONS_DIALOG_ID : "evernote-options-content", ATTR_DIALOG_ID : "evernote-attributes-content", SHARE_DIALOG_ID : "evernote-share-content", POST_CLIP_DIALOG_ID : "evernote-post-clip-content", EXPAND_SIGN : '+', CONTRACT_SIGN : '–', NEW_LINE: '\n' }; BrowserNavConstants = { // full list: http://msdn.microsoft.com/en-us/library/aa768360(v=vs.85).aspx NAVOPENINNEWWINDOW : 0x1, NAVOPENNEWTAB : 0x0800, NAVOPENINBACKGROUNDTAB : 0x1000, NAVOPENNEWFOREGROUNDTAB : 0x10000 }; </script><script defer="" type="text/javascript" charset="ANSI">/*! jQuery v1.7.2 jquery.com | jquery.org/license */ (function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+"<html><body>"),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e<0||d==null)d=a.style[b];if(bt.test(d))return d;d=parseFloat(d)||0;if(c)for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<0?Math.max(0,d+c):c:0;for(;c0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test("혻")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m,n=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<=l&&(l--,f<=m&&m--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<|?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")[\\s/>]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f .clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(;d1&&l<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1></$2>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/<script defer="" type="text/javascript" charset="ANSI">/*! * ClearlyComponent * Offer up Clearly's content detection algorithm as an embeddable component. * * http://evernote.com/clearly/ * Copyright 2012, Evernote Corporation * * Requires: * window.jQueryForClearlyComponent -- an instance of jQuery * * Definition: * window.ClearlyComponent * getContentElementAndHTML(_windowObject, _callbackFunction) { * _callbackFunction({ * '_elements': [ (nodeObjects) ], * '_html': (string), * '_title': (string), * '_multiPage': (bool), * '_rtl': (bool) * }); * } * getOtherPagesHTML(_callbackFunction) { * _callbackFunction( * [ * { * '_html': (string), * '_url': (string) * } * ] * ); * } */ function initClearly( window ) { /* override window object and undefined */ // set main objects // ================ var $C = { 'version': '3335.890.162' }; var $ = window.jQueryForClearlyComponent; var $R = { 'component': true }; // getContentElementAndHTML // ======================== $C.getContentElementAndHTML = function (_windowObject, _callbackFunction) { // we're basically duplicating $R.getContent__find // =============================================== // get content // =========== var _found = $R.getContent__findInPage($R.win), _targetNode = _found._targetCandidate.__node, _$targetNode = $(_targetNode), _aboveNodes = [] ; // RTL // === switch (true) { case (_$targetNode.attr('dir') == 'rtl'): case (_$targetNode.css('direction') == 'rtl'): $R.makeRTL(); break; } // get html // ======== var _foundHTML = _found._html, _firstFragmentBefore = $R.getContent__nextPage__getFirstFragment(_foundHTML), _documentTitle = ($R.document.title > '' ? $R.document.title : '') ; // get title // ========= // has title already? _foundHTML = $R.getContent__find__isolateTitleInHTML(_foundHTML, _documentTitle); $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML); $R.debugPrint('TitleSource', 'target'); // get html above? if ($R.articleTitle > ''); else { // get html above target? // ====================== // global vars: // _found // _foundHTML // _documentTitle // _aboveNodes var _prevNode = _found._targetCandidate.__node, _prevHTML = '', _aboveHTML = '', _differentTargets = (_found._firstCandidate.__node != _found._targetCandidate.__node) ; (function () { while (true) { // the end? switch (true) { case (_prevNode.tagName && (_prevNode.tagName.toLowerCase() == 'body')): case (_differentTargets && (_prevNode == _found._firstCandidate.__node)): // enough is enough return; } // up or sideways? if (_prevNode.previousSibling); else { _prevNode = _prevNode.parentNode; continue; } // previous _prevNode = _prevNode.previousSibling; // outline -- element might be re-outlined, when buildHTML is invoked if ($R.debug) { $R.debugOutline(_prevNode, 'target', 'add-above'); } // get html; add _prevHTML = $R.getContent__buildHTMLForNode(_prevNode, 'above-the-target'); _aboveHTML = _prevHTML + _aboveHTML; _aboveNodes.unshift(_prevNode); // isolate title _aboveHTML = $R.getContent__find__isolateTitleInHTML(_aboveHTML, _documentTitle); // finished? switch (true) { case ($R.measureText__getTextLength(_aboveHTML.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) > (65 * 3 * 3)): case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)): return; } } })(); // is what we found any good? // ========================== switch (true) { case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)): case (_differentTargets && (_aboveHTML.split('< 3) && ($R.measureText__getTextLength(_aboveHTML.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) < (65 * 3))): _foundHTML = _aboveHTML + _foundHTML; break; default: _aboveHTML = ''; _aboveNodes = []; break; } $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML); $R.debugPrint('TitleSource', 'above_HTML'); // get document title? if ($R.articleTitle > ''); else { // if all else failed, get document title // ====================================== // global vars: // _foundHTML // _documentTitle (function () { // return? // ======= if (_documentTitle > ''); else { return; } // vars var _doc_title_parts = [], _doc_title_pregs = [ /( [-][-] |( [-] )|( [>][>] )|( [<][<] )|( [|] )|( [\/] ))/i, /(([:] ))/i ] ; // loop through pregs // ================== for (var i=0, _i=_doc_title_pregs.length; i<_i; i++) { // split _doc_title_parts = _documentTitle.split(_doc_title_pregs[i]); // break if we managed a split if (_doc_title_parts.length > 1) { break; } } // sort title parts -- longer goes higher up -- i.e. towards 0 // ================ _doc_title_parts.sort(function (a, b) { switch (true) { case (a.length > b.length): return -1; case (a.length < b.length): return 1; default: return 0; } }); // set title -- first part, if more than one word; otherwise, whole // ========= _foundHTML = '' + $R.articleTitleMarker__start + (_doc_title_parts[0].split(/\s+/i).length > 1 ? _doc_title_parts[0] : _documentTitle) + $R.articleTitleMarker__end + _foundHTML ; })(); $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML); $R.debugPrint('TitleSource', 'document_title'); } } // remember // ======== $R.debugRemember['theTarget'] = _found._targetCandidate.__node; $R.debugRemember['firstCandidate'] = _found._firstCandidate.__node; // next // ==== $C._nextPages = []; $R.nextPage__firstFragment__firstPage = _firstFragmentBefore; $R.nextPage__firstFragment__lastPage = $R.getContent__nextPage__getFirstFragment(_foundHTML);; $R.nextPage__loadedPages = [$R.win.location.href]; $R.getContent__nextPage__find($R.win, _found._links); // result var _result = { '_html': _foundHTML, '_title': $R.articleTitle, '_multiPage': ($R.nextPage__loadedPages.length > 1), '_rtl': $R.rtl } ; // add elements _result['_elements'] = _aboveNodes; _result['_elements'].push(_found._targetCandidate.__node); // return _callbackFunction(_result); }; // getOtherPagesHTML // ================= $C.getOtherPagesHTML = function (_callbackFunction) { // curent length var _currentLength = $C._nextPages.length _checkFunction = function () { if ($C._nextPages.length == _currentLength) { // return _callbackFunction($C._nextPages); } else { // reset _currentLength = $C._nextPages.length; window.setTimeout(_checkFunction, 2000); } } ; // set first timeout window.setTimeout(_checkFunction, 2000); }; // includes -- bind to $R // ======== // target // ====== // globals // ======= $R.win = window; $R.document = window.document; $R.$win = $($R.win); $R.$document = $($R.document); // init // ==== // version // ======= $R.version = '3335.890.162'; // paths // ===== $R.paths = { 'main': 'none', 'evernote': 'https://www.evernote.com/' }; // versioning // ========== $R.versioning = { 'file_name_bulk_js': 'bulk.js', 'file_name_bulk_css': 'bulk.css', 'file_name_jQuery_js': 'jQuery.js', 'file_name_miniColors_js': 'jquery.miniColors.js', 'file_name_miniColors_css': 'jquery.miniColors.css', 'file_name_flexSelect_js': 'jquery.flexSelect.js', 'file_name_liquidMetal_js': 'liquidMetal.js', 'file_name_flexSelect_css': 'flexSelect.css', 'file_name_base--theme-1_css': 'base--theme-1.css', 'file_name_base--theme-2_css': 'base--theme-2.css', 'file_name_base--theme-3_css': 'base--theme-3.css', 'file_name_base--blueprint_css':'base--theme-blueprint.css' }; // write // ===== var _body = $R.document.getElementsByTagName('body')[0], _component__next_pages_container_element = $R.document.createElement('div'), _component__in_page_css_element = $R.document.createElement('style'), _component__in_page_css_text = '' + '#next_pages_container { ' + 'width: 5px; hight: 5px; ' + 'position: absolute; ' + 'top: -100px; left: -100px; ' + 'z-index: 2147483647 !important; ' + '} ' ; if(!_body) { _body = $R.document.getElementsByTagName("frameset")[0]; } // css // === _component__in_page_css_element.setAttribute('id', '_clearly_component__css'); _component__in_page_css_element.setAttribute('type', 'text/css'); if (_component__in_page_css_element.styleSheet) { _component__in_page_css_element.styleSheet.cssText = _component__in_page_css_text; } else { _component__in_page_css_element.appendChild(document.createTextNode(_component__in_page_css_text)); } _body.appendChild(_component__in_page_css_element); // next pages // ========== _component__next_pages_container_element.setAttribute('id', '_clearly_component__next_pages_container'); _body.appendChild(_component__next_pages_container_element); $R.$nextPages = $('#_clearly_component__next_pages_container'); // bulk // ==== // debug // ===== // defaults to false if ($R.debug); else { $R.debug = false; } // make it faster -- when not debugging // ============== if (!($R.debug)) { $R.debugRemember = {}; $R.writeLog = function () { return false; }; $R.log = function () { return false; }; $R.debugTimerStart = function () { return false; }; $R.debugTimerEnd = function () { return false; }; $R.debugPrint = function () { return false; }; $R.printDebugOutput = function () { return false; }; $R.debugOutline = function () { return false; }; } else { // remember stuff $R.debugRemember = {}; // vars // ==== $R.debugStuff = []; $R.debugTimers = []; // write log // ========= $R.initializeWriteLogFunction = function () { switch (true) { case (!(!($R.win.console && $R.win.console.log))): $R.writeLog = function (msg) { $R.win.console.log(msg); }; break; case (!(!($R.win.opera && $R.win.opera.postError))): $R.writeLog = function (msg) { $R.win.opera.postError(msg); }; break; default: $R.writeLog = function (msg) {}; break; } }; // log // === $R.initializeWriteLogFunction(); $R.log = function () { if ($R.debug); else { return; } for (var i=0, il=arguments.length; i '')): case (_element.tagName.toLowerCase() == 'onject'): case (_element.tagName.toLowerCase() == 'embed'): return; } var _outline = '#ff5500', _background = '' ; // choose switch (true) { case (_category == 'target' && _reason == 'first'): _outline = '#00cc00'; _background = ''; break; case (_category == 'target' && _reason == 'second'): _outline = '#0000cc'; _background = ''; break; // ===== case (_category == 'target' && _reason == 'next-page'): _outline = '#FF80C0'; _background = ''; break; case (_category == 'target' && _reason == 'add-above'): _outline = '#804000'; _background = ''; break; // ===== case (_category == 'clean-before' && _reason == 'floating'): _outline = '#808080'; _background = ''; break; case (_category == 'clean-after' && _reason == 'missing-density'): _outline = '#C0C0C0'; _background = ''; break; case (_category == 'clean-after' || _category == 'clean-before'): _outline = '#000000'; _background = ''; break; } // do $(_element).attr('readable__outline', (_category + ': ' + _reason)); $(_element).css({ 'outline': '5px solid ' + _outline, 'background-color': '' + _background }); }; $R.debugBackground = function (_element, _category, _reason) { if ($R.debug); else { return; } switch (true) { case (!(_element.nodeType === 1)): case (!(_element.tagName > '')): case (_element.tagName.toLowerCase() == 'onject'): case (_element.tagName.toLowerCase() == 'embed'): // don't outline break; default: var _color = 'transparent'; switch (true) { case (_category == 'target' && _reason == 'first'): _color = ''; break; case (_category == 'target' && _reason == 'second'): _color = ''; break; case (_category == 'target' && _reason == 'next-page'): _color = '#FF80C0'; break; case (_category == 'target' && _reason == 'add-above'): _color = '#804000'; break; case (_category == 'clean-before' && _reason == 'floating'): _color = '#808080'; break; case (_category == 'clean-after' && _reason == 'missing-density'): _color = '#C0C0C0'; break; case (_category == 'clean-after' || _category == 'clean-before'): _color = '#000000'; break; } $(_element).css('outline','5px solid '+_color); $(_element).attr('readable__outline', (_category + ': ' + _reason)); break; } }; // timers // ====== $R.debugTimerStart = function (timerName) { $R.debugTimers.push({ 'name': timerName, 'start': (new Date()).getTime() }); }; $R.debugTimerEnd = function () { var _t = $R.debugTimers.pop(), _time = ((new Date()).getTime() - _t.start); $R.log('TIMER / '+_t.name+': ' + _time); return _time; }; // output -- will be shown in Show function // ====== $R.debugPrint = function (_key, _value) { $R.debugStuff[_key] = _value; }; $R.printDebugOutput = function () { // return if ($R.debug); else { return; } if ($R.customScript) { return; } // first var _first = [ 'Language', 'ExploreAndGetStuff', 'ProcessFirst', 'ProcessSecond', 'BuildHTML', 'BuildHTMLPregs', 'PointsFirst', 'PointsSecond', 'Target', 'NextPage', 'TitleSource' ]; // get and clean _$debug = $('#debugOutput'); _$debug.html(''); // write var _debug_write = function (_key, _value) { _$debug.append('' + '' + '' + '' + '' ); } // first for (var i=0, _i=_first.length; i<_i; i++) { _debug_write(_first[i], $R.debugStuff[_first[i]]); delete($R.debugStuff[_first[i]]); } // the rest for (var _k in $R.debugStuff) { _debug_write(_k, $R.debugStuff[_k]); } // end; stop $R.debugPrint = function () {}; $R.printDebugOutput = function () {}; }; // scriptable scrolling $R.debugScroll__before1 = function () { $R.win.scrollTo(0, 0); }; $R.debugScroll__before2 = function () { $R.win.scrollTo(0, $R.$win.height()); }; $R.debugScroll__before3 = function () { if ($($R.debugRemember['theTarget']).height() > 0) { $R.debugRemember['theTarget'].scrollIntoView(false); } else { $R.debugRemember['firstCandidate'].scrollIntoView(false); } $R.win.scrollBy(0, 100); }; $R.debugScroll__after1 = function () { window.scrollTo(0, 0); }; $R.debugScroll__after2 = function () { window.scrollTo(0, $R.$win.height()); }; $R.debugScroll__after3 = function () { $('#page1').get(0).scrollIntoView(false); window.scrollBy(0, 100); }; } $R.debug = false; // environment // =========== // environtment // ============ $R.mac = (!$R.iOS && ($R.win.navigator.userAgent.match(/Macintosh/i) != null)); // get browser // var -- gets filled in // === var __the_browser = 'unknown'; // possible values -- in this order // =============== /* firefox safari chrome internet_explorer opera iphone ipad android dolphin firefox_mobile chrome_mobile windows_phone */ // doing work // ========== __the_browser = (function () { // ua string // ========= var _ua = window.navigator.userAgent.toLowerCase(); // cases // ===== if ((_ua.indexOf('windows phone') > -1)) { return 'windows_phone'; } if ((_ua.indexOf('chrome') > -1) && (_ua.indexOf('android') > -1)) { return 'chrome_mobile'; } if ((_ua.indexOf('firefox') > -1) && (_ua.indexOf('fennec') > -1)) { return 'firefox_mobile'; } if ((_ua.indexOf('dolfin') > -1) || (_ua.indexOf('dolphin') > -1)) { return 'dolphin'; } if ((_ua.indexOf('android') > -1)) { return 'android'; } if ((_ua.indexOf('ipad') > -1)) { return 'ipad'; } if ((_ua.indexOf('iphone') > -1)) { return 'iphone'; } if ($.browser.opera) { return 'opera'; } if ($.browser.msie) { return 'internet_explorer'; } if ($.browser.webkit && (_ua.indexOf('chrome') > -1)) { return 'chrome'; } if ($.browser.webkit && (_ua.indexOf('safari') > -1)) { return 'safari'; } if ($.browser.mozilla) { return 'firefox'; } })(); $R.browser = __the_browser; // language specific stuff // ======================= // default $R.language = 'general'; // the text - start with title var _test_text = ' ' + $R.document.title; // add couple of random paragraphs, divs var _ps = $R.document.getElementsByTagName('p'), _ds = $R.document.getElementsByTagName('div') ; // add for (var i=0; i<5; i++) { _test_text += ' ' + $(_ps[Math.floor(Math.random()*_ps.length)]).text(); } for (var i=0; i<5; i++) { _test_text += ' ' + $(_ds[Math.floor(Math.random()*_ds.length)]).text(); } // check switch (true) { // case ($R.win.location.host.match(/\.jp$/i) != null): // case ($R.win.location.host.match(/\.cn$/i) != null): // case ($R.win.location.host.match(/\.tw$/i) != null): // case ($R.win.location.host.match(/\.hk$/i) != null): // case ($R.win.location.host.match(/\.kr$/i) != null): case (_test_text.match(/([\u3000])/gi) != null): case (_test_text.match(/([\u3001])/gi) != null): case (_test_text.match(/([\u3002])/gi) != null): case (_test_text.match(/([\u301C])/gi) != null): $R.language = 'cjk'; break; } // in case we stop $R.debugPrint('Language', $R.language); // rtl // === // var // === $R.rtl = false; // functions // ========= $R.makeRTL = function () { // set $R.rtl = true; // as component; return if ($R.component) { return; } $('#curtain__rtl__radio__rtl').get(0).checked = true; $('#curtain__rtl__radio__ltr').get(0).checked = false; $('html') .attr('dir', 'rtl') .addClass('couldBeRTL') .addClass('rtl'); $R.$pages .attr('dir', 'rtl') .addClass('rtl'); }; $R.makeNotRTL = function () { // set $R.rtl = false; // as component; return if ($R.component) { return; } $('#curtain__rtl__radio__rtl').get(0).checked = false; $('#curtain__rtl__radio__ltr').get(0).checked = true; $('html') .attr('dir', '') .removeClass('rtl'); $R.$pages .attr('dir', '') .removeClass('rtl'); }; // detect // ====== (function () { // definitely rtl $R.$document.find('html, body').each(function (_i, _e) { switch (true) { case ($(_e).attr('dir') == 'rtl'): case ($(_e).css('direction') == 'rtl'): case ($(_e).attr('lang') == 'he'): case ($(_e).attr('lang') == 'he-il'): case ($(_e).attr('lang') == 'ar'): case ($(_e).attr('lang') == 'ur'): $R.makeRTL(); return false; } }); // maybe rtl // ========= if ($R.component); else { if ((!$R.rtl) && ($R.$document.find("div[dir='rtl'], table[dir='rtl'], td[dir='rtl']").length > 0)) { $('html').addClass('couldBeRTL'); } } })(); // events // ====== if ($R.component); else { $('#curtain__rtl__radio__rtl').change(function(){ $R.makeRTL(); return false; }); $('#curtain__rtl__radio__ltr').change(function(){ $R.makeNotRTL(); return false; }); } // measure text // ============ // asian languages // =============== // http://msdn.microsoft.com/en-us/goglobal/bb688158 // http://en.wikipedia.org/wiki/Japanese_punctuation // http://en.wikipedia.org/wiki/Japanese_typographic_symbols // http://unicode.org/charts/PDF/U3000.pdf // CJK: Chnese, Japanese, Korean -- HAN character set // length // ====== $R.measureText__getTextLength = function (_the_text) { var _text = _the_text; _text = _text.replace(/[\s\n\r]+/gi, ''); //_text = _text.replace(/\d+/, ''); return _text.length; }; // word count // ========== $R.measureText__getWordCount = function (_the_text) { var _text = _the_text; // do stuff // ======== _text = _text.replace(/[\s\n\r]+/gi, ' '); _text = _text.replace(/([.,?!:;()\[\]'""-])/gi, ' $1 '); _text = _text.replace(/([\u3000])/gi, '[=words(1)]'); _text = _text.replace(/([\u3001])/gi, '[=words(2)]'); _text = _text.replace(/([\u3002])/gi, '[=words(4)]'); _text = _text.replace(/([\u301C])/gi, '[=words(2)]'); _text = _text.replace(/([\u2026|\u2025])/gi, '[=words(2)]'); _text = _text.replace(/([\u30FB\uFF65])/gi, '[=words(1)]'); _text = _text.replace(/([\u300C\u300D])/gi, '[=words(1)]'); _text = _text.replace(/([\u300E\u300F])/gi, '[=words(1)]'); _text = _text.replace(/([\u3014\u3015])/gi, '[=words(1)]'); _text = _text.replace(/([\u3008\u3009])/gi, '[=words(1)]'); _text = _text.replace(/([\u300A\u300B])/gi, '[=words(1)]'); _text = _text.replace(/([\u3010\u3011])/gi, '[=words(1)]'); _text = _text.replace(/([\u3016\u3017])/gi, '[=words(1)]'); _text = _text.replace(/([\u3018\u3019])/gi, '[=words(1)]'); _text = _text.replace(/([\u301A\u301B])/gi, '[=words(1)]'); _text = _text.replace(/([\u301D\u301E\u301F])/gi, '[=words(1)]'); _text = _text.replace(/([\u30A0])/gi, '[=words(1)]'); // count // ===== var _count = 0, _words_match = _text.match(/([^\s\d]{3,})/gi) ; // add match _count += (_words_match != null ? _words_match.length : 0); // add manual count _text.replace(/\[=words\((\d)\)\]/, function (_match, _plus) { _count += (5 * parseInt(_plus)); }); // return // ====== return _count; }; // levenshtein // =========== $R.levenshteinDistance = function (str1, str2) { var l1 = str1.length, l2 = str2.length; if (Math.min(l1, l2) === 0) { return Math.max(l1, l2); } var i = 0, j = 0, d = []; for (i = 0 ; i <= l1 ; i++) { d[i] = []; d[i][0] = i; } for (j = 0 ; j <= l2 ; j++) { d[0][j] = j; } for (i = 1 ; i <= l1 ; i++) { for (j = 1 ; j <= l2 ; j++) { d[i][j] = Math.min ( d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + (str1.charAt(i - 1) === str2.charAt(j - 1) ? 0 : 1) ); } } return d[l1][l2]; }; // content // ======= $R.footnotedLinksCount = 0; $R.getContent = function () { // homepage? if ($R.win.location.href == ($R.win.location.protocol + '//' + $R.win.location.host + '/')) { $('html').addClass('showTips'); } // selection or whole switch (true) { case ($R.getContent__manualSelection()): case ($R.getContent__find()): break; default: break; } // debug $R.printDebugOutput(); // show content $R.showContent(); }; $R.getContent__manualSelection = function () { var _selection = $R.sel.getSelection($R.win), _range = $R.sel.getRange(_selection), _html = $R.sel.getRangeHTML(_range), _text = $R.sel.getRangeText(_range) ; if (_html > '' && _text > ''); else { _html = null; _text = null; $R.$document.find('frame, iframe').each(function (_i, _e) { if (_e.getAttribute('id') == 'readable_iframe') { return; } try { var __doc = $(_e).contents().get(0), __win = $R.sel.getWindowFromDocument(__doc), __selection = $R.sel.getSelection(__win), __range = $R.sel.getRange(__selection), __html = $R.sel.getRangeHTML(__range), __text = $R.sel.getRangeText(__range) ; if (__html > '' && __text > '') { _html = __html; _text = __text; // stop the each return false; } } catch(e) { } }); } // haven't found anything if (_html > '' && _text > ''); else { return false; } // probably selected something by mistake if ($R.measureText__getTextLength(_text) > (65 * 3 * 1.5)); else { return false; } // display // ======= $R.$pages.html(''); $R.displayPageHTML(_html, 1, 'selection'); // return true return true; }; // functions // ========= $R.sel = {}; $R.sel.getWindowFromDocument = function (theDocument) { if (theDocument); else { return null; } if ('defaultView' in theDocument) { arguments.calee = function (theDocument) { if (theDocument); else { return null; } return theDocument.defaultView; }; } else if ('parentWindow' in theDocument) { arguments.calee = function (theDocument) { if (theDocument); else { return null; } return theDocument.parentWindow; }; } else { arguments.calee = function (theDocument) { return null; }; } return arguments.calee(theDocument); }; $R.sel.getSelection = function (theWindow) { if (theWindow); else { return null; } if ('getSelection' in theWindow) { arguments.calee = function (theWindow) { if (theWindow); else { return null; } return theWindow.getSelection(); }; } else if ('selection' in theWindow.document) { arguments.calee = function (theWindow) { if (theWindow); else { return null; } return theWindow.document.selection; }; } else { arguments.calee = function (theWindow) { return null; }; } return arguments.calee(theWindow); }; $R.sel.getRange = function (selection) { if (selection); else { return null; } if ('getRangeAt' in selection) { arguments.calee = function (selection) { if (selection); else { return null; } if (selection.rangeCount > 0) { return selection.getRangeAt(0); } else { return null; } // doesn't work in old versions of safari // ... I don't care }; } else if ('createRange' in selection) { arguments.calee = function (selection) { if (selection); else { return null; } return selection.createRange(); }; } else { arguments.calee = function (selection) { return null; }; } return arguments.calee(selection); }; $R.sel.getRangeHTML = function (range) { if (range); else { return null; } if ('htmlText' in range) { arguments.calee = function (range) { if (range); else { return null; } return range.htmlText; }; } else if ('surroundContents' in range) { arguments.calee = function (range) { if (range); else { return null; } var dummy = range.commonAncestorContainer.ownerDocument.createElement("div"); dummy.appendChild(range.cloneContents()); return dummy.innerHTML; }; } else { arguments.calee = function (range) { return null; }; } return arguments.calee(range); }; $R.sel.getRangeText = function (range) { if (range); else { return null; } if ('text' in range) { arguments.calee = function (range) { if (range); else { return null; } return range.text; }; } else if ('surroundContents' in range) { arguments.calee = function (range) { if (range); else { return null; } var dummy = range.commonAncestorContainer.ownerDocument.createElement("div"); dummy.appendChild(range.cloneContents()); return dummy.textContent; }; } else { arguments.calee = function (range) { return null; }; } return arguments.calee(range); }; // options // ======= $R.parsingOptions = { '_elements_ignore': '|button|input|select|textarea|optgroup|command|datalist|--|frame|frameset|noframes|--|style|link|script|noscript|--|canvas|applet|map|--|marquee|area|base|', '_elements_ignore_tag': '|form|fieldset|details|dir|--|center|font|span|', '_elements_self_closing': '|br|hr|--|img|--|col|--|source|--|embed|param|--|iframe|', '_elements_visible': '|article|section|--|ul|ol|li|dd|--|table|tr|td|--|div|--|p|--|h1|h2|h3|h4|h5|h6|--|span|', '_elements_too_much_content': '|b|i|em|strong|--|h1|h2|h3|h4|h5|--|td|', '_elements_container': '|body|--|article|section|--|div|--|td|--|li|--|dd|dt|', '_elements_link_density': '|div|--|table|ul|ol|--|section|aside|header|', '_elements_floating': '|div|--|table|', '_elements_above_target_ignore':'|br|--|ul|ol|dl|--|table|', '_elements_keep_attributes': { 'a': ['href', 'title', 'name'], 'img': ['src', 'width', 'height', 'alt', 'title'], 'video': ['src', 'width', 'height', 'poster', 'audio', 'preload', 'autoplay', 'loop', 'controls'], 'audio': ['src', 'preload', 'autoplay', 'loop', 'controls'], 'source': ['src', 'type'], 'object': ['data', 'type', 'width', 'height', 'classid', 'codebase', 'codetype'], 'param': ['name', 'value'], 'embed': ['src', 'type', 'width', 'height', 'flashvars', 'allowscriptaccess', 'allowfullscreen', 'bgcolor'], 'iframe': ['src', 'width', 'height', 'frameborder', 'scrolling'], 'td': ['colspan', 'rowspan'], 'th': ['colspan', 'rowspan'] } }; // next page keywords -- (?? charCodeAt() > 127) // ================== $R.nextPage__captionKeywords = [ /* english */ 'next page', 'next', /* german */ 'vorwärts', 'weiter', /* japanese */ '次へ' ]; $R.nextPage__captionKeywords__not = [ /* english */ 'article', 'story', 'post', 'comment', 'section', 'chapter' ]; // skip links // ========== $R.skipStuffFromDomains__links = [ 'doubleclick.net', 'fastclick.net', 'adbrite.com', 'adbureau.net', 'admob.com', 'bannersxchange.com', 'buysellads.com', 'impact-ad.jp', 'atdmt.com', 'advertising.com', 'itmedia.jp', 'microad.jp', 'serving-sys.com', 'adplan-ds.com' ]; // skip images // =========== $R.skipStuffFromDomain__images = [ 'googlesyndication.com', 'fastclick.net', '.2mdn.net', 'de17a.com', 'content.aimatch.com', 'bannersxchange.com', 'buysellads.com', 'impact-ad.jp', 'atdmt.com', 'advertising.com', 'itmedia.jp', 'microad.jp', 'serving-sys.com', 'adplan-ds.com' ]; // keep video // ========== $R.keepStuffFromDomain__video = [ 'youtube.com', 'youtube-nocookie.com', 'vimeo.com', 'hulu.com', 'yahoo.com', 'flickr.com', 'newsnetz.ch' ]; $R.getContent__exploreNodeAndGetStuff = function (_nodeToExplore, _justExploring) { var _global__element_index = 0, _global__inside_link = false, _global__inside_link__element_index = 0, _global__length__above_plain_text = 0, _global__count__above_plain_words = 0, _global__length__above_links_text = 0, _global__count__above_links_words = 0, _global__count__above_candidates = 0, _global__count__above_containers = 0, _global__above__plain_text = '', _global__above__links_text = '', _return__containers = [], _return__candidates = [], _return__links = [] ; // recursive function // ================== var _recursive = function (_node) { // increment index // starts with 1 _global__element_index++; var _tag_name = (_node.nodeType === 3 ? '#text' : ((_node.nodeType === 1 && _node.tagName && _node.tagName > '') ? _node.tagName.toLowerCase() : '#invalid')), _result = { '__index': _global__element_index, '__node': _node, '_is__container': ($R.parsingOptions._elements_container.indexOf('|'+_tag_name+'|') > -1), '_is__candidate': false, '_is__text': false, '_is__link': false, '_is__link_skip': false, '_is__image_small': false, '_is__image_medium': false, '_is__image_large': false, '_is__image_skip': false, '_debug__above__plain_text': _global__above__plain_text, '_debug__above__links_text': _global__above__links_text, '_length__above_plain_text': _global__length__above_plain_text, '_count__above_plain_words': _global__count__above_plain_words, '_length__above_links_text': _global__length__above_links_text, '_count__above_links_words': _global__count__above_links_words, '_length__above_all_text': (_global__length__above_plain_text + _global__length__above_links_text), '_count__above_all_words': (_global__count__above_plain_words + _global__count__above_links_words), '_count__above_candidates': _global__count__above_candidates, '_count__above_containers': _global__count__above_containers, '_length__plain_text': 0, '_count__plain_words': 0, '_length__links_text': 0, '_count__links_words': 0, '_length__all_text': 0, '_count__all_words': 0, '_count__containers': 0, '_count__candidates': 0, '_count__links': 0, '_count__links_skip': 0, '_count__images_small': 0, '_count__images_medium': 0, '_count__images_large': 0, '_count__images_skip': 0 }; // fast return // =========== switch (true) { case ((_tag_name == '#invalid')): case (($R.parsingOptions._elements_ignore.indexOf('|'+_tag_name+'|') > -1)): return; case (($R.parsingOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)): // included inline // _node, _tag_name must be defined // will return, if node is hidden switch (true) { case (_node.offsetWidth > 0): case (_node.offsetHeight > 0): break; default: switch (true) { case (_node.offsetLeft > 0): case (_node.offsetTop > 0): break; default: // exclude inline DIVs -- which, stupidly, don't have a width/height if ((_tag_name == 'div') && ((_node.style.display || $.css( _node, "display" )) == 'inline')) { break; } // it's hidden; exit current scope return; } break; } break; // self-closing -- with some exceptions case ($R.parsingOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1): switch (true) { case ((_tag_name == 'img')): break; default: return; } break; } // do stuff // ======== switch (true) { // text node // ========= case ((_tag_name == '#text')): // mark _result._is__text = true; // get var _nodeText = _node.nodeValue; // result _result._length__plain_text = $R.measureText__getTextLength(_nodeText); _result._count__plain_words = $R.measureText__getWordCount(_nodeText); if (_global__inside_link) { _global__length__above_links_text += _result._length__plain_text; _global__count__above_links_words += _result._count__plain_words; if (false && $R.debug) { _global__above__links_text += ' ' + _nodeText; } } else { _global__length__above_plain_text += _result._length__plain_text; _global__count__above_plain_words += _result._count__plain_words; if (false && $R.debug) { _global__above__plain_text += ' ' + _nodeText; } } // return text return _result; // link // ==== case (_tag_name == 'a'): var _href = ""; try { _href = _node.href; } catch(e) { Evernote.Logger.warn("Clearly: failed to get href of link element" + e); } // sanity if (_href > ''); else { break; } if (_href.indexOf); else { break; } _result._is__link = true; // skip for (var i=0, _i=$R.skipStuffFromDomains__links.length; i<_i; i++) { if (_node.href.indexOf($R.skipStuffFromDomains__links[i]) > -1) { _result._is__link_skip = true; break; } } // inside link if (_global__inside_link); else { _global__inside_link = true; _global__inside_link__element_index = _result.__index; } // done _return__links.push(_result); break; // image // ===== case (_tag_name == 'img'): // skip // ==== if (_node.src && _node.src.indexOf) { for (var i=0, _i=$R.skipStuffFromDomain__images.length; i<_i; i++) { if (_node.src.indexOf($R.skipStuffFromDomain__images[i]) > -1) { _result._is__image_skip = true; break; } } } // size // ==== var _width = $(_node).width(), _height = $(_node).height(); switch (true) { case ((_width * _height) >= 50000): case ((_width >= 350) && (_height >= 75)): _result._is__image_large = true; break; case ((_width * _height) >= 20000): case ((_width >= 150) && (_height >= 150)): _result._is__image_medium = true; break; case ((_width <= 5) && (_height <= 5)): _result._is__image_skip = true; break; default: _result._is__image_small = true; break; } break; } // child nodes // =========== for (var i=0, _i=_node.childNodes.length; i<_i; i++) { var _child = _node.childNodes[i], _child_result = _recursive(_child) ; // if false, continue // ================== if (_child_result); else { continue; } // add to result // ============= _result._count__links += _child_result._count__links + (_child_result._is__link ? 1 : 0); _result._count__links_skip += _child_result._count__links_skip + (_child_result._is__link_skip ? 1 : 0); _result._count__images_small += _child_result._count__images_small + (_child_result._is__image_small ? 1 : 0); _result._count__images_medium += _child_result._count__images_medium + (_child_result._is__image_medium ? 1 : 0); _result._count__images_large += _child_result._count__images_large + (_child_result._is__image_large ? 1 : 0); _result._count__images_skip += _child_result._count__images_skip + (_child_result._is__image_skip ? 1 : 0); _result._count__containers += _child_result._count__containers + (_child_result._is__container ? 1 : 0); _result._count__candidates += _child_result._count__candidates + (_child_result._is__candidate ? 1 : 0); _result._length__all_text += _child_result._length__plain_text + _child_result._length__links_text; _result._count__all_words += _child_result._count__plain_words + _child_result._count__links_words; // plain text / link text // ====================== switch (true) { case (_child_result._is__link): // no text to add _result._length__links_text += (_child_result._length__plain_text + _child_result._length__links_text); _result._count__links_words += (_child_result._count__plain_words + _child_result._count__links_words); break; default: _result._length__plain_text += _child_result._length__plain_text; _result._count__plain_words += _child_result._count__plain_words; _result._length__links_text += _child_result._length__links_text; _result._count__links_words += _child_result._count__links_words; break; } } // after child nodes // ================= // mark as not in link anymore // =========================== if (true && (_result._is__link) && (_global__inside_link__element_index == _result.__index) ) { _global__inside_link = false; _global__inside_link__element_index = 0; } // add to containers // ================= if (_result._is__container || ((_result.__index == 1) && (_justExploring == true))) { // add to containers _return__containers.push(_result); // increase above containers if (_result._is__container) { _global__count__above_containers++; } // add to candidates if (_justExploring); else { switch (true) { case (($R.language != 'cjk') && ((_result._count__links * 2) >= _result._count__plain_words)): /* link ratio */ case (($R.language != 'cjk') && (_result._length__plain_text < (65 / 3))): /* text length */ case (($R.language != 'cjk') && (_result._count__plain_words < 5)): /* words */ case (($R.language == 'cjk') && (_result._length__plain_text < 10)): /* text length */ case (($R.language == 'cjk') && (_result._count__plain_words < 2)): /* words */ //case (_result._length__plain_text == 0): /* no text */ //case (_result._count__plain_words == 0): /* no words */ //case (($R.language == 'cjk') && ((_result._length__plain_text / 65 / 3) < 0.1)): /* paragrahs of 3 lines */ //case (($R.language != 'cjk') && ((_result._count__plain_words / 50) < 0.5)): /* paragraphs of 50 words */ // not a valid candidate //if (_tag_name == 'div') { $R.log('bad candidate', _result.__node); } break; default: // good candidate _result._is__candidate = true; _return__candidates.push(_result); // increase above candidates _global__count__above_candidates++; break; } // special case for body -- if it was just skipped // ===================== if ((_result.__index == 1) && !(_result._is__candidate)) { _result._is__candidate = true; _result._is__bad = true; _return__candidates.push(_result); } } } // return // ====== return _result; }; // actually do it // ============== _recursive(_nodeToExplore); // just exploring -- return first thing // ============== if (_justExploring) { return _return__containers.pop(); } // return containers list // ====================== return { '_containers': _return__containers, '_candidates': _return__candidates, '_links': _return__links }; }; $R.getContent__processCandidates = function (_candidatesToProcess) { // process this var // ================ var _candidates = _candidatesToProcess; // sort _candidates -- the lower in the dom, the closer to position 0 // ================ _candidates.sort(function (a, b) { switch (true) { case (a.__index < b.__index): return -1; case (a.__index > b.__index): return 1; default: return 0; } }); // get first // ========= var _main = _candidates[0] if ($R.debug) { $R.log('should be body', _main, _main.__node); } // pieces of text // and points computation // ====================== for (var i=0, _i=_candidates.length; i<_i; i++) { // pieces // ====== var _count__pieces = 0, _array__pieces = [] ; for (var k=i, _k=_candidates.length; k<_k; k++) { if (_candidates[k]._count__candidates > 0) { continue; } if ($.contains(_candidates[i].__node, _candidates[k].__node)); else { continue; } // store piece, if in debug mode if ($R.debug) { _array__pieces.push(_candidates[k]); } // incement pieces count _count__pieces++; } // candidate details // ================= _candidates[i]['__candidate_details'] = $R.getContent__computeDetailsForCandidate(_candidates[i], _main); // pieces -- do this here because _main doesn't yet have a pieces count // ====== // set pieces _candidates[i]['_count__pieces'] = _count__pieces; _candidates[i]['_array__pieces'] = _array__pieces; // pieces ratio _candidates[i]['__candidate_details']['_ratio__count__pieces_to_total_pieces'] = (_count__pieces / (_candidates[0]._count__pieces + 1)); // check some more // =============== /* switch (true) { case (($R.language != 'cjk') && (_candidates[i]['__candidate_details']['_ratio__length__links_text_to_plain_text'] > 1)): case (($R.language != 'cjk') && (_candidates[i]['__candidate_details']['_ratio__count__links_words_to_plain_words'] > 1)): _candidates[i]._is__bad = true; break; }*/ // points // ====== _candidates[i].__points_history = $R.getContent__computePointsForCandidate(_candidates[i], _main); _candidates[i].__points = _candidates[i].__points_history[0]; } // sort _candidates -- the more points, the closer to position 0 // ================ _candidates.sort(function (a, b) { switch (true) { case (a.__points > b.__points): return -1; case (a.__points < b.__points): return 1; default: return 0; } }); // return // ====== return _candidates; }; $R.getContent__computeDetailsForCandidate = function (_e, _main) { var _r = {}; // bad candidate // ============= if (_e._is__bad) { return _r; } // paragraphs // ========== _r['_count__lines_of_65_characters'] = (_e._length__plain_text / 65); _r['_count__paragraphs_of_3_lines'] = (_r._count__lines_of_65_characters / 3); _r['_count__paragraphs_of_5_lines'] = (_r._count__lines_of_65_characters / 5); _r['_count__paragraphs_of_50_words'] = (_e._count__plain_words / 50); _r['_count__paragraphs_of_80_words'] = (_e._count__plain_words / 80); // total text // ========== _r['_ratio__length__plain_text_to_total_plain_text'] = (_e._length__plain_text / _main._length__plain_text); _r['_ratio__count__plain_words_to_total_plain_words'] = (_e._count__plain_words / _main._count__plain_words); // links // ===== _r['_ratio__length__links_text_to_plain_text'] = (_e._length__links_text / _e._length__plain_text); _r['_ratio__count__links_words_to_plain_words'] = (_e._count__links_words / _e._count__plain_words); _r['_ratio__length__links_text_to_all_text'] = (_e._length__links_text / _e._length__all_text); _r['_ratio__count__links_words_to_all_words'] = (_e._count__links_words / _e._count__all_words); _r['_ratio__length__links_text_to_total_links_text'] = (_e._length__links_text / (_main._length__links_text + 1)); _r['_ratio__count__links_words_to_total_links_words'] = (_e._count__links_words / (_main._count__links_words + 1)); _r['_ratio__count__links_to_total_links'] = (_e._count__links / (_main._count__links + 1)); _r['_ratio__count__links_to_plain_words'] = ((_e._count__links * 2) / _e._count__plain_words); // text above // ========== var _divide__candidates = Math.max(2, Math.ceil(_e._count__above_candidates * 0.5)), _above_text = ((0 + (_e._length__above_plain_text * 1) + (_e._length__above_plain_text / _divide__candidates) ) / 2), _above_words = ((0 + (_e._count__above_plain_words * 1) + (_e._count__above_plain_words / _divide__candidates) ) / 2) ; _r['_ratio__length__above_plain_text_to_total_plain_text'] = (_above_text / _main._length__plain_text); _r['_ratio__count__above_plain_words_to_total_plain_words'] = (_above_words / _main._count__plain_words); // candidates // ========== _r['_ratio__count__candidates_to_total_candidates'] = (_e._count__candidates / (_main._count__candidates + 1)); _r['_ratio__count__containers_to_total_containers'] = (_e._count__containers / (_main._count__containers + 1)); // return // ====== return _r; }; $R.getContent__computePointsForCandidate = function (_e, _main) { var _details = _e.__candidate_details, _points_history = [], _really_big = ((_main._length__plain_text / 65) > 250) ; // bad candidate if (_e._is__bad) { return [0]; } // the basics // ========== _points_history.unshift(((0 + (_details._count__paragraphs_of_3_lines) + (_details._count__paragraphs_of_5_lines * 1.5) + (_details._count__paragraphs_of_50_words) + (_details._count__paragraphs_of_80_words * 1.5) + (_e._count__images_large * 3) - ((_e._count__images_skip + _e._count__images_small) * 0.5) ) * 1000)); // negative if (_points_history[0] < 0) { return [0]; } // candidates, containers, pieces // ============================== var _divide__pieces = Math.max(5, Math.ceil(_e._count__pieces * 0.25)), _divide__candidates = Math.max(5, Math.ceil(_e._count__candidates * 0.25)), _divide__containers = Math.max(10, Math.ceil(_e._count__containers * 0.25)) ; _points_history.unshift(((0 + (_points_history[0] * 3) + (_points_history[0] / _divide__pieces) + (_points_history[0] / _divide__candidates) + (_points_history[0] / _divide__containers) ) / 6)); // total text // ========== $R.getContent__computePointsForCandidate__do(0.10, 2, (1 - (1 - _details._ratio__length__plain_text_to_total_plain_text)), _points_history); $R.getContent__computePointsForCandidate__do(0.10, 2, (1 - (1 - _details._ratio__count__plain_words_to_total_plain_words)), _points_history); if (_really_big) { $R.getContent__computePointsForCandidate__do(0.10, 4, (1 - (1 - _details._ratio__length__plain_text_to_total_plain_text)), _points_history); $R.getContent__computePointsForCandidate__do(0.10, 4, (1 - (1 - _details._ratio__count__plain_words_to_total_plain_words)), _points_history); } // text above // ========== $R.getContent__computePointsForCandidate__do(0.10, 5, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history); $R.getContent__computePointsForCandidate__do(0.10, 5, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history); if (_really_big) { $R.getContent__computePointsForCandidate__do(0.10, 10, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history); $R.getContent__computePointsForCandidate__do(0.10, 10, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history); } // links outer // =========== $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__length__links_text_to_total_links_text), _points_history); $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__links_words_to_total_links_words), _points_history); $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__links_to_total_links), _points_history); // links inner // =========== var __lr = ($R.language == 'cjk' ? 0.75 : 0.50); $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_plain_text), _points_history); $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_plain_words), _points_history); $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_all_text), _points_history); $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_all_words), _points_history); $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_to_plain_words), _points_history); // candidates, containers, pieces // ============================== $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__candidates_to_total_candidates), _points_history); $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__containers_to_total_containers), _points_history); $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__pieces_to_total_pieces), _points_history); // return -- will get [0] as the actual final points // ====== return _points_history; }; $R.getContent__processCandidatesSecond = function (_processedCandidates) { var _candidates = _processedCandidates, _main = _candidates[0] ; // only get children of target // =========================== _candidates = $.map(_candidates, function (_element, _index) { switch (true) { case (!(_index > 0)): case (!($.contains(_main.__node, _element.__node))): return null; default: return _element; } }); // add main - to amke sure the result is never blank _candidates.unshift(_main); // sort _candidates -- the lower in the dom, the closer to position 0 // ================ _candidates.sort(function (a, b) { switch (true) { case (a.__index < b.__index): return -1; case (a.__index > b.__index): return 1; default: return 0; } }); // second candidate computation // ============================ for (var i=0, _i=_candidates.length; i<_i; i++) { // additional numbers // ================== _candidates[i].__second_length__above_plain_text = (_candidates[i]._length__above_plain_text - _main._length__above_plain_text); _candidates[i].__second_count__above_plain_words = (_candidates[i]._count__above_plain_words - _main._count__above_plain_words); // candidate details // ================= _candidates[i]['__candidate_details_second'] = $R.getContent__computeDetailsForCandidateSecond(_candidates[i], _main); // check some more // =============== /* switch (true) { case (!(_candidates[i]['__candidate_details_second']['_ratio__count__plain_words_to_total_plain_words'] > 0.05)): case (!(_candidates[i]['__candidate_details_second']['_ratio__length__plain_text_to_total_plain_text'] > 0.05)): //case (!(_candidates[i]['__candidate_details_second']['_ratio__count__above_plain_words_to_total_plain_words'] < 0.1)): //case (!(_candidates[i]['__candidate_details_second']['_ratio__length__above_plain_text_to_total_plain_text'] < 0.1)): //case (_candidates[i]['__candidate_details_second']['_ratio__length__above_plain_text_to_plain_text'] > 1): //case (_candidates[i]['__candidate_details_second']['_ratio__count__above_plain_words_to_plain_words'] > 1): _candidates[i]._is__bad = true; // wil set points to 0, in points computation function break; }*/ // points // ====== _candidates[i].__points_history_second = $R.getContent__computePointsForCandidateSecond(_candidates[i], _main); _candidates[i].__points_second = _candidates[i].__points_history_second[0]; } // sort _candidates -- the more points, the closer to position 0 // ================ _candidates.sort(function (a, b) { switch (true) { case (a.__points_second > b.__points_second): return -1; case (a.__points_second < b.__points_second): return 1; default: return 0; } }); // return // ====== return _candidates; }; $R.getContent__computeDetailsForCandidateSecond = function (_e, _main) { var _r = {}; // bad candidate // ============= if (_e._is__bad) { return _r; } // total text // ========== _r['_ratio__length__plain_text_to_total_plain_text'] = (_e._length__plain_text / _main._length__plain_text); _r['_ratio__count__plain_words_to_total_plain_words'] = (_e._count__plain_words / _main._count__plain_words); // links // ===== _r['_ratio__length__links_text_to_all_text'] = (_e._length__links_text / _e._length__all_text); _r['_ratio__count__links_words_to_all_words'] = (_e._count__links_words / _e._count__all_words); _r['_ratio__length__links_text_to_total_links_text'] = (_e._length__links_text / (_main._length__links_text + 1)); _r['_ratio__count__links_words_to_total_links_words'] = (_e._count__links_words / (_main._count__links_words + 1)); _r['_ratio__count__links_to_total_links'] = (_e._count__links / (_main._count__links + 1)); _r['_ratio__count__links_to_plain_words'] = ((_e._count__links * 2) / _e._count__plain_words); // text above // ========== var _divide__candidates = Math.max(2, Math.ceil((_e._count__above_candidates - _main._count__above_candidates) * 0.5)), _above_text = ((0 + (_e.__second_length__above_plain_text * 1) + (_e.__second_length__above_plain_text / _divide__candidates) ) / 2), _above_words = ((0 + (_e.__second_count__above_plain_words * 1) + (_e.__second_count__above_plain_words / _divide__candidates) ) / 2) ; _r['_ratio__length__above_plain_text_to_total_plain_text'] = (_above_text / _main._length__plain_text); _r['_ratio__count__above_plain_words_to_total_plain_words'] = (_above_words / _main._count__plain_words); _r['_ratio__length__above_plain_text_to_plain_text'] = (_above_text / _e._length__plain_text); _r['_ratio__count__above_plain_words_to_plain_words'] = (_above_words / _e._count__plain_words); // candidates // ========== _r['_ratio__count__candidates_to_total_candidates'] = (Math.max(0, (_e._count__candidates - (_main._count__candidates * 0.25))) / (_main._count__candidates + 1)); _r['_ratio__count__containers_to_total_containers'] = (Math.max(0, (_e._count__containers - (_main._count__containers * 0.25))) / (_main._count__containers + 1)); _r['_ratio__count__pieces_to_total_pieces'] = (Math.max(0, (_e._count__pieces - (_main._count__pieces * 0.25))) / (_main._count__pieces + 1)); // return // ====== return _r; }; $R.getContent__computePointsForCandidateSecond = function (_e, _main) { var _details = _e.__candidate_details, _details_second = _e.__candidate_details_second, _points_history = [] ; // bad candidate if (_e._is__bad) { return [0]; } // get initial points // ================== _points_history.unshift(_e.__points_history[(_e.__points_history.length-1)]); // candidates, containers, pieces // ============================== var _divide__pieces = Math.max(5, Math.ceil(_e._count__pieces * 0.25)), _divide__candidates = Math.max(5, Math.ceil(_e._count__candidates * 0.25)), _divide__containers = Math.max(10, Math.ceil(_e._count__containers * 0.25)) ; _points_history.unshift(((0 + (_points_history[0] * 3) + ((_points_history[0] / _divide__pieces) * 2) + ((_points_history[0] / _divide__candidates) * 2) + ((_points_history[0] / _divide__containers) * 2) ) / 9)); // total text // ========== $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - (1 - _details_second._ratio__length__plain_text_to_total_plain_text)), _points_history); $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - (1 - _details_second._ratio__count__plain_words_to_total_plain_words)), _points_history); // text above // ========== var __ar = ($R.language == 'cjk' ? 0.50 : 0.10); $R.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__length__above_plain_text_to_total_plain_text), _points_history); $R.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__count__above_plain_words_to_total_plain_words), _points_history); $R.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__length__above_plain_text_to_plain_text), _points_history); $R.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__count__above_plain_words_to_plain_words), _points_history); // links outer // =========== $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details_second._ratio__count__links_to_total_links), _points_history); $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details_second._ratio__length__links_text_to_total_links_text), _points_history); $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details_second._ratio__count__links_words_to_total_links_words), _points_history); // links inner // =========== var __lr = ($R.language == 'cjk' ? 0.75 : 0.50); $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_plain_text), _points_history); $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_plain_words), _points_history); $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__length__links_text_to_all_text), _points_history); $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__count__links_words_to_all_words), _points_history); $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__count__links_to_plain_words), _points_history); // candidates, containers, pieces // ============================== $R.getContent__computePointsForCandidate__do(0.10, 2, (1 - _details_second._ratio__count__candidates_to_total_candidates), _points_history); $R.getContent__computePointsForCandidate__do(0.10, 2, (1 - _details_second._ratio__count__containers_to_total_containers), _points_history); $R.getContent__computePointsForCandidate__do(0.10, 2, (1 - _details_second._ratio__count__pieces_to_total_pieces), _points_history); // return -- will get [0] as the actual final points // ====== return _points_history; }; $R.getContent__computePointsForCandidateThird = function (_e, _main) { var _details = _e.__candidate_details, _details_second = _e.__candidate_details_second, _points_history = [] ; // bad candidate if (_e._is__bad) { return [0]; } // get initial points // ================== _points_history.unshift(_e.__points_history[(_e.__points_history.length-1)]); // candidates, containers, pieces // ============================== var _divide__pieces = Math.max(2, Math.ceil(_e._count__pieces * 0.25)), _divide__candidates = Math.max(2, Math.ceil(_e._count__candidates * 0.25)), _divide__containers = Math.max(4, Math.ceil(_e._count__containers * 0.25)) ; _points_history.unshift(((0 + (_points_history[0] * 3) + ((_points_history[0] / _divide__pieces) * 2) + ((_points_history[0] / _divide__candidates) * 2) + ((_points_history[0] / _divide__containers) * 2) ) / 9)); // total text // ========== $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - (1 - _details_second._ratio__length__plain_text_to_total_plain_text)), _points_history); $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - (1 - _details_second._ratio__count__plain_words_to_total_plain_words)), _points_history); // text above // ========== $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history); $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history); $R.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__length__above_plain_text_to_total_plain_text), _points_history); $R.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__count__above_plain_words_to_total_plain_words), _points_history); $R.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__length__above_plain_text_to_plain_text), _points_history); $R.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__count__above_plain_words_to_plain_words), _points_history); // links inner // =========== $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__length__links_text_to_all_text), _points_history); $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_words_to_all_words), _points_history); $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__length__links_text_to_plain_text), _points_history); $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_words_to_plain_words), _points_history); $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_to_plain_words), _points_history); // candidates, containers, pieces // ============================== $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__candidates_to_total_candidates), _points_history); $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__containers_to_total_containers), _points_history); $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__pieces_to_total_pieces), _points_history); // return -- will get [0] as the actual final points // ====== return _points_history; }; $R.getContent__computePointsForCandidate__do = function (_ratio_remaining, _power, _ratio, _points_history) { var _points_remaining = (_points_history[0] * _ratio_remaining), _points_to_compute = (_points_history[0] - _points_remaining) ; if (_ratio < 0) { //_points_return = (0.75 * _points_remaining); _points_return = _points_remaining; } else { _points_return = 0 + _points_remaining + (_points_to_compute * Math.pow(_ratio, _power)) ; } // add _points_history.unshift(_points_return); }; $R.getContent__buildHTMLForNode = function (_nodeToBuildHTMLFor, _custom_mode) { var _global__element_index = 0, _global__the_html = '', _global__exploreNodeToBuildHTMLFor = $R.getContent__exploreNodeAndGetStuff(_nodeToBuildHTMLFor, true) ; // custom // ====== switch (_custom_mode) { case 'above-the-target': _global__exploreNodeToBuildHTMLFor = false; break; } // recursive function // ================== var _recursive = function (_node) { // increment index -- starts with 1 // =============== _global__element_index++; // vars // ==== var _explored = false, _tag_name = (_node.nodeType === 3 ? '#text' : ((_node.nodeType === 1 && _node.tagName && _node.tagName > '') ? _node.tagName.toLowerCase() : '#invalid')), _pos__start__before = 0, _pos__start__after = 0, _pos__end__before = 0, _pos__end__after = 0 ; // fast return // =========== switch (true) { case ((_tag_name == '#invalid')): case (($R.parsingOptions._elements_ignore.indexOf('|'+_tag_name+'|') > -1)): return; case (_tag_name == '#text'): _global__the_html += _node.nodeValue .replace(//gi, '>') ; return; } // hidden // ====== if ($R.parsingOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1) { // included inline // _node, _tag_name must be defined // will return, if node is hidden switch (true) { case (_node.offsetWidth > 0): case (_node.offsetHeight > 0): break; default: switch (true) { case (_node.offsetLeft > 0): case (_node.offsetTop > 0): break; default: // exclude inline DIVs -- which, stupidly, don't have a width/height if ((_tag_name == 'div') && ((_node.style.display || $.css( _node, "display" )) == 'inline')) { break; } // it's hidden; exit current scope return; } break; } } // clean -- before // ===== // just a return will skip the whol element // including children // objects, embeds, iframes // ======================== switch (_tag_name) { case ('object'): case ('embed'): case ('iframe'): var _src = (_tag_name == 'object' ? $(_node).find("param[name='movie']").attr('value') : $(_node).attr('src')), _skip = ((_src > '') ? false : true) ; if (_skip); else { // default skip _skip = true; // loop for (var i=0, _i=$R.keepStuffFromDomain__video.length; i<_i; i++) { if (_src.indexOf($R.keepStuffFromDomain__video[i]) > -1) { _skip = false; break; } } } // skip? if (_skip) { $R.debugOutline(_node, 'clean-before', 'object-embed-iframe'); return; } break; } // skipped link // ============ if (_tag_name == 'a' || _tag_name == 'li') { _explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true)); switch (true) { case (_explored._is__link_skip): case (((_explored._count__images_small + _explored._count__images_skip) > 0) && (_explored._length__plain_text < 65)): $R.debugOutline(_node, 'clean-before', 'skip-link'); return; } } // link density // ============ if ($R.parsingOptions._elements_link_density.indexOf('|'+_tag_name+'|') > -1) { _explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true)); switch (true) { case (_explored._length__plain_text > (65 * 3 * 2)): case ($R.language == 'cjk' && (_explored._length__plain_text > (65 * 3 * 1))): case (!(_explored._count__links > 1)): case (_global__exploreNodeToBuildHTMLFor && (_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.5): case (_global__exploreNodeToBuildHTMLFor && (_explored._count__plain_words / _global__exploreNodeToBuildHTMLFor._count__plain_words) > 0.5): case ((_explored._length__plain_text == 0) && (_explored._count__links == 1) && (_explored._length__links_text < 65)): case ((_explored._length__plain_text < 25) && ((_explored._count__images_large + _explored._count__images_medium) > 0)): break; case ((_explored._length__links_text / _explored._length__all_text) < 0.5): if (_explored._count__links > 0); else { break; } if (_explored._count__links_skip > 0); else { break; } if (((_explored._count__links_skip / _explored._count__links) > 0.25) && (_explored._length__links_text / _explored._length__all_text) < 0.05) { break; } default: $R.debugOutline(_node, 'clean-before', 'link-density'); return; } } // floating // ======== if ($R.parsingOptions._elements_floating.indexOf('|'+_tag_name+'|') > -1) { _explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true)); switch (true) { case (_explored._length__plain_text > (65 * 3 * 2)): case ($R.language == 'cjk' && (_explored._length__plain_text > (65 * 3 * 1))): case (_global__exploreNodeToBuildHTMLFor && (_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.25): case (_global__exploreNodeToBuildHTMLFor && (_explored._count__plain_words / _global__exploreNodeToBuildHTMLFor._count__plain_words) > 0.25): case ((_explored._length__plain_text < 25) && (_explored._length__links_text < 25) && ((_explored._count__images_large + _explored._count__images_medium) > 0)): case (_node.getElementsByTagName && (_explored._length__plain_text < (65 * 3 * 1)) && ((_node.getElementsByTagName('h1').length + _node.getElementsByTagName('h2').length + _node.getElementsByTagName('h3').length + _node.getElementsByTagName('h4').length) > 0)): break; default: var _float = $(_node).css('float'); if (_float == 'left' || _float == 'right'); else { break; } if ((_explored._length__links_text == 0) && ((_explored._count__images_large + _explored._count__images_medium) > 0)) { break; } $R.debugOutline(_node, 'clean-before', 'floating'); return; } } // above target // ============ if (_custom_mode == 'above-the-target') { // is ignored? if ($R.parsingOptions._elements_above_target_ignore.indexOf('|'+_tag_name+'|') > -1) { $R.debugOutline(_node, 'clean-before', 'above-target'); return; } // is image? if (_tag_name == 'img') { _explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true)); if (_explored._is__image_large); else { $R.debugOutline(_node, 'clean-before', 'above-target'); return; } } // has too many links? //if (_node.getElementsByTagName && _node.getElementsByTagName('a').length > 5) // { $R.debugOutline(_node, 'clean-before', 'above-target'); return; } } // headers that are images // ======================= if (_tag_name.match(/^h(1|2|3|4|5|6)$/gi)) { _explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true)); switch (true) { case ((_explored._length__plain_text < 10) && ((_explored._count__images_small + _explored._count__images_medium + _explored._count__images_large + _explored._count__images_skip) > 0)): $R.debugOutline(_node, 'clean-before', 'skip-heading'); return; } } // start tag // ========= if ($R.parsingOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1); else { /* mark */ _pos__start__before = _global__the_html.length; /* add */ _global__the_html += '<'+_tag_name; // attributes // ========== // allowed attributes // ================== if (_tag_name in $R.parsingOptions._elements_keep_attributes) { for (var i=0, _i=$R.parsingOptions._elements_keep_attributes[_tag_name].length; i<_i; i++) { var _attribute_name = $R.parsingOptions._elements_keep_attributes[_tag_name][i], _attribute_value = _node.getAttribute(_attribute_name) ; // if present if (_attribute_value > '') { _global__the_html += ' '+_attribute_name+'="'+(_attribute_value)+'"'; } } } // keep ID for all elements // ======================== var _id_attribute = _node.getAttribute('id'); if (_id_attribute > '') { _global__the_html += ' id="'+_id_attribute+'"'; } // links target NEW // ================ if (_tag_name == 'a') { _global__the_html += ' target="_blank"'; } // close start // =========== if ($R.parsingOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1) { _global__the_html += ' />'; } else { _global__the_html += '>';} /* mark */ _pos__start__after = _global__the_html.length; } // child nodes // =========== if ($R.parsingOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1); else { for (var i=0, _i=_node.childNodes.length; i<_i; i++) { _recursive(_node.childNodes[i]); } } // end tag // ======= switch (true) { case (($R.parsingOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1)): return; case (($R.parsingOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1)): /* mark */ _pos__end__before = _global__the_html.length; /* mark */ _pos__end__after = _global__the_html.length; break; default: /* mark */ _pos__end__before = _global__the_html.length; /* end */ _global__the_html += '</'+_tag_name+'>'; /* mark */ _pos__end__after = _global__the_html.length; break; } // clean -- after // ===== // we need to actually cut things out of // "_global__the_html", for stuff to not be there // largeObject classes // =================== if (_tag_name == 'iframe' || _tag_name == 'embed' || _tag_name == 'object') { _global__the_html = '' + _global__the_html.substr(0, _pos__start__before) + '
' + _global__the_html.substr(_pos__start__before, (_pos__end__after - _pos__start__before)) + '
' ; return; } // add image classes // ================= if (_tag_name == 'img') { _explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true)); switch (true) { case (_explored._is__image_skip): $R.debugOutline(_node, 'clean-after', 'skip-img'); _global__the_html = _global__the_html.substr(0, _pos__start__before); return; case (_explored._is__image_large): // add float class -- for images too narrow/tall // remove width/height -- only for large images // http://www.wired.com/threatlevel/2011/05/gps-gallery/?pid=89&viewall=true // http://david-smith.org/blog/2012/03/10/ios-5-dot-1-upgrade-stats/index.html // http://www.turntablekitchen.com/2012/04/dutch-baby-with-caramelized-vanilla-bean-pears-moving-through-the-decades/ _global__the_html = '' + _global__the_html.substr(0, _pos__start__before) + '
' + _global__the_html.substr(_pos__start__before, (_pos__end__after - _pos__start__before)).replace(/width="([^=]+?)"/gi, '').replace(/height="([^=]+?)"/gi, '') + '
' ; return; } } // large images in links // ===================== if (_tag_name == 'a') { _explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true)); switch (true) { case (_explored._count__images_large == 1): _global__the_html = '' + _global__the_html.substr(0, _pos__start__after-1) + ' class="readableLinkWithLargeImage">' + _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after)) + '' ; return; case (_explored._count__images_medium == 1): _global__the_html = '' + _global__the_html.substr(0, _pos__start__after-1) + ' class="readableLinkWithMediumImage">' + _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after)) + '' ; return; } } // too much content // ================ if ($R.parsingOptions._elements_too_much_content.indexOf('|'+_tag_name+'|') > -1) { _explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true)); switch (true) { case (_tag_name == 'h1' && (_explored._length__all_text > (65 * 2))): case (_tag_name == 'h2' && (_explored._length__all_text > (65 * 2 * 3))): case ((_tag_name.match(/^h(3|4|5|6)$/) != null) && (_explored._length__all_text > (65 * 2 * 5))): case ((_tag_name.match(/^(b|i|em|strong)$/) != null) && (_explored._length__all_text > (65 * 5 * 5))): $R.debugOutline(_node, 'clean-after', 'too-much-content'); _global__the_html = '' + _global__the_html.substr(0, _pos__start__before) + _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after)) ; return; } } // empty elements // ============== switch (true) { case (($R.parsingOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1)): case (($R.parsingOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1)): case (_tag_name == 'td'): break; default: var _contents = _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after)); _contents = _contents.replace(/(
)/gi, ''); _contents = _contents.replace(/(
)/gi, ''); // for rows, clear empty cells if (_tag_name == 'tr') { _contents = _contents.replace(/]*?>/gi, ''); _contents = _contents.replace(/<\/tr>/gi, ''); } var _contentsLength = $R.measureText__getTextLength(_contents); switch (true) { case (_contentsLength == 0 && _tag_name == 'p'): _global__the_html = _global__the_html.substr(0, _pos__start__before) + '

'; return; case (_contentsLength == 0): case ((_contentsLength < 5) && ($R.parsingOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)): $R.debugOutline(_node, 'clean-after', 'blank'); _global__the_html = _global__the_html.substr(0, _pos__start__before); return; } break; } // too much missing // ================ if ($R.parsingOptions._elements_link_density.indexOf('|'+_tag_name+'|') > -1) { _explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true)); var _contents = _global__the_html .substr(_pos__start__after, (_pos__end__before - _pos__start__after)) .replace(/(<([^>]+)>)/gi, ''), _contentsLength = $R.measureText__getTextLength(_contents), _initialLength = 0 + _explored._length__all_text + (_explored._count__images_small * 10) + (_explored._count__images_skip * 10) + (_node.getElementsByTagName('iframe').length * 10) + (_node.getElementsByTagName('object').length * 10) + (_node.getElementsByTagName('embed').length * 10) + (_node.getElementsByTagName('button').length * 10) + (_node.getElementsByTagName('input').length * 10) + (_node.getElementsByTagName('select').length * 10) + (_node.getElementsByTagName('textarea').length * 10) ; // too much missing switch (true) { case (!(_contentsLength > 0)): case (!(_initialLength > 0)): case (!((_contentsLength / _initialLength) < 0.5)): case (!(($R.language == 'cjk') && (_contentsLength / _initialLength) < 0.1)): case ((_global__exploreNodeToBuildHTMLFor && ((_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.25))): case (($R.language == 'cjk') && (_global__exploreNodeToBuildHTMLFor && ((_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.1))): break; default: $R.debugOutline(_node, 'clean-after', 'missing-density'); _global__the_html = _global__the_html.substr(0, _pos__start__before); return; } } // return return; }; // actually do it _recursive(_nodeToBuildHTMLFor); // return html return _global__the_html; }; // article title marker // ==================== $R.articleTitleMarker__start = '

'; $R.articleTitleMarker__end = '

'; // article title check function // ============================ $R.getContent__find__hasIsolatedTitleInHTML = function (_html) { return (_html.substr(0, $R.articleTitleMarker__start.length) == $R.articleTitleMarker__start); }; // article title get function // ============================ $R.getContent__find__getIsolatedTitleInHTML = function (_html) { // is it there? if ($R.getContent__find__hasIsolatedTitleInHTML(_html)); else { return ''; } // regex var _getTitleRegex = new RegExp($R.articleTitleMarker__start + '(.*?)' + $R.articleTitleMarker__end, 'i'), _getTitleMatch = _html.match(_getTitleRegex) ; // match? if (_getTitleMatch); else { return ''; } // return return _getTitleMatch[1]; }; // find title in arbitrary html // ============================ $R.getContent__find__isolateTitleInHTML = function (_html, _document_title) { // can't just use (h1|h2|h3|etc) -- we want to try them in a certain order // ============================= var _heading_pregs = [ /<(h1)[^>]*?>([\s\S]+?)<\/\1>/gi, /<(h2)[^>]*?>([\s\S]+?)<\/\1>/gi, /<(h3|h4|h5|h6)[^>]*?>([\s\S]+?)<\/\1>/gi ], _secondary_headings = '|h2|h3|h4|h5|h6|', _search_document_title = ' ' + _document_title.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ') + ' ' ; // loop pregs // ========== for (var i=0, _i=_heading_pregs.length; i<_i; i++) { // exec var _match = _heading_pregs[i].exec(_html); // return? switch (true) { case (!(_match)): case (!(_heading_pregs[i].lastIndex > -1)): // will continue loop break; default: // measurements var _heading_end_pos = _heading_pregs[i].lastIndex, _heading_start_pos = (_heading_end_pos - _match[0].length), _heading_type = _match[1], _heading_text = _match[2].replace(/<\s*br[^>]*>/gi, '').replace(/[\n\r]+/gi, ''), _heading_text_plain = _heading_text.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' '); _heading_length = $R.measureText__getTextLength(_heading_text_plain), _heading_words = [], _to_heading_text = _html.substr(0, _heading_start_pos), _to_heading_length = $R.measureText__getTextLength(_to_heading_text.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) ; // return? switch (true) { case (!(_heading_length > 5)): case (!(_heading_length < (65 * 3))): case (!(_to_heading_length < (65 * 3 * 2))): // will continue for loop break; case ((_secondary_headings.indexOf('|' + _heading_type + '|') > -1)): // words in this heading _heading_words = _heading_text_plain.split(' '); // count words present in title for (var j=0, _j=_heading_words.length, _matched_words=''; j<_j; j++) { if (_search_document_title.indexOf(' ' + _heading_words[j] + ' ') > -1) { _matched_words += _heading_words[j] + ' '; } } // break continues for loop // nothing goes to switch's default // ================================ // no break? var _no_break = false; switch (true) { // if it's big enough, and it's a substring of the title, it's good case ((_heading_length > 20) && (_search_document_title.indexOf(_heading_text_plain) > -1)): // if it's slightly smaler, but is exactly at the begging or the end case ((_heading_length > 10) && ((_search_document_title.indexOf(_heading_text_plain) == 1) || (_search_document_title.indexOf(_heading_text_plain) == (_search_document_title.length - 1 - _heading_text_plain.length)))): _no_break = true; break; } // break? var _break = false; switch (true) { // no break? case (_no_break): break; // heading too long? -- if not h2 case ((_heading_length > ((_search_document_title.length - 2) * 2)) && (_heading_type != 'h2')): // heading long enough? case ((_heading_length < Math.ceil((_search_document_title.length - 2) * 0.50))): // enough words matched? case ((_heading_length < 25) && (_matched_words.length < Math.ceil(_heading_length * 0.75))): case ((_heading_length < 50) && (_matched_words.length < Math.ceil(_heading_length * 0.65))): case ((_matched_words.length < Math.ceil(_heading_length * 0.55))): _break = true; break; } // break? if (_break) { break; } default: // this is the title -- do isolation; return // ================= return '' + $R.articleTitleMarker__start + _heading_text + $R.articleTitleMarker__end + _html.substr(_heading_end_pos) ; } break; } } // return unmodified return _html; }; $R.getContent__find = function () { // get content // =========== var _found = $R.getContent__findInPage($R.win), _targetNode = _found._targetCandidate.__node, _$targetNode = $(_targetNode), _aboveNodes = [] ; // RTL // === switch (true) { case (_$targetNode.attr('dir') == 'rtl'): case (_$targetNode.css('direction') == 'rtl'): $R.makeRTL(); break; } // get html // ======== var _foundHTML = _found._html, _firstFragmentBefore = $R.getContent__nextPage__getFirstFragment(_foundHTML), _documentTitle = ($R.document.title > '' ? $R.document.title : '') ; // get title // ========= // has title already? _foundHTML = $R.getContent__find__isolateTitleInHTML(_foundHTML, _documentTitle); $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML); $R.debugPrint('TitleSource', 'target'); // get html above? if ($R.articleTitle > ''); else { // get html above target? // ====================== // global vars: // _found // _foundHTML // _documentTitle // _aboveNodes var _prevNode = _found._targetCandidate.__node, _prevHTML = '', _aboveHTML = '', _differentTargets = (_found._firstCandidate.__node != _found._targetCandidate.__node) ; (function () { while (true) { // the end? switch (true) { case (_prevNode.tagName && (_prevNode.tagName.toLowerCase() == 'body')): case (_differentTargets && (_prevNode == _found._firstCandidate.__node)): // enough is enough return; } // up or sideways? if (_prevNode.previousSibling); else { _prevNode = _prevNode.parentNode; continue; } // previous _prevNode = _prevNode.previousSibling; // outline -- element might be re-outlined, when buildHTML is invoked if ($R.debug) { $R.debugOutline(_prevNode, 'target', 'add-above'); } // get html; add _prevHTML = $R.getContent__buildHTMLForNode(_prevNode, 'above-the-target'); _aboveHTML = _prevHTML + _aboveHTML; _aboveNodes.unshift(_prevNode); // isolate title _aboveHTML = $R.getContent__find__isolateTitleInHTML(_aboveHTML, _documentTitle); // finished? switch (true) { case ($R.measureText__getTextLength(_aboveHTML.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) > (65 * 3 * 3)): case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)): return; } } })(); // is what we found any good? // ========================== switch (true) { case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)): case (_differentTargets && (_aboveHTML.split('< 3) && ($R.measureText__getTextLength(_aboveHTML.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) < (65 * 3))): _foundHTML = _aboveHTML + _foundHTML; break; default: _aboveHTML = ''; _aboveNodes = []; break; } $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML); $R.debugPrint('TitleSource', 'above_HTML'); // get document title? if ($R.articleTitle > ''); else { // if all else failed, get document title // ====================================== // global vars: // _foundHTML // _documentTitle (function () { // return? // ======= if (_documentTitle > ''); else { return; } // vars var _doc_title_parts = [], _doc_title_pregs = [ /( [-][-] |( [-] )|( [>][>] )|( [<][<] )|( [|] )|( [\/] ))/i, /(([:] ))/i ] ; // loop through pregs // ================== for (var i=0, _i=_doc_title_pregs.length; i<_i; i++) { // split _doc_title_parts = _documentTitle.split(_doc_title_pregs[i]); // break if we managed a split if (_doc_title_parts.length > 1) { break; } } // sort title parts -- longer goes higher up -- i.e. towards 0 // ================ _doc_title_parts.sort(function (a, b) { switch (true) { case (a.length > b.length): return -1; case (a.length < b.length): return 1; default: return 0; } }); // set title -- first part, if more than one word; otherwise, whole // ========= _foundHTML = '' + $R.articleTitleMarker__start + (_doc_title_parts[0].split(/\s+/i).length > 1 ? _doc_title_parts[0] : _documentTitle) + $R.articleTitleMarker__end + _foundHTML ; })(); $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML); $R.debugPrint('TitleSource', 'document_title'); } } // display // ======= $R.$pages.html(''); $R.displayPageHTML(_foundHTML, 1, $R.win.location.href); // remember // ======== $R.debugRemember['theTarget'] = _found._targetCandidate.__node; $R.debugRemember['firstCandidate'] = _found._firstCandidate.__node; // next // ==== $R.nextPage__firstFragment__firstPage = _firstFragmentBefore; $R.nextPage__firstFragment__lastPage = $R.getContent__nextPage__getFirstFragment(_foundHTML);; $R.nextPage__loadedPages = [$R.win.location.href]; $R.getContent__nextPage__find($R.win, _found._links); // return return true; }; $R.getContent__findInPage = function (_pageWindow) { // calculations // ============ var _firstCandidate = false, _secondCandidate = false, _targetCandidate = false ; $R.debugTimerStart('ExploreAndGetStuff'); var _stuff = $R.getContent__exploreNodeAndGetStuff(_pageWindow.document.body); $R.debugPrint('ExploreAndGetStuff', $R.debugTimerEnd()+'ms'); $R.debugTimerStart('ProcessFirst'); var _processedCandidates = $R.getContent__processCandidates(_stuff._candidates); _firstCandidate = _processedCandidates[0]; _targetCandidate = _firstCandidate; $R.debugPrint('ProcessFirst', $R.debugTimerEnd()+'ms'); // debug if ($R.debug) { // debug first candidates $R.log('First 5 Main Candidates:'); for (var x in _processedCandidates) { if (x == 5) { break; } $R.log(_processedCandidates[x], _processedCandidates[x].__node); } // highlight first $R.debugOutline(_firstCandidate.__node, 'target', 'first'); } // in case we stop $R.debugPrint('Target', 'first'); // do second? switch (true) { case (!(_firstCandidate._count__containers > 0)): case (!(_firstCandidate._count__candidates > 0)): case (!(_firstCandidate._count__pieces > 0)): case (!(_firstCandidate._count__containers > 25)): break; default: $R.debugTimerStart('ProcessSecond'); var _processedCandidatesSecond = $R.getContent__processCandidatesSecond(_processedCandidates); _secondCandidate = _processedCandidatesSecond[0]; $R.debugPrint('ProcessSecond', $R.debugTimerEnd()+'ms'); // they're the same if (_firstCandidate.__node == _secondCandidate.__node) { break; } // debug if ($R.debug) { // log second candidates $R.log('First 5 Second Candidates:'); for (var x in _processedCandidatesSecond) { if (x == 5) { break; } $R.log(_processedCandidatesSecond[x], _processedCandidatesSecond[x].__node); } // highlight second $R.debugOutline(_secondCandidate.__node, 'target', 'second'); } // compute again // ============= _firstCandidate['__points_history_final'] = $R.getContent__computePointsForCandidateThird(_firstCandidate, _firstCandidate); _firstCandidate['__points_final'] = _firstCandidate.__points_history_final[0]; _secondCandidate['__points_history_final'] = $R.getContent__computePointsForCandidateThird(_secondCandidate, _firstCandidate); _secondCandidate['__points_final'] = _secondCandidate.__points_history_final[0]; // log results // =========== if ($R.debug) { $R.log('The 2 Candidates:'); $R.log(_firstCandidate); $R.log(_secondCandidate); } // are we selecting _second? // ========================= switch (true) { case ((_secondCandidate.__candidate_details._count__lines_of_65_characters < 20) && (_secondCandidate.__points_final / _firstCandidate.__points_final) > 1): case ((_secondCandidate.__candidate_details._count__lines_of_65_characters > 20) && (_secondCandidate.__points_final / _firstCandidate.__points_final) > 0.9): case ((_secondCandidate.__candidate_details._count__lines_of_65_characters > 50) && (_secondCandidate.__points_final / _firstCandidate.__points_final) > 0.75): _targetCandidate = _secondCandidate; $R.debugPrint('Target', 'second'); break; } // print points // ============ if ($R.debug) { $R.debugPrint('PointsFirst', _firstCandidate['__points_history_final'][0].toFixed(2)); $R.debugPrint('PointsSecond', _secondCandidate['__points_history_final'][0].toFixed(2)); } break; } // highlight target // ================ if ($R.debug) { $(_targetCandidate.__node).css({ 'box-shadow': 'inset 0px 0px 50px rgba(255, 255, 0, 0.95), 0px 0px 50px rgba(255, 255, 0, 0.95)' }); } // get html // ======== $R.debugTimerStart('BuildHTML'); var _html = $R.getContent__buildHTMLForNode(_targetCandidate.__node, 'the-target'); _html = _html.substr((_html.indexOf('>')+1)) _html = _html.substr(0, _html.lastIndexOf('<')); $R.debugPrint('BuildHTML', $R.debugTimerEnd()+'ms'); $R.debugTimerStart('BuildHTMLPregs'); _html = _html.replace(/<(blockquote|div|p|td|li)([^>]*)>(\s*
)+/gi, '<$1$2>'); _html = _html.replace(/(
\s*)+<\/(blockquote|div|p|td|li)>/gi, '</$2>'); _html = _html.replace(/(
\s*)+<(blockquote|div|h\d|ol|p|table|ul|li)([^>]*)>/gi, '<$2$3>'); _html = _html.replace(/<\/(blockquote|div|h\d|ol|p|table|ul|li)>(\s*
)+/gi, '</$1>'); _html = _html.replace(/(

\s*
\s*)+/gi, '
'); _html = _html.replace(/(
\s*
\s*)+/gi, '

'); $R.debugPrint('BuildHTMLPregs', $R.debugTimerEnd()+'ms'); // return // ====== return { '_html': _html, '_links': _stuff._links, '_targetCandidate': _targetCandidate, '_firstCandidate': _firstCandidate }; }; // get first page fragment // ======================= $R.getContent__nextPage__getFirstFragment = function (_html) { // remove all tags _html = _html.replace(/<[^>]+?>/gi, ''); // normalize spaces _html = _html.replace(/\s+/gi, ' '); // return first 1000 characters return _html.substr(0, 2000); }; // get link parts // ============== // substr starting with the first slash after // $R.getURLPath = function (_url) { return _url.substr(_url.indexOf('/', (_url.indexOf('//') + 2))); }; // substr until the first slash after // $R.getURLDomain = function (_url) { return _url.substr(0, _url.indexOf('/', (_url.indexOf('//') + 2))) }; // find // ==== $R.getContent__nextPage__find = function (_currentPageWindow, _linksInCurrentPage) { // page id var _pageNr = ($R.nextPage__loadedPages.length + 1); // get // === var _possible = []; if (_possible.length > 0); else { _possible = $R.getContent__nextPage__find__possible(_currentPageWindow, _linksInCurrentPage, 0.5); } //if (_possible.length > 0); else { _possible = $R.getContent__nextPage__find__possible(_currentPageWindow, _linksInCurrentPage, 0.50); } // none if (_possible.length > 0); else { if ($R.debug) { $R.log('no next link found'); } return; } if ($R.debug) { $R.log('possible next', _possible); } // the one // ======= var _nextLink = false; // next keyword? // ============= (function () { if (_nextLink) { return; } for (var i=0, _i=_possible.length; i<_i; i++) { for (var j=0, _j=$R.nextPage__captionKeywords.length; j<_j; j++) { if (_possible[i]._caption.indexOf($R.nextPage__captionKeywords[j]) > -1) { // length // ====== if (_possible[i]._caption.length > $R.nextPage__captionKeywords[j].length * 2) { continue; } // not keywords // ============ for (var z=0, _z=$R.nextPage__captionKeywords__not.length; z<_z; z++) { if (_possible[i]._caption.indexOf($R.nextPage__captionKeywords__not[z]) > -1) { _nextLink = false; return; } } // got it // ====== _nextLink = _possible[i]; return; } } } })(); // caption matched page number // =========================== (function () { if (_nextLink) { return; } for (var i=0, _i=_possible.length; i<_i; i++) { if (_possible[i]._caption == (''+_pageNr)) { _nextLink = _possible[i]; return; } } })(); // next keyword in title // ===================== (function () { if (_nextLink) { return; } for (var i=0, _i=_possible.length; i<_i; i++) { // sanity if (_possible[i]._title > ''); else { continue; } if ($R.measureText__getTextLength(_possible[i]._caption) <= 2); else { continue; } for (var j=0, _j=$R.nextPage__captionKeywords.length; j<_j; j++) { if (_possible[i]._title.indexOf($R.nextPage__captionKeywords[j]) > -1) { // length // ====== if (_possible[i]._title.length > $R.nextPage__captionKeywords[j].length * 2) { continue; } // not keywords // ============ for (var z=0, _z=$R.nextPage__captionKeywords__not.length; z<_z; z++) { if (_possible[i]._title.indexOf($R.nextPage__captionKeywords__not[z]) > -1) { _nextLink = false; return; } } // got it // ====== _nextLink = _possible[i]; return; } } } })(); // return? // ======= if (_nextLink); else { return; } // mark // ==== $R.debugPrint('NextPage', 'true'); if ($R.debug) { $R.debugOutline(_nextLink._node, 'target', 'next-page'); $R.log('NextPage Link', _nextLink, _nextLink._node); } // process page // ============ $R.getContent__nextPage__loadToFrame(_pageNr, _nextLink._href); $R.nextPage__loadedPages.push(_nextLink._href); }; // find with similarity // ==================== $R.getContent__nextPage__find__possible = function (_currentPageWindow, _linksInCurrentPage, _distanceFactor) { var _mainPageHref = $R.win.location.href, _mainPageDomain = $R.getURLDomain(_mainPageHref), _mainPagePath = $R.getURLPath(_mainPageHref) ; var _links = $.map ( _linksInCurrentPage, function (_element, _index) { var _href = _element.__node.href, _path = $R.getURLPath(_href), _title = (_element.__node.title > '' ? _element.__node.title.toLowerCase() : ''), _caption = _element.__node.innerHTML.replace(/<[^>]+?>/gi, '').replace(/\&[^\&\s;]{1,10};/gi, '').replace(/\s+/gi, ' ').replace(/^ /, '').replace(/ $/, '').toLowerCase(), _distance = $R.levenshteinDistance(_mainPagePath, _path) ; var _caption2 = ''; for (var i=0, _i=_caption.length, _code=0; i<_i; i++) { _code = _caption.charCodeAt(i); _caption2 += (_code > 127 ? (''+_code+';') : _caption.charAt(i)); } _caption = _caption2; switch (true) { case (!(_href > '')): case (_mainPageHref.length > _href.length): case (_mainPageDomain != $R.getURLDomain(_href)): case (_href.substr(_mainPageHref.length).substr(0, 1) == '#'): case (_distance > Math.ceil(_distanceFactor * _path.length)): return null; default: // skip if already loaded as next page for (var i=0, _i=$R.nextPage__loadedPages.length; i<_i; i++) { if ($R.nextPage__loadedPages[i] == _href) { return null; } } // return return { '_node': _element.__node, '_href': _href, '_title': _title, '_caption': _caption, '_distance': _distance }; } } ); // sort -- the less points, the closer to position 0 // ==== _links.sort(function (a, b) { switch (true) { case (a._distance < b._distance): return -1; case (a._distance > b._distance): return 1; default: return 0; } }); // return return _links; }; // load to frame // ============= $R.getContent__nextPage__loadToFrame = function (_pageNr, _nextPageURL) { // do ajax // ======= $.ajax ({ 'url' : _nextPageURL, 'type' : 'GET', 'dataType' : 'html', 'async' : true, 'timeout': (10 * 1000), //'headers': { 'Referrer': _nextPageURL }, 'success' : function (_response, _textStatus, _xhr) { $R.getContent__nextPage__ajaxComplete(_pageNr, _response, _textStatus, _xhr); }, 'error' : function (_xhr, _textStatus, _error) { $R.getContent__nextPage__ajaxError(_pageNr, _xhr, _textStatus, _error); } }); }; // ajax calbacks // ============= $R.getContent__nextPage__ajaxError = function (_pageNr, _xhr, _textStatus, _error) { }; $R.getContent__nextPage__ajaxComplete = function (_pageNr, _response, _textStatus, _xhr) { // valid? // ====== if (_response > ''); else { return; } // script // ====== var _script = '' + '<script type="text/javascript">' + ' function __this_page_loaded()' + ' {' + ' window.setTimeout(' + ' function () {' + ($R.component ? 'window.parent.' : 'window.parent.parent.') + '$readable.getContent__nextPage__loadedInFrame("'+_pageNr+'", window); }, ' + ' 250' + ' );' + ' } ' + ' if (document.readyState); else { __this_page_loaded(); } ' + ' function __this_page_loaded_ready(delayedNrTimes)' + ' {' + ' if (document.readyState != "complete" && delayedNrTimes < 30)' + ' { setTimeout(function () { __this_page_loaded_ready(delayedNrTimes+1); }, 100); return; }' + ' __this_page_loaded();' + ' }' + ' __this_page_loaded_ready(0);' + '</script>' ; // get html // ======== var _html = _response; // normalize // ========= _html = _html.replace(/<\s+/gi, '<'); _html = _html.replace(/\s+>/gi, '>'); _html = _html.replace(/\s+\/>/gi, '/>'); // remove // ====== _html = _html.replace(/<script[^>]*?>([\s\S]*?)<\/script>/gi, ''); _html = _html.replace(/<script[^>]*?\/>/gi, ''); _html = _html.replace(/
").addClass("mCustomScrollbar _mCS_"+c(document).data("mCustomScrollbar-index"));var g=m.children(".mCustomScrollBox");if(e.horizontalScroll){g.addClass("mCSB_horizontal").wrapInner("
");var k=g.children(".mCSB_h_wrapper");k.wrapInner("
").children(".mCSB_container").css({width:k.children().outerWidth(),position:"relative"}).unwrap()}else{g.wrapInner("
")}var o=g.children(".mCSB_container");if(c.support.touch){o.addClass("mCS_touch")}o.after("
");var l=g.children(".mCSB_scrollTools"),h=l.children(".mCSB_draggerContainer"),q=h.children(".mCSB_dragger");if(e.horizontalScroll){q.data("minDraggerWidth",q.width())}else{q.data("minDraggerHeight",q.height())}if(e.scrollButtons.enable){if(e.horizontalScroll){l.prepend("").append("")}else{l.prepend("").append("")}}g.bind("scroll",function(){if(!m.is(".mCS_disabled")){g.scrollTop(0).scrollLeft(0)}});m.data({mCS_Init:true,mCustomScrollbarIndex:c(document).data("mCustomScrollbar-index"),horizontalScroll:e.horizontalScroll,scrollInertia:e.scrollInertia,scrollEasing:"mcsEaseOut",mouseWheel:e.mouseWheel,mouseWheelPixels:e.mouseWheelPixels,autoDraggerLength:e.autoDraggerLength,autoHideScrollbar:e.autoHideScrollbar,alwaysShowScrollbar:e.alwaysShowScrollbar,snapAmount:e.snapAmount,snapOffset:e.snapOffset,scrollButtons_enable:e.scrollButtons.enable,scrollButtons_scrollType:e.scrollButtons.scrollType,scrollButtons_scrollSpeed:e.scrollButtons.scrollSpeed,scrollButtons_scrollAmount:e.scrollButtons.scrollAmount,autoExpandHorizontalScroll:e.advanced.autoExpandHorizontalScroll,autoScrollOnFocus:e.advanced.autoScrollOnFocus,normalizeMouseWheelDelta:e.advanced.normalizeMouseWheelDelta,contentTouchScroll:e.contentTouchScroll,onScrollStart_Callback:e.callbacks.onScrollStart,onScroll_Callback:e.callbacks.onScroll,onTotalScroll_Callback:e.callbacks.onTotalScroll,onTotalScrollBack_Callback:e.callbacks.onTotalScrollBack,onTotalScroll_Offset:e.callbacks.onTotalScrollOffset,onTotalScrollBack_Offset:e.callbacks.onTotalScrollBackOffset,whileScrolling_Callback:e.callbacks.whileScrolling,bindEvent_scrollbar_drag:false,bindEvent_content_touch:false,bindEvent_scrollbar_click:false,bindEvent_mousewheel:false,bindEvent_buttonsContinuous_y:false,bindEvent_buttonsContinuous_x:false,bindEvent_buttonsPixels_y:false,bindEvent_buttonsPixels_x:false,bindEvent_focusin:false,bindEvent_autoHideScrollbar:false,mCSB_buttonScrollRight:false,mCSB_buttonScrollLeft:false,mCSB_buttonScrollDown:false,mCSB_buttonScrollUp:false});if(e.horizontalScroll){if(m.css("max-width")!=="none"){if(!e.advanced.updateOnContentResize){e.advanced.updateOnContentResize=true}}}else{if(m.css("max-height")!=="none"){var s=false,r=parseInt(m.css("max-height"));if(m.css("max-height").indexOf("%")>=0){s=r,r=m.parent().height()*s/100}m.css("overflow","hidden");g.css("max-height",r)}}m.mCustomScrollbar("update");if(e.advanced.updateOnBrowserResize){var i,j=c(window).width(),u=c(window).height();c(window).bind("resize."+m.data("mCustomScrollbarIndex"),function(){if(i){clearTimeout(i)}i=setTimeout(function(){if(!m.is(".mCS_disabled")&&!m.is(".mCS_destroyed")){var w=c(window).width(),v=c(window).height();if(j!==w||u!==v){if(m.css("max-height")!=="none"&&s){g.css("max-height",m.parent().height()*s/100)}m.mCustomScrollbar("update");j=w;u=v}}},150)})}if(e.advanced.updateOnContentResize){var p;if(e.horizontalScroll){var n=o.outerWidth()}else{var n=o.outerHeight()}p=setInterval(function(){if(e.horizontalScroll){if(e.advanced.autoExpandHorizontalScroll){o.css({position:"absolute",width:"auto"}).wrap("
").css({width:o.outerWidth(),position:"relative"}).unwrap()}var v=o.outerWidth()}else{var v=o.outerHeight()}if(v!=n){m.mCustomScrollbar("update");n=v}},300)}})},update:function(){var n=c(this),k=n.children(".mCustomScrollBox"),q=k.children(".mCSB_container");q.removeClass("mCS_no_scrollbar");n.removeClass("mCS_disabled mCS_destroyed");k.scrollTop(0).scrollLeft(0);var y=k.children(".mCSB_scrollTools"),o=y.children(".mCSB_draggerContainer"),m=o.children(".mCSB_dragger");if(n.data("horizontalScroll")){var A=y.children(".mCSB_buttonLeft"),t=y.children(".mCSB_buttonRight"),f=k.width();if(n.data("autoExpandHorizontalScroll")){q.css({position:"absolute",width:"auto"}).wrap("
").css({width:q.outerWidth(),position:"relative"}).unwrap()}var z=q.outerWidth()}else{var w=y.children(".mCSB_buttonUp"),g=y.children(".mCSB_buttonDown"),r=k.height(),i=q.outerHeight()}if(i>r&&!n.data("horizontalScroll")){y.css("display","block");var s=o.height();if(n.data("autoDraggerLength")){var u=Math.round(r/i*s),l=m.data("minDraggerHeight");if(u<=l){m.css({height:l})}else{if(u>=s-10){var p=s-10;m.css({height:p})}else{m.css({height:u})}}m.children(".mCSB_dragger_bar").css({"line-height":m.height()+"px"})}var B=m.height(),x=(i-r)/(s-B);n.data("scrollAmount",x).mCustomScrollbar("scrolling",k,q,o,m,w,g,A,t);var D=Math.abs(q.position().top);n.mCustomScrollbar("scrollTo",D,{scrollInertia:0,trigger:"internal"})}else{if(z>f&&n.data("horizontalScroll")){y.css("display","block");var h=o.width();if(n.data("autoDraggerLength")){var j=Math.round(f/z*h),C=m.data("minDraggerWidth");if(j<=C){m.css({width:C})}else{if(j>=h-10){var e=h-10;m.css({width:e})}else{m.css({width:j})}}}var v=m.width(),x=(z-f)/(h-v);n.data("scrollAmount",x).mCustomScrollbar("scrolling",k,q,o,m,w,g,A,t);var D=Math.abs(q.position().left);n.mCustomScrollbar("scrollTo",D,{scrollInertia:0,trigger:"internal"})}else{k.unbind("mousewheel focusin");if(n.data("horizontalScroll")){m.add(q).css("left",0)}else{m.add(q).css("top",0)}if(n.data("alwaysShowScrollbar")){if(!n.data("horizontalScroll")){m.css({height:o.height()})}else{if(n.data("horizontalScroll")){m.css({width:o.width()})}}}else{y.css("display","none");q.addClass("mCS_no_scrollbar")}n.data({bindEvent_mousewheel:false,bindEvent_focusin:false})}}},scrolling:function(i,q,n,k,A,f,D,w){var l=c(this);if(!l.data("bindEvent_scrollbar_drag")){var o,p,C,z,e;if(c.support.pointer){C="pointerdown";z="pointermove";e="pointerup"}else{if(c.support.msPointer){C="MSPointerDown";z="MSPointerMove";e="MSPointerUp"}}if(c.support.pointer||c.support.msPointer){k.bind(C,function(K){K.preventDefault();l.data({on_drag:true});k.addClass("mCSB_dragger_onDrag");var J=c(this),M=J.offset(),I=K.originalEvent.pageX-M.left,L=K.originalEvent.pageY-M.top;if(I0&&L0){o=L;p=I}});c(document).bind(z+"."+l.data("mCustomScrollbarIndex"),function(K){K.preventDefault();if(l.data("on_drag")){var J=k,M=J.offset(),I=K.originalEvent.pageX-M.left,L=K.originalEvent.pageY-M.top;G(o,p,L,I)}}).bind(e+"."+l.data("mCustomScrollbarIndex"),function(x){l.data({on_drag:false});k.removeClass("mCSB_dragger_onDrag")})}else{k.bind("mousedown touchstart",function(K){K.preventDefault();K.stopImmediatePropagation();var J=c(this),N=J.offset(),I,M;if(K.type==="touchstart"){var L=K.originalEvent.touches[0]||K.originalEvent.changedTouches[0];I=L.pageX-N.left;M=L.pageY-N.top}else{l.data({on_drag:true});k.addClass("mCSB_dragger_onDrag");I=K.pageX-N.left;M=K.pageY-N.top}if(I0&&M0){o=M;p=I}}).bind("touchmove",function(K){K.preventDefault();K.stopImmediatePropagation();var N=K.originalEvent.touches[0]||K.originalEvent.changedTouches[0],J=c(this),M=J.offset(),I=N.pageX-M.left,L=N.pageY-M.top;G(o,p,L,I)});c(document).bind("mousemove."+l.data("mCustomScrollbarIndex"),function(K){if(l.data("on_drag")){var J=k,M=J.offset(),I=K.pageX-M.left,L=K.pageY-M.top;G(o,p,L,I)}}).bind("mouseup."+l.data("mCustomScrollbarIndex"),function(x){l.data({on_drag:false});k.removeClass("mCSB_dragger_onDrag")})}l.data({bindEvent_scrollbar_drag:true})}function G(J,K,L,I){if(l.data("horizontalScroll")){l.mCustomScrollbar("scrollTo",(k.position().left-(K))+I,{moveDragger:true,trigger:"internal"})}else{l.mCustomScrollbar("scrollTo",(k.position().top-(J))+L,{moveDragger:true,trigger:"internal"})}}if(c.support.touch&&l.data("contentTouchScroll")){if(!l.data("bindEvent_content_touch")){var m,E,s,t,v,F,H;q.bind("touchstart",function(x){x.stopImmediatePropagation();m=x.originalEvent.touches[0]||x.originalEvent.changedTouches[0];E=c(this);s=E.offset();v=m.pageX-s.left;t=m.pageY-s.top;F=t;H=v});q.bind("touchmove",function(x){x.preventDefault();x.stopImmediatePropagation();m=x.originalEvent.touches[0]||x.originalEvent.changedTouches[0];E=c(this).parent();s=E.offset();v=m.pageX-s.left;t=m.pageY-s.top;if(l.data("horizontalScroll")){l.mCustomScrollbar("scrollTo",H-v,{trigger:"internal"})}else{l.mCustomScrollbar("scrollTo",F-t,{trigger:"internal"})}})}}if(!l.data("bindEvent_scrollbar_click")){n.bind("click",function(I){var x=(I.pageY-n.offset().top)*l.data("scrollAmount"),y=c(I.target);if(l.data("horizontalScroll")){x=(I.pageX-n.offset().left)*l.data("scrollAmount")}if(y.hasClass("mCSB_draggerContainer")||y.hasClass("mCSB_draggerRail")){l.mCustomScrollbar("scrollTo",x,{trigger:"internal",scrollEasing:"draggerRailEase"})}});l.data({bindEvent_scrollbar_click:true})}if(l.data("mouseWheel")){if(!l.data("bindEvent_mousewheel")){i.bind("mousewheel",function(K,M){var J,I=l.data("mouseWheelPixels"),x=Math.abs(q.position().top),L=k.position().top,y=n.height()-k.height();if(l.data("normalizeMouseWheelDelta")){if(M<0){M=-1}else{M=1}}if(I==="auto"){I=100+Math.round(l.data("scrollAmount")/2)}if(l.data("horizontalScroll")){L=k.position().left;y=n.width()-k.width();x=Math.abs(q.position().left)}if((M>0&&L!==0)||(M<0&&L!==y)){K.preventDefault();K.stopImmediatePropagation()}J=x-(M*I);l.mCustomScrollbar("scrollTo",J,{trigger:"internal"})});l.data({bindEvent_mousewheel:true})}}if(l.data("scrollButtons_enable")){if(l.data("scrollButtons_scrollType")==="pixels"){if(l.data("horizontalScroll")){w.add(D).unbind("mousedown touchstart MSPointerDown pointerdown mouseup MSPointerUp pointerup mouseout MSPointerOut pointerout touchend",j,h);l.data({bindEvent_buttonsContinuous_x:false});if(!l.data("bindEvent_buttonsPixels_x")){w.bind("click",function(x){x.preventDefault();r(Math.abs(q.position().left)+l.data("scrollButtons_scrollAmount"))});D.bind("click",function(x){x.preventDefault();r(Math.abs(q.position().left)-l.data("scrollButtons_scrollAmount"))});l.data({bindEvent_buttonsPixels_x:true})}}else{f.add(A).unbind("mousedown touchstart MSPointerDown pointerdown mouseup MSPointerUp pointerup mouseout MSPointerOut pointerout touchend",j,h);l.data({bindEvent_buttonsContinuous_y:false});if(!l.data("bindEvent_buttonsPixels_y")){f.bind("click",function(x){x.preventDefault();r(Math.abs(q.position().top)+l.data("scrollButtons_scrollAmount"))});A.bind("click",function(x){x.preventDefault();r(Math.abs(q.position().top)-l.data("scrollButtons_scrollAmount"))});l.data({bindEvent_buttonsPixels_y:true})}}function r(x){if(!k.data("preventAction")){k.data("preventAction",true);l.mCustomScrollbar("scrollTo",x,{trigger:"internal"})}}}else{if(l.data("horizontalScroll")){w.add(D).unbind("click");l.data({bindEvent_buttonsPixels_x:false});if(!l.data("bindEvent_buttonsContinuous_x")){w.bind("mousedown touchstart MSPointerDown pointerdown",function(y){y.preventDefault();var x=B();l.data({mCSB_buttonScrollRight:setInterval(function(){l.mCustomScrollbar("scrollTo",Math.abs(q.position().left)+x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var j=function(x){x.preventDefault();clearInterval(l.data("mCSB_buttonScrollRight"))};w.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",j);D.bind("mousedown touchstart MSPointerDown pointerdown",function(y){y.preventDefault();var x=B();l.data({mCSB_buttonScrollLeft:setInterval(function(){l.mCustomScrollbar("scrollTo",Math.abs(q.position().left)-x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var h=function(x){x.preventDefault();clearInterval(l.data("mCSB_buttonScrollLeft"))};D.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",h);l.data({bindEvent_buttonsContinuous_x:true})}}else{f.add(A).unbind("click");l.data({bindEvent_buttonsPixels_y:false});if(!l.data("bindEvent_buttonsContinuous_y")){f.bind("mousedown touchstart MSPointerDown pointerdown",function(y){y.preventDefault();var x=B();l.data({mCSB_buttonScrollDown:setInterval(function(){l.mCustomScrollbar("scrollTo",Math.abs(q.position().top)+x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var u=function(x){x.preventDefault();clearInterval(l.data("mCSB_buttonScrollDown"))};f.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",u);A.bind("mousedown touchstart MSPointerDown pointerdown",function(y){y.preventDefault();var x=B();l.data({mCSB_buttonScrollUp:setInterval(function(){l.mCustomScrollbar("scrollTo",Math.abs(q.position().top)-x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var g=function(x){x.preventDefault();clearInterval(l.data("mCSB_buttonScrollUp"))};A.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",g);l.data({bindEvent_buttonsContinuous_y:true})}}function B(){var x=l.data("scrollButtons_scrollSpeed");if(l.data("scrollButtons_scrollSpeed")==="auto"){x=Math.round((l.data("scrollInertia")+100)/40)}return x}}}if(l.data("autoScrollOnFocus")){if(!l.data("bindEvent_focusin")){i.bind("focusin",function(){i.scrollTop(0).scrollLeft(0);var x=c(document.activeElement);if(x.is("input,textarea,select,button,a[tabindex],area,object")){var J=q.position().top,y=x.position().top,I=i.height()-x.outerHeight();if(l.data("horizontalScroll")){J=q.position().left;y=x.position().left;I=i.width()-x.outerWidth()}if(J+y<0||J+y>I){l.mCustomScrollbar("scrollTo",y,{trigger:"internal"})}}});l.data({bindEvent_focusin:true})}}if(l.data("autoHideScrollbar")&&!l.data("alwaysShowScrollbar")){if(!l.data("bindEvent_autoHideScrollbar")){i.bind("mouseenter",function(x){i.addClass("mCS-mouse-over");d.showScrollbar.call(i.children(".mCSB_scrollTools"))}).bind("mouseleave touchend",function(x){i.removeClass("mCS-mouse-over");if(x.type==="mouseleave"){d.hideScrollbar.call(i.children(".mCSB_scrollTools"))}});l.data({bindEvent_autoHideScrollbar:true})}}},scrollTo:function(e,f){var i=c(this),o={moveDragger:false,trigger:"external",callbacks:true,scrollInertia:i.data("scrollInertia"),scrollEasing:i.data("scrollEasing")},f=c.extend(o,f),p,g=i.children(".mCustomScrollBox"),k=g.children(".mCSB_container"),r=g.children(".mCSB_scrollTools"),j=r.children(".mCSB_draggerContainer"),h=j.children(".mCSB_dragger"),t=draggerSpeed=f.scrollInertia,q,s,m,l;if(!k.hasClass("mCS_no_scrollbar")){i.data({mCS_trigger:f.trigger});if(i.data("mCS_Init")){f.callbacks=false}if(e||e===0){if(typeof(e)==="number"){if(f.moveDragger){p=e;if(i.data("horizontalScroll")){e=h.position().left*i.data("scrollAmount")}else{e=h.position().top*i.data("scrollAmount")}draggerSpeed=0}else{p=e/i.data("scrollAmount")}}else{if(typeof(e)==="string"){var v;if(e==="top"){v=0}else{if(e==="bottom"&&!i.data("horizontalScroll")){v=k.outerHeight()-g.height()}else{if(e==="left"){v=0}else{if(e==="right"&&i.data("horizontalScroll")){v=k.outerWidth()-g.width()}else{if(e==="first"){v=i.find(".mCSB_container").find(":first")}else{if(e==="last"){v=i.find(".mCSB_container").find(":last")}else{v=i.find(e)}}}}}}if(v.length===1){if(i.data("horizontalScroll")){e=v.position().left}else{e=v.position().top}p=e/i.data("scrollAmount")}else{p=e=v}}}if(i.data("horizontalScroll")){if(i.data("onTotalScrollBack_Offset")){s=-i.data("onTotalScrollBack_Offset")}if(i.data("onTotalScroll_Offset")){l=g.width()-k.outerWidth()+i.data("onTotalScroll_Offset")}if(p<0){p=e=0;clearInterval(i.data("mCSB_buttonScrollLeft"));if(!s){q=true}}else{if(p>=j.width()-h.width()){p=j.width()-h.width();e=g.width()-k.outerWidth();clearInterval(i.data("mCSB_buttonScrollRight"));if(!l){m=true}}else{e=-e}}var n=i.data("snapAmount");if(n){e=Math.round(e/n)*n-i.data("snapOffset")}d.mTweenAxis.call(this,h[0],"left",Math.round(p),draggerSpeed,f.scrollEasing);d.mTweenAxis.call(this,k[0],"left",Math.round(e),t,f.scrollEasing,{onStart:function(){if(f.callbacks&&!i.data("mCS_tweenRunning")){u("onScrollStart")}if(i.data("autoHideScrollbar")&&!i.data("alwaysShowScrollbar")){d.showScrollbar.call(r)}},onUpdate:function(){if(f.callbacks){u("whileScrolling")}},onComplete:function(){if(f.callbacks){u("onScroll");if(q||(s&&k.position().left>=s)){u("onTotalScrollBack")}if(m||(l&&k.position().left<=l)){u("onTotalScroll")}}h.data("preventAction",false);i.data("mCS_tweenRunning",false);if(i.data("autoHideScrollbar")&&!i.data("alwaysShowScrollbar")){if(!g.hasClass("mCS-mouse-over")){d.hideScrollbar.call(r)}}}})}else{if(i.data("onTotalScrollBack_Offset")){s=-i.data("onTotalScrollBack_Offset")}if(i.data("onTotalScroll_Offset")){l=g.height()-k.outerHeight()+i.data("onTotalScroll_Offset")}if(p<0){p=e=0;clearInterval(i.data("mCSB_buttonScrollUp"));if(!s){q=true}}else{if(p>=j.height()-h.height()){p=j.height()-h.height();e=g.height()-k.outerHeight();clearInterval(i.data("mCSB_buttonScrollDown"));if(!l){m=true}}else{e=-e}}var n=i.data("snapAmount");if(n){e=Math.round(e/n)*n-i.data("snapOffset")}d.mTweenAxis.call(this,h[0],"top",Math.round(p),draggerSpeed,f.scrollEasing);d.mTweenAxis.call(this,k[0],"top",Math.round(e),t,f.scrollEasing,{onStart:function(){if(f.callbacks&&!i.data("mCS_tweenRunning")){u("onScrollStart")}if(i.data("autoHideScrollbar")&&!i.data("alwaysShowScrollbar")){d.showScrollbar.call(r)}},onUpdate:function(){if(f.callbacks){u("whileScrolling")}},onComplete:function(){if(f.callbacks){u("onScroll");if(q||(s&&k.position().top>=s)){u("onTotalScrollBack")}if(m||(l&&k.position().top<=l)){u("onTotalScroll")}}h.data("preventAction",false);i.data("mCS_tweenRunning",false);if(i.data("autoHideScrollbar")&&!i.data("alwaysShowScrollbar")){if(!g.hasClass("mCS-mouse-over")){d.hideScrollbar.call(r)}}}})}if(i.data("mCS_Init")){i.data({mCS_Init:false})}}}function u(w){if(i.data("mCustomScrollbarIndex")){this.mcs={top:k.position().top,left:k.position().left,draggerTop:h.position().top,draggerLeft:h.position().left,topPct:Math.round((100*Math.abs(k.position().top))/Math.abs(k.outerHeight()-g.height())),leftPct:Math.round((100*Math.abs(k.position().left))/Math.abs(k.outerWidth()-g.width()))};switch(w){case"onScrollStart":i.data("mCS_tweenRunning",true).data("onScrollStart_Callback").call(i,this.mcs);break;case"whileScrolling":i.data("whileScrolling_Callback").call(i,this.mcs);break;case"onScroll":i.data("onScroll_Callback").call(i,this.mcs);break;case"onTotalScrollBack":i.data("onTotalScrollBack_Callback").call(i,this.mcs);break;case"onTotalScroll":i.data("onTotalScroll_Callback").call(i,this.mcs);break}}}},stop:function(){var g=c(this),e=g.children().children(".mCSB_container"),f=g.children().children().children().children(".mCSB_dragger");d.mTweenAxisStop.call(this,e[0]);d.mTweenAxisStop.call(this,f[0])},disable:function(e){var j=c(this),f=j.children(".mCustomScrollBox"),h=f.children(".mCSB_container"),g=f.children(".mCSB_scrollTools"),i=g.children().children(".mCSB_dragger");f.unbind("mousewheel focusin mouseenter mouseleave touchend");h.unbind("touchstart touchmove");if(e){if(j.data("horizontalScroll")){i.add(h).css("left",0)}else{i.add(h).css("top",0)}}g.css("display","none");h.addClass("mCS_no_scrollbar");j.data({bindEvent_mousewheel:false,bindEvent_focusin:false,bindEvent_content_touch:false,bindEvent_autoHideScrollbar:false}).addClass("mCS_disabled")},destroy:function(){var e=c(this);e.removeClass("mCustomScrollbar _mCS_"+e.data("mCustomScrollbarIndex")).addClass("mCS_destroyed").children().children(".mCSB_container").unwrap().children().unwrap().siblings(".mCSB_scrollTools").remove();c(document).unbind("mousemove."+e.data("mCustomScrollbarIndex")+" mouseup."+e.data("mCustomScrollbarIndex")+" MSPointerMove."+e.data("mCustomScrollbarIndex")+" MSPointerUp."+e.data("mCustomScrollbarIndex"));c(window).unbind("resize."+e.data("mCustomScrollbarIndex"))}},d={showScrollbar:function(){this.stop().animate({opacity:1},"fast")},hideScrollbar:function(){this.stop().animate({opacity:0},"fast")},mTweenAxis:function(g,i,h,f,o,y){var y=y||{},v=y.onStart||function(){},p=y.onUpdate||function(){},w=y.onComplete||function(){};var n=t(),l,j=0,r=g.offsetTop,s=g.style;if(i==="left"){r=g.offsetLeft}var m=h-r;q();e();function t(){if(window.performance&&window.performance.now){return window.performance.now()}else{if(window.performance&&window.performance.webkitNow){return window.performance.webkitNow()}else{if(Date.now){return Date.now()}else{return new Date().getTime()}}}}function x(){if(!j){v.call()}j=t()-n;u();if(j>=g._time){g._time=(j>g._time)?j+l-(j-g._time):j+l-1;if(g._time0){g.currVal=k(g._time,r,m,f,o);s[i]=Math.round(g.currVal)+"px"}else{s[i]=h+"px"}p.call()}function e(){l=1000/60;g._time=j+l;_request=(!window.requestAnimationFrame)?function(z){u();return setTimeout(z,0.01)}:window.requestAnimationFrame;g._id=_request(x)}function q(){if(g._id==null){return}if(!window.requestAnimationFrame){clearTimeout(g._id)}else{window.cancelAnimationFrame(g._id)}g._id=null}function k(B,A,F,E,C){switch(C){case"linear":return F*B/E+A;break;case"easeOutQuad":B/=E;return -F*B*(B-2)+A;break;case"easeInOutQuad":B/=E/2;if(B<1){return F/2*B*B+A}B--;return -F/2*(B*(B-2)-1)+A;break;case"easeOutCubic":B/=E;B--;return F*(B*B*B+1)+A;break;case"easeOutQuart":B/=E;B--;return -F*(B*B*B*B-1)+A;break;case"easeOutQuint":B/=E;B--;return F*(B*B*B*B*B+1)+A;break;case"easeOutCirc":B/=E;B--;return F*Math.sqrt(1-B*B)+A;break;case"easeOutSine":return F*Math.sin(B/E*(Math.PI/2))+A;break;case"easeOutExpo":return F*(-Math.pow(2,-10*B/E)+1)+A;break;case"mcsEaseOut":var D=(B/=E)*B,z=D*B;return A+F*(0.499999999999997*z*D+-2.5*D*D+5.5*z+-6.5*D+4*B);break;case"draggerRailEase":B/=E/2;if(B<1){return F/2*B*B*B+A}B-=2;return F/2*(B*B*B+2)+A;break}}},mTweenAxisStop:function(e){if(e._id==null){return}if(!window.requestAnimationFrame){clearTimeout(e._id)}else{window.cancelAnimationFrame(e._id)}e._id=null},rafPolyfill:function(){var f=["ms","moz","webkit","o"],e=f.length;while(--e>-1&&!window.requestAnimationFrame){window.requestAnimationFrame=window[f[e]+"RequestAnimationFrame"];window.cancelAnimationFrame=window[f[e]+"CancelAnimationFrame"]||window[f[e]+"CancelRequestAnimationFrame"]}}};d.rafPolyfill.call();c.support.touch=!!("ontouchstart" in window);c.support.pointer=window.navigator.pointerEnabled;c.support.msPointer=window.navigator.msPointerEnabled;var a=("https:"==document.location.protocol)?"https:":"http:";c.event.special.mousewheel||document.write('<script defer="" type="text/javascript" charset="ANSI">// HTML5 placeholder plugin version 1.01 // Copyright (c) 2010-The End of Time, Mike Taylor, http://miketaylr.com // MIT Licensed: http://www.opensource.org/licenses/mit-license.php // // Enables cross-browser HTML5 placeholder for inputs, by first testing // for a native implementation before building one. // // // USAGE: //$('input[placeholder]').placeholder(); // <input type="text" placeholder="username"> (function($){ //feature detection var hasPlaceholder = 'placeholder' in document.createElement('input'); var placeholderClass = 'evn-placeholder'; //sniffy sniff sniff -- just to give extra left padding for the older //graphics for type=email and type=url var isOldOpera = $.browser.opera && $.browser.version < 10.5; $.fn.placeholder = function(options) { //merge in passed in options, if any var options = $.extend({}, $.fn.placeholder.defaults, options), //cache the original 'left' value, for use by Opera later o_left = options.placeholderCSS.left; //first test for native placeholder support before continuing //feature detection inspired by ye olde jquery 1.4 hawtness, with paul irish return (hasPlaceholder) ? this : this.each(function() { //local vars var $this = $(this), inputVal = $.trim($this.val()), inputWidth = $this.width(), inputHeight = $this.height(), //grab the inputs id for the
', placeholderText: null, //more or less just emulating what webkit does here //tweak to your hearts content placeholderCSS: { 'font':'0.75em sans-serif', 'color':'#bababa', 'position': 'absolute', 'left':'5px', 'top':'3px', 'overflow': 'hidden' } }; })(jQuery);</script><script defer="" type="text/javascript" charset="ANSI">/*! * ClearlyComponent__detect * Evernote Clearly's content-detection algorithm as an embeddable component. * Copyright 2013, Evernote Corporation * * Usage: * ====== * * // define * window.ClearlyComponent__detect = { * 'callbacks': { * 'finished': someFunction(), * }, * 'window': window, * 'document': document, * 'jQuery': window.jQuery * }; * * // init -- will return false, if something goes wrong * window.ClearlyComponent__detect = initClearlyComponent__detect(window.ClearlyComponent__detect); * * // call -- returns nothing; callbacks will be used * window.ClearlyComponent__detect.start(); * * // publcly available/overridable * window.ClearlyComponent__detect.debug * window.ClearlyComponent__detect.parseOptions * */ /* changes: ======== $R => $D $R.win => $D.window $R.parsingOptions => $D.parseOptions $R.skipStuffFromDomains__links => $D.parseOptions._skip_link_from_domain $R.skipStuffFromDomain__images => $D.parseOptions._skip_image_from_domain $R.keepStuffFromDomain__video => $D.parseOptions._keep_video_from_domain $R.getContent__processCandidates => $D.getContent__processCandidates__first $R.getContent__computePointsForCandidate => $D.getContent__computePointsForCandidate__first $R.getContent__computeDetailsForCandidate => $D.getContent__computeDetailsForCandidate__first $R.getContent__processCandidatesSecond => $D.getContent__processCandidates__second $R.getContent__computePointsForCandidateSecond => $D.getContent__computePointsForCandidate__second $R.getContent__computeDetailsForCandidateSecond => $D.getContent__computeDetailsForCandidate__second $R.getContent__computePointsForCandidateThird => $D.getContent__computePointsForCandidate__third $R.getContent__computeDetailsForCandidateThird => $D.getContent__computeDetailsForCandidate__third to do: ====== */ function initClearlyComponent__detect(_paramInstance) { // global instance reference { // =========================== // null; return if (_paramInstance); else { return false; } // shorthand $D = _paramInstance; // global instance reference } // required vars { // =============== // the component instance object must already be created, // when the init function is called. it must have these vars set: switch (true) { case (!($D.callbacks)): case (!($D.callbacks.finished)): case (!($D.window)): case (!($D.document)): case (!($D.document.body)): case (!($D.jQuery)): if ($D.debug) { console.log(!($D.callbacks)); console.log(!($D.callbacks.finished)); console.log(!($D.window)); console.log(!($D.document)); console.log(!($D.document.body)); console.log(!($D.jQuery)); } // something's wrong return false; } // required vars } // global vars { // ============= $CJ = $D.jQuery; $D.$window = $CJ($D.window); $D.$document = $CJ($D.document); // global vars } // parse options { // =============== $D.parseOptions = { '_elements_ignore': '|button|input|select|textarea|optgroup|command|datalist|--|frame|frameset|noframes|--|style|link|script|noscript|--|canvas|applet|map|--|marquee|area|base|', '_elements_ignore_id': '|evernote-content|evernote-attributes-content|evernote-share-content|evernoteErrorPopup|evernote-post-clip-content|', '_elements_ignore_tag': '|form|fieldset|details|dir|--|center|font|span|', '_elements_container': '|body|--|article|section|--|div|--|td|--|li|--|dd|dt|', '_elements_self_closing': '|br|hr|--|img|--|col|--|source|--|embed|param|--|iframe|', '_elements_visible': '|article|section|--|ul|ol|li|dd|--|table|tr|td|--|div|--|p|--|h1|h2|h3|h4|h5|h6|--|span|', '_elements_too_much_content': '|b|i|em|strong|--|h1|h2|h3|h4|h5|--|td|', '_elements_link_density': '|div|--|table|ul|ol|--|section|aside|header|', '_elements_floating': '|div|--|table|', '_elements_above_target_ignore': '|br|--|ul|ol|dl|--|table|', '_unskippable_attribute': 'clearly__unskippable_element', '_unskippable_attribute_value': 'yes', '_use_document_title_attribute': 'clearly__use_document_title_as_article_title', '_use_document_title_attribute_value': 'yes', '_elements_keep_attributes': { 'a': ['href', 'title', 'name'], 'img': ['src', 'width', 'height', 'alt', 'title'], 'video': ['src', 'width', 'height', 'poster', 'audio', 'preload', 'autoplay', 'loop', 'controls'], 'audio': ['src', 'preload', 'autoplay', 'loop', 'controls'], 'source': ['src', 'type'], 'object': ['data', 'type', 'width', 'height', 'classid', 'codebase', 'codetype'], 'param': ['name', 'value'], 'embed': ['src', 'type', 'width', 'height', 'flashvars', 'allowscriptaccess', 'allowfullscreen', 'bgcolor'], 'iframe': ['src', 'width', 'height', 'frameborder', 'scrolling'], 'td': ['colspan', 'rowspan'], 'th': ['colspan', 'rowspan'] }, '_skip_link_from_domain': [ /* international */ 'doubleclick.net', 'fastclick.net', 'adbrite.com', 'adbureau.net', 'admob.com', 'bannersxchange.com', 'buysellads.com', 'impact-ad.jp', 'atdmt.com', 'advertising.com', 'serving-sys.com', /* japan */ 'itmedia.jp', 'microad.jp', 'adplan-ds.com' ], '_skip_image_from_domain': [ /* international */ 'googlesyndication.com', 'fastclick.net', '.2mdn.net', 'de17a.com', 'content.aimatch.com', 'bannersxchange.com', 'buysellads.com', 'atdmt.com', 'advertising.com', 'serving-sys.com', /* japan */ 'impact-ad.jp', 'itmedia.jp', 'microad.jp', 'adplan-ds.com' ], '_keep_video_from_domain': [ /* video */ 'youtube.com', 'youtube-nocookie.com', 'vimeo.com', 'hulu.com', 'flickr.com', /* other */ 'yahoo.com', 'newsnetz.ch' ] }; // parse options } // debug { // ======= $D.debug = ($D.debug || false); $D.debugRemembered = {}; $D.debugTimers = []; if ($D.debug) { // writeLog // ======== switch (true) { case (!(!($D.window.console && $D.window.console.log))): $D.writeLog = function (msg) { $D.window.console.log(msg); }; break; case (!(!($D.window.opera && $D.window.opera.postError))): $D.writeLog = function (msg) { $D.window.opera.postError(msg); }; break; default: $D.writeLog = function (msg) {}; break; } // log // === $D.log = function () { if ($D.debug); else { return; } for (var i=0, il=arguments.length; i'')): case (_element.tagName.toLowerCase() == 'onject'): case (_element.tagName.toLowerCase() == 'embed'): return; } switch (true) { case (_category == 'target' && _reason == 'first'): _outline = '#00cc00'; _background = ''; break; case (_category == 'target' && _reason == 'second'): _outline = '#0000cc'; _background = ''; break; case (_category == 'target' && _reason == 'next-page'): _outline = '#FF80C0'; _background = ''; break; case (_category == 'target' && _reason == 'add-above'): _outline = '#804000'; _background = ''; break; case (_category == 'clean-before' && _reason == 'floating'): _outline = '#808080'; _background = ''; break; case (_category == 'clean-after' && _reason == 'missing-density'): _outline = '#C0C0C0'; _background = ''; break; case (_category == 'clean-after' || _category == 'clean-before'): _outline = '#000000'; _background = ''; break; } // do $CJ(_element).attr('readable__outline', (_category + ': ' + _reason)); $CJ(_element).css({ 'outline': '5px solid ' + _outline, 'background-color': '' + _background }); }; // timers // ====== $D.debugTimerStart = function (timerName) { $D.debugTimers.push({ 'name': timerName, 'start': (new Date()).getTime() }); }; $D.debugTimerEnd = function () { var _t = $D.debugTimers.pop(), _time = ((new Date()).getTime() - _t.start); $D.log('TIMER / '+_t.name+': ' + _time); return _time; }; } else { $D.writeLog = function () { return false; }; $D.log = function () { return false; }; $D.debugRemember = function () { return false; }; $D.debugOutline = function () { return false; }; $D.debugTimerStart = function () { return false; }; $D.debugTimerEnd = function () { return false; }; } // debug } // language { // ========== // default $D.language = 'general'; // text to test // ============ // title $D.textForlanguageDetection = $D.document.title; // snippets // ... // check // ===== switch (true) { case ($D.textForlanguageDetection.match(/([\u3000])/gi) != null): case ($D.textForlanguageDetection.match(/([\u3001])/gi) != null): case ($D.textForlanguageDetection.match(/([\u3002])/gi) != null): case ($D.textForlanguageDetection.match(/([\u301C])/gi) != null): $D.language = 'cjk'; break; } // language } // rtl { // ===== // flags $D.rtl = false; $D.maybeRTL = false; // on/off $D.makeRTL = function () { $D.rtl = true; }; $D.makeNotRTL = function () { $D.rtl = false; }; // detect (function () { // definitely $D.$document.find('html, body').each(function (_i, _e) { switch (true) { case ($CJ(_e).attr('dir') == 'rtl'): case ($CJ(_e).css('direction') == 'rtl'): case ($CJ(_e).attr('lang') == 'he'): case ($CJ(_e).attr('lang') == 'he-il'): case ($CJ(_e).attr('lang') == 'ar'): case ($CJ(_e).attr('lang') == 'ur'): $D.makeRTL(); return false; } }); // maybe? if (true && (!$D.rtl) && ($D.$document.find("div[dir='rtl'], table[dir='rtl'], td[dir='rtl']").length > 0) ) { $D.maybeRTL = true; } } )(); // rtl } // measure text { // ============== // asian languages // =============== // http://msdn.microsoft.com/en-us/goglobal/bb688158 // http://en.wikipedia.org/wiki/Japanese_punctuation // http://en.wikipedia.org/wiki/Japanese_typographic_symbols // http://unicode.org/charts/PDF/U3000.pdf // CJK: Chnese, Japanese, Korean -- HAN character set // length // ====== $D.measureText__getTextLength = function (_the_text) { var _text = _the_text; _text = _text.replace(/[\s\n\r]+/gi, ''); //_text = _text.replace(/\d+/, ''); return _text.length; }; // word count // ========== $D.measureText__getWordCount = function (_the_text) { var _text = _the_text; // do stuff // ======== _text = _text.replace(/[\s\n\r]+/gi, ' '); _text = _text.replace(/([.,?!:;()\[\]'""-])/gi, ' $1 '); _text = _text.replace(/([\u3000])/gi, '[=words(1)]'); _text = _text.replace(/([\u3001])/gi, '[=words(2)]'); _text = _text.replace(/([\u3002])/gi, '[=words(4)]'); _text = _text.replace(/([\u301C])/gi, '[=words(2)]'); _text = _text.replace(/([\u2026|\u2025])/gi, '[=words(2)]'); _text = _text.replace(/([\u30FB\uFF65])/gi, '[=words(1)]'); _text = _text.replace(/([\u300C\u300D])/gi, '[=words(1)]'); _text = _text.replace(/([\u300E\u300F])/gi, '[=words(1)]'); _text = _text.replace(/([\u3014\u3015])/gi, '[=words(1)]'); _text = _text.replace(/([\u3008\u3009])/gi, '[=words(1)]'); _text = _text.replace(/([\u300A\u300B])/gi, '[=words(1)]'); _text = _text.replace(/([\u3010\u3011])/gi, '[=words(1)]'); _text = _text.replace(/([\u3016\u3017])/gi, '[=words(1)]'); _text = _text.replace(/([\u3018\u3019])/gi, '[=words(1)]'); _text = _text.replace(/([\u301A\u301B])/gi, '[=words(1)]'); _text = _text.replace(/([\u301D\u301E\u301F])/gi, '[=words(1)]'); _text = _text.replace(/([\u30A0])/gi, '[=words(1)]'); // count // ===== var _count = 0, _words_match = _text.match(/([^\s\d]{3,})/gi) ; // add match _count += (_words_match != null ? _words_match.length : 0); // add manual count _text.replace(/\[=words\((\d)\)\]/, function (_match, _plus) { _count += (5 * parseInt(_plus)); }); // return // ====== return _count; }; // levenshtein // =========== $D.levenshteinDistance = function (str1, str2) { var l1 = str1.length, l2 = str2.length, i = 0, j = 0, d = []; if (Math.min(l1, l2) === 0) { return Math.max(l1, l2); } for (i = 0 ; i <= l1 ; i++) { d[i] = []; d[i][0] = i; } for (j = 0 ; j <= l2 ; j++) { d[0][j] = j; } for (i = 1 ; i <= l1 ; i++) { for (j = 1 ; j <= l2 ; j++) { d[i][j] = Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + (str1.charAt(i - 1) === str2.charAt(j - 1) ? 0 : 1)); } } return d[l1][l2]; }; // get first fragment // ================== $D.nextPage__getFirstFragment = function (_html) { // remove all tags _html = _html.replace(/<[^>]+?>/gi, ''); // normalize spaces _html = _html.replace(/\s+/gi, ' '); // return first 1000 characters return _html.substr(0, 2000); }; // measure text } // hidden node { // ============= $D.isNodeHidden = function (_node, _tag_name) { switch (true) { case (_node.offsetWidth > 0): case (_node.offsetHeight > 0): break; default: switch (true) { case (_node.offsetLeft > 0): case (_node.offsetTop > 0): break; default: // exclude inline DIVs -- which, stupidly, don't have a width/height if (true && (_tag_name == 'div') && ((_node.style.display || $CJ.css( _node, "display" )) == 'inline') ) { break; } // it's hidden return true; } break; } // it's not hidden return false; }; // hidden node } // compute points for candidate { // ============================== $D.getContent__computePointsForCandidate__do = function (_ratio_remaining, _power, _ratio, _points_history) { var _points_remaining = (_points_history[0] * _ratio_remaining), _points_to_compute = (_points_history[0] - _points_remaining) ; if (_ratio < 0) { //_points_return = (0.75 * _points_remaining); _points_return = _points_remaining; } else { _points_return = 0 + _points_remaining + (_points_to_compute * Math.pow(_ratio, _power)) ; } // add _points_history.unshift(_points_return); }; // compute points for candidate } // process candidates (first) { // ============================ $D.getContent__computeDetailsForCandidate__first = function (_e, _main) { var _r = {}; // bad candidate // ============= if (_e._is__bad) { return _r; } // paragraphs // ========== _r['_count__lines_of_65_characters'] = (_e._length__plain_text / 65); _r['_count__paragraphs_of_3_lines'] = (_r._count__lines_of_65_characters / 3); _r['_count__paragraphs_of_5_lines'] = (_r._count__lines_of_65_characters / 5); _r['_count__paragraphs_of_50_words'] = (_e._count__plain_words / 50); _r['_count__paragraphs_of_80_words'] = (_e._count__plain_words / 80); // total text // ========== _r['_ratio__length__plain_text_to_total_plain_text'] = (_e._length__plain_text / _main._length__plain_text); _r['_ratio__count__plain_words_to_total_plain_words'] = (_e._count__plain_words / _main._count__plain_words); // links // ===== _r['_ratio__length__links_text_to_plain_text'] = (_e._length__links_text / _e._length__plain_text); _r['_ratio__count__links_words_to_plain_words'] = (_e._count__links_words / _e._count__plain_words); _r['_ratio__length__links_text_to_all_text'] = (_e._length__links_text / _e._length__all_text); _r['_ratio__count__links_words_to_all_words'] = (_e._count__links_words / _e._count__all_words); _r['_ratio__length__links_text_to_total_links_text'] = (_e._length__links_text / (_main._length__links_text + 1)); _r['_ratio__count__links_words_to_total_links_words'] = (_e._count__links_words / (_main._count__links_words + 1)); _r['_ratio__count__links_to_total_links'] = (_e._count__links / (_main._count__links + 1)); _r['_ratio__count__links_to_plain_words'] = ((_e._count__links * 2) / _e._count__plain_words); // text above // ========== var _divide__candidates = Math.max(2, Math.ceil(_e._count__above_candidates * 0.5)), _above_text = ((0 + (_e._length__above_plain_text * 1) + (_e._length__above_plain_text / _divide__candidates) ) / 2), _above_words = ((0 + (_e._count__above_plain_words * 1) + (_e._count__above_plain_words / _divide__candidates) ) / 2) ; _r['_ratio__length__above_plain_text_to_total_plain_text'] = (_above_text / _main._length__plain_text); _r['_ratio__count__above_plain_words_to_total_plain_words'] = (_above_words / _main._count__plain_words); // candidates // ========== _r['_ratio__count__candidates_to_total_candidates'] = (_e._count__candidates / (_main._count__candidates + 1)); _r['_ratio__count__containers_to_total_containers'] = (_e._count__containers / (_main._count__containers + 1)); // return // ====== return _r; }; $D.getContent__computePointsForCandidate__first = function (_e, _main) { var _details = _e.__candidate_details, _points_history = [], _really_big = ((_main._length__plain_text / 65) > 250) ; // bad candidate if (_e._is__bad) { return [0]; } // the basics // ========== _points_history.unshift(((0 + (_details._count__paragraphs_of_3_lines) + (_details._count__paragraphs_of_5_lines * 1.5) + (_details._count__paragraphs_of_50_words) + (_details._count__paragraphs_of_80_words * 1.5) + (_e._count__images_large * 3) - ((_e._count__images_skip + _e._count__images_small) * 0.5) ) * 1000)); // negative if (_points_history[0] < 0) { return [0]; } // candidates, containers, pieces // ============================== var _divide__pieces = Math.max(5, Math.ceil(_e._count__pieces * 0.25)), _divide__candidates = Math.max(5, Math.ceil(_e._count__candidates * 0.25)), _divide__containers = Math.max(10, Math.ceil(_e._count__containers * 0.25)) ; _points_history.unshift(((0 + (_points_history[0] * 3) + (_points_history[0] / _divide__pieces) + (_points_history[0] / _divide__candidates) + (_points_history[0] / _divide__containers) ) / 6)); // total text // ========== $D.getContent__computePointsForCandidate__do(0.10, 2, (1 - (1 - _details._ratio__length__plain_text_to_total_plain_text)), _points_history); $D.getContent__computePointsForCandidate__do(0.10, 2, (1 - (1 - _details._ratio__count__plain_words_to_total_plain_words)), _points_history); if (_really_big) { $D.getContent__computePointsForCandidate__do(0.10, 4, (1 - (1 - _details._ratio__length__plain_text_to_total_plain_text)), _points_history); $D.getContent__computePointsForCandidate__do(0.10, 4, (1 - (1 - _details._ratio__count__plain_words_to_total_plain_words)), _points_history); } // text above // ========== $D.getContent__computePointsForCandidate__do(0.10, 5, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history); $D.getContent__computePointsForCandidate__do(0.10, 5, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history); if (_really_big) { $D.getContent__computePointsForCandidate__do(0.10, 10, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history); $D.getContent__computePointsForCandidate__do(0.10, 10, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history); } // links outer // =========== $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__length__links_text_to_total_links_text), _points_history); $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__links_words_to_total_links_words), _points_history); $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__links_to_total_links), _points_history); // links inner // =========== var __lr = ($D.language == 'cjk' ? 0.75 : 0.50); $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_plain_text), _points_history); $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_plain_words), _points_history); $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_all_text), _points_history); $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_all_words), _points_history); $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_to_plain_words), _points_history); // candidates, containers, pieces // ============================== $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__candidates_to_total_candidates), _points_history); $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__containers_to_total_containers), _points_history); $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__pieces_to_total_pieces), _points_history); // return -- will get [0] as the actual final points // ====== return _points_history; }; $D.getContent__processCandidates__first = function (_candidatesToProcess) { // process this var // ================ var _candidates = _candidatesToProcess; // sort _candidates -- the lower in the dom, the closer to position 0 // ================ _candidates.sort(function (a, b) { switch (true) { case (a.__index < b.__index): return -1; case (a.__index > b.__index): return 1; default: return 0; } }); // get first // ========= var _main = _candidates[0] if ($D.debug) { $D.log('should be body', _main, _main.__node); } // pieces of text -- and points computation // ============== for (var i=0, _i=_candidates.length; i<_i; i++) { // pieces // ====== var _count__pieces = 0, _array__pieces = [] ; for (var k=i, _k=_candidates.length; k<_k; k++) { if (_candidates[k]._count__candidates > 0) { continue; } if ($CJ.contains(_candidates[i].__node, _candidates[k].__node)); else { continue; } // store piece, if in debug mode if ($D.debug) { _array__pieces.push(_candidates[k]); } // incement pieces count _count__pieces++; } // candidate details // ================= _candidates[i]['__candidate_details'] = $D.getContent__computeDetailsForCandidate__first(_candidates[i], _main); // pieces -- do this here because _main doesn't yet have a pieces count // ====== // set pieces _candidates[i]['_count__pieces'] = _count__pieces; _candidates[i]['_array__pieces'] = _array__pieces; // pieces ratio _candidates[i]['__candidate_details']['_ratio__count__pieces_to_total_pieces'] = (_count__pieces / (_candidates[0]._count__pieces + 1)); // check some more // =============== /* switch (true) { case (($D.language != 'cjk') && (_candidates[i]['__candidate_details']['_ratio__length__links_text_to_plain_text'] > 1)): case (($D.language != 'cjk') && (_candidates[i]['__candidate_details']['_ratio__count__links_words_to_plain_words'] > 1)): _candidates[i]._is__bad = true; break; } */ // points // ====== _candidates[i].__points_history = $D.getContent__computePointsForCandidate__first(_candidates[i], _main); _candidates[i].__points = _candidates[i].__points_history[0]; } // sort _candidates -- the more points, the closer to position 0 // ================ _candidates.sort(function (a, b) { switch (true) { case (a.__points > b.__points): return -1; case (a.__points < b.__points): return 1; default: return 0; } }); // return // ====== return _candidates; }; // process candidates (first) } // process candidates (second) { // ============================= $D.getContent__computePointsForCandidate__second = function (_e, _main) { var _details = _e.__candidate_details, _details_second = _e.__candidate_details_second, _points_history = [] ; // bad candidate if (_e._is__bad) { return [0]; } // get initial points // ================== _points_history.unshift(_e.__points_history[(_e.__points_history.length-1)]); // candidates, containers, pieces // ============================== var _divide__pieces = Math.max(5, Math.ceil(_e._count__pieces * 0.25)), _divide__candidates = Math.max(5, Math.ceil(_e._count__candidates * 0.25)), _divide__containers = Math.max(10, Math.ceil(_e._count__containers * 0.25)) ; _points_history.unshift(((0 + (_points_history[0] * 3) + ((_points_history[0] / _divide__pieces) * 2) + ((_points_history[0] / _divide__candidates) * 2) + ((_points_history[0] / _divide__containers) * 2) ) / 9)); // total text // ========== $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - (1 - _details_second._ratio__length__plain_text_to_total_plain_text)), _points_history); $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - (1 - _details_second._ratio__count__plain_words_to_total_plain_words)), _points_history); // text above // ========== var __ar = ($D.language == 'cjk' ? 0.50 : 0.10); $D.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__length__above_plain_text_to_total_plain_text), _points_history); $D.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__count__above_plain_words_to_total_plain_words), _points_history); $D.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__length__above_plain_text_to_plain_text), _points_history); $D.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__count__above_plain_words_to_plain_words), _points_history); // links outer // =========== $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details_second._ratio__count__links_to_total_links), _points_history); $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details_second._ratio__length__links_text_to_total_links_text), _points_history); $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details_second._ratio__count__links_words_to_total_links_words), _points_history); // links inner // =========== var __lr = ($D.language == 'cjk' ? 0.75 : 0.50); $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_plain_text), _points_history); $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_plain_words), _points_history); $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__length__links_text_to_all_text), _points_history); $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__count__links_words_to_all_words), _points_history); $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__count__links_to_plain_words), _points_history); // candidates, containers, pieces // ============================== $D.getContent__computePointsForCandidate__do(0.10, 2, (1 - _details_second._ratio__count__candidates_to_total_candidates), _points_history); $D.getContent__computePointsForCandidate__do(0.10, 2, (1 - _details_second._ratio__count__containers_to_total_containers), _points_history); $D.getContent__computePointsForCandidate__do(0.10, 2, (1 - _details_second._ratio__count__pieces_to_total_pieces), _points_history); // return -- will get [0] as the actual final points // ====== return _points_history; }; $D.getContent__computeDetailsForCandidate__second = function (_e, _main) { var _r = {}; // bad candidate // ============= if (_e._is__bad) { return _r; } // total text // ========== _r['_ratio__length__plain_text_to_total_plain_text'] = (_e._length__plain_text / _main._length__plain_text); _r['_ratio__count__plain_words_to_total_plain_words'] = (_e._count__plain_words / _main._count__plain_words); // links // ===== _r['_ratio__length__links_text_to_all_text'] = (_e._length__links_text / _e._length__all_text); _r['_ratio__count__links_words_to_all_words'] = (_e._count__links_words / _e._count__all_words); _r['_ratio__length__links_text_to_total_links_text'] = (_e._length__links_text / (_main._length__links_text + 1)); _r['_ratio__count__links_words_to_total_links_words'] = (_e._count__links_words / (_main._count__links_words + 1)); _r['_ratio__count__links_to_total_links'] = (_e._count__links / (_main._count__links + 1)); _r['_ratio__count__links_to_plain_words'] = ((_e._count__links * 2) / _e._count__plain_words); // text above // ========== var _divide__candidates = Math.max(2, Math.ceil((_e._count__above_candidates - _main._count__above_candidates) * 0.5)), _above_text = ((0 + (_e.__second_length__above_plain_text * 1) + (_e.__second_length__above_plain_text / _divide__candidates) ) / 2), _above_words = ((0 + (_e.__second_count__above_plain_words * 1) + (_e.__second_count__above_plain_words / _divide__candidates) ) / 2) ; _r['_ratio__length__above_plain_text_to_total_plain_text'] = (_above_text / _main._length__plain_text); _r['_ratio__count__above_plain_words_to_total_plain_words'] = (_above_words / _main._count__plain_words); _r['_ratio__length__above_plain_text_to_plain_text'] = (_above_text / _e._length__plain_text); _r['_ratio__count__above_plain_words_to_plain_words'] = (_above_words / _e._count__plain_words); // candidates // ========== _r['_ratio__count__candidates_to_total_candidates'] = (Math.max(0, (_e._count__candidates - (_main._count__candidates * 0.25))) / (_main._count__candidates + 1)); _r['_ratio__count__containers_to_total_containers'] = (Math.max(0, (_e._count__containers - (_main._count__containers * 0.25))) / (_main._count__containers + 1)); _r['_ratio__count__pieces_to_total_pieces'] = (Math.max(0, (_e._count__pieces - (_main._count__pieces * 0.25))) / (_main._count__pieces + 1)); // return // ====== return _r; }; $D.getContent__processCandidates__second = function (_processedCandidates) { var _candidates = _processedCandidates, _main = _candidates[0] ; // only get children of target // =========================== _candidates = $CJ.map(_candidates, function (_element, _index) { switch (true) { case (!(_index > 0)): case (!($CJ.contains(_main.__node, _element.__node))): return null; default: return _element; } }); // add main - to amke sure the result is never blank _candidates.unshift(_main); // sort _candidates -- the lower in the dom, the closer to position 0 // ================ _candidates.sort(function (a, b) { switch (true) { case (a.__index < b.__index): return -1; case (a.__index > b.__index): return 1; default: return 0; } }); // second candidate computation // ============================ for (var i=0, _i=_candidates.length; i<_i; i++) { // additional numbers // ================== _candidates[i].__second_length__above_plain_text = (_candidates[i]._length__above_plain_text - _main._length__above_plain_text); _candidates[i].__second_count__above_plain_words = (_candidates[i]._count__above_plain_words - _main._count__above_plain_words); // candidate details // ================= _candidates[i]['__candidate_details_second'] = $D.getContent__computeDetailsForCandidate__second(_candidates[i], _main); // check some more // =============== /* switch (true) { case (!(_candidates[i]['__candidate_details_second']['_ratio__count__plain_words_to_total_plain_words'] > 0.05)): case (!(_candidates[i]['__candidate_details_second']['_ratio__length__plain_text_to_total_plain_text'] > 0.05)): //case (!(_candidates[i]['__candidate_details_second']['_ratio__count__above_plain_words_to_total_plain_words'] < 0.1)): //case (!(_candidates[i]['__candidate_details_second']['_ratio__length__above_plain_text_to_total_plain_text'] < 0.1)): //case (_candidates[i]['__candidate_details_second']['_ratio__length__above_plain_text_to_plain_text'] > 1): //case (_candidates[i]['__candidate_details_second']['_ratio__count__above_plain_words_to_plain_words'] > 1): _candidates[i]._is__bad = true; // wil set points to 0, in points computation function break; } */ // points // ====== _candidates[i].__points_history_second = $D.getContent__computePointsForCandidate__second(_candidates[i], _main); _candidates[i].__points_second = _candidates[i].__points_history_second[0]; } // sort _candidates -- the more points, the closer to position 0 // ================ _candidates.sort(function (a, b) { switch (true) { case (a.__points_second > b.__points_second): return -1; case (a.__points_second < b.__points_second): return 1; default: return 0; } }); // return // ====== return _candidates; }; // process candidates (second) } // process candidates (third) { // ============================ $D.getContent__computePointsForCandidate__third = function (_e, _main) { var _details = _e.__candidate_details, _details_second = _e.__candidate_details_second, _points_history = [] ; // bad candidate if (_e._is__bad) { return [0]; } // get initial points // ================== _points_history.unshift(_e.__points_history[(_e.__points_history.length-1)]); // candidates, containers, pieces // ============================== var _divide__pieces = Math.max(2, Math.ceil(_e._count__pieces * 0.25)), _divide__candidates = Math.max(2, Math.ceil(_e._count__candidates * 0.25)), _divide__containers = Math.max(4, Math.ceil(_e._count__containers * 0.25)) ; _points_history.unshift(((0 + (_points_history[0] * 3) + ((_points_history[0] / _divide__pieces) * 2) + ((_points_history[0] / _divide__candidates) * 2) + ((_points_history[0] / _divide__containers) * 2) ) / 9)); // total text // ========== $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - (1 - _details_second._ratio__length__plain_text_to_total_plain_text)), _points_history); $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - (1 - _details_second._ratio__count__plain_words_to_total_plain_words)), _points_history); // text above // ========== $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history); $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history); $D.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__length__above_plain_text_to_total_plain_text), _points_history); $D.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__count__above_plain_words_to_total_plain_words), _points_history); $D.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__length__above_plain_text_to_plain_text), _points_history); $D.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__count__above_plain_words_to_plain_words), _points_history); // links inner // =========== $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__length__links_text_to_all_text), _points_history); $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_words_to_all_words), _points_history); $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__length__links_text_to_plain_text), _points_history); $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_words_to_plain_words), _points_history); $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_to_plain_words), _points_history); // candidates, containers, pieces // ============================== $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__candidates_to_total_candidates), _points_history); $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__containers_to_total_containers), _points_history); $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__pieces_to_total_pieces), _points_history); // return -- will get [0] as the actual final points // ====== return _points_history; }; // process candidates (third) } // explore node and get stuff { // ============================ $D.getContent__exploreNodeAndGetStuff = function (_nodeToExplore, _justExploring) { var _global__element_index = 0, _global__inside_link = false, _global__inside_link__element_index = 0, _global__length__above_plain_text = 0, _global__count__above_plain_words = 0, _global__length__above_links_text = 0, _global__count__above_links_words = 0, _global__count__above_candidates = 0, _global__count__above_containers = 0, _global__above__plain_text = '', _global__above__links_text = '', _return__containers = [], _return__candidates = [], _return__links = [] ; // recursive function // ================== var _recursive = function (_node) { // increment index // starts with 1 _global__element_index++; var _tag_name = (_node.nodeType === 3 ? '#text' : ((_node.nodeType === 1 && _node.tagName && _node.tagName > '') ? _node.tagName.toLowerCase() : '#invalid')), _node_id = (_node.id), _result = { '__index': _global__element_index, '__node': _node, '_is__container': ($D.parseOptions._elements_container.indexOf('|'+_tag_name+'|') > -1), '_is__candidate': false, '_is__text': false, '_is__link': false, '_is__link_skip': false, '_is__image_small': false, '_is__image_medium': false, '_is__image_large': false, '_is__image_skip': false, '_is__unskippable': false, '_debug__above__plain_text': _global__above__plain_text, '_debug__above__links_text': _global__above__links_text, '_length__above_plain_text': _global__length__above_plain_text, '_count__above_plain_words': _global__count__above_plain_words, '_length__above_links_text': _global__length__above_links_text, '_count__above_links_words': _global__count__above_links_words, '_length__above_all_text': (_global__length__above_plain_text + _global__length__above_links_text), '_count__above_all_words': (_global__count__above_plain_words + _global__count__above_links_words), '_count__above_candidates': _global__count__above_candidates, '_count__above_containers': _global__count__above_containers, '_length__plain_text': 0, '_count__plain_words': 0, '_length__links_text': 0, '_count__links_words': 0, '_length__all_text': 0, '_count__all_words': 0, '_count__containers': 0, '_count__candidates': 0, '_count__links': 0, '_count__links_skip': 0, '_count__images_small': 0, '_count__images_medium': 0, '_count__images_large': 0, '_count__images_skip': 0 }; // unskippable // =========== if (false || (_result._is__container) || ($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1) ) { var _unskip = _node.getAttribute($D.parseOptions._unskippable_attribute); if (_unskip == $D.parseOptions._unskippable_attribute_value) { _result._is__unskippable = true; } } // fast return // =========== switch (true) { case ((_tag_name == '#invalid')): case (($D.parseOptions._elements_ignore.indexOf('|'+_tag_name+'|') > -1)): return false; case (($D.parseOptions._elements_ignore_id.indexOf('|'+_node_id+'|') > -1)): return false; case (($D.parseOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)): if ($D.isNodeHidden(_node, _tag_name)) { return false; } break; // self-closing -- with some exceptions case ($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1): switch (true) { case ((_tag_name == 'img')): break; default: return false; } break; } // do stuff // ======== switch (true) { // text node case ((_tag_name == '#text')): // mark _result._is__text = true; // get var _nodeText = _node.nodeValue; // result _result._length__plain_text = $D.measureText__getTextLength(_nodeText); _result._count__plain_words = $D.measureText__getWordCount(_nodeText); if (_global__inside_link) { _global__length__above_links_text += _result._length__plain_text; _global__count__above_links_words += _result._count__plain_words; if (false && $D.debug) { _global__above__links_text += ' ' + _nodeText; } } else { _global__length__above_plain_text += _result._length__plain_text; _global__count__above_plain_words += _result._count__plain_words; if (false && $D.debug) { _global__above__plain_text += ' ' + _nodeText; } } // return text return _result; // link case (_tag_name == 'a'): var _href = ''; try { _href = _node.href } catch (e) { _href = $CJ.attr('href'); } // sanity if (_href > ''); else { break; } if (_href.indexOf); else { break; } _result._is__link = true; // skip for (var i=0, _i=$D.parseOptions._skip_link_from_domain.length; i<_i; i++) { if (_href.indexOf($D.parseOptions._skip_link_from_domain[i]) > -1) { _result._is__link_skip = true; break; } } // inside link if (_global__inside_link); else { _global__inside_link = true; _global__inside_link__element_index = _result.__index; } // done _return__links.push(_result); break; // image case (_tag_name == 'img'): // skip if (_node.src && _node.src.indexOf) { for (var i=0, _i=$D.parseOptions._skip_image_from_domain.length; i<_i; i++) { if (_node.src.indexOf($D.parseOptions._skip_image_from_domain[i]) > -1) { _result._is__image_skip = true; break; } } } // size var _width = $CJ(_node).width(), _height = $CJ(_node).height(); switch (true) { case ((_width * _height) >= 50000): case ((_width >= 350) && (_height >= 75)): _result._is__image_large = true; break; case ((_width * _height) >= 20000): case ((_width >= 150) && (_height >= 150)): _result._is__image_medium = true; break; case ((_width <= 5) && (_height <= 5)): _result._is__image_skip = true; break; default: _result._is__image_small = true; break; } break; } // child nodes // =========== for (var i=0, _i=_node.childNodes.length; i<_i; i++) { var _child = _node.childNodes[i], _child_result = _recursive(_child) ; // if false, continue if (_child_result); else { continue; } // add to result _result._count__links += _child_result._count__links + (_child_result._is__link ? 1 : 0); _result._count__links_skip += _child_result._count__links_skip + (_child_result._is__link_skip ? 1 : 0); _result._count__images_small += _child_result._count__images_small + (_child_result._is__image_small ? 1 : 0); _result._count__images_medium += _child_result._count__images_medium + (_child_result._is__image_medium ? 1 : 0); _result._count__images_large += _child_result._count__images_large + (_child_result._is__image_large ? 1 : 0); _result._count__images_skip += _child_result._count__images_skip + (_child_result._is__image_skip ? 1 : 0); _result._count__containers += _child_result._count__containers + (_child_result._is__container ? 1 : 0); _result._count__candidates += _child_result._count__candidates + (_child_result._is__candidate ? 1 : 0); _result._length__all_text += _child_result._length__plain_text + _child_result._length__links_text; _result._count__all_words += _child_result._count__plain_words + _child_result._count__links_words; // plain text / link text switch (true) { case (_child_result._is__link): // no text to add _result._length__links_text += (_child_result._length__plain_text + _child_result._length__links_text); _result._count__links_words += (_child_result._count__plain_words + _child_result._count__links_words); break; default: _result._length__plain_text += _child_result._length__plain_text; _result._count__plain_words += _child_result._count__plain_words; _result._length__links_text += _child_result._length__links_text; _result._count__links_words += _child_result._count__links_words; break; } } // after child nodes // ================= // mark as not in link anymore if (true && (_result._is__link) && (_global__inside_link__element_index == _result.__index) ) { _global__inside_link = false; _global__inside_link__element_index = 0; } // add to containers // ================= if (_result._is__container || ((_result.__index == 1) && (_justExploring == true))) { // add to containers _return__containers.push(_result); // increase above containers if (_result._is__container) { _global__count__above_containers++; } // add to candidates if (_justExploring); else { switch (true) { case (($D.language != 'cjk') && ((_result._count__links * 2) >= _result._count__plain_words)): /* link ratio */ case (($D.language != 'cjk') && (_result._length__plain_text < (65 / 3))): /* text length */ case (($D.language != 'cjk') && (_result._count__plain_words < 5)): /* words */ case (($D.language == 'cjk') && (_result._length__plain_text < 10)): /* text length */ case (($D.language == 'cjk') && (_result._count__plain_words < 2)): /* words */ //case (_result._length__plain_text == 0): /* no text */ //case (_result._count__plain_words == 0): /* no words */ //case (($D.language == 'cjk') && ((_result._length__plain_text / 65 / 3) < 0.1)): /* paragrahs of 3 lines */ //case (($D.language != 'cjk') && ((_result._count__plain_words / 50) < 0.5)): /* paragraphs of 50 words */ // not a valid candidate //if (_tag_name == 'div') { $D.log('bad candidate', _result.__node); } break; default: // good candidate _result._is__candidate = true; _return__candidates.push(_result); // increase above candidates _global__count__above_candidates++; break; } // special case for body -- if it was just skipped // ===================== if ((_result.__index == 1) && !(_result._is__candidate)) { _result._is__candidate = true; _result._is__bad = true; _return__candidates.push(_result); } } } // return // ====== return _result; }; // actually do it // ============== _recursive(_nodeToExplore); // just exploring -- return first thing // ============== if (_justExploring) { return _return__containers.pop(); } // return containers list // ====================== return { '_containers': _return__containers, '_candidates': _return__candidates, '_links': _return__links }; }; // explore node and get stuff } // build html for node { // ===================== $D.getContent__buildHTMLForNode = function (_nodeToBuildHTMLFor, _custom_mode) { var _global__element_index = 0, _global__the_html = '', _global__exploreNodeToBuildHTMLFor = $D.getContent__exploreNodeAndGetStuff(_nodeToBuildHTMLFor, true) ; // custom switch (_custom_mode) { case 'above-the-target': _global__exploreNodeToBuildHTMLFor = false; break; } // recursive function // ================== var _recursive = function (_node) { // increment index -- starts with 1 // =============== _global__element_index++; // vars // ==== var _explored = false, _tag_name = (_node.nodeType === 3 ? '#text' : ((_node.nodeType === 1 && _node.tagName && _node.tagName > '') ? _node.tagName.toLowerCase() : '#invalid')), _node_id = _node.id, _pos__start__before = 0, _pos__start__after = 0, _pos__end__before = 0, _pos__end__after = 0 ; // fast return // =========== switch (true) { case ((_tag_name == '#invalid')): case (($D.parseOptions._elements_ignore.indexOf('|'+_tag_name+'|') > -1)): return; case (($D.parseOptions._elements_ignore_id.indexOf('|'+_node_id+'|') > -1)): return; case (_tag_name == '#text'): _global__the_html += _node.nodeValue .replace(//gi, '>') ; return; } // hidden // ====== if (true && ($D.parseOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1) && $D.isNodeHidden(_node, _tag_name) ) { return; } // clean -- before // ===== // objects, embeds, iframes // ======================== switch (_tag_name) { case ('object'): case ('embed'): case ('iframe'): var _src = (_tag_name == 'object' ? $CJ(_node).find("param[name='movie']").attr('value') : $CJ(_node).attr('src')), _skip = ((_src > '') ? false : true) ; if (_skip); else { // default skip _skip = true; // loop for (var i=0, _i=$D.parseOptions._keep_video_from_domain.length; i<_i; i++) { if (_src.indexOf($D.parseOptions._keep_video_from_domain[i]) > -1) { _skip = false; break; } } } // skip? if (_skip) { _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true)); if (_explored && _explored._is__unskippable); else { $D.debugOutline(_node, 'clean-before', 'object-embed-iframe'); return; } } break; } // skipped link // ============ if (_tag_name == 'a' || _tag_name == 'li') { _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true)); if (_explored && _explored._is__unskippable); else { switch (true) { case (_explored._is__link_skip): case (((_explored._count__images_small + _explored._count__images_skip) > 0) && (_explored._length__plain_text < 65)): $D.debugOutline(_node, 'clean-before', 'skip-link'); return; } } } // link density // ============ if ($D.parseOptions._elements_link_density.indexOf('|'+_tag_name+'|') > -1) { _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true)); if (_explored && _explored._is__unskippable); else { switch (true) { case (_explored._length__plain_text > (65 * 3 * 2)): case ($D.language == 'cjk' && (_explored._length__plain_text > (65 * 3 * 1))): case (!(_explored._count__links > 1)): case (_global__exploreNodeToBuildHTMLFor && (_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.5): case (_global__exploreNodeToBuildHTMLFor && (_explored._count__plain_words / _global__exploreNodeToBuildHTMLFor._count__plain_words) > 0.5): case ((_explored._length__plain_text == 0) && (_explored._count__links == 1) && (_explored._length__links_text < 65)): case ((_explored._length__plain_text < 25) && ((_explored._count__images_large + _explored._count__images_medium) > 0)): break; case ((_explored._length__links_text / _explored._length__all_text) < 0.5): if (_explored._count__links > 0); else { break; } if (_explored._count__links_skip > 0); else { break; } if (((_explored._count__links_skip / _explored._count__links) > 0.25) && (_explored._length__links_text / _explored._length__all_text) < 0.05) { break; } default: $D.debugOutline(_node, 'clean-before', 'link-density'); return; } } } // floating // ======== if ($D.parseOptions._elements_floating.indexOf('|'+_tag_name+'|') > -1) { _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true)); if (_explored && _explored._is__unskippable); else { switch (true) { case (_explored._length__plain_text > (65 * 3 * 2)): case ($D.language == 'cjk' && (_explored._length__plain_text > (65 * 3 * 1))): case (_global__exploreNodeToBuildHTMLFor && (_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.25): case (_global__exploreNodeToBuildHTMLFor && (_explored._count__plain_words / _global__exploreNodeToBuildHTMLFor._count__plain_words) > 0.25): case ((_explored._length__plain_text < 25) && (_explored._length__links_text < 25) && ((_explored._count__images_large + _explored._count__images_medium) > 0)): case (_node.getElementsByTagName && (_explored._length__plain_text < (65 * 3 * 1)) && ((_node.getElementsByTagName('h1').length + _node.getElementsByTagName('h2').length + _node.getElementsByTagName('h3').length + _node.getElementsByTagName('h4').length) > 0)): break; default: var _float = $CJ(_node).css('float'); if (_float == 'left' || _float == 'right'); else { break; } if ((_explored._length__links_text == 0) && ((_explored._count__images_large + _explored._count__images_medium) > 0)) { break; } $D.debugOutline(_node, 'clean-before', 'floating'); return; } } } // above target // ============ if (_custom_mode == 'above-the-target') { // is ignored? if ($D.parseOptions._elements_above_target_ignore.indexOf('|'+_tag_name+'|') > -1) { _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true)); if (_explored && _explored._is__unskippable); else { $D.debugOutline(_node, 'clean-before', 'above-target'); return; } } // is image? if (_tag_name == 'img') { _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true)); if (_explored && _explored._is__unskippable); else { if (_explored._is__image_large); else { $D.debugOutline(_node, 'clean-before', 'above-target'); return; } } } // has too many links? //if (_node.getElementsByTagName && _node.getElementsByTagName('a').length > 5) // { $D.debugOutline(_node, 'clean-before', 'above-target'); return; } } // headers that are images // ======================= if (_tag_name.match(/^h(1|2|3|4|5|6)$/gi)) { _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true)); if (_explored && _explored._is__unskippable); else { switch (true) { case ((_explored._length__plain_text < 10) && ((_explored._count__images_small + _explored._count__images_medium + _explored._count__images_large + _explored._count__images_skip) > 0)): $D.debugOutline(_node, 'clean-before', 'skip-heading'); return; } } } // start tag // ========= if ($D.parseOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1); else { /* mark */ _pos__start__before = _global__the_html.length; /* add */ _global__the_html += '<'+_tag_name; // attributes // ========== // allowed attributes if (_tag_name in $D.parseOptions._elements_keep_attributes) { for (var i=0, _i=$D.parseOptions._elements_keep_attributes[_tag_name].length; i<_i; i++) { var _attribute_name = $D.parseOptions._elements_keep_attributes[_tag_name][i], _attribute_value = _node.getAttribute(_attribute_name) ; // if present if (_attribute_value > '') { _global__the_html += ' '+_attribute_name+'="'+(_attribute_value)+'"'; } } } // keep ID for all elements var _id_attribute = _node.getAttribute('id'); if (_id_attribute > '') { _global__the_html += ' id="'+_id_attribute+'"'; } // links target NEW if (_tag_name == 'a') { _global__the_html += ' target="_blank"'; } // close start // =========== if ($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1) { _global__the_html += ' />'; } else { _global__the_html += '>';} /* mark */ _pos__start__after = _global__the_html.length; } // child nodes // =========== if ($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1); else { for (var i=0, _i=_node.childNodes.length; i<_i; i++) { _recursive(_node.childNodes[i]); } } // end tag // ======= switch (true) { case (($D.parseOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1)): return; case (($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1)): /* mark */ _pos__end__before = _global__the_html.length; /* mark */ _pos__end__after = _global__the_html.length; break; default: /* mark */ _pos__end__before = _global__the_html.length; /* end */ _global__the_html += '</'+_tag_name+'>'; /* mark */ _pos__end__after = _global__the_html.length; break; } // clean -- after // ===== // largeObject classes if (_tag_name == 'iframe' || _tag_name == 'embed' || _tag_name == 'object') { _global__the_html = '' + _global__the_html.substr(0, _pos__start__before) + '
' + _global__the_html.substr(_pos__start__before, (_pos__end__after - _pos__start__before)) + '
' ; return; } // add image classes if (_tag_name == 'img') { _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true)); if (_explored && _explored._is__unskippable); else { switch (true) { case (_explored._is__image_skip): $D.debugOutline(_node, 'clean-after', 'skip-img'); _global__the_html = _global__the_html.substr(0, _pos__start__before); return; case (_explored._is__image_large): // add float class -- for images too narrow/tall // remove width/height -- only for large images // http://www.wired.com/threatlevel/2011/05/gps-gallery/?pid=89&viewall=true // http://david-smith.org/blog/2012/03/10/ios-5-dot-1-upgrade-stats/index.html // http://www.turntablekitchen.com/2012/04/dutch-baby-with-caramelized-vanilla-bean-pears-moving-through-the-decades/ _global__the_html = '' + _global__the_html.substr(0, _pos__start__before) + '
' + _global__the_html.substr(_pos__start__before, (_pos__end__after - _pos__start__before)).replace(/width="([^=]+?)"/gi, '').replace(/height="([^=]+?)"/gi, '') + '
' ; return; } } } // large images in links if (_tag_name == 'a') { _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true)); switch (true) { case (_explored._count__images_large == 1): _global__the_html = '' + _global__the_html.substr(0, _pos__start__after-1) + ' class="readableLinkWithLargeImage">' + _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after)) + '' ; return; case (_explored._count__images_medium == 1): _global__the_html = '' + _global__the_html.substr(0, _pos__start__after-1) + ' class="readableLinkWithMediumImage">' + _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after)) + '' ; return; } } // too much content if ($D.parseOptions._elements_too_much_content.indexOf('|'+_tag_name+'|') > -1) { _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true)); if (_explored && _explored._is__unskippable); else { switch (true) { case (_tag_name == 'h1' && (_explored._length__all_text > (65 * 2))): case (_tag_name == 'h2' && (_explored._length__all_text > (65 * 2 * 3))): case ((_tag_name.match(/^h(3|4|5|6)$/) != null) && (_explored._length__all_text > (65 * 2 * 5))): case ((_tag_name.match(/^(b|i|em|strong)$/) != null) && (_explored._length__all_text > (65 * 5 * 5))): $D.debugOutline(_node, 'clean-after', 'too-much-content'); _global__the_html = '' + _global__the_html.substr(0, _pos__start__before) + _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after)) ; return; } } } // empty elements switch (true) { case (($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1)): case (($D.parseOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1)): case (_tag_name == 'td'): break; default: var _contents = _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after)); _contents = _contents.replace(/(
)/gi, ''); _contents = _contents.replace(/(
)/gi, ''); // for rows, clear empty cells if (_tag_name == 'tr') { _contents = _contents.replace(/]*?>/gi, ''); _contents = _contents.replace(/<\/tr>/gi, ''); } var _contentsLength = $D.measureText__getTextLength(_contents); _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true)); if (_explored && _explored._is__unskippable); else { switch (true) { case (_contentsLength == 0 && _tag_name == 'p'): _global__the_html = _global__the_html.substr(0, _pos__start__before) + '

'; return; case (_contentsLength == 0): case ((_contentsLength < 5) && ($D.parseOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)): $D.debugOutline(_node, 'clean-after', 'blank'); _global__the_html = _global__the_html.substr(0, _pos__start__before); return; } } break; } // too much missing if ($D.parseOptions._elements_link_density.indexOf('|'+_tag_name+'|') > -1) { _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true)); if (_explored && _explored._is__unskippable); else { var _contents = _global__the_html .substr(_pos__start__after, (_pos__end__before - _pos__start__after)) .replace(/(<([^>]+)>)/gi, ''), _contentsLength = $D.measureText__getTextLength(_contents), _initialLength = 0 + _explored._length__all_text + (_explored._count__images_small * 10) + (_explored._count__images_skip * 10) + (_node.getElementsByTagName('iframe').length * 10) + (_node.getElementsByTagName('object').length * 10) + (_node.getElementsByTagName('embed').length * 10) + (_node.getElementsByTagName('button').length * 10) + (_node.getElementsByTagName('input').length * 10) + (_node.getElementsByTagName('select').length * 10) + (_node.getElementsByTagName('textarea').length * 10) ; // too much missing switch (true) { case (!(_contentsLength > 0)): case (!(_initialLength > 0)): case (!((_contentsLength / _initialLength) < 0.5)): case (!(($D.language == 'cjk') && (_contentsLength / _initialLength) < 0.1)): case ((_global__exploreNodeToBuildHTMLFor && ((_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.25))): case (($D.language == 'cjk') && (_global__exploreNodeToBuildHTMLFor && ((_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.1))): break; default: $D.debugOutline(_node, 'clean-after', 'missing-density'); _global__the_html = _global__the_html.substr(0, _pos__start__before); return; } } } // return return; }; // actually do it _recursive(_nodeToBuildHTMLFor); // return html return _global__the_html; }; // build html for node } // isolate title in html { // ======================= $D.articleTitleMarker__start = '

'; $D.articleTitleMarker__end = '

'; $D.getContent__find__hasIsolatedTitleInHTML = function (_html) { return (_html.substr(0, $D.articleTitleMarker__start.length) == $D.articleTitleMarker__start); }; $D.getContent__find__getIsolatedTitleInHTML = function (_html) { // is it there? if ($D.getContent__find__hasIsolatedTitleInHTML(_html)); else { return ''; } // regex var _getTitleRegex = new RegExp($D.articleTitleMarker__start + '(.*?)' + $D.articleTitleMarker__end, 'i'), _getTitleMatch = _html.match(_getTitleRegex) ; // match? if (_getTitleMatch); else { return ''; } // return return _getTitleMatch[1]; }; $D.getContent__find__isolateTitleInHTML = function (_html, _document_title) { // use document title if ($D.$document.find('body').attr($D.parseOptions._use_document_title_attribute) == $D.parseOptions._use_document_title_attribute_value) { return _html; } // can't just use (h1|h2|h3|etc) // we want to try them in a certain order var _heading_pregs = [ /<(h1)[^>]*?>([\s\S]+?)<\/\1>/gi, /<(h2)[^>]*?>([\s\S]+?)<\/\1>/gi, /<(h3|h4|h5|h6)[^>]*?>([\s\S]+?)<\/\1>/gi ], _secondary_headings = '|h2|h3|h4|h5|h6|', _search_document_title = ' ' + _document_title.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ') + ' ' ; // loop pregs for (var i=0, _i=_heading_pregs.length; i<_i; i++) { // exec var _match = _heading_pregs[i].exec(_html); // return? switch (true) { case (!(_match)): case (!(_heading_pregs[i].lastIndex > -1)): // will continue loop break; default: // measurements var _heading_end_pos = _heading_pregs[i].lastIndex, _heading_start_pos = (_heading_end_pos - _match[0].length), _heading_type = _match[1], _heading_text = _match[2].replace(/<\s*br[^>]*>/gi, '').replace(/[\n\r]+/gi, ''), _heading_text_plain = _heading_text.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' '); _heading_length = $D.measureText__getTextLength(_heading_text_plain), _heading_words = [], _to_heading_text = _html.substr(0, _heading_start_pos), _to_heading_length = $D.measureText__getTextLength(_to_heading_text.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) ; // return? switch (true) { case (!(_heading_length > 5)): case (!(_heading_length < (65 * 3))): case (!(_to_heading_length < (65 * 3 * 2))): // will continue for loop break; case ((_secondary_headings.indexOf('|' + _heading_type + '|') > -1)): // words in this heading _heading_words = _heading_text_plain.split(' '); // count words present in title for (var j=0, _j=_heading_words.length, _matched_words=''; j<_j; j++) { if (_search_document_title.indexOf(' ' + _heading_words[j] + ' ') > -1) { _matched_words += _heading_words[j] + ' '; } } // break continues for loop // nothing goes to switch's default // no break? // ========= var _no_break = false; switch (true) { // if it's big enough, and it's a substring of the title, it's good case ((_heading_length > 20) && (_search_document_title.indexOf(_heading_text_plain) > -1)): // if it's slightly smaler, but is exactly at the begging or the end case ((_heading_length > 10) && ((_search_document_title.indexOf(_heading_text_plain) == 1) || (_search_document_title.indexOf(_heading_text_plain) == (_search_document_title.length - 1 - _heading_text_plain.length)))): _no_break = true; break; } // break? // ====== var _break = false; switch (true) { // no break? case (_no_break): break; // heading too long? -- if not h2 case ((_heading_length > ((_search_document_title.length - 2) * 2)) && (_heading_type != 'h2')): // heading long enough? case ((_heading_length < Math.ceil((_search_document_title.length - 2) * 0.50))): // enough words matched? case ((_heading_length < 25) && (_matched_words.length < Math.ceil(_heading_length * 0.75))): case ((_heading_length < 50) && (_matched_words.length < Math.ceil(_heading_length * 0.65))): case ((_matched_words.length < Math.ceil(_heading_length * 0.55))): _break = true; break; } // break? // ====== if (_break) { break; } default: // this is the title -- do isolation; return return '' + $D.articleTitleMarker__start + _heading_text + $D.articleTitleMarker__end + $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart(_html.substr(_heading_end_pos)) ; } break; } } // return unmodified return _html; }; $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart__substrCount = function (_haystack, _needle, _offset, _length) { // http://kevin.vanzonneveld.net // + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + bugfixed by: Onno Marsman // + improved by: Brett Zamir (http://brett-zamir.me) // + improved by: Thomas // * example 1: substr_count('Kevin van Zonneveld', 'e'); // * returns 1: 3 // * example 2: substr_count('Kevin van Zonneveld', 'K', 1); // * returns 2: 0 // * example 3: substr_count('Kevin van Zonneveld', 'Z', 0, 10); // * returns 3: false var cnt = 0; _haystack += ''; _needle += ''; if (isNaN(_offset)) { _offset = 0; } if (isNaN(_length)) { _length = 0; } if (_needle.length == 0) { return false; } _offset--; while ((_offset = _haystack.indexOf(_needle, _offset + 1)) != -1) { if (_length > 0 && (_offset + _needle.length) > _length) { return false; } cnt++; } return cnt; }; $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart = function (_html) { // easy; remove all at begining var _h = _html.replace(/^(\s*<\s*\/\s*[^>]+>)+/gi, ''), _r = /<\s*\/\s*([^\s>]+?)[^>]*>/gi, _the_end_tag = '', _the_start_tag = '
<100; _i++) { _end_tag_pos = _h.indexOf(_the_end_tag, _last_pos); if (_end_tag_pos > -1); else { break; } var _sub = _h.substr(0, _end_tag_pos), _start_tags = $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart__substrCount(_sub, _the_start_tag, _last_pos), _end_tags = ((_start_tags > 0) ? (1 + $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart__substrCount(_sub, _the_end_tag, _last_pos)) : false) ; if ((!(_start_tags > 0)) || (_start_tags < _end_tags)) { _h = '' + _h.substr(0, _end_tag_pos) + _h.substr(_end_tag_pos + _the_end_tag.length) ; _last_pos = _end_tag_pos; } else { _last_pos = _end_tag_pos + 1; } } $D.log(_h); return _h; }; // isolate title in html } // find in page { // ============== $D.getContent__findInPage = function (_pageWindow) { // calculations // ============ var _firstCandidate = false, _secondCandidate = false, _targetCandidate = false ; $D.debugTimerStart('ExploreAndGetStuff'); var _stuff = $D.getContent__exploreNodeAndGetStuff(_pageWindow.document.body); $D.debugRemember('ExploreAndGetStuff', $D.debugTimerEnd()+'ms'); $D.debugTimerStart('ProcessFirst'); var _processedCandidates = $D.getContent__processCandidates__first(_stuff._candidates); _firstCandidate = _processedCandidates[0]; _targetCandidate = _firstCandidate; $D.debugRemember('ProcessFirst', $D.debugTimerEnd()+'ms'); // debug if ($D.debug) { // debug first candidates $D.log('First 5 Main Candidates:'); for (var x in _processedCandidates) { if (x == 5) { break; } $D.log(_processedCandidates[x], _processedCandidates[x].__node); } // highlight first $D.debugOutline(_firstCandidate.__node, 'target', 'first'); } // in case we stop $D.debugRemember('Target', 'first'); // do second? switch (true) { case (!(_firstCandidate._count__containers > 0)): case (!(_firstCandidate._count__candidates > 0)): case (!(_firstCandidate._count__pieces > 0)): case (!(_firstCandidate._count__containers > 25)): break; default: $D.debugTimerStart('ProcessSecond'); var _processedCandidatesSecond = $D.getContent__processCandidates__second(_processedCandidates); _secondCandidate = _processedCandidatesSecond[0]; $D.debugRemember('ProcessSecond', $D.debugTimerEnd()+'ms'); // they're the same if (_firstCandidate.__node == _secondCandidate.__node) { break; } // debug if ($D.debug) { // log second candidates $D.log('First 5 Second Candidates:'); for (var x in _processedCandidatesSecond) { if (x == 5) { break; } $D.log(_processedCandidatesSecond[x], _processedCandidatesSecond[x].__node); } // highlight second $D.debugOutline(_secondCandidate.__node, 'target', 'second'); } // compute again // ============= _firstCandidate['__points_history_final'] = $D.getContent__computePointsForCandidate__third(_firstCandidate, _firstCandidate); _firstCandidate['__points_final'] = _firstCandidate.__points_history_final[0]; _secondCandidate['__points_history_final'] = $D.getContent__computePointsForCandidate__third(_secondCandidate, _firstCandidate); _secondCandidate['__points_final'] = _secondCandidate.__points_history_final[0]; // log results // =========== if ($D.debug) { $D.log('The 2 Candidates:'); $D.log(_firstCandidate); $D.log(_secondCandidate); } // are we selecting _second? // ========================= switch (true) { case ((_secondCandidate.__candidate_details._count__lines_of_65_characters < 20) && (_secondCandidate.__points_final / _firstCandidate.__points_final) > 1): case ((_secondCandidate.__candidate_details._count__lines_of_65_characters > 20) && (_secondCandidate.__points_final / _firstCandidate.__points_final) > 0.9): case ((_secondCandidate.__candidate_details._count__lines_of_65_characters > 50) && (_secondCandidate.__points_final / _firstCandidate.__points_final) > 0.75): _targetCandidate = _secondCandidate; $D.debugRemember('Target', 'second'); break; } // print points // ============ if ($D.debug) { $D.debugRemember('PointsFirst', _firstCandidate['__points_history_final'][0].toFixed(2)); $D.debugRemember('PointsSecond', _secondCandidate['__points_history_final'][0].toFixed(2)); } break; } // highlight target // ================ if ($D.debug) { $CJ(_targetCandidate.__node).css({ 'box-shadow': 'inset 0px 0px 50px rgba(255, 255, 0, 0.95), 0px 0px 50px rgba(255, 255, 0, 0.95)' }); } // get html // ======== $D.debugTimerStart('BuildHTML'); var _html = $D.getContent__buildHTMLForNode(_targetCandidate.__node, 'the-target'); _html = _html.substr((_html.indexOf('>')+1)) _html = _html.substr(0, _html.lastIndexOf('<')); $D.debugRemember('BuildHTML', $D.debugTimerEnd()+'ms'); $D.debugTimerStart('BuildHTMLPregs'); _html = _html.replace(/<(blockquote|div|p|td|li)([^>]*)>(\s*
)+/gi, '<$1$2>'); _html = _html.replace(/(
\s*)+<\/(blockquote|div|p|td|li)>/gi, '</$2>'); _html = _html.replace(/(
\s*)+<(blockquote|div|h\d|ol|p|table|ul|li)([^>]*)>/gi, '<$2$3>'); _html = _html.replace(/<\/(blockquote|div|h\d|ol|p|table|ul|li)>(\s*
)+/gi, '</$1>'); _html = _html.replace(/(

\s*
\s*)+/gi, '
'); _html = _html.replace(/(
\s*
\s*)+/gi, '

'); $D.debugRemember('BuildHTMLPregs', $D.debugTimerEnd()+'ms'); // return // ====== return { '_html': _html, '_links': _stuff._links, '_targetCandidate': _targetCandidate, '_firstCandidate': _firstCandidate }; }; // find in page } // start { // ======= $D.start = function () { // get content // =========== var _found = $D.getContent__findInPage($D.window), _found_links = _found._links, _targetNode = _found._targetCandidate.__node, _$targetNode = $CJ(_targetNode), _aboveNodes = [] ; // RTL // === switch (true) { case (_$targetNode.attr('dir') == 'rtl'): case (_$targetNode.css('direction') == 'rtl'): $D.makeRTL(); break; } // get html // ======== var _foundHTML = _found._html, _firstFragmentBeforeProcessing = $D.nextPage__getFirstFragment(_foundHTML), _documentTitle = ($D.document.title > '' ? $D.document.title : '') ; // get title // ========= // has title already? _foundHTML = $D.getContent__find__isolateTitleInHTML(_foundHTML, _documentTitle); $D.articleTitle = $D.getContent__find__getIsolatedTitleInHTML(_foundHTML); $D.debugRemember('TitleSource', 'target'); // get html above? if ($D.articleTitle > ''); else { // get html above target? // ====================== // global vars: // _found // _foundHTML // _documentTitle // _aboveNodes var _prevNode = _found._targetCandidate.__node, _prevHTML = '', _aboveHTML = '', _differentTargets = (_found._firstCandidate.__node != _found._targetCandidate.__node) ; (function () { while (true) { // the end? switch (true) { case (_prevNode.tagName && (_prevNode.tagName.toLowerCase() == 'body')): case (_differentTargets && (_prevNode == _found._firstCandidate.__node)): // enough is enough return; } // up or sideways? if (_prevNode.previousSibling); else { _prevNode = _prevNode.parentNode; continue; } // previous _prevNode = _prevNode.previousSibling; // outline -- element might be re-outlined, when buildHTML is invoked if ($D.debug) { $D.debugOutline(_prevNode, 'target', 'add-above'); } // get html; add _prevHTML = $D.getContent__buildHTMLForNode(_prevNode, 'above-the-target'); _aboveHTML = _prevHTML + _aboveHTML; _aboveNodes.unshift(_prevNode); // isolate title _aboveHTML = $D.getContent__find__isolateTitleInHTML(_aboveHTML, _documentTitle); // finished? switch (true) { case ($D.measureText__getTextLength(_aboveHTML.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) > (65 * 3 * 3)): case ($D.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)): return; } } })(); // is what we found any good? // ========================== switch (true) { case ($D.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)): case (_differentTargets && (_aboveHTML.split('< 3) && ($D.measureText__getTextLength(_aboveHTML.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) < (65 * 3))): _foundHTML = _aboveHTML + _foundHTML; break; default: _aboveHTML = ''; _aboveNodes = []; break; } // set title // ========= $D.articleTitle = $D.getContent__find__getIsolatedTitleInHTML(_foundHTML); $D.debugRemember('TitleSource', 'above_HTML'); // get document title? if ($D.articleTitle > ''); else { // if all else failed, get document title // ====================================== // global vars: // _foundHTML // _documentTitle (function () { // return? // ======= if (_documentTitle > ''); else { return; } // vars var _doc_title_parts = [], _doc_title_pregs = [ /( [-][-] |( [-] )|( [>][>] )|( [<][<] )|( [|] )|( [\/] ))/i, /(([:] ))/i ] ; // loop through pregs // ================== for (var i=0, _i=_doc_title_pregs.length; i<_i; i++) { // split _doc_title_parts = _documentTitle.split(_doc_title_pregs[i]); // break if we managed a split if (_doc_title_parts.length > 1) { break; } } // sort title parts -- longer goes higher up -- i.e. towards 0 // ================ _doc_title_parts.sort(function (a, b) { switch (true) { case (a.length > b.length): return -1; case (a.length < b.length): return 1; default: return 0; } }); // set title -- first part, if more than one word; otherwise, whole // ========= _foundHTML = '' + $D.articleTitleMarker__start + (_doc_title_parts[0].split(/\s+/i).length > 1 ? _doc_title_parts[0] : _documentTitle) + $D.articleTitleMarker__end + _foundHTML ; })(); // set title // ========= $D.articleTitle = $D.getContent__find__getIsolatedTitleInHTML(_foundHTML); $D.debugRemember('TitleSource', 'document_title'); } } // remember // ======== $D.debugRemember('theTarget', _found._targetCandidate.__node); $D.debugRemember('firstCandidate', _found._firstCandidate.__node); // result // ====== $D.nextPage__firstFragment__firstPage = _firstFragmentBeforeProcessing; $D.nextPage__firstFragment__lastPage = $D.nextPage__getFirstFragment(_foundHTML); $D.nextPage__firstLinks = _found_links; var _result = { '_html': _foundHTML, '_title': $D.articleTitle, '_rtl': $D.rtl } ; // add elements _result['_elements'] = _aboveNodes; _result['_elements'].push(_found._targetCandidate.__node); // return // ====== $D.callbacks.finished(_result); }; // start } // return self // =========== return $D; }</script><script defer="" type="text/javascript" charset="ANSI">/*! * ClearlyComponent__highlight * Evernote Clearly's highlighting algorithm/functionality as an embeddable component. * Copyright 2013, Evernote Corporation * * Usage: * ====== * * // define * window.ClearlyComponent__highlight = { * 'callbacks': { * 'highlightAdded': someFunction(), * 'highlightDeleted': someFunction(), * 'arbitraryRangeExclusion': someFunction() * }, * 'settings': { * 'imgPath': 'string', * 'onInsertCSSUseThisId': 'string', * 'highlightingEnabledCSSClass': 'string', * 'highlightElementCSSClass': 'string', * 'highlightElementIdAttribute': 'string', * 'highlightElementFirstCSSClass': 'string', * 'highlightElementLastCSSClass': 'string', * 'highlightElementDeleteCSSClass': 'string', * 'highlightElementDeleteIdPrefix': 'string', * 'highlightCleanHTMLElementStart': 'string', * 'highlightCleanHTMLElementEnd': 'string', * 'elementWhichMustContainAllHighlights': _dom_element, * 'elementsToAttachMouseHandlersTo': [ * _dom_element * ] * }, * 'window': window, * 'document': document, * 'jQuery': window.jQuery * }; * * // init -- will return false, if something goes wrong * window.ClearlyComponent__highlight = initClearlyComponent__highlight(window.ClearlyComponent__highlight); * * // setup * window.ClearlyComponent__highlight.insertCSS(); * window.ClearlyComponent__highlight.addMouseHandlers(); * * // enable * window.ClearlyComponent__highlight.enable(); * * // publcly available/overridable * window.ClearlyComponent__highlight.debug * */ /* changes: ======== $R => $H $R.highlight => $H.enabled to do: ====== */ function initClearlyComponent__highlight(_paramInstance) { // global instance reference { // =========================== // null; return if (_paramInstance); else { return false; } // shorthand $H = _paramInstance; // global instance reference } // required vars { // =============== // the component instance object must already be created, // when the init function is called. it must have these vars set: switch (true) { case (!($H.settings)): case (!($H.settings.imgPath)): case (!($H.window)): case (!($H.document)): case (!($H.document.body)): case (!($H.jQuery)): if ($H.debug) { console.log(!($H.settings)); console.log(!($H.settings.imgPath)); console.log(!($H.window)); console.log(!($H.document)); console.log(!($H.document.body)); console.log(!($H.jQuery)); } // something's wrong return false; } // required vars } // missing settings { // ================== // restrictions if ($H.settings.elementWhichMustContainAllHighlights); else { $H.settings.elementWhichMustContainAllHighlights = $H.document.body; } if ($H.settings.elementsToAttachMouseHandlersTo); else { $H.settings.elementsToAttachMouseHandlersTo = [$H.document.body]; } // names for stuff /* css id */ if ($H.settings.onInsertCSSUseThisId); else { $H.settings.onInsertCSSUseThisId = 'clearly_highlighting_css'; } /* enabled */ if ($H.settings.highlightingEnabledCSSClass); else { $H.settings.highlightingEnabledCSSClass = 'clearly_highlighting_enabled'; } /* element id */ if ($H.settings.highlightElementIdAttribute); else { $H.settings.highlightElementIdAttribute = 'clearly_highlight_id'; } /* element class */ if ($H.settings.highlightElementCSSClass); else { $H.settings.highlightElementCSSClass = 'clearly_highlight_element'; } /* element (first) */ if ($H.settings.highlightElementFirstCSSClass); else { $H.settings.highlightElementFirstCSSClass = 'clearly_highlight_first'; } /* element (first) */ if ($H.settings.highlightElementLastCSSClass); else { $H.settings.highlightElementLastCSSClass = 'clearly_highlight_last'; } /* delete class */ if ($H.settings.highlightElementDeleteCSSClass); else { $H.settings.highlightElementDeleteCSSClass = 'clearly_highlight_delete_element'; } /* delete id prefix */ if ($H.settings.highlightElementDeleteIdPrefix); else { $H.settings.highlightElementDeleteIdPrefix = 'clearly_highlight_delete__'; } /* clean html start */ if ($H.settings.highlightCleanHTMLElementStart); else { $H.settings.highlightCleanHTMLElementStart = ''; } /* clean html end */ if ($H.settings.highlightCleanHTMLElementEnd); else { $H.settings.highlightCleanHTMLElementEnd = ''; } // missing settings } // global vars { // ============= $CJ = $H.jQuery; $H.$window = $CJ($H.window); $H.$document = $CJ($H.document); $H.$html = $H.$document.find('html'); $H.$elementWhichMustContainAllHighlights = $CJ($H.settings.elementWhichMustContainAllHighlights); $H.enabled = false; // global vars } // parse options { // =============== $H.parseOptions = { '_elements_ignore': '|button|input|select|textarea|optgroup|command|datalist|--|frame|frameset|noframes|--|style|link|script|noscript|--|canvas|applet|map|--|marquee|area|base|', '_elements_ignore_tag': '|form|fieldset|details|dir|--|center|font|span|', '_elements_container': '|body|--|article|section|--|div|--|td|--|li|--|dd|dt|', '_elements_self_closing': '|br|hr|--|img|--|col|--|source|--|embed|param|--|iframe|', '_elements_highlight_protect': '|video|audio|source|--|object|param|embed|', '_elements_keep_attributes': { 'a': ['href', 'title', 'name'], 'img': ['src', 'width', 'height', 'alt', 'title'], 'video': ['src', 'width', 'height', 'poster', 'audio', 'preload', 'autoplay', 'loop', 'controls'], 'audio': ['src', 'preload', 'autoplay', 'loop', 'controls'], 'source': ['src', 'type'], 'object': ['data', 'type', 'width', 'height', 'classid', 'codebase', 'codetype'], 'param': ['name', 'value'], 'embed': ['src', 'type', 'width', 'height', 'flashvars', 'allowscriptaccess', 'allowfullscreen', 'bgcolor'], 'iframe': ['src', 'width', 'height', 'frameborder', 'scrolling'], 'td': ['colspan', 'rowspan'], 'th': ['colspan', 'rowspan'] } }; // parse options } // debug { // ======= $H.debug = ($H.debug || false); if ($H.debug) { // writeLog // ======== switch (true) { case (!(!($H.window.console && $H.window.console.log))): $H.writeLog = function (msg) { $H.window.console.log(msg); }; break; case (!(!($H.window.opera && $H.window.opera.postError))): $H.writeLog = function (msg) { $H.window.opera.postError(msg); }; break; default: $H.writeLog = function (msg) {}; break; } // log // === $H.log = function () { if ($H.debug); else { return; } for (var i=0, il=arguments.length; i absolute; width: 34px; height: 34px; left: -17px; top: -17px; ' + '} ' + 'em.'+$H.settings.highlightElementCSSClass+' a.'+$H.settings.highlightElementDeleteCSSClass+':hover { background-position: -34px 0px; } ' ; // create var _cssElement = $H.document.createElement('style'); _cssElement.setAttribute('id', $H.settings.onInsertCSSUseThisId); _cssElement.setAttribute('type', 'text/css'); if (_cssElement.styleSheet) { _cssElement.styleSheet.cssText = _cssText; } else { _cssElement.appendChild($H.document.createTextNode(_cssText)); } // append $H.$document.find('head').append(_cssElement); }; // insert css } // selection { // =========== $H.sel = {}; $H.sel.getWindowFromDocument = function (theDocument) { if (theDocument); else { return null; } if ('defaultView' in theDocument) { arguments.calee = function (theDocument) { if (theDocument); else { return null; } return theDocument.defaultView; }; } else if ('parentWindow' in theDocument) { arguments.calee = function (theDocument) { if (theDocument); else { return null; } return theDocument.parentWindow; }; } else { arguments.calee = function (theDocument) { return null; }; } return arguments.calee(theDocument); }; $H.sel.getSelection = function (theWindow) { if (theWindow); else { return null; } if ('getSelection' in theWindow) { arguments.calee = function (theWindow) { if (theWindow); else { return null; } return theWindow.getSelection(); }; } else if ('selection' in theWindow.document) { arguments.calee = function (theWindow) { if (theWindow); else { return null; } return theWindow.document.selection; }; } else { arguments.calee = function (theWindow) { return null; }; } return arguments.calee(theWindow); }; $H.sel.getRange = function (selection) { if (selection); else { return null; } if ('getRangeAt' in selection) { arguments.calee = function (selection) { if (selection); else { return null; } if (selection.rangeCount > 0) { return selection.getRangeAt(0); } else { return null; } // doesn't work in old versions of safari // ... I don't care }; } else if ('createRange' in selection) { arguments.calee = function (selection) { if (selection); else { return null; } return selection.createRange(); }; } else { arguments.calee = function (selection) { return null; }; } return arguments.calee(selection); }; $H.sel.getRangeHTML = function (range) { if (range); else { return null; } if ('htmlText' in range) { arguments.calee = function (range) { if (range); else { return null; } return range.htmlText; }; } else if ('surroundContents' in range) { arguments.calee = function (range) { if (range); else { return null; } if (range.commonAncestorContainer && range.commonAncestorContainer.ownerDocument); else { return null; } var dummy = range.commonAncestorContainer.ownerDocument.createElement("div"); dummy.appendChild(range.cloneContents()); return dummy.innerHTML; }; } else { arguments.calee = function (range) { return null; }; } return arguments.calee(range); }; $H.sel.getRangeText = function (range) { if (range); else { return null; } if ('text' in range) { arguments.calee = function (range) { if (range); else { return null; } return range.text; }; } else if ('surroundContents' in range) { arguments.calee = function (range) { if (range); else { return null; } if (range.commonAncestorContainer && range.commonAncestorContainer.ownerDocument); else { return null; } var dummy = range.commonAncestorContainer.ownerDocument.createElement("div"); dummy.appendChild(range.cloneContents()); return dummy.textContent; }; } else { arguments.calee = function (range) { return null; }; } return arguments.calee(range); }; // selection } // helpers { // ========= $H.rand = function (_min, _max) { return (Math.floor(Math.random() * (_max - _min + 1)) + _min); }; $H.highlight__deleteSpansFromParents = function (_parents) { var _done = [], _this_done = false, _inner = ''; // main loop for (var i=0, _i=_parents.length; i<_i; i++) { // init _this_done = false; // check for (var ii=0, _ii=_done.length; ii<_ii; ii++) { if (_done[ii] == _parents[i]) { _this_done = true; break; } } // skip if (_this_done) { continue; } // actually do // =========== // add _done.push(_parents[i]); // get _inner = _parents[i].innerHTML; // check if (_inner.indexOf(' -1); else { continue; } // replace _inner = _inner.replace(/]*?)>/gi, ''); _inner = _inner.replace(/<\/span>/gi, ''); _parents[i].innerHTML = _inner; } }; $H.highlight__getDeepestTextNode = function (_node) { var _n = _node; while (true) { switch (true) { // text case (_n.nodeType && _n.nodeType == 3): return _n; // single child case (_n.nodeType && _n.nodeType == 1 && _n.childNodes.length > 0): _n = _n.childNodes[0]; break; // no children but has sibling case (_n.nodeType && _n.nodeType == 1 && _n.childNodes.length == 0 && _n.nextSibling): _n = _n.nextSibling; break; // default default: return _node; } } }; $H.highlight__getCommonAncestorContainerForNodes = function (_node1, _node2, _fallback) { var _parent1 = _node1, _parent2 = _node2; while (true) { // next _parent1 = _parent1.parentNode; _parent2 = _parent2.parentNode; // break switch (true) { case (!(_parent1)): case (!(_parent2)): case (_parent1 == _fallback): case (_parent2 == _fallback): return _fallback; } // maybe switch (true) { case (_parent1 == _parent2): return _parent1; case ($CJ.contains(_parent1, _node2)): return _parent1; case ($CJ.contains(_parent2, _node1)): return _parent2; case ($CJ.contains(_parent1, _parent2)): return _parent1; case ($CJ.contains(_parent2, _parent1)): return _parent2; } } }; $H.highlight__getParentElementOfNode = function (_thisNode) { var _element = _thisNode; while (true) { // correct if (_element.nodeType == 1) { break; } // continue _element = _element.parentNode; } return _element; }; $H.highlight__getParentElementOfNodeWithThisParent = function (_thisNode, _thisParent) { // impossible switch (true) { case (_thisNode == _thisParent): return _thisNode; case (!($CJ.contains(_thisParent, _thisNode))): // always false in IE //return _thisNode; } // do var _element = _thisNode; while (true) { // correct if (_element.parentNode == _thisParent) { break; } // continue _element = _element.parentNode; } return _element; }; // helpers } // build html for element with selected range { // ============================================ $H.highlight__buildHTMLForElementWithSelectedRange = function (_elementToBuildHTMLFor, _modeToBuildHTMLIn, _rangeToBuildHTMLWith) { var _global__element_index = 0, _global__the_html = '', _global__highlight_on = ((_modeToBuildHTMLIn == 'boundry-end') ? true : false) ; // recursive function // ================== var _recursive = function (_node) { // increment index -- starts with 1 // =============== _global__element_index++; // vars // ==== var _explored = false, _tag_name = (_node.nodeType === 3 ? '#text' : ((_node.nodeType === 1 && _node.tagName && _node.tagName > '') ? _node.tagName.toLowerCase() : '#invalid')), _tag_is_ignored = ($H.parseOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1), _tag_is_ignored = (_tag_is_ignored ? ((_tag_name == 'span') ? false : true) : false), _pos__start__before = 0, _pos__start__after = 0, _pos__end__before = 0, _pos__end__after = 0, _to_write = '', _selection_starts_here = false, _selection_ends_here = false ; // fast return // =========== switch (true) { case ((_tag_name == '#invalid')): case (($H.parseOptions._elements_ignore.indexOf('|'+_tag_name+'|') > -1)): return; case (_tag_name == '#text'): // get value // ========= _to_write = _node.nodeValue.replace(//gi, '>'); // mode? // ===== switch (true) { case (_modeToBuildHTMLIn == 'nothing'): break; case (_modeToBuildHTMLIn == 'everything'): _to_write = '' + '' + _to_write + '' ; break; case (_modeToBuildHTMLIn == 'boundry-start'): case (_modeToBuildHTMLIn == 'boundry-end'): case (_modeToBuildHTMLIn == 'boundry-both'): // end of range? // ============= if (_node == _rangeToBuildHTMLWith.endContainer) { _to_write = '' + '' + _to_write.substr(0, _rangeToBuildHTMLWith.endOffset) + '' + _to_write.substr(_rangeToBuildHTMLWith.endOffset) ; _global__highlight_on = false; _selection_ends_here = true; } // start of range? // =============== if (_node == _rangeToBuildHTMLWith.startContainer) { _to_write = '' + _to_write.substr(0, _rangeToBuildHTMLWith.startOffset) + '' + _to_write.substr(_rangeToBuildHTMLWith.startOffset) + '' ; _global__highlight_on = true; _selection_starts_here = true; } // correction // ========== if (_selection_starts_here && _selection_ends_here) { _to_write = _node.nodeValue.replace(//gi, '>'); _to_write = '' + _to_write.substr(0, _rangeToBuildHTMLWith.startOffset) + '' + _to_write.substr(_rangeToBuildHTMLWith.startOffset, (_rangeToBuildHTMLWith.endOffset - _rangeToBuildHTMLWith.startOffset)) + '' + _to_write.substr(_rangeToBuildHTMLWith.endOffset) ; _global__highlight_on = false; } // snap-to // ======= if (_selection_starts_here && (_rangeToBuildHTMLWith.startOffset > 0)) { // before _to_write = _to_write.replace(/([ .,;?!])([a-z0-9]{1,2})/gi, '$1$2'); // space at begining _to_write = _to_write.replace(/([\s])([^\s])/gi, '$1$2'); // too much _to_write = _to_write.replace(/([a-z0-9])([ ])([a-z0-9])/gi, '$1$2$3'); } if (_selection_ends_here && (_rangeToBuildHTMLWith.endOffset > 0)) { var _do_end = true; if (_rangeToBuildHTMLWith.endContainer && _rangeToBuildHTMLWith.endContainer.nodeValue && _rangeToBuildHTMLWith.endContainer.nodeValue.length) { _do_end = (_rangeToBuildHTMLWith.endOffset < _rangeToBuildHTMLWith.endContainer.nodeValue.length); } if (_do_end) { // after _to_write = _to_write.replace(/<\/highlight>([a-z0-9]{0,2})([ .,;?!])/gi, '$1$2'); // space at end _to_write = _to_write.replace(/([^\s])([\s])<\/highlight>/gi, '$1$2'); // too much _to_write = _to_write.replace(/([ ])([a-z0-9])<\/highlight>([a-z0-9])/gi, '$1$2$3'); } } // other // ===== if (!(_selection_starts_here) && !(_selection_ends_here)) { _to_write = _node.nodeValue.replace(//gi, '>'); if (_global__highlight_on) { _to_write = '' + '' + _to_write + '' ; } } break; } // write value // =========== _global__the_html += _to_write; return; } // range anchors are elements instead of text-nodes // ================================================ // end of range? if ((_rangeToBuildHTMLWith.endContainer.nodeType == 1) && (_node == _rangeToBuildHTMLWith.endContainer)) { _global__highlight_on = false; _selection_ends_here = true; } // start of range? if ((_rangeToBuildHTMLWith.startContainer.nodeType == 1) && (_node == _rangeToBuildHTMLWith.startContainer)) { _global__highlight_on = true; _selection_starts_here = true; } // correction if (_selection_starts_here && _selection_ends_here) { _global__highlight_on = false; } // start tag // ========= if (_tag_is_ignored); else { /* mark */ _pos__start__before = _global__the_html.length; /* add */ _global__the_html += '<'+_tag_name; // attributes // ========== // allowed attributes if (_tag_name in $H.parseOptions._elements_keep_attributes) { for (var i=0, _i=$H.parseOptions._elements_keep_attributes[_tag_name].length; i<_i; i++) { var _attribute_name = $H.parseOptions._elements_keep_attributes[_tag_name][i], _attribute_value = _node.getAttribute(_attribute_name) ; // if present if (_attribute_value > '') { _global__the_html += ' '+_attribute_name+'="'+(_attribute_value)+'"'; } } } // keep ID for all elements var _id_attribute = _node.getAttribute('id'); if (_id_attribute > '') { _global__the_html += ' id="'+_id_attribute+'"'; } // links target NEW if (_tag_name == 'a') { _global__the_html += ' target="_blank"'; } // add class name // ============== var _class_attribute = _node.getAttribute('class'); if (_class_attribute > '') { _global__the_html += ' class="'+_class_attribute+'"'; } // add highlight id -- for EMs that are outside the global highlight // ================ if (_tag_name == 'em' && _modeToBuildHTMLIn != 'everything') { // with a fix for when an em is the first thing inside a parent element switch (true) { case (_global__highlight_on): case ((_rangeToBuildHTMLWith.startOffset == 0) && (_node.firstChild) && (_node.firstChild == _rangeToBuildHTMLWith.startContainer)): break; default: var _highlight_id_attribute = _node.getAttribute($H.settings.highlightElementIdAttribute); if (_highlight_id_attribute > '') { _global__the_html += ' '+$H.settings.highlightElementIdAttribute+'="'+_highlight_id_attribute+'"'; } break; } } // close start // =========== if ($H.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1) { _global__the_html += ' />'; } else { _global__the_html += '>';} /* mark */ _pos__start__after = _global__the_html.length; } // child nodes // =========== if ($H.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1); else { for (var i=0, _i=_node.childNodes.length; i<_i; i++) { _recursive(_node.childNodes[i]); } } // end tag // ======= switch (true) { case (_tag_is_ignored): return; case (($H.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1)): /* mark */ _pos__end__before = _global__the_html.length; /* mark */ _pos__end__after = _global__the_html.length; break; default: /* mark */ _pos__end__before = _global__the_html.length; /* end */ _global__the_html += '</'+_tag_name+'>'; /* mark */ _pos__end__after = _global__the_html.length; break; } // protected elements // ================== switch (true) { // some elemnts are protected from highlighting case (($H.parseOptions._elements_highlight_protect.indexOf('|'+_tag_name+'|') > -1)): case ((_tag_name == 'em') && $CJ(_node).hasClass($H.settings.highlightElementCSSClass)): // so, if highlights are inside an already highlighted element --or an unhighlightable one-- remove _global__the_html = '' + _global__the_html.substr(0, _pos__start__after) + _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after)) .replace(//gi, '') .replace(/<\/highlight>/gi, '') + _global__the_html.substr(_pos__end__before) ; break; // some elements are invalid completely case ((_tag_name == 'a') && (_node.className == 'deleteHighlight')): _global__the_html = '' + _global__the_html.substr(0, _pos__start__before) + _global__the_html.substr(_pos__end__after) ; break; // some elements need to have their tags ignored /*case (_tag_name == 'span'): _global__the_html = '' + _global__the_html.substr(0, _pos__start__before) + _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after)) + _global__the_html.substr(_pos__end__after) ; break;*/ } // return return; }; // actually do it _recursive(_elementToBuildHTMLFor); // use em, instead of highlight _global__the_html = _global__the_html .replace(//gi, '') .replace(/<\/highlight>/gi, '') ; // return return _global__the_html; }; // build html for element with selected range } // do range { // ========== $H.highlight__doRange = function (_range_to_highlight) { // get referrence elements var _commonAncestorElement = $H.highlight__getParentElementOfNode(_range_to_highlight.commonAncestorContainer), _startElement = $H.highlight__getParentElementOfNodeWithThisParent(_range_to_highlight.startContainer, _commonAncestorElement), _endElement = $H.highlight__getParentElementOfNodeWithThisParent(_range_to_highlight.endContainer, _commonAncestorElement) ; // range not in container element if (true && (_commonAncestorElement.tagName) && !($CJ.contains($H.settings.elementWhichMustContainAllHighlights, _commonAncestorElement)) ) { return false; } // arbitrary range exclusion if ($H.callbacks.arbitraryRangeExclusion) { if ($H.callbacks.arbitraryRangeExclusion(_range_to_highlight, _commonAncestorElement, _startElement, _endElement) === false) { return false; } } /* $H.log( _range.startContainer, _range.endContainer, _range.startOffset, _range.endOffset, _range_to_highlight, _commonAncestorElement, _startElement, _endElement ); */ // selection id var _selection_id = $H.rand(1, 1000); while (true) { // nothing found if ($H.$elementWhichMustContainAllHighlights.find('em.'+$H.settings.highlightElementCSSClass+'['+$H.settings.highlightElementIdAttribute+'="'+_selection_id+'"]').length > 0); else { break; } // new id _selection_id = $H.rand(1, 1000); } // chainging elements // ================== var _chaingingElements = [], _currElement = _startElement, _currChainging = false; while (true) { // object _currChainging = { '_element': _currElement, '_tagName': (_currElement.nodeType === 3 ? '#text' : ((_currElement.nodeType === 1 && _currElement.tagName && _currElement.tagName > '') ? _currElement.tagName.toLowerCase() : '#invalid')) }; // add _chaingingElements.push(_currChainging); // break if (_currElement == _endElement) { break; } // next _currElement = _currElement.nextSibling; // error? if (_currElement); else { break; } } // rewrite elements // ================ var _parents_to_clean = []; for (var i=0, _i=_chaingingElements.length, _currElement=false; i<_i; i++) { var _currElement = _chaingingElements[i], _currNode = _currElement._element, _currTag = _currElement._tagName, _boundry_mode = '', _currBuiltHTML = false, _resNode = false ; // get html / mode // =============== switch (true) { case ((_i == 1) && (i == 0)): _boundry_mode = 'boundry-both'; break; case ((_i > 1) && (i == 0)): _boundry_mode = 'boundry-start'; break; case ((_i > 1) && (i == (_i-1))): _boundry_mode = 'boundry-end'; break; default: _boundry_mode = 'everything'; break; } // get html // ======== _currBuiltHTML = $H.highlight__buildHTMLForElementWithSelectedRange(_currNode, _boundry_mode, _range_to_highlight); // write // ===== switch (true) { case ((_currTag == '#text')): // resulting html might be something like "something something else" // so we create a dummy span tag to eomcompass it, and then repalce the old text node with that // create var _newElement = $H.document.createElement('span'); _newElement.innerHTML = _currBuiltHTML; // result _resNode = _newElement; /* with (Evernote.evernotePopup) { console.log(' ~~~ highlight.js gadit before |' + docSelection + "|"); console.log(' ~~~ from ' +docSelection.startOffset + ' to ' + docSelection.endOffset); }*/ Evernote.Utils.sendMessageToPopup('highlightDomChangesStart'); // replace _currNode.parentNode.replaceChild(_resNode, _currNode); Evernote.Utils.sendMessageToPopup('highlightDomChangesEnd'); /* with (Evernote.evernotePopup) { console.log(' ~~~ highlight.js nagadil |' + docSelection + "|"); console.log(' ~~~ from ' +docSelection.startOffset + ' to ' + docSelection.endOffset); }*/ break; case (($H.parseOptions._elements_self_closing.indexOf('|'+_currTag+'|') > -1)): // result _resNode = _currNode; /* nothing */ /* var _newElement = $H.document.createElement('em'); _newElement.className = $H.settings.highlightElementCSSClass; _newElement.innerHTML = _currBuiltHTML; _currNode.parentNode.replaceChild(_newElement, _currNode); */ break; default: // result _resNode = _currNode; // innerHTML _currBuiltHTML = _currBuiltHTML.substr((_currBuiltHTML.indexOf('>')+1)); _currBuiltHTML = _currBuiltHTML.substr(0, _currBuiltHTML.lastIndexOf('<')); // highlighted anything? if (_currBuiltHTML.indexOf('') > - 1); else { break; } // do it _currNode.innerHTML = _currBuiltHTML; break; } // set highlight class // =================== // inside node $CJ(_resNode).find('em.'+$H.settings.highlightElementCSSClass+':not(['+$H.settings.highlightElementIdAttribute+'])').attr($H.settings.highlightElementIdAttribute, _selection_id); // on node if ((_currTag == 'em') && $CJ(_resNode).hasClass($H.settings.highlightElementCSSClass)) { $CJ(_resNode).attr($H.settings.highlightElementIdAttribute, _selection_id); } // clean::add _parents_to_clean.push(_resNode.parentNode); } // clean::do $H.highlight__deleteSpansFromParents(_parents_to_clean); }; // do range } // do current selection { // ====================== $H.highlight__doCurentSelection = function () { // vars // ==== var _selection = $H.sel.getSelection($H.window), _range = $H.sel.getRange(_selection), _text = $H.sel.getRangeText(_range), _good_range = (_range ? { 'commonAncestorContainer': _range.commonAncestorContainer, 'startContainer': _range.startContainer, 'endContainer': _range.endContainer, 'startOffset': _range.startOffset, 'endOffset': _range.endOffset } : false) ; // some exception rules // ==================== switch (true) { case (!(_text)): case (!(_text.length > 0)): case (!(_good_range)): return false; } // some corrections // ================ // Firefox fucks up -- https://developer.mozilla.org/en/DOM/range.startOffset // Offsets mean two differet things // start container if (_good_range.startContainer.nodeType == 1) { if (_good_range.startContainer.childNodes[_good_range.startOffset]) { _good_range.startContainer = _good_range.startContainer.childNodes[_good_range.startOffset]; _good_range.startOffset = 0; } } // end container if (_good_range.endContainer.nodeType == 1) { if (_good_range.endContainer.childNodes[_good_range.endOffset]) { _good_range.endContainer = _good_range.endContainer.childNodes[_good_range.endOffset]; _good_range.endOffset = 0; } } // highlight range // =============== var _highlighted_range = $H.highlight__doRange(_good_range); if (_highlighted_range === false) { return false; } // clear selection // =============== try { _selection.removeAllRanges(); } catch (e) {} // correct double highlights // ========================= var _parents_double_to_clean = []; $H.$elementWhichMustContainAllHighlights.find('em.'+$H.settings.highlightElementCSSClass+' em.'+$H.settings.highlightElementCSSClass).each(function (_i, _e) { // remove inner button $CJ(_e).find('a.'+$H.settings.highlightElementDeleteCSSClass).remove(); // create var _newElement = $H.document.createElement('span'); _newElement.innerHTML = _e.innerHTML; // repalce _e.parentNode.replaceChild(_newElement, _e); // add _parents_double_to_clean.push(_newElement.parentNode); }); // clean $H.highlight__deleteSpansFromParents(_parents_double_to_clean); // remove buttons and classes // ========================== // delete buttons $H.$elementWhichMustContainAllHighlights.find('em.'+$H.settings.highlightElementCSSClass+' a.'+$H.settings.highlightElementDeleteCSSClass).remove(); // first, last $H.$elementWhichMustContainAllHighlights.find('em.'+$H.settings.highlightElementCSSClass+'.'+$H.settings.highlightElementFirstCSSClass).removeClass($H.settings.highlightElementFirstCSSClass); $H.$elementWhichMustContainAllHighlights.find('em.'+$H.settings.highlightElementCSSClass+'.'+$H.settings.highlightElementLastCSSClass).removeClass($H.settings.highlightElementLastCSSClass); // add buttons and classes // ======================= var _highlights_collection = $H.$elementWhichMustContainAllHighlights.find('em.'+$H.settings.highlightElementCSSClass), _highlights_collection_ids = [], _curr_delete_button = false ; // get all ids _highlights_collection.each(function (_i, _e) { _highlights_collection_ids.push($CJ(_e).attr($H.settings.highlightElementIdAttribute)); }); // add button, classes _highlights_collection.each(function (_i, _e) { var _isFirst = (_highlights_collection_ids[(_i-1)] ? (_highlights_collection_ids[_i] != _highlights_collection_ids[(_i-1)]) : true), _isLast = (_highlights_collection_ids[(_i+1)] ? (_highlights_collection_ids[_i] != _highlights_collection_ids[(_i+1)]) : true) ; if (_isFirst) { // class $CJ(_e).addClass($H.settings.highlightElementFirstCSSClass); // create button _curr_delete_button = $H.document.createElement('a'); _curr_delete_button.className = $H.settings.highlightElementDeleteCSSClass; _curr_delete_button.id = $H.settings.highlightElementDeleteIdPrefix + _highlights_collection_ids[_i]; // add button _e.insertBefore(_curr_delete_button, _e.firstChild); } if (_isLast) { // class $CJ(_e).addClass($H.settings.highlightElementLastCSSClass); } }); }; // do current selection } // delete highlight { // ================== $H.highlight__deleteAllHighlights = function () { $H.highlight__deleteHighlight('all'); }; $H.highlight__deleteHighlight = function (_highlight_id) { var _expression = 'em.' + $H.settings.highlightElementCSSClass + (_highlight_id == 'all' ? '' : '['+$H.settings.highlightElementIdAttribute+'="'+_highlight_id+'"]'), _parents_to_clean = [] ; // collection $H.$elementWhichMustContainAllHighlights.find(_expression).each(function (_index, _e) { // create var _s = $H.document.createElement('span'); _s.innerHTML = _e.innerHTML; // do _e.parentNode.replaceChild(_s, _e); // parents _parents_to_clean.push(_s.parentNode); }); // delete spans $H.highlight__deleteSpansFromParents(_parents_to_clean); }; // delete highlight } // enable / disable { // ================== $H.enable = function () { if ($H.enabled) { return; } $H.enabled = true; $H.$html.addClass($H.settings.highlightingEnabledCSSClass); }; $H.disable = function () { if ($H.enabled); else { return; } $H.enabled = false; $H.$html.removeClass($H.settings.highlightingEnabledCSSClass); }; // enable / disable } // add mouse handlers { // ==================== // globals $H.highlight__mouseUp_timeout = false; $H.highlight__deleteButton__byId__mouseEnter_timeout = {}; $H.highlight__deleteButton__byId__mouseLeave_timeout = {}; // containers mouse up $H.highlight__mouseUp = function () { // not in highlight mode if ($H.enabled); else { return; } // timeout $H.highlight__mouseUp_timeout = $H.window.setTimeout ( function () { // try $H.highlight__mouseUp_timeout = false; var _didSelection = $H.highlight__doCurentSelection(); // callback if (_didSelection === false); else { if ($H.callbacks.highlightAdded) { $H.callbacks.highlightAdded(); } } }, 250 ); }; // containers mouse down $H.highlight__mouseDown = function () { // not in highlight mode if ($H.enabled); else { return; } // timeout $H.window.clearTimeout($H.highlight__mouseUp_timeout); }; // delete buttons show/hide $H.highlight__deleteButton__show = function (_highlight_id) { $H.$elementWhichMustContainAllHighlights.find('#' + $H.settings.highlightElementDeleteIdPrefix + _highlight_id).fadeIn(250); }; $H.highlight__deleteButton__hide = function (_highlight_id) { $H.$elementWhichMustContainAllHighlights.find('#' + $H.settings.highlightElementDeleteIdPrefix + _highlight_id).fadeOut(250); }; // add mouse handlers $H.addMouseHandlers = function () { // mouse up/down for (var i=0, _i=$H.settings.elementsToAttachMouseHandlersTo.length; i<_i; i++) { $CJ($H.settings.elementsToAttachMouseHandlersTo[i]) .mouseup($H.highlight__mouseUp) .mousedown($H.highlight__mouseDown) ; } // highlight mouse enter $H.$elementWhichMustContainAllHighlights.on('mouseenter', 'em.'+$H.settings.highlightElementCSSClass, function () { var _highlight_id = $CJ(this).attr($H.settings.highlightElementIdAttribute); $H.window.clearTimeout($H.highlight__deleteButton__byId__mouseLeave_timeout[_highlight_id]); $H.highlight__deleteButton__byId__mouseEnter_timeout[_highlight_id] = $H.window.setTimeout( function () { $H.highlight__deleteButton__byId__mouseEnter_timeout[_highlight_id] = false; $H.highlight__deleteButton__show(_highlight_id); }, 250 ); }); // highlight mouse leave $H.$elementWhichMustContainAllHighlights.on('mouseleave', 'em.'+$H.settings.highlightElementCSSClass, function () { var _highlight_id = $CJ(this).attr($H.settings.highlightElementIdAttribute); $H.window.clearTimeout($H.highlight__deleteButton__byId__mouseEnter_timeout[_highlight_id]); $H.highlight__deleteButton__byId__mouseLeave_timeout[_highlight_id] = $H.window.setTimeout( function () { $H.highlight__deleteButton__byId__mouseLeave_timeout[_highlight_id] = false; $H.highlight__deleteButton__hide(_highlight_id); }, 250 ); }); // highlight delete click $H.$elementWhichMustContainAllHighlights.on('click', 'em.'+$H.settings.highlightElementCSSClass+' a.'+$H.settings.highlightElementDeleteCSSClass, function () { // get id var _id = $CJ(this.parentNode).attr($H.settings.highlightElementIdAttribute); // remove self $CJ(this).remove(); // delete $H.highlight__deleteHighlight(_id); // callback if ($H.callbacks.highlightDeleted) { $H.callbacks.highlightDeleted(); } }); }; // add mouse handlers } // get clean html { // ================ $H.getCleanHTML = function (_rawHTML) { // html var _html = _rawHTML; // remove all spans -- spans hold deleted highlights, or useless helper elements _html = _html.replace(/]*?)>/gi, ''); _html = _html.replace(/<\/span>/gi, ''); // remove highlight-delete buttons var _highlight_delete_reg = new RegExp(']*?)'+$H.settings.highlightElementDeleteCSSClass+'([^>]*?)>', 'gi'); _html = _html.replace(_highlight_delete_reg, ''); // highlight element var _highlight_element_reg = new RegExp(']*?)'+$H.settings.highlightElementCSSClass+'([^>]*?)>([^>]+?)', 'gi'); _html = _html.replace(_highlight_element_reg, '$3'); // double EMs var _two_highlights_reg = new RegExp('([\\s\\S]*?)([ \\n\\r\\t]*?)([\\s\\S]*?)', 'gi'); while (true && _html.match(_two_highlights_reg)) { _html = _html.replace(_two_highlights_reg, '$1$3'); } // replace EMs var _highlight_reg = new RegExp('([\\s\\S]*?)', 'gi'); _html = _html.replace(_highlight_reg, $H.settings.highlightCleanHTMLElementStart+'$1'+$H.settings.highlightCleanHTMLElementEnd); return _html; }; // get clean html } // return self // =========== return $H; }</script><script defer="" type="text/javascript" charset="ANSI">/*! * ClearlyComponent__next * Evernote Clearly's next-page algorithm as an embeddable component. * Copyright 2013, Evernote Corporation * * Usage: * ====== * * The Next-pages Clearly-component works hand-in-hand with the clearly Detect Component. * So its init/usage pattern needs to come after the normal init/usage pattern for the Detect Component. * Like this: * * First "Detect": * ============= * * // define * window.ClearlyComponent__detect = { * 'callbacks': { * 'finished': someFunction(), * }, * 'window': window, * 'document': document, * 'jQuery': window.jQuery * }; * * // init -- will return false, if something goes wrong * window.ClearlyComponent__detect = initClearlyComponent__detect(window.ClearlyComponent__detect); * * Then "Next": * ============ * * // define * window.ClearlyComponent__next = { * 'callbacks': { * 'newPageFound': someFunction() * }, * * 'settings': { * 'onCreateNextPagesContainerUseThisId': 'string', * 'onCreateNextPagesContainerDoNotInsertCSS': true * }, * * 'detectComponentInstance': window.ClearlyComponent__detect * }; * * // init -- will return false, if something goes wrong * window.ClearlyComponent__next = initClearlyComponent__next(window.ClearlyComponent__next); * * // call -- returns nothing; callbacks will be used * window.ClearlyComponent__next.createNextPagesContainer() * window.ClearlyComponent__next.start(); * */ /* changes: ======== $R => $N, $D */ function initClearlyComponent__next(_paramInstance) { // global instance reference { // =========================== // null; return if (_paramInstance); else { return false; } // shorthand $N = _paramInstance; // global instance reference } // required vars { // =============== // the component instance object must already be created, // when the init function is called. it must have these vars set: switch (true) { case (!($N.detectComponentInstance)): case (!($N.callbacks)): case (!($N.callbacks.newPageFound)): // something's wrong return false; } // required vars } // missing settings { // ================== if ($N.settings); else { $N.settings = {}; } // names for stuff /* frames id */ if ($N.settings.onCreateNextPageFramesUseThisIdPrefix); else { $N.settings.onCreateNextPageFramesUseThisIdPrefix = 'clearly_next_page_frame__'; } /* container id */ if ($N.settings.onCreateNextPagesContainerUseThisId); else { $N.settings.onCreateNextPagesContainerUseThisId = 'clearly_next_pages_container'; } /* insert container css */ if ($N.settings.onCreateNextPagesContainerDoNotInsertCSS); else { $N.settings.onCreateNextPagesContainerDoNotInsertCSS = false; } /* frames attribute */ if ($N.settings.onLoadingNextPageFramesUseThisAttribute); else { $N.settings.onLoadingNextPageFramesUseThisAttribute = 'clearly_next_page_loaded'; } /* frames attribute value */ if ($N.settings.onLoadingNextPageFramesUseThisAttributeValue); else { $N.settings.onLoadingNextPageFramesUseThisAttributeValue = 'yes'; } // missing settings } // global vars { // ============= $D = $N.detectComponentInstance; $CJ = $D.jQuery; $N.pages = []; // global vars } // parse options { // ============= $N.parseOptions = { '_next_page_keywords': [ /* english */ 'next page', 'next', /* german */ 'vorwärts', 'weiter', /* japanese */ '次へ' ], '_next_page_keywords_not': [ /* english */ 'article', 'story', 'post', 'comment', 'section', 'chapter' ] }; // parse options } // create next pages container { // ============================= $N.createNextPagesContainer = function () { // default id // ========== _container_id = $N.settings.onCreateNextPagesContainerUseThisId; // container // ========= var _containerElement = $D.document.createElement('div'); _containerElement.setAttribute('id', _container_id); // css // === if ($N.settings.onCreateNextPagesContainerDoNotInsertCSS); else { var _cssElement = $D.document.createElement('style'), _cssText = '' + '#'+_container_id+' { ' + 'margin: 0; padding: 0; border: none; ' + 'position:absolute; ' + 'width: 10px; height: 10px; ' + 'top: -100px; left: -100px; ' + '} ' + '#'+_container_id+' iframe { ' + 'margin: 0; padding: 0; border: none; ' + 'position:absolute; ' + 'width: 10px; height: 10px; ' + 'top: -100px; left: -100px; ' + '} ' ; _cssElement.setAttribute('id', _container_id + '__css'); _cssElement.setAttribute('type', 'text/css'); if (_cssElement.styleSheet) { _cssElement.styleSheet.cssText = _cssText; } else { _cssElement.appendChild($D.document.createTextNode(_cssText)); } } // write // ===== var _body = $D.document.getElementsByTagName('body')[0]; /* css */ if (_cssElement) { _body.appendChild(_cssElement); } /* container */ _body.appendChild(_containerElement); // set // === $N.nextPages = _containerElement; $N.$nextPages = $CJ($N.nextPages); }; // create next pages container } // helpers { // ========= // substr starting with the first slash after // $N.getURLPath = function (_url) { return _url.substr(_url.indexOf('/', (_url.indexOf('//') + 2))); }; // substr until the first slash after // $N.getURLDomain = function (_url) { return _url.substr(0, _url.indexOf('/', (_url.indexOf('//') + 2))); }; // helpers } // load page { // =========== $N.nextPage__loadToFrame = function (_pageNr, _nextPageURL) { // do ajax // ======= $CJ.ajax ({ 'url' : _nextPageURL, 'type' : 'GET', 'dataType' : 'html', 'async' : true, 'timeout': (10 * 1000), //'headers': { 'Referrer': _nextPageURL }, 'success' : function (_response, _textStatus, _xhr) { $N.nextPage__ajaxComplete(_pageNr, _response, _textStatus, _xhr); }, 'error' : function (_xhr, _textStatus, _error) { $N.nextPage__ajaxError(_pageNr, _xhr, _textStatus, _error); } }); }; $N.nextPage__ajaxError = function (_pageNr, _xhr, _textStatus, _error) { }; $N.nextPage__ajaxComplete = function (_pageNr, _response, _textStatus, _xhr) { // valid? // ====== if (_response > ''); else { return; } // get html // ======== var _html = _response; // normalize // ========= _html = _html.replace(/<\s+/gi, '<'); _html = _html.replace(/\s+>/gi, '>'); _html = _html.replace(/\s+\/>/gi, '/>'); // remove // ====== _html = _html.replace(/<script[^>]*?>([\s\S]*?)<\/script>/gi, ''); _html = _html.replace(/<script[^>]*?\/>/gi, ''); _html = _html.replace(/
' + '
' + '
' + '
' + '
' + '
' + '
' + '
    ' + '' + '' + '' + '
    ' + '' + '' + '' ; _iframeElement.setAttribute('id', _frame_id); // css // === if ($R.settings.onCreateFrameDoNotInsertCSS); else { var _cssElement = $R.document.createElement('style'), _cssText = '' + '#'+_frame_id+' { ' + 'margin: 0; padding: 0; border: none; ' + 'position:absolute; ' + 'width: 10px; height: 10px; ' + 'top: -100px; left: -100px; ' + '} ' ; _cssElement.setAttribute('id', _frame_id + '__css'); _cssElement.setAttribute('type', 'text/css'); if (_cssElement.styleSheet) { _cssElement.styleSheet.cssText = _cssText; } else { _cssElement.appendChild($R.document.createTextNode(_cssText)); } } // write // ===== var _body = $R.document.getElementsByTagName('body')[0]; /* css */ if (_cssElement) { _body.appendChild(_cssElement); } /* frame */ _body.appendChild(_iframeElement); var _iframe = $R.document.getElementById(_frame_id); var _doc; _iframe.innerHTML = _iframeHTML; // callback & variables // ==================== var _check_interval = false; var _check = function () { // iframe var _iframe = $R.document.getElementById(_frame_id); if (_iframe); else { return; } // body var _body = $CJ(_iframe).find('#bodyContent')[0]; if (_body); else { return; } // clear interval $R.window.clearInterval(_check_interval); // global vars $R.iframe = _iframe; $R.$iframe = $CJ($R.iframe); $R.iframeDocument = _iframe; $R.$iframeDocument = $CJ($R.iframeDocument); $R.iframeWindow = _iframe; $R.$iframeWindow = $CJ($R.iframeWindow); $R.$iframeBox = $R.$iframeDocument.find('#box'); $R.$iframePages = $R.$iframeDocument.find('#pages'); $R.$iframeBackground = $R.$iframeDocument.find('#background'); $R.$iframeFootnotedLinks = $R.$iframeDocument.find('#footnotedLinks'); // callback if ($R.callbacks.frameCreated) { $R.callbacks.frameCreated(); } }; // set interval _check_interval = $R.window.setInterval(_check, 250); }; // create frame } // add page { // ========== $R.addNewPage = function (_pageHTML, _pageURL) { // update page count // ================= var _pageNr = $R.pagesCount + 1; $R.pagesCount++; // separator // ========= if (_pageNr > 1) { $R.$iframePages.append('' + '
    ' + '
    ' + '
    '+$R.settings.pageLabel+_pageNr+'
    ' + '' ); } // append page // =========== $R.$iframePages.append('' + '
    ' + '
    ' + _pageHTML + '
    ' + '' ); // this new page // ============= // cache var _$page = $R.$iframeDocument.find('#page'+_pageNr); // links as footnotes _$page.find('a').each(function (_index, _element) { // check var _href = _element.href; if (_href > ''); else { return; } if (_href.indexOf); else { return; } if (_href.indexOf('#') > -1) { return; } // count var _nr = ++$R.footnotedLinksCount; // add $CJ(_element).append(' ['+_nr+']'); $R.$iframeFootnotedLinks.append('
    ' + _key + ' ' + _value + '
    ]*?>/gi, ''); _contents = _contents.replace(/<\/td>/gi, ''); } // for tables, clear empty rows if (_tag_name == 'table') { _contents = _contents.replace(/
    ]*?>/gi, ''); _contents = _contents.replace(/<\/td>/gi, ''); } // for tables, clear empty rows if (_tag_name == 'table') { _contents = _contents.replace(/
    '+_href+''); }); }; // add page } // clear all pages { // ================= $R.clearAllPages = function () { // reset pages count $R.pagesCount = 0; // delete all pages $R.$iframePages.get(0).innerHTML = ''; // reset footnote count $R.footnotedLinksCount = 0; // delete all footnotes $R.$iframeFootnotedLinks.get(0).innerHTML = ''; }; // clear all pages } // return self // =========== return $R; }</script><script defer="" type="text/javascript" charset="ANSI">Evernote.ClearlyController = { _created : false, _visible : false, _logEnabled : false, _detectResult : null, logger : function(text) { if (!this._logEnabled) return; console.log('[Clearly] : ' + text); }, getSimplifiedArticle : function() { this.logger('getSimplifiedArticle()'); return Evernote.JQuery('#evernoteClearlyArticle #box #text').get(0); }, changeFrameClassTo : function(className) { this.clearlyFrame[0].className = ''; this.clearlyFrame.addClass(className); }, hide : function() { this.logger('hide()'); var self = this; if (this._created && this._visible) { this.clearlyBackground.stop(); this.changeFrameClassTo('processing'); this.clearlyBackground.animate({right:'100%'}, 500, null, function() { self.changeFrameClassTo('temphidden'); window.focus(); } ); this._visible = false; } }, show : function() { this.logger('show()'); var self = this; if (this._created && !this._visible) { this.clearlyBackground.stop(); this.changeFrameClassTo('processing'); this.clearlyBackground.animate({ right: "0px" }, 500, null, function() { self.changeFrameClassTo('visible'); window.focus(); } ); this._visible = true; } }, detectComponent : function(callback) { this.logger('detectComponent()'); window.ClearlyComponent__detect = { callbacks: { finished: function(data) { if (callback) callback(data); } }, window: window, document: document, jQuery: Evernote.JQuery }; window.ClearlyComponent__detect = initClearlyComponent__detect(window.ClearlyComponent__detect); window.ClearlyComponent__detect.start(); }, reformatComponent : function(callback){ this.logger('reformatComponent()'); window.ClearlyComponent__reformat = { callbacks: { frameCreated: function(data) { if (callback) callback(data); } }, settings: { cssPath: 'css/clearly', pageLabel: "page ", onCreateFrameUseThisId: "evernoteClearlyArticle", onCreateFrameDoNotInsertCSS: true }, window: window, document: document, jQuery: Evernote.JQuery }; window.ClearlyComponent__reformat = initClearlyComponent__reformat(window.ClearlyComponent__reformat); window.ClearlyComponent__reformat.createFrame(); }, getContentElementAndHTML : function (callback) { this.logger('getContentElementAndHTML()'); this.detectComponent(callback); }, getClearlyArticleText : function(callback) { this.logger('getClearlyArticleText()'); this.detectComponent(callback); }, assignClearlyArticleContent : function() { this.logger('showClearlyArticleContent()'); window.ClearlyComponent__reformat.$iframeBox.find('#text #pages')[0].innerHTML = this._detectResult; }, setContainersSize : function() { var maxHeight = Math.max(document.body.scrollHeight, this.clearlyFrame.scrollHeight); try { //old ie throws error this.clearlyFrame[0].style.height = maxHeight + "px"; } catch (e) { } }, startClearly : function() { this.logger('startClearly()'); var self = this; if (this._created) { self.show(); return; } function onDetectEnd(data) { self._detectResult = data._html.replace(/(id|class)="(.*?)"/ig,'cid="$2"'); self.assignClearlyArticleContent(); self.show(); } function onFrameCreated() { self.clearlyFrame = window.ClearlyComponent__reformat.$iframe; self.clearlyBackground = window.ClearlyComponent__reformat.$iframeBackground; self._created = true; self.setContainersSize(); self.detectComponent(onDetectEnd); } window.scrollTo(0,0); this.reformatComponent(onFrameCreated); }, isReady : function() { return this._created; }, isVisible : function() { return this._visible; }, highlight : function () { this.logger('highlight()'); var numTextHighlights; window.ClearlyComponent__highlight = { callbacks: { highlightAdded: function() { numTextHighlights++; }, highlightDeleted: function() { numTextHighlights--; } }, settings: { imgPath: "images/" }, window: window, document: document, jQuery: Evernote.JQuery }; window.ClearlyComponent__highlight = initClearlyComponent__highlight(window.ClearlyComponent__highlight); window.ClearlyComponent__highlight.insertCSS(); window.ClearlyComponent__highlight.addMouseHandlers(); window.ClearlyComponent__highlight.enable(); }, disableHighlight : function() { this.logger('disableHighlight()'); if (window.ClearlyComponent__highlight) { window.ClearlyComponent__highlight.disable(); } }, removeHighlighted : function() { this.logger('removeHighlighed()'); // Evernote.JQuery('.clearly_highlight_delete_element').click(); } };</script><script defer="" type="text/javascript" charset="ANSI">/** * SelectionFinder provides mechanism for finding selection on the page via * find(). It is able to traverse frames in order to find a selection. It will * report whether there's a selection via hasSelection(). After doing find(), * the selection is stored in the selection property, and the document property * will contain the document in which the selection was found. Find method will * only recurse documents if it was invoked as find(true), specifying to do * recursive search. You can use reset() to undo find(). */ Evernote.SelectionFinder = function SelectionFinder( doc ) { this._document = doc; }; Evernote.SelectionFinder.prototype._document = null; Evernote.SelectionFinder.prototype._selection = null; Evernote.SelectionFinder.prototype.hasSelection = function() { Evernote.Logger.debug( "SelectionFinder.hasSelection()" ); var range = Evernote.Utils.fixIERangeObject(this.getRange()); return range && (range.startContainer != range.endContainer || (range.startContainer == range.endContainer && range.startOffset != range.endOffset)); }; Evernote.SelectionFinder.prototype.find = function( deep ) { Evernote.Logger.debug( "SelectionFinder.find()" ); var result = this.findSelectionInDocument( this._document, deep ); this._document = result.document; this._selection = result.selection; }; Evernote.SelectionFinder.prototype.getRange = function() { Evernote.Logger.debug( "SelectionFinder.getRange()" ); if ( !this._selection || this._selection.rangeCount == 0 ) { return null; } if ( typeof this._selection.getRangeAt == 'function' ) { return this._selection.getRangeAt( 0 ); } if ( (window.Range && this._selection instanceof window.Range) || !this._selection.anchorNode ) { return this._selection; } var range = this._document.createRange(); range.setStart( this._selection.anchorNode, this._selection.anchorOffset ); range.setEnd( this._selection.focusNode, this._selection.focusOffset ); return range; }; Evernote.SelectionFinder.prototype.findSelectionInDocument = function( doc, deep ) { try { Evernote.Logger.debug( "SelectionFinder.findSelectionInDocument()" ); var sel = null; var hasSelection = false; var win = null; try { win = (doc.defaultView) ? doc.defaultView : window; } catch ( e ) { win = window; } if ( typeof win.getSelection == 'function' ) { sel = win.getSelection(); if ( sel && typeof sel.rangeCount != 'undefined' && sel.rangeCount > 0 ) { Evernote.Logger.debug("Found selection by win.getSelection()"); hasSelection = true; } } else if ( win.selection && typeof win.selection.createRange == 'function' ) { sel = win.selection.createRange(); if ( win.selection.type == 'Text' && typeof sel.htmlText == 'string' && sel.htmlText.length > 0 ) { Evernote.Logger.debug("Found selection by win.selection"); hasSelection = true; } } else if ( doc.selection && (typeof doc.selection.createRange == 'function' || typeof doc.selection.createRange == 'object') ) { sel = doc.selection.createRange(); if(doc.selection.type == "None") sel = undefined; if ( (doc.selection.type == 'Text') && (typeof sel.htmlText == 'string') && (sel.htmlText.length > 0) ) { Evernote.Logger.debug("Found selection by doc.selection"); hasSelection = true; } } if ( sel && !hasSelection && deep ) { var nestedDocs = Evernote.Utils.getNestedDocuments( doc ); for ( var i = 0; i < nestedDocs.length; ++i ) { if ( nestedDocs[ i ] ) { var framedSel = this.findSelectionInDocument( nestedDocs[ i ], deep ); if ( framedSel && framedSel.selection && framedSel.selection.rangeCount > 0 ) { return framedSel; } } } } //if do not find any selection in document, try to find selection in HTMLTextArea|Input. //Get Selection object for TextArea, and set selection as a Range object if(doc.activeElement) Evernote.Logger.debug( "Check selection in INPUT TEXT area (input, textarea), for active element :" + doc.activeElement.nodeName ); var activeEl = doc.activeElement && false; // disabled, because no need to search selections in this elements. if ( activeEl && ( (window.HTMLInputElement && (activeEl instanceof window.HTMLInputElement && activeEl.type == "text")) || ( window.HTMLTextAreaElement && (activeEl instanceof window.HTMLTextAreaElement)) ) ) { if ( activeEl.selectionStart != activeEl.selectionEnd ) { var range = doc.createRange(); var textNode = doc.createTextNode( activeEl.value ); range.setStart( textNode, activeEl.selectionStart ); range.setEnd( textNode, activeEl.selectionEnd ); sel = range; } } return { document : doc, selection : sel }; } catch(e) { Evernote.Logger.error("Failed to find selection on the page due to error " + e); //Do not throw exception here, it is better to not show error to user and allow to clip article or something else. } return { document: doc, selection: null } };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.JSSerializer = { _selectionFinder : new Evernote.SelectionFinder(window.document), serializeAsync : function( element, fullPage, callback ) { try { var start = new Date().getTime(); var root = element || document.body.parentNode || document.body; var serializer = new Evernote.NodeSerializer( window, new Evernote.ClipFullStylingStrategy() ); var parser = new Evernote.DomParser( window, null ); var resultFunc = function() { var images = []; var imageUrls = serializer.getImagesUrls(); for(var i = 0; i < imageUrls.length; i++) { images.push(Evernote.Utils.makeAbsolutePath(serializer.getDocumentBase(), imageUrls[i]).replace(/\s/g, "%20")); } callback( { content : serializer.getSerializedDom(), imageUrls : images, docBase : serializer.getDocumentBase() }); }; parser.parseAsync( root, fullPage ? true: false, serializer, resultFunc); var end = new Date().getTime(); Evernote.Logger.debug( "Clip.clipFullPage(): clipped body in " + (end - start) + " milliseconds" ); } catch ( e ) { Evernote.Logger.error( "JSSerializer.serialize() failed: error = " + e ); throw e; } }, serialize : function( element, fullPage ) { try { var start = new Date().getTime(); var root = element || document.body.parentNode || document.body; var serializer = new Evernote.NodeSerializer( window, new Evernote.ClipFullStylingStrategy() ); var parser = new Evernote.DomParser( window, null ); parser.parse( root, fullPage ? true: false, serializer); var end = new Date().getTime(); Evernote.Logger.debug( "Clip.clipFullPage(): clipped body in " + (end - start) + " milliseconds" ); var images = []; var imageUrls = serializer.getImagesUrls(); for(var i = 0; i < imageUrls.length; i++) { images.push(Evernote.Utils.makeAbsolutePath(serializer.getDocumentBase(), imageUrls[i]).replace(/\s/g, "%20")); } return { content : serializer.getSerializedDom(), imageUrls : images, docBase : serializer.getDocumentBase() } } catch ( e ) { Evernote.Logger.error( "JSSerializer.serialize() failed: error = " + e ); throw e; } }, serializeSelectionAsync : function( range, callback ) { try { if( !range ) { if ( !this.hasSelection() ) { Evernote.Logger.warn( "JSSerializer.serializeSelection(): no selection to clip" ); callback(); return; } range = Evernote.Utils.fixIERangeObject(this._selectionFinder.getRange()); if ( !range ) { Evernote.Logger.warn( "JSSerializer.serializeSelection(): no range in selection" ); callback(); return; } } var start = new Date().getTime(); var ancestor = (this._styleStrategy && Evernote.Utils.Selection.getCommonAncestorContainer(range).nodeType == Evernote.Node.TEXT_NODE && Evernote.Utils.Selection.getCommonAncestorContainer(range).parentNode) ? Evernote.Utils.Selection.getCommonAncestorContainer(range).parentNode : Evernote.Utils.Selection.getCommonAncestorContainer(range); while ( typeof Evernote.ClipRules.NON_ANCESTOR_NODES[ ancestor.nodeName.toUpperCase() ] != 'undefined' && ancestor.parentNode ) { if ( ancestor.nodeName.toUpperCase() == "BODY" ) { break; } ancestor = ancestor.parentNode; } var serializer = new Evernote.NodeSerializer( window, new Evernote.ClipFullStylingStrategy(), null, true ); var parser = new Evernote.DomParser(window, Evernote.Utils.fixIERangeObject(range)); var resultFunc = function() { var images = []; var imageUrls = serializer.getImagesUrls(); for(var i = 0; i < imageUrls.length; i++) { images.push(Evernote.Utils.makeAbsolutePath(serializer.getDocumentBase(), imageUrls[i]).replace(/\s/g, "%20")); } callback( { content : serializer.getSerializedDom(), imageUrls : images, docBase : serializer.getDocumentBase() } ); }; parser.parseAsync( ancestor, false, serializer, resultFunc ); var end = new Date().getTime(); Evernote.Logger.debug( "JSSerializer.serializeSelection(): clipped selection in " + (end - start) + " milliseconds" ); } catch ( e ) { Evernote.Logger.error( "JSSerializer.serializeSelection() failed: error = " + e ); throw e; } }, serializeSelection : function( range ) { try { if( !range ) { if ( !this.hasSelection() ) { Evernote.Logger.warn( "JSSerializer.serializeSelection(): no selection to clip" ); return; } range = Evernote.Utils.fixIERangeObject(this._selectionFinder.getRange()); if ( !range ) { Evernote.Logger.warn( "JSSerializer.serializeSelection(): no range in selection" ); return; } } var start = new Date().getTime(); var ancestor = (this._styleStrategy && Evernote.Utils.Selection.getCommonAncestorContainer(range).nodeType == Evernote.Node.TEXT_NODE && Evernote.Utils.Selection.getCommonAncestorContainer(range).parentNode) ? Evernote.Utils.Selection.getCommonAncestorContainer(range).parentNode : Evernote.Utils.Selection.getCommonAncestorContainer(range); while ( typeof Evernote.ClipRules.NON_ANCESTOR_NODES[ ancestor.nodeName.toUpperCase() ] != 'undefined' && ancestor.parentNode ) { if ( ancestor.nodeName.toUpperCase() == "BODY" ) { break; } ancestor = ancestor.parentNode; } var serializer = new Evernote.NodeSerializer( window, new Evernote.ClipFullStylingStrategy() ); var parser = new Evernote.DomParser(window, Evernote.Utils.fixIERangeObject(range)); parser.parse( ancestor, false, serializer ); var end = new Date().getTime(); Evernote.Logger.debug( "JSSerializer.serializeSelection(): clipped selection in " + (end - start) + " milliseconds" ); var images = []; var imageUrls = serializer.getImagesUrls(); for(var i = 0; i < imageUrls.length; i++) { images.push(Evernote.Utils.makeAbsolutePath(serializer.getDocumentBase(), imageUrls[i]).replace(/\s/g, "%20")); } return { content : serializer.getSerializedDom(), imageUrls : images, docBase : serializer.getDocumentBase() } } catch ( e ) { Evernote.Logger.error( "JSSerializer.serializeSelection() failed: error = " + e ); throw e; } }, hasSelection : function() { Evernote.Logger.debug( "Clip.hasSelection()" ); if ( this._selectionFinder.hasSelection() ) { return true; } else { this._selectionFinder.find( true ); return this._selectionFinder.hasSelection(); } } };</script><script defer="" type="text/javascript" charset="ANSI">/** * Represents JQuery loader that allow to have two versions of JQuery loaded on the same page * @type {Object} */ Evernote.JQueryLoader = { /** * Initializes jquery instance on global Evernote context */ initJQuery : function() { if (!Evernote.JQuery) { Evernote.JQuery = $.noConflict(true); } } }; (function () { if (!Evernote.JQuery) { Evernote.JQuery = $.noConflict(true); } }());</script><script defer="" type="text/javascript" charset="ANSI">Evernote.ClipNotificator = function ClipNotificator() { }; // TODO: clip notificator is obsolete now. Remove it. Evernote.ClipNotificator.WAIT_CONTAINER_ID = "evernoteContentClipperWait"; Evernote.ClipNotificator.SHOW_WAIT_MIN_TIME = 2000; Evernote.ClipNotificator.prototype.showCopyNotification = function( doc, options, useAutoHide ) { Evernote.evernotePostClipPopup.fillOutPopup(options.title, options.notebookName); Evernote.evernotePostClipPopup.show(); try { var wait = this.getWaitContainer( doc, Evernote.Addin.getLocalizedMessage(Evernote.Messages.CLIPPING) ); wait.style.display = "none"; this.centerBox(wait); if ( doc.body ) { doc.body.appendChild( wait ); } if (useAutoHide) { var self = this; var timeout = this.constructor.SHOW_WAIT_MIN_TIME; setTimeout( function() { self.clearWait( doc ); }, timeout ); } } catch ( e ) { Evernote.Logger.error( "ClipNotificator.showCopyNotification() failed: error = " + e ); } }; Evernote.ClipNotificator.prototype.centerBox = function( container ) { // TODO: for what? It can be done with css. var topPosition = ((document.documentElement.scrollTop || document.body.scrollTop) + ((((document.documentElement.clientHeight || document.body.clientHeight) + (!container.offsetHeight && 0)) / 2) >> 0)); var leftPosition = (((document.documentElement.clientWidth || document.body.clientWidth) / 2) - (container.offsetWidth / 2)); container.style.position = "absolute"; container.style.top = (topPosition-20) + "px"; container.style.left = (leftPosition - 90) + "px"; }; Evernote.ClipNotificator.prototype.getWaitContainer = function( doc, msg ) { Evernote.Logger.debug( "ClipNotificator.getWaitContainer()" ); var container = doc.getElementById( this.constructor.WAIT_CONTAINER_ID ); if ( !container ) { container = doc.createElement( "evernotediv" ); if(Evernote.Utils.isQuirkMode()) { container.className = "quirk-mode-container"; } container.id = this.constructor.WAIT_CONTAINER_ID; var wait = doc.createElement( "div" ); wait.id = this.constructor.WAIT_CONTAINER_ID + "Content"; if(Evernote.BrowserDetection.isLessThanIE9()) { wait.className = "content-less-than-nine-container"; } container.appendChild( wait ); var center = doc.createElement( "center" ); wait.appendChild( center ); var spinner = doc.createElement( "div" ); spinner.id = "evernote-spinner-container"; center.appendChild( spinner ); var text = doc.createElement( "span" ); text.id = this.constructor.WAIT_CONTAINER_ID + "Text"; center.appendChild( text ); container._waitMsgBlock = text; container._waitMsgBlock.appendChild( doc.createTextNode( msg ) ); } return container; }; Evernote.ClipNotificator.prototype.clearWait = function( doc, immediately ) { Evernote.Logger.debug( "ClipNotificator.clearWait()" ); var wait = doc.getElementById( Evernote.ClipNotificator.WAIT_CONTAINER_ID ); if ( wait ) { wait.style.opacity = "0"; if (immediately) { wait.parentNode.removeChild( wait ); } else { setTimeout( function() { if ( wait.parentNode ) { wait.parentNode.removeChild( wait ); } }, 300 ); } } };</script><script defer="" type="text/javascript" charset="ANSI">/** * Represents clipper object that is capable of clipping elements from pages or clip elements based on preferences. */ Evernote.Clipper = { _serializer : Evernote.JSSerializer, _clipNotifier : new Evernote.ClipNotificator(), _defaultOptions : { title: PageContext.title, tags: [], comments: "", notebookUid: -1, notebookName : "" }, /** * Clips article element (one that user selected or default if no selection was made). */ clipArticle : function(options, clearly) { var currentOptions = this.initOptions(options); this._clipNotifier.showCopyNotification(document, currentOptions); var self = this; setTimeout(function() { var article if ( clearly ) { article = Evernote.ClearlyController.getSimplifiedArticle(); } else { article = Evernote.contentPreviewer.getArticleElement(); } if(!article) { article = Evernote.pageInfo.getDefaultArticle(function(article) {}); } var resultFunc = function(serializedDom) { self._clipNotifier.clearWait(document); Evernote.Addin.clipNote(currentOptions.comments + serializedDom.content, currentOptions, PageContext.url, serializedDom.imageUrls, true, document); Evernote.ClearlyController.hide(); }; self._serializer.serializeAsync(article, false, resultFunc); }, 100); }, initOptions: function(options) { if(!options) options = this._defaultOptions; options = Evernote.JQuery.extend({}, this._defaultOptions, options); if(!options.title || Evernote.JQuery.trim(options.title).length == 0) options.title = Evernote.Addin.getLocalizedMessage(Evernote.Messages.UNTITLED_NOTE); options.title = Evernote.JQuery.trim(Evernote.Utils.cutToLength(options.title, 255, " ")); /* get notebook name */ var notebookUid = options.notebookUid || 0; var notebook = Evernote.NotebooksLoader.getNotebookByUid(notebookUid); if(!notebook) { options.notebookName = Evernote.Addin.getLocalizedMessage(Evernote.Messages.DEFAULT_NOTEBOOK); } else { options.notebookName = notebook.name; } return options; }, /** * Clips full page. */ clipFullPage : function(options) { Evernote.Logger.debug("Clipper: clipFullPage"); var currentOptions = this.initOptions(options); this._clipNotifier.showCopyNotification(document , currentOptions); var self = this; setTimeout(function() { Evernote.Logger.debug("Start clipping of full page"); var resultFunc = function(serializedDom) { self._clipNotifier.clearWait(document); Evernote.Logger.debug("Image urls " + JSON.stringify(serializedDom.imageUrls)); Evernote.Logger.debug("Send clip to EN"); Evernote.Addin.clipNote(currentOptions.comments + serializedDom.content, currentOptions, PageContext.url, serializedDom.imageUrls, true, document); }; self._serializer.serializeAsync(null, true, resultFunc); }, 100); }, /** * Clips url with favicon (if favicon is recognized) */ clipUrl : function(options) { var currentOptions = this.initOptions(options); this._clipNotifier.showCopyNotification(document, currentOptions, true); var self = this; setTimeout(function() { var snippet = Evernote.contentPreviewer.getSnippetText(); if (snippet) { snippet = snippet.replace(/(<([^>]+)>)/ig,""); var content = Evernote.GlobalUtils.createUrlClipContent(PageContext.title, PageContext.url, PageContext.getFavIconUrl(), snippet); Evernote.Addin.clipNote(currentOptions.comments + content, currentOptions, PageContext.url, PageContext.getFavIconUrl(), true, document); }else { self._clipNotifier.clearWait(document, true); Evernote.ClearlyController.getClearlyArticleText( function (data) { snippet = data._html.replace(/(<([^>]+)>)/ig,""); var content = Evernote.GlobalUtils.createUrlClipContent(PageContext.title, PageContext.url, PageContext.getFavIconUrl(), snippet); Evernote.Addin.clipNote(currentOptions.comments + content, currentOptions, PageContext.url, PageContext.getFavIconUrl(), true, document); }); } }, 100); }, /** * Clips selection from the page. */ clipSelection : function( range, options ) { var currentOptions = this.initOptions(options); this._clipNotifier.showCopyNotification(document , currentOptions); var self = this; setTimeout(function() { var resultFunc = function(serializedDom) { self._clipNotifier.clearWait(document); if(serializedDom) { Evernote.Addin.clipNote(currentOptions.comments + serializedDom.content, currentOptions, PageContext.url, serializedDom.imageUrls, true, document); } }; self._serializer.serializeSelectionAsync( range, resultFunc ); }, 100); }, /** * Clips image from the page. */ clipImage : function(options ) { if (!options.imageElement) { Evernote.Logger.debug("clipImage Empty element"); return; } var currentOptions = this.initOptions(options); this._clipNotifier.showCopyNotification(document , currentOptions); var self = this; var clojureBug = Evernote.BrowserDetection.isIE7(); var CUSTOM_ID = 'evn-image-for-clip'; if (clojureBug) { // add attr to find this element later Evernote.JQuery(document).find(options.imageElement).attr( CUSTOM_ID ,'true'); } setTimeout(function() { var elementToSerialize = options.imageElement; if (clojureBug) { var elem = Evernote.JQuery('*['+ CUSTOM_ID +']'); elementToSerialize = Evernote.JQuery('*['+ CUSTOM_ID +']')[0]; elem.removeAttr(CUSTOM_ID); } Evernote.Logger.debug("Start clipping of image"); var resultFunc = function(serializedDom) { self._clipNotifier.clearWait(document); Evernote.Logger.debug("Image urls " + JSON.stringify(serializedDom.imageUrls)); Evernote.Logger.debug("Send clip to EN"); Evernote.Addin.clipNote(currentOptions.comments + serializedDom.content, currentOptions, PageContext.url, serializedDom.imageUrls, true, document); }; self._serializer.serializeAsync(elementToSerialize, false, resultFunc); }, 100); }, /** * Clips part of the page, defined in option (url, article or full page) or selection if presented. */ clipWithOptions : function(clipOptions) { function getNotebook() { return {uid : -1}; } var notebookToClipTo = getNotebook(); var alwaysTags = []; if (notebookToClipTo.type != Evernote.NotebookTypes.LINKED && Evernote.Options.tags.alwaysEnable == true) { alwaysTags = Evernote.Options.tags.alwaysData.split(','); } var options = { notebookUid: notebookToClipTo.uid, imageElement: EvernoteExternal.imageElement, tags: alwaysTags }; if(clipOptions.getClipAction() == Evernote.ClipperActions.CLIP_SELECTION && Evernote.Utils.hasSelection(window)) { Evernote.Clipper.clipSelection(null, options); } else if(clipOptions.getClipAction() == Evernote.ClipperActions.CLIP_URL) { Evernote.Clipper.clipUrl(options); } else if(clipOptions.getClipAction() == Evernote.ClipperActions.CLIP_FULL_PAGE) { Evernote.Clipper.clipFullPage(options); } else if(clipOptions.getClipAction() == Evernote.ClipperActions.CLIP_IMAGE) { Evernote.Clipper.clipImage(options); } else { Evernote.Logger.warn("Unknown option is specified : " + clipOptions.getClipAction()); } }, clipBase64Image : function(options, base64Image) { var self = this; var currentOptions = this.initOptions(options); this._clipNotifier.showCopyNotification(document , currentOptions); Evernote.Addin.clipImageAsync(options, function(result) { EvernoteGlobalReceiver(result); }, PageContext.url, base64Image); } };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.ClipOptions = function ClipOptions(data) { this.clipAction = data.clipAction; }; Evernote.ClipOptions.prototype.getClipAction = function() { return this.clipAction; };</script><script defer="" type="text/javascript" charset="ANSI">function ContentVeil() { var veil = document.createElement("div"); veil.id = "evernoteContentVeil"; var inner = document.createElement("div"); inner.id = "evernoteInnerBox"; var pageCounter = document.createElement("div"); pageCounter.id = "evernotePageCounter"; veil.appendChild(pageCounter); veil.appendChild(inner); var pageHeight = document.body.scrollHeight; // used for infinite scroll handling /* IE10 doesn't support pointer-events:none; So we had to replace existing veil with new one, combined of 8 divs. Four of them has border to outline content, and four divs in corners has white filling only. There is no any element in center, over the content, so nothing will catch mouse events. It helps other functions, especially html highlighter, works as expected. veil structure: veilNW | veilTop | veilNE veilLeft | | veilRight veilSW | veilBottom | veilSE */ var veilTop = document.createElement("div"); veilTop.id = "evernoteContentVeilTop"; var veilLeft = document.createElement("div"); veilLeft.id = "evernoteContentVeilLeft"; var veilRight = document.createElement("div"); veilRight.id = "evernoteContentVeilRight"; var veilBottom = document.createElement("div"); veilBottom.id = "evernoteContentVeilBottom"; var veilNW = document.createElement("div"); veilNW.id = "evernoteContentVeilNW"; var veilNE = document.createElement("div"); veilNE.id = "evernoteContentVeilNE"; var veilSE = document.createElement("div"); veilSE.id = "evernoteContentVeilSE"; var veilSW = document.createElement("div"); veilSW.id = "evernoteContentVeilSW"; var veilAll = Evernote.JQuery([veilTop,veilBottom,veilLeft,veilRight]); var veilCorners = Evernote.JQuery([veilNW,veilNE,veilSE,veilSW]); veilAll.addClass('EvConVeil'); veilCorners.addClass('EvConVeilCorn'); function fireClickUnderVeil(evt) { var veil = Evernote.JQuery(this); veil.hide(); var bottomElement = document.elementFromPoint(evt.clientX, evt.clientY); veil.show(); bottomElement.click(); } // make veil imperceptible for mouse clicks. veilAll.click(fireClickUnderVeil); veilCorners.click(fireClickUnderVeil); var tooltipTimeout; var topExpandContract; var bottomExpandContract; for (var i = 0; i < 2; i++) { var expand = document.createElement("div"); var contract = document.createElement("div"); expand.className = "evernoteArticleExpand"; contract.className = "evernoteArticleContract"; expand.setAttribute('tooltip', Evernote.Addin.getLocalizedMessage(Evernote.Messages.EXPAND)); expand.setAttribute('unselectable', 'on'); contract.setAttribute('tooltip',Evernote.Addin.getLocalizedMessage(Evernote.Messages.CONTRACT)); contract.setAttribute('unselectable','on'); expand.addEventListener("mousemove", nudgeMousemoveHandler); expand.addEventListener("mouseout", nudgeMouseoutHandler); contract.addEventListener("mousemove", nudgeMousemoveHandler); contract.addEventListener("mouseout", nudgeMouseoutHandler); expand.addEventListener("click", function() { Evernote.contentPreviewer.previewNudge('up'); }); contract.addEventListener("click", function() { Evernote.contentPreviewer.previewNudge('down'); }); if (i == 0) { topExpandContract = document.createElement("div"); topExpandContract.className = "evernoteExpandContract evernoteUsingExpandContract"; topExpandContract.appendChild(expand); topExpandContract.appendChild(contract); veilTop.appendChild(topExpandContract); } else { bottomExpandContract = document.createElement("div"); bottomExpandContract.id = "bottomExpandContract"; bottomExpandContract.className = "evernoteExpandContract"; bottomExpandContract.appendChild(expand); bottomExpandContract.appendChild(contract); veilBottom.appendChild(bottomExpandContract); } } function nudgeMousemoveHandler(evt) { clearTimeout(tooltipTimeout); tooltipTimeout = setTimeout(function() { evt.srcElement.className += " tooltipon"; }, 250); } function nudgeMouseoutHandler() { clearTimeout(tooltipTimeout); this.className = this.className.replace(/\s*tooltipon/g, ""); } // We keep a record of what we're currently showing (at least in some cases) so that we can update it in case the // state of the page changes (like if the user scrolls). var currentlyShownRect = null; var currentlyShownElt = null; var currentRectOffsetTop = 0; var currentRectOffsetLeft = 0; var currentlyStatic = false; var currentlyShadowBox = false; function reset(doNotResetPageCount) { currentlyShownRect = null; currentlyShownElt = null; currentRectOffsetTop = 0; currentRectOffsetLeft = 0; currentlyShadowBox = false; inner.className = inner.className.replace(/\s*evernoteShadowBox/g, ""); veil.className = inner.className.replace(/\s*evernoteShadowBox/g, ""); veilAll.removeClass('evernoteShadowBoxActi'); if (!doNotResetPageCount) { setPageCount(); } topExpandContract.className = topExpandContract.className.replace(/\s*evernoteUsingExpandContract/g, ""); bottomExpandContract.className = bottomExpandContract.className.replace(/s*evernoteUsingExpandContract/g, ""); showElements("embed"); showElements("object"); showElements("iframe"); blank(); } function blank() { veil.style.height = document.body.scrollHeight - 6 + "px"; veil.style.width = document.body.scrollWidth - 6 + "px"; veil.style.borderWidth = "0"; } function gray() { show(); inner.style.display = "none"; veil.style.backgroundColor = "rgba(255, 255, 255, 0.75)"; veilAll.each(function(){this.style.borderWidth = "0";}); veilAll.addClass('evernoteGrayFillingActi'); revealRectNew({ top:0, bottom:getPageHeight(), left:0, right:0, width:document.body.scrollWidth, height:getPageHeight() }); } function show() { inner.style.display = ""; veil.style.backgroundColor = ""; veilAll.each(function(){this.style.borderWidth = ""}); veilAll.removeClass('evernoteGrayFillingActi'); if (!Evernote.ElementExtension.hasParentNode(veil)) { document.body.appendChild(veil); veilAll.each(function(){document.body.appendChild(this)}); veilCorners.each(function(){document.body.appendChild(this)}); } } function hide() { if (Evernote.ElementExtension.hasParentNode(veil)) { veilAll.each(function(){this.parentNode.removeChild(this)}); veilCorners.each(function(){this.parentNode.removeChild(this)}); veil.parentNode.removeChild(veil); } } function isHidden() { if (Evernote.ElementExtension.hasParentNode(veil)) { return false; } return true; } // Makes a rectangle bigger in all directions by the number of pixels specified (or smaller, if 'amount' is // negative). Returns the new rectangle. function expandRect(rect, amount) { return { top: (rect.top - amount), left: (rect.left - amount), bottom: (rect.bottom + amount), right: (rect.right + amount), width: (rect.width + (2 * amount)), height: (rect.height + (2 * amount)) }; } function getPageHeight() { var h = Math.abs(window.innerHeight - document.body.scrollHeight) < 15 ? document.body.scrollHeight : Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); var wh = window.innerHeight; if ((wh - h) > 15) return wh; return h; } function revealRect(rect, elt, staticView, shadowBox) { // Save this info. currentlyShownRect = rect; currentlyShownElt = elt; currentRectOffsetTop = Evernote.Utils.scrollTop(); currentRectOffsetLeft = Evernote.Utils.scrollLeft(); currentlyStatic = staticView; currentlyShadowBox = shadowBox; // We expand the rectangle for two reasons. // 1) we want to expand it by the width of the stroke, so that when we draw out outline, it doesn't overlap our // content. // 2) We want to leave a little extra room around the content for aesthetic reasons. rect = expandRect(rect, 8); var x = rect.left; var y = rect.top; var width = rect.width; var height = rect.height; var veilWidth = veil.style.width.replace("px", ""); var veilHeight = veil.style.height.replace("px", ""); inner.className = inner.className.replace(/\s*evernoteShadowBox/g, ""); veil.className = inner.className.replace(/\s*evernoteShadowBox/g, ""); veilAll.removeClass('evernoteShadowBoxActi'); if (shadowBox) { veilAll.addClass('evernoteShadowBoxActi'); inner.className += " evernoteShadowBox"; veil.className += " evernoteShadowBox"; } inner.style.display = "block"; veil.style.borderLeftWidth = Math.max(x, 0) + "px"; veil.style.borderTopWidth = Math.max(y, 0) + "px"; veil.style.borderRightWidth = Math.max((veilWidth - x - width), 0) + "px"; veil.style.borderBottomWidth = Math.max((veilHeight - y - height), 0) + "px"; /*oh my gosh*/ var rectNew = { top:Math.max(y, 0), left:Math.max(x, 0), bottom:Math.max((veilHeight - y - height),0), right:Math.max((veilWidth - x - width),0), width:document.body.scrollWidth, height:getPageHeight() }; if (!shadowBox) { rectNew.width = rectNew.width - 4; rectNew.height = rectNew.height - 4; } else { rectNew.width = rectNew.width - 6; rectNew.height = rectNew.height - 6; } /* // debug part. function toFix(rect) { for (var prop in rect) { rect[prop] = rect[prop].toFixed(0); } return rect; } console.log('old ' + JSON.stringify(toFix(rect))); console.log('new ' + JSON.stringify(toFix(rectNew))); */ revealRectNew(rectNew); } function revealRectNew(rect) { veilLeft.style.height = rect.height - rect.bottom - rect.top + 2 + 'px'; veilLeft.style.width = rect.left + 'px'; veilLeft.style.top = rect.top -1 + 'px'; veilRight.style.height = rect.height - rect.bottom - rect.top + 2 + 'px'; veilRight.style.width = rect.right + 'px'; veilRight.style.top = rect.top - 1 + 'px'; veilRight.style.left = rect.width - rect.right + 'px'; veilTop.style.height = rect.top + 'px'; veilTop.style.left = rect.left + 'px'; veilTop.style.right = rect.right + 'px'; veilTop.style.width = rect.width - rect.right - rect.left + 'px'; veilBottom.style.height = rect.bottom + 'px'; veilBottom.style.width = rect.width - rect.right - rect.left + 'px'; veilBottom.style.left = rect.left + 'px'; veilBottom.style.right = rect.right + 'px'; veilBottom.style.top = rect.height - rect.bottom + 'px'; veilNW.style.height = Math.max(rect.top - 1, 0) + 'px'; veilNW.style.width = rect.left + 'px'; veilNE.style.height = Math.max(rect.top - 1, 0) + 'px'; veilNE.style.width = rect.right + 'px'; veilNE.style.left = rect.width - rect.right + 'px'; veilSW.style.height = Math.max(rect.bottom - 1, 0) + 'px'; veilSW.style.top = rect.height - rect.bottom + 1 + 'px'; veilSW.style.width = rect.left + 'px'; veilSE.style.height = Math.max(rect.bottom - 1, 0) + 'px'; veilSE.style.top = rect.height - rect.bottom + 1 + 'px'; veilSE.style.left = rect.width - rect.right + 'px'; veilSE.style.width = rect.right + 'px'; } function revealStaticRect(rect, elt, shadowBox) { revealRect(rect, elt, true, shadowBox); } function outlineElement(element, scrollTo, shadowBox, articleAdjustment) { // See notes in Preview.js for why we use this method instead of just calling element.getBoundingClientRect(). var rect = Evernote.contentPreviewer.computeDescendantBoundingBox(element); if (rect) { reset(articleAdjustment); revealRect(rect, element, true, shadowBox); if (scrollTo) { element.scrollIntoView(); } hideElements("embed", element); hideElements("object", element); hideElements("iframe", element); topExpandContract.className += " evernoteUsingExpandContract"; if (rect.height - 30 > window.innerHeight) { bottomExpandContract.className += " evernoteUsingExpandContract"; } else { bottomExpandContract.className = bottomExpandContract.className.replace(/\s*evernoteUsingExpandContract/g, ""); } show(); } else { Evernote.Logger.warn("Couldn't create rectangle from element: " + element.toString()); } } function hideAllActiveObjects() { hideElements("embed"); hideElements("object"); hideElements("iframe"); } function hideElements (tagName, exceptInElement) { var els = document.getElementsByTagName(tagName); for (var i = 0; i < els.length; i++) { els[i].enSavedVisibility = els[i].style.visibility; els[i].style.visibility = "hidden"; } showElements(tagName, exceptInElement); } function showElements (tagName, inElement) { if (!inElement) { inElement = document; } var els = inElement.getElementsByTagName(tagName); for (var i = 0; i < els.length; i++) { if (typeof els[i].enSavedVisibility !== "undefined") { els[i].style.visibility = els[i].enSavedVisibility; try { delete els[i].enSavedVisibility; } catch(e) { els[i].enSavedVisibility = undefined; } } } } function getElement() { return veil; } function setPageCount(count) { if (!count) { pageCounter.innerText = ""; } else if (count == 1) { //TODO: test l10n pageCounter.innerText = "oneMorePageFound"; } else { //TODO:test l10n pageCounter.innerText = "morePagesFound" + count; } pageCounter.scrollIntoView(true); } var onScrollHandle = function(e) { if (currentlyShownRect && !currentlyStatic) { var rect = { top: currentlyShownRect.top, bottom: currentlyShownRect.bottom, left: currentlyShownRect.left, right: currentlyShownRect.right, width: currentlyShownRect.width, height: currentlyShownRect.height }; var vert = Evernote.Utils.scrollTop() - currentRectOffsetTop; var horiz = Evernote.Utils.scrollLeft() - currentRectOffsetLeft; if (!vert && !horiz) { return; } rect.top -= vert; rect.bottom -= vert; rect.left -= horiz; rect.right -= horiz; blank(); revealRect(rect, currentlyShownElt); } if (pageHeight < document.body.scrollHeight - 30) { pageHeight = document.body.scrollHeight; onResizeHandle(); } }; var onResizeHandle = function(e) { if (currentlyShownElt) { var rect = Evernote.contentPreviewer.computeDescendantBoundingBox(currentlyShownElt); if (rect) { blank(); if (currentlyShadowBox) { revealRect(rect, currentlyShownElt, true, true); } else { revealRect(rect, currentlyShownElt, true, false); } } } // todo: switch gray filling to position:fixed. if (veilAll.hasClass('evernoteGrayFillingActi')) { gray(); } }; window.addEventListener("resize", onResizeHandle); window.addEventListener("scroll", onScrollHandle, false); // Public API: this.reset = reset; this.show = show; this.gray = gray; this.hide = hide; this.revealRect = revealRect; this.revealStaticRect = revealStaticRect; this.outlineElement = outlineElement; this.expandRect = expandRect; this.hideAllActiveObjects = hideAllActiveObjects; }</script><script defer="" type="text/javascript" charset="ANSI">/** * Created by chizhikov on 11.04.14. */ function ScreenshotVeil() { var areaEl = document.createElement('div'); areaEl.id = 'evernoteScreenShotArea'; var startX, startY = 0; var global_tools = Evernote.JQuery('#' + Constants.CLIP_DIALOG_ID); var area = Evernote.JQuery(areaEl); var selecting = false; var startVertLine = document.createElement('div'); var startHorizLine = document.createElement('div'); startVertLine.className = 'screenAreaStartVertLine'; startHorizLine.className = 'screenAreaStartHorizLine'; var borderDiv = document.createElement('div'); borderDiv.id = 'screenAreaSelected'; areaEl.appendChild(startVertLine); areaEl.appendChild(startHorizLine); areaEl.appendChild(borderDiv); function sendMessageToPopup( msg ){ // send message to global tools var zoomModifier = screen.deviceXDPI / screen.logicalXDPI; with (borderDiv.style) { var topX = pixelLeft * zoomModifier; var topY = pixelTop * zoomModifier; var bottomX = (area.width() - pixelRight) * zoomModifier; var bottomY = (area.height() - pixelBottom) * zoomModifier; } // If any side of the rectangle that user is drawing is smaller than 16px then we interpret it as a // single click and should make a fullscreen capture. var rectWidth = Math.abs(topX - bottomX); var rectHeight = Math.abs(topY - bottomY); if (rectWidth < 16 || rectHeight < 16) { topX = 0; topY = 0; bottomX = area.width(); bottomY = area.height(); } global_tools.trigger(msg ,[topX,topY , bottomX, bottomY]); } function drawLines(e) { startVertLine.style.pixelLeft = e.clientX; startHorizLine.style.pixelTop = e.clientY; if (selecting) { drawRect(startX, startY, e.clientX, e.clientY); // TODO: prevent selection } } function drawRect( startX, startY, mouseX, mouseY) { var topX, topY, bottomX, bottomY; topX = Math.min(startX, mouseX); topY = Math.min(startY, mouseY); bottomX = Math.max(startX, mouseX); bottomY = Math.max(startY, mouseY); borderDiv.style.pixelTop = topY; borderDiv.style.pixelLeft = topX; borderDiv.style.pixelRight = area.width() - bottomX - 1; borderDiv.style.pixelBottom = area.height() - bottomY -1; } function clearSelectedAreaPosition() { borderDiv.style.pixelRight = ''; borderDiv.style.pixelBottom = ''; borderDiv.style.pixelTop = ''; borderDiv.style.pixelLeft = ''; selecting = false; } function startSelectArea(e) { if (e.button != 0) return; if (Evernote.JQuery(e.target).closest('#' + Constants.CLIP_DIALOG_NEW_ID).length == 0) { selecting = true; startX = e.clientX; startY = e.clientY; } e.preventDefault(); } function selectionEnd(e) { if (!selecting) return; if (Evernote.JQuery(e.target).closest('#cancelButton').length == 0 && Evernote.JQuery(e.target).closest('#closeSidebar').length == 0 ) { sendMessageToPopup('readyToScreenshot'); } else { sendMessageToPopup('cancelScreenshot'); } hide(); clearSelectedAreaPosition(); } function disableContextMenu(e) { e.preventDefault(); return false; } function show() { document.addEventListener('mousemove', drawLines); document.addEventListener('mousedown', startSelectArea); document.addEventListener('mouseup', selectionEnd); document.addEventListener('contextmenu', disableContextMenu); // TODO: remove scroll from page area.addClass('visible'); Evernote.JQuery('body').css('overflow','hidden'); } function hide() { area.removeClass('visible'); clearSelectedAreaPosition(); document.removeEventListener('mousemove', drawLines); document.removeEventListener('mousedown', startSelectArea); document.removeEventListener('mouseup', selectionEnd); document.removeEventListener('contextmenu', disableContextMenu); Evernote.JQuery('body').css('overflow','visible'); } document.body.appendChild(areaEl); this.show = show; this.hide = hide; }</script><script defer="" type="text/javascript" charset="ANSI">function PageInfo() { var newPageCallback; // This is a map of hostnames (for hostnames that begin with 'www.', the 'www.' will be stripped off first, so don't // include it in your lookup string) to CSS selectors. When we try and locate an article in a page, we'll see if we // can find the doamin for the page in this list, and if so, we'll try and find an element that matches the given // selector. If no element is returned, we'll fall back to the heuristic approach. var specialCases = { "penny-arcade.com": "div.contentArea > div.comic > img", "aspicyperspective.com": "div.entry-content", "thewirecutter.com": "div#content", "katespade.com": "div#pdpMain", "threadless.com": "section.product_section", "yelp.com": "div#bizBox", "flickr.com": "div#photo", "instagr.am": "div.stage > div.stage-inner", "stackoverflow.com": "div#mainbar", "makeprojects.com": "div#guideMain", "cookpad.com": "div#main", "imgur.com": "div.image", "smittenkitchen.com": "div.entry", "allrecipes.com": "div#content-wrapper", "qwantz.com": "img.comic", "questionablecontent.net": "img#strip", "cad-comic.com": "div#content" } var useFoundImage = [ "xkcd.com" ] // These are the items we're trying to collect. This first block is trivial. var containsImages = Boolean(document.getElementsByTagName("img").length > 0); var documentWidth = document.width; var documentHeight = document.height; var documentMode = document.documentMode; var url = document.location.href; // Very slow and useless assignment, takes more than a second. Temporary commented for speed up [actimind] // var documentLength = document.body.textContent ? document.body.textContent.length : 0; // These take slightly more work and are initialized only when requested. var article = null; var cleanArticles = []; var articleBoundingClientRect = null; var selection = false; // This is easy to get, but is always "false" at load time until the user selects something. var selectionIsInFrame = false; var documentIsFrameset = false; var selectionFrameElement = null; var recommendationText = null; // Internal state variables to keep us duplicating work. var hasCheckedArticle = false; // Experimental recognition of 'image' pages (like photo sites and comics). function findImage() { var imgs = document.getElementsByTagName("img"); var biggest = null; var biggestArea = 0; for (var i = 0; i < imgs.length; i++) { var style = Evernote.ElementExtension.getComputedStyle(imgs[i]); var width = style.width.replace(/[^0-9.-]/g, ""); var height = style.height.replace(/[^0-9.-]/g, ""); var area = width * height; if (!biggest || area > biggestArea) { biggest = imgs[i]; biggestArea = area; } } return biggest; } function getAncestors(node) { var an = []; while (node) { an.unshift(node); node = node.parentNode; } return an; } function getDeepestCommonNode(nodeList1, nodeList2) { var current = null; for (var i = 0; i < nodeList1.length; i++) { if (nodeList1[i] === nodeList2[i]) { current = nodeList1[i]; } else { break; } } return current; } function getCommonAncestor(nodeList) { if (!nodeList.length) return null; if (nodeList.length == 1) return nodeList[0]; var lastList = getAncestors(nodeList[0]); var node = null; for (var i = 1; i < nodeList.length; i++) { var list = getAncestors(nodeList[i]); node = getDeepestCommonNode(lastList, list); lastList = getAncestors(node); } return node; } function clearlyCallback(data, callback) { Evernote.Logger.debug("Clearly callback invoked"); findImage(); // See if we should special-case this. var host = getHostname(); if (specialCases[host]) { var candidate = Evernote.ElementExtension.querySelector(specialCases[host]); if (candidate) { Evernote.Logger.debug("Found article in specialCases"); article = candidate; articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article); } } // Or see if it's a special case image page. else if (Evernote.ArrayExtension.indexOf(useFoundImage, host) != -1) { article = findImage(); if (article) { Evernote.Logger.debug("Found article in image"); articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article); } } // If it's not a special case, see if it's a single image. if (!article) { var imageTypes = ['jpeg', 'jpg', 'gif', 'png']; var urlExtension = document.location.href.replace(/^.*\.(\w+)$/, "$1"); if (urlExtension && (Evernote.ArrayExtension.indexOf(imageTypes, urlExtension) != -1)) { var candidate = Evernote.JQuery("body > img"); if (candidate.length > 0) { Evernote.Logger.debug("Found article in a single image"); article = candidate.get(0); articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article); } } } // If we still didn't find an article, let's see if maybe it's in a frame. Cleary fails on frames so we try this // check before we use our clearly info. if (!article) { if (document.body.nodeName.toLowerCase() == "frameset") { documentIsFrameset = true; var frame = findBiggestFrame(); if (frame && frame.contentDocument && frame.contentDocument.documentElement) { selectionFrameElement = frame; article = frame.contentDocument.documentElement; articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article); } } } // If we didn't use any of our special case handling, we'll use whatever clearly found. if (!article) { Evernote.Logger.debug("Use clearly find article"); if (data && data._elements && data._elements.length) { article = data._elements[0]; if (data._elements.length > 1) { // This will include *all* clearly elements (and whatever else in in between them). article = getCommonAncestor(data._elements); // This includes *just the last (and therefore most important)* element from the clearly detection. // article = data._elements[data._elements.length - 1]; } if (article.nodeType === ( window.Node ? window.Node.TEXT_NODE : 1)) { article = article.parentNode; } } } if(article) { if(Evernote.JQuery(article).closest("#evernote-content").length != 0) article = undefined; } // If clearly found nothing (because it failed), then use the body of the document. if (!article) { article = document.body; } hasCheckedArticle = true; callback(); } // This will try and determine the 'default' page article. It will only run once per page, but it's specifically // called only on demand as it can be expensive. function findArticle(callback) { function afterInject() { // If we'd previously computed an article element, but it's lost its parent or become invisible, then we'll try // and re-compute the article. This can happen if, for example the page dynamically udaptes itself (like showing // the latest news article in a box that updates periodically). This doesn't guarantee that we clip something // sane if this happens, (if the page re-writes itself while a clip is taking place, the results are // indeterminate), but it will make such things less likely. if (article && (!article.parentNode || !article.getBoundingClientRect || Evernote.ElementExtension.getBoundingClientRect(article).width == 0)) { article = null; hasCheckedArticle = false; } Evernote.Logger.debug("afterInject"); if (!hasCheckedArticle) { Evernote.Logger.debug("no article"); if (!window) { Evernote.Logger.warn("Couldn't find clearly!"); clearlyCallback(null, callback); } else { Evernote.Logger.debug("Call clearly to select article"); try { Evernote.ClearlyController.getContentElementAndHTML(function(data){clearlyCallback(data, callback)}); } catch(e) { Evernote.Logger.error("Failed to find article by clearly due to error " + e.message); clearlyCallback(null, callback); } } } // If the page is big enough, clearly is excruciatingly slow. We'll just get the whole page. // TODO: Clearly was updated. Check, if big pages are still problem else if (document.body.innerHTML.length > (1024 * 1024)) { Evernote.Logger.warn("Page over 1mb, skipping article detection."); clearlyCallback(null, callback); } else { Evernote.Logger.debug("callback"); callback(); } } afterInject(); } function findBiggestFrame() { var frames = document.getElementsByTagName("frame"); var candidate = null; var candidateSize = 0; for (var i = 0; i < frames.length; i++) { if (frames[i].width && frames[i].height) { var area = frames[i].width * frames[i].height; if (area > candidateSize) { candidate = frames[i]; candidateSize = area; } } } return candidate; } function getHostname() { var match = document.location.href.match(/^.*?:\/\/(www\.)?(.*?)(\/|$)/); if (match) { return match[2]; } return null; } function getDefaultArticle(callback) { Evernote.Logger.debug("getDefaultArticle"); findArticle(function(){callback(article)}); // Article already exists, so we'll return it. if (article) return article; } function getBiggestImage(callback) { getDefaultArticle(function(art) { var imgs; if (art) { imgs = art.querySelectorAll("img"); } else { imgs = document.querySelectorAll("img"); } var maxHeight = 0; var maxWidth = 0; var maxImage; for (var i = 0; i < imgs.length; i++) { var w = imgs.item(i).width; var h = imgs.item(i).height; if (w * h > maxWidth * maxHeight) { maxHeight = h; maxWidth = w; maxImage = imgs.item(i).src; } } callback({ src: maxImage, width: maxWidth, height: maxHeight }); }); } // Looks for selections in the current document and descendent (i)frames. // Returns the *first* non-empty selection. function getSelection() { // First we check our main window and return a selection if that has one. var selection = window.getSelection(); if (selection && selection.rangeCount && !selection.isCollapsed) { return selection; } // Then we'll try our frames and iframes. var docs = []; var iframes = document.getElementsByTagName("iframe"); for (var i = 0; i < iframes.length; i++) { docs.push(iframes[i]); } var frames = document.getElementsByTagName("frame"); for (var i = 0; i < frames.length; i++) { docs.push(frames[i]); } var urlBase = document.location.href.replace(/^(https?:\/\/.*?)\/.*/i, "$1").toLowerCase(); for (var i = 0; i < docs.length; i++) { // If frames/iframes fail a same origin policy check, then they'll through annoying errors, and we wont be able // to access them anyway, so we attempt to skip anything that wont match. if (docs[i].src && docs[i].src.toLowerCase().substr(0, urlBase.length) !== urlBase) { continue; } var doc = docs[i].contentDocument; if (doc) { var frameSelection = doc.getSelection(); if (frameSelection && frameSelection.rangeCount && !frameSelection.isCollapsed) { selectionIsInFrame = true; selectionFrameElement = docs[i]; return frameSelection; } } else { Evernote.Logger.warn("iframe contained no Document object."); } } // Didn't find anything. return null; } function getUrl() { return url; } function getText(node, soFar, maxLen) { if (node.nodeType == Evernote.Node.TEXT_NODE) { var trimmed = (node.textContent) ? Evernote.JQuery.trim(node.textContent).replace(/\s+/g, " ") : ""; if (trimmed === " " || trimmed === "") return soFar; return soFar + " " + trimmed; } var banned = [ "style", "script", "noscript" ]; if (node.nodeType == Evernote.Node.ELEMENT_NODE) { if (Evernote.ArrayExtension.indexOf(banned, node.nodeName.toLowerCase()) == -1) { for (var i = 0; i < node.childNodes.length; i++) { soFar = getText(node.childNodes[i], soFar, maxLen); if (soFar.length > maxLen) { return soFar; } } } } return soFar; } function getRecommendationText() { var text = ""; var MAX_LEN = 5000; var selection = getSelection(); if (selection) { var df = selection.getRangeAt(0).cloneContents(); var div = document.createElement("div"); div.appendChild(df); text = getText(div, "", MAX_LEN); } else if (article) { text = getText(article, "", MAX_LEN); } else { text = getText(document.body, "", MAX_LEN); } text = document.title + " " + text; return text; } // Note: you must call getSelection() first to populate this field! function getSelectionFrame() { return selectionFrameElement; } function checkClearly() { var clearlyDoc = Evernote.ElementExtension.querySelector("iframe#readable_iframe"); if (clearlyDoc) clearlyDoc = clearlyDoc.contentDocument; if (clearlyDoc) clearlyDoc = Evernote.ElementExtension.querySelector("body#body div#box", clearlyDoc); if (clearlyDoc) { article = clearlyDoc; articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article); } } // @TODO: This is fairly incomplete. function getFavIconUrl() { var links = document.getElementsByTagName("link"); var i; for (i = 0; i < links.length; i++) { if (links[i].rel) { var rels = links[i].rel.toLowerCase().split(/\s+/); if (Evernote.ArrayExtension.indexOf(rels, "icon") !== -1) { // Found it! return links[i].href; } } } return null; } function _getInfoRequestHandler(data, request, sender, sendResponse) { var isSelected = getSelection(); checkClearly(); var response = { containsImages: containsImages, documentWidth: documentWidth, documentHeight: documentHeight, url: url, selection: (isSelected !== null), selectionIsInFrame: selectionIsInFrame, documentLength: document.body.textContent.length, articleBoundingClientRect: articleBoundingClientRect, article: (article != null), recommendationText: getRecommendationText(), favIconUrl: getFavIconUrl(), documentIsFrameset: documentIsFrameset }; sendResponse(response); } function getInfoRequestHandler(request, sender, sendResponse) { findArticle(function(data){_getInfoRequestHandler(data, request, sender, respondWithInfo)}); } function getDocumentMode() { return documentMode; } function getCleanArticle(callback, _newPageCallback) { newPageCallback = _newPageCallback; findArticle(function() { callback(cleanArticles); }); } // Public API: this.getDefaultArticle = getDefaultArticle; this.getSelection = getSelection; this.getSelectionFrame = getSelectionFrame; this.getFavIconUrl = getFavIconUrl; //redesign this.getBiggestImage = getBiggestImage; this.getRecommendationText = getRecommendationText; this.getCleanArticle = getCleanArticle; this.getText = getText; this.getUrl = getUrl; this.getDocumentMode = getDocumentMode; }</script><script defer="" type="text/javascript" charset="ANSI">Evernote.Scroller = function Scroller( tab ) { this.initialize( tab ); }; Evernote.Scroller.prototype._tab = null; Evernote.Scroller.prototype.initialize = function ( tab ) { this._tab = tab; var scrollX = (this._tab.pageXOffset !== undefined) ? this._tab.pageXOffset : (this._tab.document.documentElement || this._tab.document.body.parentNode ||this._tab.document.body).scrollLeft; var scrollY = (this._tab.pageYOffset !== undefined) ? this._tab.pageYOffset : (this._tab.document.documentElement || this._tab.document.body.parentNode || this._tab.document.body).scrollTop; this.initialPoint = { x: scrollX, y: scrollY }; }; Evernote.Scroller.prototype.scrollTo = function ( endPoint, time, resolution ) { this.abort(); this.endPoint = endPoint; this.step = 0; this.calculatePath( time, resolution ); var self = this; this.proc = setInterval( function () { if ( !self.doScroll() ) { self.abort(); } }, resolution ); }; Evernote.Scroller.prototype.calculatePath = function ( time, resolution ) { this.path = []; var sx = this.initialPoint.x; var sy = this.initialPoint.y; var ex = this.endPoint.x; var ey = this.endPoint.y; var k = (Math.PI * resolution) / time; for ( var i = -(Math.PI / 2); i < (Math.PI / 2); i += k ) { var c = ((1 + Math.sin( i )) / 2); this.path.push( { x:(sx + c * (ex - sx)), y:(sy + c * (ey - sy)) } ); } }; Evernote.Scroller.prototype.doScroll = function () { var s = this.path[++this.step]; if ( !s ) { return false; } var view = this._tab.document.defaultView || this._tab; view.scrollTo( s.x, s.y ); return true; }; Evernote.Scroller.prototype.abort = function () { if ( this.proc ) { clearInterval( this.proc ); this.proc = null; } };</script><script defer="" type="text/javascript" charset="ANSI">function ContentPreview() { Evernote.Logger.debug("Start creating preview box"); var contentVeil = new ContentVeil(); var screenshotVeil = new ScreenshotVeil(); Evernote.Logger.debug("End creating preview box"); // Stores a reference to the last element that we used as a preview. var previewElement = null; var article = null; var snippet = null; function buildUrlElement() { var urlEl = document.createElement("div"); urlEl.id = "evernotePreviewContainer"; var className = "yui3-cssreset"; if(Evernote.Utils.isQuirkMode()) { className += " evernote-middle-fixed-position-quirks" } urlEl.className = className; return urlEl; } Evernote.Logger.debug("Build url element"); var urlElement = buildUrlElement(); function showUrlElement() { Evernote.Logger.debug("ContentPreview: showUrlElement start"); if (!Evernote.ElementExtension.hasParentNode(urlElement)) { document.documentElement.appendChild(urlElement); } // Make sure we're centered in the window. var elStyle = Evernote.ElementExtension.getComputedStyle(urlElement, ''); var w = parseInt(Evernote.StyleElementExtension.getPropertyValue(elStyle, "width")); var h = parseInt(Evernote.StyleElementExtension.getPropertyValue(elStyle, "height")); if (isNaN(w) || isNaN(h)) { // IE8 w = Evernote.JQuery(urlElement).width(); h = Evernote.JQuery(urlElement).height(); } if (w && h) { urlElement.style.marginLeft = (0 - w / 2) + "px"; urlElement.style.marginTop = (0 - h / 2) + "px"; } Evernote.Logger.debug("ContentPreview: showUrlElement end"); } function hideUrlElement() { if (Evernote.ElementExtension.hasParentNode(urlElement)) { urlElement.parentNode.removeChild(urlElement); } } function showScreenShotArea() { clear(); screenshotVeil.show(); } function showOverlay() { previewElement = null; clear(); contentVeil.reset(); contentVeil.hideAllActiveObjects(); contentVeil.gray(); } function previewUrl() { clear(); function buildContent ( data ) { var title = PageContext.title; var url = PageContext.url; var favIconUrl = PageContext.getFavIconUrl(); snippet = data.replace(/(<([^>]+)>)/ig,""); // remove html tags from text urlElement.innerHTML = Evernote.GlobalUtils.createUrlClipContent(title, url, favIconUrl, snippet); var element = Evernote.JQuery(urlElement); if(Evernote.Utils.isQuirkMode() && !element.hasClass("evernote-fixed-position-fix")) { element.addClass("evernote-fixed-position-fix"); } showUrlElement(); contentVeil.reset(); contentVeil.hideAllActiveObjects(); contentVeil.gray(); } Evernote.ClearlyController.getClearlyArticleText( function (data) { buildContent(data._html); }); } // This doesn't remove internal state of previewElement, because another script may not have finished clipping until // after the page looks 'clear'. function clear() { contentVeil.reset(); contentVeil.hide(); screenshotVeil.hide(); hideUrlElement(); } function _previewArticle () { Evernote.Logger.debug("Start previewing article element"); if (previewElement) { var selectionFrame; if (typeof Evernote.pageInfo !== undefined) { selectionFrame = Evernote.pageInfo.getSelectionFrame(); } Evernote.Logger.debug("Selection frame selected " + selectionFrame); if (selectionFrame) { var rect = { width: selectionFrame.width, height: selectionFrame.height, top: selectionFrame.offsetTop, bottom: (selectionFrame.height + selectionFrame.offsetTop), left: selectionFrame.offsetLeft, right: (selectionFrame.width + selectionFrame.offsetLeft) }; Evernote.Logger.debug("contentVeil.revealStaticRect " + rect); contentVeil.revealStaticRect(contentVeil.expandRect(rect, -9), selectionFrame, true); Evernote.Logger.debug("contentVeil.show "); contentVeil.show(); } else { // TODO: Scroll into article view. contentVeil.outlineElement(previewElement, false, true); window.scrollTo(0, previewElement.offsetTop - 30); } } else { Evernote.Logger.warn("Couldn't find a preview element. We should switch to 'full page' mode."); } } /** * Finds and preview article element. * If reloadArticle is specified and equals to true, then discard previously found article and re-start search of article again. * Otherwise use article found on previous call (if this is the first call then article will be searched anyway). * @param reloadArticle */ function previewArticle (reloadArticle) { clear(); previewElement = null; if(reloadArticle) { article = null; } Evernote.Logger.debug("Evernote.pageinfo " + Evernote.pageInfo); if (typeof Evernote.pageInfo !== undefined) { if(!article) { previewElement = Evernote.pageInfo.getDefaultArticle(function(el){ Evernote.Logger.debug("Article element " + el.nodeName); previewElement = el; article = el; Evernote.Logger.debug("Preview article "); _previewArticle(); }); article = previewElement; } else { previewElement = article; _previewArticle(); } } else { Evernote.Logger.warn("Couldn't find a 'pageInfo' object."); } } // When nudging the preview around the page, we want to skip nodes that aren't interesting. This includes empty // nodes, containers that have identical contents to the already selected node, invisible nodes, etc. // @TODO: There's a lot more we could probably add here. function looksInteresting(candidate, given) { if (!candidate) { Evernote.Logger.warn("Can't determine if 'null' is interesting (it's probably not)."); return false; } // This is the parent of our 'HTML' tag, but has no tag itself. There's no reason it's ever more interesting than // the HTML element. if (candidate === window.document) { return false; } //Disable clip of evernote main popup if(Evernote.JQuery(candidate).closest("#evernote-content").length != 0) { return false; } // Elements with neither text nor images are not interesting. if (!candidate.textContent && (candidate.getElementsByTagName("img").length === 0)) { return false; } // Elements with 0 area are not interesting. var rect = Evernote.ElementExtension.getBoundingClientRect(candidate); if (!rect.width || !rect.height) { return false; } // Invisible elements are not interesting. var style = Evernote.ElementExtension.getComputedStyle(candidate); if ((style.visibility === "hidden") || (style.display === "none")) { return false; } // If the nodes have a parent/child relationship, then they're only interesting if their visible contents differ. if (candidate.parentNode && given.parentNode) { if ((candidate.parentNode == given) || (given.parentNode == candidate)) { if ((candidate.textContent === given.textContent) && (candidate.getElementsByTagName("img").length === given.getElementsByTagName("img").length)) { return false; } } } return true; } // Returns the current article element, which may not be the same as the auto-detected one if the user has 'nudged' // the selection around the page. function getArticleElement() { return previewElement; } function nudgePreview(direction) { Evernote.Logger.debug("nudgePreview start"); if (!previewElement) { return; } var oldPreview = previewElement; Evernote.Logger.debug("nudgePreview: direction is " + direction); Evernote.Logger.debug("nudgePreview: previewElement is " + previewElement.nodeName); switch (direction) { case "up": var temp = previewElement.parentNode; while (temp) { if (looksInteresting(temp, previewElement)) { // If we move up and then down, we want to move back to where we started, not the first child. temp.enNudgeDescendToNode = previewElement; previewElement = temp; break; } temp = temp.parentNode; } break; case "down": Evernote.Logger.debug("nudgePreview: previewElement.enNudgeDescendToNode is " + previewElement.enNudgeDescendToNode); if (previewElement.enNudgeDescendToNode) { var temp = previewElement.enNudgeDescendToNode; // @TODO: make sure we clean these up somewhere else if we never reverse our nudging. try { delete previewElement.enNudgeDescendToNode; } catch(e) { previewElement.enNudgeDescendToNode = undefined; } previewElement = temp; } else { previewElement = descendTreeUntilUniqueElement(previewElement); } break; Evernote.Logger.debug("nudgePreview: previewElement.children.length = " + previewElement.children.length); for (var i = 0; i < previewElement.children.length; i++) { Evernote.Logger.debug("nudgePreview: checking child is " + previewElement.children[i].nodeName); if (looksInteresting(previewElement.children[i], previewElement)) { Evernote.Logger.debug("nudgePreview: found interesting child" + previewElement.children[i]); previewElement = previewElement.children[i]; break; } } break; case "left": var temp = previewElement.previousElementSibling; while (temp) { if (looksInteresting(temp, previewElement)) { previewElement = temp; break; } temp = temp.previousElementSibling; } break; case "right": var temp = previewElement.nextElementSibling; while (temp) { if (looksInteresting(temp, previewElement)) { previewElement = temp; break; } temp = temp.nextElementSibling; } break; default: Evernote.Logger.warn("Unhandled nudge direction: " + direction); } // Drawing is expensive so don't bother if nothing changed. if (oldPreview !== previewElement) { Evernote.Logger.debug("nudgePreview: draw new element."); function enoughSize(elem) { var el = Evernote.JQuery(elem); var w = el.width(); var h = el.height(); return (w > 30 && h > 15) } // if (enoughSize(previewElement) === false) return; contentVeil.outlineElement(previewElement, false, true, true); article = previewElement; // TODO: scroll into Element view here (probably, attach to Expand/Contract Container window.scrollTo(0, previewElement.offsetTop - 30); } } function sameElement(a, b) { var aRect = a.getBoundingClientRect(); var bRect = b.getBoundingClientRect(); if (aRect.bottom == bRect.bottom && aRect.height == bRect.height && aRect.left == bRect.left && aRect.right == bRect.right && aRect.top == bRect.top && aRect.width == bRect.width) { return false; } else if ((a.textContent === b.textContent) && (a.getElementsByTagName("img").length === b.getElementsByTagName("img").length)) { return false; } } function descendTreeUntilUniqueElement(parent) { for (var i = 0; i < parent.children.length; i++) { if (sameElement(parent.children[i], parent)) { return descendTreeUntilUniqueElement(parent.children[i]); } else if (looksInteresting(parent.children[i], parent)) { return parent.children[i]; } } return parent; } function previewFullPage() { var borderWidth = 4; var w = document.documentElement.scrollWidth; var h = document.documentElement.scrollHeight; var rect = { bottom: (h - borderWidth), top: (borderWidth), left: (borderWidth), right: (w - borderWidth), width: (w - (2 * borderWidth)), height: (h - (2 * borderWidth)) }; clear(); contentVeil.reset(); contentVeil.revealStaticRect(rect, document.body); contentVeil.show(); contentVeil.hideAllActiveObjects(); } // Creates the union of two rectangles, which is defined to be the smallest rectangle that contains both given // rectangles. function unionRectangles(rect1, rect2) { var rect = { top: (Math.min(rect1.top, rect2.top)), bottom: (Math.max(rect1.bottom, rect2.bottom)), left: (Math.min(rect1.left, rect2.left)), right: (Math.max(rect1.right, rect2.right)) } rect.width = rect.right - rect.left; rect.height = rect.bottom - rect.top; return rect; } // Returns true if the rectangles match, false otherwise. function rectanglesEqual(rect1, rect2) { if (!rect1 && !rect2) return true; if (!rect1) return false; if (!rect2) return false; if (rect1.top != rect2.top) return false; if (rect1.bottom != rect2.bottom) return false; if (rect1.left != rect2.left) return false; if (rect1.right != rect2.right) return false; if (rect1.width != rect2.width) return false; if (rect1.height != rect2.height) return false; return true; } // If the user triple-clicks a paragraph, we will often get a selection that includes the next paragraph after the // selected one, but only up to offset 0 in that paragraph. This causes the built in getBoundingClientRect to give a // box that includes the whole trailing paragraph, even though none of it is actually selected. Instead, we'll build // our own bounding rectangle that omits the trailing box. // @TODO: Currently this computes a box that is *too big* if you pass it a range that doesn't have start and/or end // offsets that are 0, because it will select the entire beginning and ending node, instead of jsut the selected // portion. function computeAlternateBoundingBox(range) { // If the end of selection isn't at offset 0 into an element node (rather than a text node), then we just return the // original matching rectangle. if ((range.endOffset !== 0) || (range.endContainer && range.endContainer.nodeType !== Evernote.Node.ELEMENT_NODE) || ( range.startContainer && range.startContainer && range.startContainer.getBoundingClientRect) || ( range.endContainer && range.endContainer.getBoundingClientRect) || ( range.commonAncestorContainer && range.commonAncestorContainer.getBoundingClientRect) ) { var rect = range.getBoundingClientRect(); if(rect.top == 0 && rect.bottom == 0 && rect.left == 0 && rect.right == 0) { if(range.commonAncestorContainer && range.commonAncestorContainer.getBoundingClientRect) { rect = range.commonAncestorContainer.getBoundingClientRect(); } else if(range.startContainer && range.startContainer.getBoundingClientRect) { rect = range.startContainer.getBoundingClientRect(); } else if(range.endContainer && range.endContainer.getBoundingClientRect) { rect = range.endContainer.getBoundingClientRect(); } } var mutableRect = { top: rect.top, bottom: rect.bottom, left: rect.left, right: rect.right, width: rect.width, height: rect.height }; return mutableRect; } // This is the one we don't want. var endElementRect = null; try { endElementRect = Evernote.ElementExtension.getBoundingClientRect(range.endContainer); } catch(ex) { Evernote.Logger.warn("Couldn't get a bounding client rect for our end element, maybe it's a text node."); } // We look for a rectangle matching our end element, and if we find it, we don't copy it to our list to keep. // You'd think we could just grab the last element in range.getClientRects() here and trim that one, which might be // true, but the spec makes no claim that these are returned in order, so I don't want to rely on that. // We keep track if we remove a rectangle, as we're only trying to remove one for the trailnig element. If there are // more than one matching rectangle, we want to keep all but one of them. var foundEnd = false; var keptRects = []; var initialRects = range.getClientRects(); for (var i = 0; i < initialRects.length; i++) { if (rectanglesEqual(endElementRect, initialRects[i]) && !foundEnd) { foundEnd = true; } else { keptRects.push(initialRects[i]); } } // Now compute our new bounding box and return that. if (keptRects.length == 0) return Evernote.ElementExtension.getBoundingClientRect(range); if (keptRects.length == 1) return keptRects[0]; var rect = keptRects[0]; for (var i = 1; i < keptRects.length; i++) { rect = unionRectangles(rect, keptRects[i]); } return rect; } // If every edge of the rectangle is in negative space, function rectIsOnScreen(rect) { // rtl pages have actual content in "negative" space. This case could be handled better. if (document.dir == "rtl") { return false; } // If both top and bottom are in negative space, we can't see this. if (rect.bottom < 0 && rect.top < 0) { return false; } // Or, if both left and right are in negative space, we can't see this. if (rect.left < 0 && rect.right < 0) { return false; } // Probably visible. return true; } function applyElementRect(element, rect) { var newRect = rect; var tempRect = Evernote.ElementExtension.getBoundingClientRect(element); tempRect = { bottom: tempRect.bottom + window.pageYOffset, height: tempRect.height, left: tempRect.left + window.pageXOffset, right: tempRect.right + window.pageXOffset, top: tempRect.top + window.pageYOffset, width: tempRect.width }; // Skip elements that are positioned off screen. if (!rectIsOnScreen(tempRect)) { return newRect; } var cs = getComputedStyle(element); // We won't descend into hidden elements. if (cs.display == "none") { return newRect; } // don't union a big rectangle that has hidden overflow if (cs.overflowX == "hidden" || cs.overflowY == "hidden") { return newRect; } // We skip anything with an area of one px or less. This is anything that has "display: none", or single pixel // images for loading ads and analytics and stuff. Most hidden items end up at 0:0 and will stretch our rectangle // to the top left corner of the screen if we include them. Sometimes single pixels are deliberately placed off // screen. if ((tempRect.width * tempRect.height) > 1) { newRect = unionRectangles(tempRect, rect); } if (element.children) { for (var i = 0; i < element.children.length; i++) { newRect = applyElementRect(element.children[i], newRect); } } return newRect; } // In the case of positioned elements, a bounding box around an element doesn't necessarily contain its child // elements, so we have this method to combine all of these into one bigger box. ContentVeil calls this function. function computeDescendantBoundingBox(element) { if (!element) return {top: 0, bottom: 0, left: 0, right: 0, width: 0, height: 0}; var rect = element.getBoundingClientRect(); var li = rect.top + window.pageYOffset return applyElementRect(element, { bottom: rect.bottom + window.pageYOffset, height: rect.height, left: rect.left + window.pageXOffset, right: rect.right + window.pageXOffset, top: rect.top + window.pageYOffset, width: rect.width }); } function previewSelection(sel) { var selection; var selectionFrame; if(sel) { selection = sel; } else if (typeof Evernote.pageInfo !== undefined) { selection = Evernote.pageInfo.getSelection(); // If our selection is in a frame or iframe, we'll compute an offset relative to that, so we need to adjust it by // the offset of the frame. selectionFrame = Evernote.pageInfo.getSelectionFrame(); } contentVeil.reset(); var frameRect = null; if (selectionFrame) { frameRect = Evernote.ElementExtension.getBoundingClientRect(selectionFrame); } var range, rect, i; // If !selection, then something has gone awry. if (selection) { clear(); contentVeil.reset(); // We attempt to highlight each selection, but this hasn't been tested for more than a single selection. for (i = 0; i < Evernote.Utils.Selection.getRangeCount(selection); i++) { range = Evernote.Utils.Selection.getRangeAt(selection, i); rect = computeAlternateBoundingBox(range); rect.top += document.documentElement.scrollTop; rect.bottom += document.documentElement.scrollTop; rect.left += document.documentElement.scrollLeft; rect.right += document.documentElement.scrollLeft; // Actual adjustment mentioned earlier regarding frames. if (frameRect) { rect.left += frameRect.left; rect.right += frameRect.left; rect.top += frameRect.top; rect.bottom += frameRect.top; } contentVeil.revealStaticRect(rect, selectionFrame, false); contentVeil.show(); } } contentVeil.show(); contentVeil.hideAllActiveObjects(); } function getSnippetText() { return snippet; } // Public API: this.getArticleElement = getArticleElement; this.looksInteresting = looksInteresting; this.computeDescendantBoundingBox = computeDescendantBoundingBox; this.previewArticle = previewArticle; this.previewFullPage = previewFullPage; this.previewSelection = previewSelection; this.previewUrl = previewUrl; this.clear = clear; this.previewNudge = nudgePreview; this.showOverlay = showOverlay; this.getSnippetText = getSnippetText; this.showScreenShotArea = showScreenShotArea; }</script><script defer="" type="text/javascript" charset="ANSI">Evernote.ElementExtension = { querySelector : function(selector, doc) { if(!doc) { doc = document; } if(doc.querySelector) { return doc.querySelector(selector); } else { var head = doc.documentElement.firstChild; var styleTag = doc.createElement("STYLE"); head.appendChild(styleTag); doc.__qsResult = []; styleTag.styleSheet.cssText = selector + "{x:expression_(document.__qsResult.push(this))}"; window.scrollBy(0, 0); head.removeChild(styleTag); var result = []; for (var i in doc.__qsResult) result.push(doc.__qsResult[i]); return result; } }, getComputedStyle : function(element, pseudoElement, win) { var pseudo = pseudoElement; var target = win; if(!target) target = window; if(!pseudo) { pseudo = null; } if(target.getComputedStyle) return target.getComputedStyle(element, pseudo); if(element.currentStyle) { try { var fixedElement = Evernote.Utils.cloneObject(element.currentStyle); fixedElement['fontSize'] = Evernote.Utils.getIEComputedStyle(element, 'fontSize'); return fixedElement; } catch (err) { return element.currentStyle; } } return null; }, hasParentNode : function(element) { return element.parentNode && element.parentNode.nodeType != 9 && element.parentNode.nodeType != 11; }, getBoundingClientRect : function(element) { if(element && element.getBoundingClientRect) { var rect = element.getBoundingClientRect(); var width = rect.width || element.offsetWidth || element.boundingWidth; var height = rect.height || element.offsetHeight || element.boundingHeight; return { left : rect.left, right : rect.right, top : rect.top, bottom : rect.bottom, width : width, height : height } } return null; }, hasAttribute : function(node, attrName) { if(node) { if(node.hasAttribute) { return node.hasAttribute(attrName); } if(node.attributes) { var attrValue = node.attributes[attrName]; return typeof attrValue != typeof undefined; } } } };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.ArrayExtension = { indexOf : function(element, searchStr) { if(!element) { return -1; } if (element.indexOf) return element.indexOf(searchStr); for(var i = 0; i < element.length; i++) { if(element[i] == searchStr) return i; } return -1; }, containsCaseIgnore : function(element, searchStr) { if(!element) { return false; } for(var i = 0; i < element.length; i++) { if(element[i].toLowerCase() == searchStr.toLowerCase()) return true; } return false; }, remove : function(arr, element) { var elementPosition = Evernote.ArrayExtension.indexOf(arr, element); if(elementPosition != -1) { var rest = arr.slice(elementPosition + 1 || arr.length); arr.length = elementPosition; return arr.push.apply(arr, rest); } }, filter : function(arr, fun) { var len = arr.length >>> 0; if (typeof fun != "function") throw new TypeError(); var res = []; var thisp = arguments[1]; for (var i = 0; i < len; i++) { if (i in arr) { var val = arr[i]; if (fun.call(thisp, val, i, arr)) { res.push(val); } } } return res; } }; </script><script defer="" type="text/javascript" charset="ANSI">Evernote.StyleElementExtension = { getPropertyValue : function(styleObj, propertyName) { var props = propertyName; if(!(props instanceof Array)) { props = [propertyName]; } Evernote.Logger.debug("Evernote.StyleElementExtension.getPropertyValue: number of properties to check " + props.length); for(var i = 0; i < props.length; i++) { var propName = props[i]; Evernote.Logger.debug("Evernote.StyleElementExtension.getPropertyValue: property name is " + propName); var val; if(styleObj.getPropertyValue) { val = styleObj.getPropertyValue(propName); Evernote.Logger.debug("Evernote.StyleElementExtension.getPropertyValue: value from getPropertyValue is " + val); if(val) return val; } val = styleObj[propName]; Evernote.Logger.debug("Evernote.StyleElementExtension.getPropertyValue: value from styleObj " + val); if(val) return val; } } }; </script><script defer="" type="text/javascript" charset="ANSI">Evernote.GlobalUtils = {}; (function(){ var urlMatcher = /^(.*?):\/\/((www\.)?(.*?))(:\d+)?(\/.*?)(\?.*)?$/; var BAD_FAV_ICON_URLS = {"http://localhost/favicon.ico": true}; Evernote.GlobalUtils.componentizeUrl = function(url) { var data = { protocol: null, domain: null, domainNoWww: null, port: null, path: null, queryString: null }; var matches = urlMatcher.exec(url); data.protocol = matches[1]; data.domain = matches[2]; data.domainNoWww = matches[4]; data.port = matches[5]; data.path = matches[6]; data.queryString = matches[7]; return data; }; Evernote.GlobalUtils.getMessageCode = function(messageConst) { Evernote.Logger.debug("getMessageCode: " + messageConst); return Evernote.Messages[messageConst]; }; Evernote.GlobalUtils.absolutizeImages = function(element, path) { if(path) { Evernote.Utils.changeBackgroundImage(element, Evernote.Addin.getPath("resources") + path); } else if(element.attributes && element.attributes["background-image"]) { // TODO: replace "oldlipper" with universal path Evernote.Utils.changeBackgroundImage(element, Evernote.Addin.getPath("resources") + 'oldclipper/' + element.attributes["background-image"].value); } Evernote.Logger.debug("absolutizeImages: walk through children"); for (var i = 0; i < element.children.length; i++) { Evernote.GlobalUtils.absolutizeImages(element.children[i]); } Evernote.Logger.debug("absolutizeImages: end"); }; Evernote.GlobalUtils.localize = function(element) { var node = element.nodeName.toLowerCase(); if (node == "input" || node == "textarea") { var type = element.type; if (node == "textarea") type = "textarea"; switch (element.type) { case "text": case "textarea": case "button": case "submit": case "search": if (element.attributes && element.attributes["placeholder"]) { var localizedMessage = Evernote.Addin.getLocalizedMessage(Evernote.GlobalUtils.getMessageCode(element.attributes["placeholder"].value)); Evernote.Logger.debug("localizedMessage is " + localizedMessage); if (localizedMessage) { try { element.attributes["placeholder"].value = localizedMessage; } catch(e) { var placeHolderAttr = document.createAttribute("placeholder"); placeHolderAttr.nodeValue = localizedMessage; element.setAttribute("placeholder", localizedMessage); } } } if (element.attributes && element.attributes["message"]) { var localizedMessage = Evernote.Addin.getLocalizedMessage(Evernote.GlobalUtils.getMessageCode(element.attributes["message"].value)); Evernote.Logger.debug("localizedMessage is " + localizedMessage); if (localizedMessage) { element.value = localizedMessage; } } break; // unlocalizable. case "checkbox": case "password": case "hidden": case "radio": break; default: throw new Error("We need to localize the value of input elements."); } } else if (element.attributes && element.attributes["message"]) { var localizedMessage = Evernote.Addin.getLocalizedMessage(Evernote.GlobalUtils.getMessageCode(element.attributes["message"].value)); if (localizedMessage) { element.innerHTML = localizedMessage; } else { element.innerHTML = 'l10n error'; // to spot if something goes wrong } } if (element.title){ var localizedTitle = Evernote.Addin.getLocalizedMessage(Evernote.GlobalUtils.getMessageCode(element.title)); if (localizedTitle) { element.title = localizedTitle; } } for (var i = 0; i < element.children.length; i++) { Evernote.GlobalUtils.localize(element.children[i]); } }; Evernote.GlobalUtils.getQueryParams = function(url) { var data = Evernote.GlobalUtils.componentizeUrl(url); var queryString = data.queryString; var params = {}; if (!queryString) { return params; }; queryString = queryString.substr(1); // Don't want the question mark. queryString = queryString.split("#")[0]; // Get rid of any fragment identifier. var pairs = queryString.split("&"); var i; for (i = 0; i < pairs.length; i++) { var item = pairs[i].split("="); if (item[1]) { item[1] = item[1].replace(/\+/g, " "); } params[item[0].toLowerCase()] = item[1]; } return params; }; Evernote.GlobalUtils.escapeXML = function(str) { var map = { "&" : "&", "<" : "<", ">" : ">", "\"" : """, "'" : "'" }; var a = str.split(""); for (var i = 0; i < a.length; i++) { if (map[a[i]]) { a[i] = map[a[i]]; } } return a.join(""); }; Evernote.GlobalUtils.decodeXML = function(str) { str = str.replace(/&apos;/g, "'"); str = str.replace(/&quot;/g, """); str = str.replace(/&lt;/g, "<"); str = str.replace(/&gt;/g, ">"); return str; }; Evernote.GlobalUtils.cropImage = function( data ) { var img = new Image; img.onload = function(){ var canvas=document.createElement("canvas"); canvas.width=Math.min(150,data.width); canvas.height=Math.min(150,data.height); canvas.getContext("2d").drawImage(img ,Math.max(0,(data.width-150)/2),Math.max(0,(data.height-150)/2),canvas.width,canvas.height,0,0,canvas.width,canvas.height); return canvas.toDataURL(); // Not working. Cross origin policy forbids toDataUrl() method. }; img.src = data.src; }; Evernote.GlobalUtils.createUrlClipContent = function(title, url, favIcoUrl, snippet) { var titleAttr = (title) ? Evernote.GlobalUtils.escapeXML(title) : ""; var urlStr = Evernote.GlobalUtils.escapeXML(url); var snip = snippet; if (snip.length > 275) { snip = snip.substr(0, 275-3) + '...'; } snip = Evernote.GlobalUtils.escapeXML(snip); var contentStyle = 'text-align:left;padding:15px;font-size:12px;font-family:Verdana;max-width:370px;color:black;background-color:white;box-sizing:content-box;display:block;background-repeat:no-repeat;'; var titleStyle = 'white-space:nowrap;font-size:14px;font-weight:bold;overflow-x:hidden;text-overflow:ellipsis;height:24px;'; var hrStyle = 'border-top-width:1px;border-top-style:solid;border-top-color:#d8d8d8;height:0;width:100%;'; var imgStyle = 'position:relative;display:inline-block;float:left;width:150px;height:150px;margin:15px 30px 0 0;overflow:hidden;'; var contStyle = 'display:inline-block;vertical-align:top;margin:15px 0 0;width:364px;'; var linkDivStyle = 'padding:0px 0px 11px 0px;'; var faviconStyle = 'float:left;width:16px; height:16px; margin-right:9px; background-size:16px 16px;background-repeat: no-repeat; background-position:left center;'; var linkStyle = 'display:inline-block;text-decoration:none;line-height:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:rgb(12, 12, 12);width:325px;'; var snipStyle ='word-wrap:break-word;line-height:normal;text-align:left;font-size:12px'; var imgDiv = ''; var titleDiv = '
    ' + titleAttr + '
    '; var hrDiv = '
     
    '; Evernote.pageInfo.getBiggestImage(function(data) { if (data && data.src) { var im = ''; imgDiv = '
    ' + im + '
    '; contentStyle = contentStyle.replace('max-width:370px','max-width:562px'); } }); var link = '' + urlStr + ''; var favicon = '
     
    '; var linkDiv = '
    ' + favicon + link + '
    ' ; var snipDiv = '
    ' + snip + '
    '; var contDiv = '
    ' + linkDiv + snipDiv + '
    '; var clearDiv = '
    ' var content = '
    ' + titleDiv + hrDiv + imgDiv + contDiv + clearDiv + '
    '; return content; }; Evernote.GlobalUtils.executeOnDomReady = function(callback) { Evernote.JQuery(document).ready(function() { callback(); }); }; Evernote.GlobalUtils.isDocumentLoaded = function(doc) { return doc.readyState == "complete" || doc.readyState == "interactive"; }; })(); </script><script defer="" type="text/javascript" charset="ANSI">/** * Global utilities. */ Evernote.Utils = { _prevTime : null, getIEComputedStyle : function(elem, prop) { //Dean Edwards method. See first comment here: http://bit.ly/cMSs9R var value = elem.currentStyle[prop] || 0; var leftCopy = elem.style.left; var runtimeLeftCopy = elem.runtimeStyle.left; elem.runtimeStyle.left = elem.currentStyle.left; elem.style.left = (prop === "fontSize") ? "1em" : value; value = elem.style.pixelLeft + "px"; elem.style.left = leftCopy; elem.runtimeStyle.left = runtimeLeftCopy; return value }, sendMessageToPopup : function( message ){ Evernote.JQuery("#" + Constants.CLIP_DIALOG_ID).trigger(message); }, pushTimeWithPrefix : function(prefix) { var time = new Date; var passed; time = time.getTime(); passed = time - this._prevTime; this._prevTime = time; console.log(prefix + ': ' + passed + 'ms'); }, cloneObject : function(obj){ if(obj == null || typeof(obj) != 'object') return obj; if(obj.constructor == Array) return [].concat(obj); var temp = {}; for(var key in obj) temp[key] = this.cloneObject(obj[key]); return temp; }, saveSelection : function(win) { Evernote.Logger.debug( "Utils.SaveSelection()" ); var selectionFinder = new Evernote.SelectionFinder(win.document); selectionFinder.find( true ); if(selectionFinder.hasSelection()) { return Evernote.Utils.cloneRange(selectionFinder.getRange()); } return null; }, clearSelection : function(doc) { if(doc.getSelection) { doc.getSelection().removeAllRanges(); } }, /** * Make selection of passed range in document. * @param doc - DOM object * @param range - selection range */ selectRange : function(doc, range) { if(doc.getSelection) { doc.getSelection().addRange(range); } else if (doc.selection && range) { range.select(); } }, /** * Creates copy of selection range only if it supports it, otherwise returns same range * @param range - Range object * @return {Range} */ cloneRange : function(range) { Evernote.Logger.debug("cloneRange: start"); if(range && range.cloneRange) { return range.cloneRange(); } if(range.duplicate) { Evernote.Logger.debug("cloneRange: result = " + range.duplicate()); return range.duplicate(); } return range; }, /** * Checks whether selection is presented. * @param win - window object that should be checked. * @return true - if selection is presented, false otherwise. */ hasSelection : function(win) { Evernote.Logger.debug( "Utils.hasSelection()" ); var selectionFinder = new Evernote.SelectionFinder(win.document) if ( selectionFinder.hasSelection() ) { return true; } else { selectionFinder.find( true ); return selectionFinder.hasSelection(); } }, /** * Gets favicon url from the document (if any) * @param doc - document to inspect. * @return url to the favicon or null. */ getFavIconUrl : function(doc) { var links = doc.getElementsByTagName("link"); var i; for (i = 0; i < links.length; i++) { if (links[i].rel) { var rels = links[i].rel.toLowerCase().split(/\s+/); if (Evernote.ArrayExtension.indexOf(rels, "icon") !== -1) { // Found it! return links[i].href; } } } return null; }, /** * If passed string length is more than length argument, than string is trimmed to length and dots are added * (total length of the returned string does not exceed specified length). * @param str - string to trim * @param length - max number of characters in the string * @param addition - text to be added to truncated string * @return {*} */ cutToLength : function(str, length, addition) { if(!addition) { addition = "..."; } if(str.length > length) { return (str.substring(0, length-3) + addition); } return str; }, /** * Change new line symbol to html
    */ newLineToBr : function(str) { return str.replace(/(\r\n|\n|\r)/gm, "
    "); }, /** * Encodes html specific characters (<, >, &, etc.) in specified string * @param str - string to encode. * @return new string with encoded characters. */ htmlEncode : function( str ) { var result = ""; for ( var i = 0; i < str.length; i++ ) { var charcode = str.charCodeAt( i ); var aChar = str[ i ]; if(!aChar) { aChar = str.charAt(i); } if(charcode >= 55296 ) result += aChar; else if ( charcode > 0x7f ) { result += "" + charcode + ";"; } else if ( aChar == '>' ) { result += ">"; } else if ( aChar == '<' ) { result += "<"; } else if ( aChar == '&' ) { result += "&"; } else { result += str[ i ] ? str[ i ] : str.charAt(i); } } return result; }, /** * Absolutize specified url by specified base. * @param base - base url * @param href - relative url (from base) */ makeAbsolutePath : function ( base, href ) { function parseURI( url ) { var m = String( url ).replace( /^\s+|\s+$/g, '' ).match( /^([^:\/?#]+:)?(\/\/(?:[^:@]*(?::[^:@]*)?@)?(([^:\/?#]*)(?::(\d*))?))?([^?#]*)(\?[^#]*)?(#[\s\S]*)?/ ); // authority = '//' + user + ':' + pass '@' + hostname + ':' port return (m ? { href : m[ 0 ] || '', protocol : m[ 1 ] || '', authority : m[ 2 ] || '', host : m[ 3 ] || '', hostname : m[ 4 ] || '', port : m[ 5 ] || '', pathname : m[ 6 ] || '', search : m[ 7 ] || '', hash : m[ 8 ] || '' } : null); } function absolutizeURI( base, href ) {// RFC 3986 function removeDotSegments( input ) { var output = []; input.replace( /^(\.\.?(\/|$))+/, '' ) .replace( /\/(\.(\/|$))+/g, '/' ) .replace( /\/\.\.$/, '/../' ) .replace( /\/?[^\/]*/g, function ( p ) { if ( p === '/..' ) { output.pop(); } else { output.push( p ); } } ); return output.join( '' ).replace( /^\//, input.charAt( 0 ) === '/' ? '/' : '' ); } href = parseURI( href || '' ); base = parseURI( base || '' ); return !href || !base ? null : (href.protocol || base.protocol) + (href.protocol || href.authority ? href.authority : base.authority) + removeDotSegments( href.protocol || href.authority || href.pathname.charAt( 0 ) === '/' ? href.pathname : (href.pathname ? ((base.authority && !base.pathname ? '/' : '') + base.pathname.slice( 0, base.pathname.lastIndexOf( '/' ) + 1 ) + href.pathname) : base.pathname) ) + (href.protocol || href.authority || href.pathname ? href.search : (href.search || base.search)) + href.hash; } return absolutizeURI( base, href ); }, getNestedDocuments : function( doc ) { Evernote.Logger.debug( "Utils.getNestedDocuments()" ); var docs = [ ]; try { var frames = ( doc ) ? doc.getElementsByTagName( "frame" ) : [ ]; for ( var i = 0; i < frames.length; ++i ) { if ( frames[ i ].contentDocument ) { docs.push( frames[ i ].contentDocument ); } } var iframes = ( doc ) ? doc.getElementsByTagName( "iframe" ) : [ ]; for ( i = 0; i < iframes.length; ++i ) { if ( iframes[ i ].contentDocument ) { docs.push( iframes[ i ].contentDocument ); } } } catch (e) { Evernote.Logger.error("getNestedDocuments failed with error " + e); } Evernote.Logger.debug( "Utils.getNestedDocuments() end" ); return docs; }, isSupportedUrl : function(url) { return url.indexOf("http") == 0; }, getFontSizeInPixels : function(elementFontSize) { function computedStyle(element, property){ var s = false; if(window.getComputedStyle){ s = window.getComputedStyle(element, null).getPropertyValue(property); } else if(element.currentStyle){ var p = property.split('-'); var str = new String(''); for(var i = 0; i < p.length; i++){ str += (i > 0)?(p[i].substr(0, 1).toUpperCase() + p[i].substr(1)):p[i]; } s = element.currentStyle[str]; } return s; } function getPercentageSize(size) { var currentFontSize = parseFloat(size); var htmlFontSize = 16; var htmlElement = document.getElementsByTagName("html"); if(htmlElement && htmlElement.length > 0) { var htmlComputedFontSize = computedStyle(htmlElement[0], "font-size"); if(htmlComputedFontSize && htmlComputedFontSize.indexOf("%") == -1) { htmlFontSize = Evernote.Utils.getFontSizeInPixels(htmlComputedFontSize); } } return htmlFontSize * currentFontSize / 100; } var size = elementFontSize; if(size.indexOf("em") > -1) { var defFont = computedStyle(document.body, "font-size"); if(defFont.indexOf("pt") > -1){ defFont = Math.round(parseInt(defFont)*96/72); } else if(defFont.indexOf("%") > -1) { defFont = getPercentageSize(defFont); } else{ defFont = parseInt(defFont); } size = Math.round(defFont * parseFloat(size)); } else if(size.indexOf("pt") > -1){ size = Math.round(parseInt(size)*96/72) } else if(size.indexOf("%") > -1) { size = getPercentageSize(size); } return parseInt(size); }, innerWidth : function() { if(window.innerWidth) return window.innerWidth; var doc= (document.body.clientWidth)? document.body: document.documentElement; return doc.clientWidth; }, innerHeight : function() { if(window.innerHeight) return window.innerHeight; var doc= (document.body.clientHeight)? document.body: document.documentElement; return doc.clientHeight; }, scrollTop : function() { var doc = document.body.scrollTop ? document.body : document.documentElement; return doc.scrollTop; }, scrollLeft : function() { var doc = document.body.scrollLeft ? document.body : document.documentElement; return doc.scrollLeft; }, /** * Stopped propagation of keydown events for passed selector. * @param selector - could be element or jquery selector. */ hardInput : function(selector) { this.elem = Evernote.JQuery(selector); this.elem.keydown(function(e) { e.stopPropagation(); }); }, isQuirkMode : function() { return document.compatMode == "BackCompat" && !Evernote.BrowserDetection.isIE11(); }, isQuirkModeNew : function() { return document.compatMode == "BackCompat" && Evernote.BrowserDetection.isLessThanIE9(); }, isInstanceOf : function(obj, type) { if(obj && type) { try { return obj instanceof type; } catch (e) { return type.toString().indexOf(typeof obj) != -1; } } return false; }, changeBackgroundImage : function(element, localpath) { if(element.style) { element.style.backgroundImage = "url('file:///" + localpath.replace(/\\/g, "/").replace(/\s/g, "%20") + "')"; } }, format: function(str) { var args = arguments; return str.replace(/\{(\d+)\}/g, function (m, n) { return args[(n | 0)+1]; }); }, fixIERangeObject : function(range,win) { //Only for IE8 and below. win=win || window; if(!range) return null; if(!range.startContainer && win.document.selection) { //IE8 and below var _findTextNode=function(parentElement,text) { //Iterate through all the child text nodes and check for matches //As we go through each text node keep removing the text value (substring) from the beginning of the text variable. var container=null,offset=-1; for(var node=parentElement.firstChild; node; node=node.nextSibling) { if(node.nodeType==3) {//Text node var find=node.nodeValue; var pos=text.indexOf(find); if(pos==0 && text!=find) { //text==find is a special case text=text.substring(find.length); } else { container=node; offset=text.length-1; //Offset to the last character of text. text[text.length-1] will give the last character. break; } } } //Debug Message //alert(container.nodeValue); return {node: container,offset: offset}; //nodeInfo }; var rangeCopy1=range.duplicate(), rangeCopy2=range.duplicate(); //Create a copy var rangeObj1=range.duplicate(), rangeObj2=range.duplicate(); //More copies :P rangeCopy1.collapse(true); //Go to beginning of the selection rangeCopy1.moveEnd('character',1); //Select only the first character rangeCopy2.collapse(false); //Go to the end of the selection rangeCopy2.moveStart('character',-1); //Select only the last character //Debug Message // alert(rangeCopy1.text); //Should be the first character of the selection var parentElement1=rangeCopy1.parentElement(), parentElement2=rangeCopy2.parentElement(); //If user clicks the input button without selecting text, then moveToElementText throws an error. if(window.HTMLInputElement && (parentElement1 instanceof window.HTMLInputElement || parentElement2 instanceof HTMLInputElement)) { return null; } rangeObj1.moveToElementText(parentElement1); //Select all text of parentElement rangeObj1.setEndPoint('EndToEnd',rangeCopy1); //Set end point to the first character of the 'real' selection rangeObj2.moveToElementText(parentElement2); rangeObj2.setEndPoint('EndToEnd',rangeCopy2); //Set end point to the last character of the 'real' selection var text1=rangeObj1.text; //Now we get all text from parentElement's first character upto the real selection's first character var text2=rangeObj2.text; //Here we get all text from parentElement's first character upto the real selection's last character var nodeInfo1=_findTextNode(parentElement1,text1); var nodeInfo2=_findTextNode(parentElement2,text2); // todo: dirty fix if (!nodeInfo1.node) { nodeInfo1.node = parentElement1; } if (!nodeInfo2.node) { nodeInfo2.node = parentElement2; } //Finally we are here range.startContainer=nodeInfo1.node; range.startOffset=nodeInfo1.offset; range.endContainer=nodeInfo2.node; range.endOffset=nodeInfo2.offset+1; //End offset comes 1 position after the last character of selection. } return range; }, unionRectangles : function(rect1, rect2) { var rect = { top: (Math.min(rect1.top, rect2.top)), bottom: (Math.max(rect1.bottom, rect2.bottom)), left: (Math.min(rect1.left, rect2.left)), right: (Math.max(rect1.right, rect2.right)) }; rect.width = rect.right - rect.left; rect.height = rect.bottom - rect.top; return rect; }, fixedPosition : function(win, el, topOffset, immediate) { function applyPosition(elem) { if(elem) { var scrollPosition = win.document.documentElement.scrollTop || win.document.body.scrollTop; var offset; if(typeof topOffset == "function") { offset = topOffset(); } else { offset = scrollPosition + topOffset; } elem.animate({top: offset}, 100); } } if(el) { var elem = Evernote.JQuery(el); if(Evernote.Utils.isQuirkMode()) { elem.css("position", "absolute"); if (win.attachEvent) win.attachEvent("onscroll", function() {applyPosition(elem);}); else if (win.addEventListener) win.addEventListener("scroll", function() {applyPosition(elem);}, false); else Evernote.Logger.error( "Utils.fixedPosition() can't attachEvent" ); if(immediate) { applyPosition(elem); } } } }, mergeCustomComboBoxStrings : function(notebook, owner, ownedByStr, maxLen) { var totalLen = notebook.length; if (owner.length) { // format: "space","(","","space","",")" // magic number "4" is: "space","(","space",")" totalLen += ownedByStr.length + owner + 4; } if (totalLen <= maxLen) { return { note: notebook, own: "", title: "" }; } var half = maxLen / 2 - 2; if (owner.length == 0) { return { note: notebook.substr(0, half) + "..." + notebook.substring(notebook.length - half, notebook.length), own: "", title: notebook }; } var ownerFormatStr = "(" + ownedByStr + " " + owner + ")"; var title = notebook + ownerFormatStr; var resultString = title.substr(0, half) + "..." + title.substr(title.length - half); if (notebook.length <= half) { return { note: notebook, own: "..." + title.substr(title.length - notebook.length), title: notebook + " " + ownerFormatStr }; }else if (ownerFormatStr <= half) { return { note: notebook.substr(0, maxLen - ownerFormatStr.length) + "...", own: ownerFormatStr, title: notebook + " " + ownerFormatStr }; }else { return { note: resultString.substr(0, resultString.length - half), own: resultString.substr(half + 3), title: notebook + " " + ownerFormatStr }; } }, setEvernoteLogo : function(selector) { var serverLocation = Evernote.Addin.getServerLocation(); Evernote.Logger.debug("Evernote server location is " + serverLocation); if (serverLocation.length && serverLocation.indexOf("international") == -1) { var evernoteLogoEl = Evernote.JQuery(selector); if (evernoteLogoEl) { var imageFileName = "oldclipper/images/web-clipper-logo_" + serverLocation + ".png"; this.changeBackgroundImage(evernoteLogoEl.get(0), Evernote.Addin.getPath("resources") + imageFileName); } } }, Selection : { getRangeCount : function(selection) { if(selection.rangeCount) { return selection.rangeCount; } return 1; }, getRangeAt : function(selection, pos) { if(selection.getRangeAt) { selection.getRangeAt(pos); } return selection; }, getCommonAncestorContainer : function(range) { if(range.commonAncestorContainer) { return range.commonAncestorContainer; } else if(range.parentElement) { return range.parentElement(); } return null; } } };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.ClipperActions = { CLIP_URL : "0", CLIP_FULL_PAGE: "1", CLIP_ARTICLE: "2", CLIP_SELECTION: "3", // Selection is not supported by default CLIP_IMAGE: "4", // Image too CLIP_SIMPLIFIED_ARTICLE: "5", CLIP_SCREEN_SHOT: "6" }; Evernote.ArticleSelectionOptions = { ENABLED : "0", DISABLED : "1", ENABLED_WITHOUT_HINTS : "2" }; Evernote.Trigger = { ENABLED : true, DISABLED : false }; Evernote.Options = { oneClickMode: false, action: { bydefault: "2", lastUsedEnable: true, lastUsed: "article" }, tags: { alwaysEnable: false, alwaysData: "" }, notebooks: { lastUsed: -1, lastUsedEnable: true, bydefault: "" }, skitch: { lastUsedColor: "" }, hints: { permanentScreenCapture : true }, postClip : { show : false }, /** * Return string representation of the object (you can use it in load method to restore object from string). */ _serialize: function() { //return JSON.stringify(this, null, '\t'); CNN.com has own JSON.stringify with parse errors function strObj( obj ) { var i = 0; var optArr = []; for (var prop in obj) { if (obj.hasOwnProperty(prop) && typeof obj[prop] != 'function') { var value; if (typeof obj[prop] == 'object') { value = strObj(obj[prop]); } else if (typeof obj[prop] == 'string') { var tempStr = obj[prop]; tempStr = tempStr.replace(/\\/g, "\\\\"); tempStr = tempStr.replace(/\"/g, "\\\""); value = '"' + tempStr + '"'; } else { value = obj[prop]; } optArr[i] = '"' + prop + '":' + value; i++; } } return '{' + optArr.toString() + '}'; } return strObj(this); }, load : function() { var optionsContent = Evernote.FS.getOptionsFileContent(); this._load(optionsContent); Evernote.Logger.debug('Load options ' + JSON.stringify(this, null, '\t')); }, _load : function(str) { if(str) { try { var options; options = JSON.parse(str); for (var prop in options) { if (options[prop] && options.hasOwnProperty(prop)) { this[prop] = options[prop]; } } } catch(e){ // ignore } } }, setScreenCaptureHintNonPermanent : function(){ this.hints.permanentScreenCapture = false; this.save(); }, setDefaultAction : function(action) { this.action.bydefault = action; this.setLastUsedActionDisabled(); this.save(); }, setDefaultNotebook : function(notebook) { this.notebooks.bydefault = notebook; this.setLastUsedNotebookDisabled(); this.save(); }, setNotebook : function(notebookUid) { this.notebooks.lastUsed = notebookUid; this.save(); }, setLastUsedNotebookEnabled : function() { if (this.notebooks.lastUsedEnable == Evernote.Trigger.DISABLED) { this.notebooks.lastUsedEnable = Evernote.Trigger.ENABLED; } this.save(); }, setLastUsedNotebookDisabled : function() { if (this.notebooks.lastUsedEnable == Evernote.Trigger.ENABLED) { this.notebooks.lastUsedEnable = Evernote.Trigger.DISABLED; } this.save(); }, setLastUsedAction : function(action) { this.action.lastUsed = action; this.save(); }, setLastUsedActionEnabled : function () { if (this.action.lastUsedEnable == Evernote.Trigger.DISABLED) { this.action.lastUsedEnable = Evernote.Trigger.ENABLED; } this.save(); }, setLastUsedActionDisabled : function() { if (this.action.lastUsedEnable == Evernote.Trigger.ENABLED) { this.action.lastUsedEnable = Evernote.Trigger.DISABLED; } }, setOneClickClipping : function(condition) { if (condition) { this.oneClickMode = Evernote.Trigger.ENABLED; } else { this.oneClickMode = Evernote.Trigger.DISABLED; } this.save(); }, setAlwaysTagsEnabled : function (condition) { if (condition) { this.tags.alwaysEnable = Evernote.Trigger.ENABLED; } else { this.tags.alwaysEnable = Evernote.Trigger.DISABLED; } this.save(); }, setAlwaysTagsString : function (str) { this.tags.alwaysData = str; this.save(); }, setPostClipDialogEnabled : function () { if (this.postClip.show == Evernote.Trigger.DISABLED) { this.postClip.show = Evernote.Trigger.ENABLED; } this.save(); }, setPostClipDialogDisabled : function () { if (this.postClip.show == Evernote.Trigger.ENABLED) { this.postClip.show = Evernote.Trigger.DISABLED; } this.save(); }, setLastUsedSkitchColor : function(color) { this.skitch.lastUsedColor = color; this.save(); }, save : function() { Evernote.Logger.debug('Save options: ' + JSON.stringify(this, null, '\t')); var jsonSer = this._serialize(); Evernote.FS.writeOptionsToFile(jsonSer); } }; </script><script defer="" type="text/javascript" charset="ANSI">Evernote.BrowserDetection = { isIE11 : function() { return navigator.userAgent.indexOf("Trident/7.0") != -1 }, isIE10 : function() { return navigator.userAgent.indexOf("MSIE 10") != -1; }, isIE7 : function() { return navigator.userAgent.indexOf("MSIE 7.0") != -1 && navigator.userAgent.indexOf("Trident/7.0") == -1; }, isIE8 : function() { return navigator.userAgent.indexOf("MSIE 8.0") != -1 && navigator.userAgent.indexOf("Trident/7.0") == -1; }, isIE9 : function() { return navigator.userAgent.indexOf("MSIE 9.0") != -1 && navigator.userAgent.indexOf("Trident/7.0") == -1; }, isLessThanIE9 : function() { return Evernote.BrowserDetection.isIE7() || Evernote.BrowserDetection.isIE8() }, isIE10orGreater : function() { return Evernote.BrowserDetection.isIE10() || Evernote.BrowserDetection.isIE11() } };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.Node = { ELEMENT_NODE : 1, TEXT_NODE : 3 }; </script><script defer="" type="text/javascript" charset="ANSI">Evernote.Share = { _DEFAULT_WIDTH : 650, _DEFAULT_HEIGHT : 650, _DEFAULT_TYPE : 'popup', _openWindow : function( url, width, height ) { var w = width || this._DEFAULT_WIDTH; var h = height || this._DEFAULT_HEIGHT; var t = this._DEFAULT_TYPE; var params = 'width=' + w + ',height=' + h + ',type=' + t + ',left=200,top=200,resizable=yes'; Evernote.Logger.debug('Open ' + url + ' with params: ' + params); window.open(url, null, params); }, toSocial : function ( id, link , title) { Evernote.Logger.debug('Evernote.Share.toSocial ' + id + ' and link: ' + link + ', title: ' + title); var shareUrl; if ( id == 'facebook') { shareUrl = "https://www.facebook.com/sharer/sharer.php?u=" + encodeURIComponent(link); this._openWindow( shareUrl, 626, 436 ); } else if (id == 'twitter') { shareUrl = "https://twitter.com/intent/tweet?text=" + encodeURIComponent(title) + "&url=" + encodeURIComponent(link); this._openWindow( shareUrl, 550, 420 ); } else if (id == 'linkedin') { shareUrl = "http://www.linkedin.com/shareArticle?mini=true&url=" + encodeURIComponent(link) + "&title=" + encodeURIComponent(title); this._openWindow( shareUrl, 900, 570 ); } else if (id == 'weibo') { shareUrl = "http://service.weibo.com/share/share.php?url=" + encodeURIComponent(link) + "&title=" + encodeURIComponent(title); this._openWindow( shareUrl, 650, 650 ); } } };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.PostClipPopup = function(doc) { var elem = Evernote.JQuery('#' + Constants.POST_CLIP_DIALOG_ID); var clipboard_container = elem.find('#' + 'evn-clipboardCopy-container'); var titleField = elem.find('.noteTitle'); var link = Evernote.pageInfo.getUrl(); var shareTitle = 'error'; // subscribe to response from addin Evernote.ResponseReceiver.subscribe(this); var _title = ''; var _notebook = ''; var clipping_message = Evernote.Addin.getLocalizedMessage(Evernote.Messages.CLIPPING); var clipped_message = Evernote.Addin.getLocalizedMessage(Evernote.Messages.CLIPPED); var message = elem.find('.clippedMessage'); var closeButton = elem.find('.closeCross'); var openButton = elem.find('#openButton'); var shareButton = elem.find('#shareButton'); var shareIcons = elem.find('.shareButton'); var cbInput = elem.find('.evn-pcp-clipboard-input'); var cbMessage = elem.find('.evn-pcp-clipboard-message'); var cbButton = elem.find('.evn-pcp-clipboard-button'); var errorLink = elem.find('#evn-show-logs'); var errorMsg = elem.find('.evn-error-desc'); function showLogs() { var logFile = Evernote.Addin.getPath("logfile"); Evernote.Addin.openLocalFile(logFile, BrowserNavConstants.NAVOPENNEWTAB); } function modifyToCurrentIE() { if (document.documentMode == '9') { elem.addClass('evn-iexplorer9'); } else if (document.documentMode == '7' || Evernote.BrowserDetection.isIE7()) { elem.addClass('evn-iexplorer7'); } } function finishPostClip () { endProcessingAndClose(); // if (Evernote.Options.postClip.show == true) { // endProcessing(); // } else { // endProcessingAndClose(); // } } function localize() { Evernote.GlobalUtils.localize(elem.get(0)); } function copyToClipboard(){ var clipSucceed = window.clipboardData.setData('Text', link); var isAllowed = window.clipboardData.getData('Text'); if (isAllowed == "") { // Could be empty, or failed // Verify failure if (!window.clipboardData.setData('Text', 'test_string')) isAllowed = null; } if (clipSucceed && isAllowed) { clipboard_container.addClass('evn-success'); cbMessage.text(Evernote.Addin.getLocalizedMessage(Evernote.Messages.URL_COPIED)); } else { clipboard_container.addClass('evn-failed'); cbMessage.text(Evernote.Addin.getLocalizedMessage(Evernote.Messages.DISABLED)); } } function handleShareIconClick ( evt ) { var id = evt.srcElement.id || Evernote.JQuery(evt.target).closest('table').attr('id'); if (id == 'clipboard') { elem.addClass('evn-clipboard-mode'); } else { Evernote.Share.toSocial( id , link, shareTitle); } } function fillOutPopup(title, notebook) { _title = title; _notebook = notebook; titleField.html(title); cbInput.val(link); shareTitle = title; } function renderErrorMessage( error ) { if (error.code == Evernote.ErrorCodes.AUTHENTICATION_ERROR) { errorMsg.html(error.message); } elem.removeClass('processing'); elem.addClass('evn-error-mode'); } function processError(error) { renderErrorMessage(error); elem.show(); return true; } function endProcessing() { elem.removeClass('processing'); Evernote.ClearlyController.removeHighlighted(); message.html(clipped_message + ' ' + _notebook); } function endProcessingAndClose() { elem.removeClass('processing').addClass('withoutShare'); Evernote.ClearlyController.removeHighlighted(); message.html(clipped_message + ' ' + _notebook); setTimeout(function(){ hide(); }, 1000); } function setProcessing() { elem.addClass('processing'); message.html('' + clipping_message + '' + _title); } function show() { setProcessing(); addListeners(); elem.show(); elem.addClass('visible'); } function hide() { removeListeners(); elem.hide(); elem.removeClass('visible'); elem.removeClass('evn-error-mode'); elem.removeClass('withoutShare'); elem.removeClass('evn-clipboard-mode'); clipboard_container.removeClass(); cbMessage.text(Evernote.Addin.getLocalizedMessage(Evernote.Messages.SOURCE_LINK)); } function onClickOutside(e) { if (Evernote.JQuery(e.target).closest('#' + Constants.POST_CLIP_DIALOG_ID).length == 0) { hide(); } } function onKeyPressed(e) { if (e.keyCode == 27) { hide(); } } function onDataReceived(response) { if (response.type == 'clipped') { finishPostClip(); } } function addListeners() { Evernote.JQuery(document).on('click', onClickOutside); Evernote.JQuery(document).on('keydown',onKeyPressed); } function removeListeners() { Evernote.JQuery(document).off('click',onClickOutside); Evernote.JQuery(document).off('keydown',onKeyPressed); } closeButton.click(hide); shareIcons.click(handleShareIconClick); cbButton.click(copyToClipboard); errorLink.click(showLogs); elem.on('errorShown', hide); localize(); modifyToCurrentIE(); this.fillOutPopup = fillOutPopup; this.endProcessing = endProcessing; this.endProcessingAndClose = endProcessingAndClose; this.show = show; this.hide = hide; this.processError = processError; this.onDataReceived = onDataReceived; };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.Messages = { CLIP_SELECTION: 113, // Save Selection CLIP_URL: 115, // Save URL CLIP_FULL_PAGE: 116, // Save Full Page CLIP_ARTICLE: 117, // Save Article ENTER: 118, // enter OPTIONS: 119, // Options DEFAULT_ACTION: 120, // Default action ARTICLE_SELECTION: 121, // Article selection ENABLED: 122, // Enabled DISABLED: 123, // Disabled ENABLED_NO_HINTS: 124, // Enabled (no hints) ARTICLE_SELECTION_HINT: 125, // When enabled, you can modify article selection using your keyboard before make a clip. Enabling with "no hints" will prevent displaying the informational message. When disabled - you cannot make any adjustments to the automatic article selection. EXPAND_SELECTION: 126, // expand selection SHRINK_SELECTION: 127, // shrink selection MOVE_SELECTION: 128, // move selection CLIP_ARTICLE_HINT: 129, // clip article CLIPPING: 130, // Clipping UNSUPPORTED_SCHEMA: 131, // Clipping from this location is not supported. UNTITLED_NOTE: 132, // Untitled note ADD_TAGS: 133, // Add tags ADD_REMARK: 134, // Add remark OWNED_BY: 135, // owned by SHARED_NOTEBOOKS: 136, // Shared Notebooks BUSINESS_NOTEBOOKS: 137, // Business Notebooks LOADING_TAGS: 140, // Loading tags... LOGIN_FAILED: 141, // You need to be signed in to Evernote desktop to clip webpages CLOSE: 142, // ?逵克???? LOADING_NOTEBOOKS: 146, // 鈞逵均??菌逵? 閨剋棘克戟棘??... CLIP_FAILED_TITLE: 147, // ?筠 ?畇逵剋棘?? ?棘??逵戟龜?? 鈞逵劇筠?克?. VERSION: 148, // ?筠??龜? LIMIT_TAGS: 150, // You've entered the maximum number of tags CLIP_HEADER: 151, // Clip SKITCH_HEADER: 152, // Annotate ORGANIZE_HEADER: 153, // Organize SAVE_BUTTON: 154, // Save CLIP_SCREEN_SHOT: 155, // Screenshot NOTEBOOK_SEARCH: 156, // Find a notebook SHARE_BUTTON: 157, // Share ARTICLE: 158, // Article SIMPLIFIED_ARTICLE: 159, // Simplified Article SELECTION: 160, // Selection URL: 161, // Bookmark SCREENSHOT: 162, // Screen Capture SOURCE_LINK: 163, // Source link URL_COPIED: 164, // Url copied to clipboard FULL_PAGE: 165, // Full Page TAGS : 166, // Tag selection CLIP_ACTION : 167, // Default clip action LOADING : 168, // Loading... ALWAYS_START_IN : 169, // Always start in ALWAYS_ADD_TAGS : 170, // Always tag with LAST_USED_ACTION : 171, // Last Used Action COPYRIGHT : 172, // Copyright 2009-2013 Evernote Corporation. All rights reserved. PRIVACY_POLICY : 173, // Privacy Policy TERMS_OF_SERVICE : 174, // Terms of Service EXPAND : 175, // Expand the article selection CONTRACT : 176, // Contract the article selection ADD_TAG : 177, // Add tag LIMIT_TAGS_SHORT : 178, // Max 20 tags TAGS_NOT_SUPPORTED : 179, // Tags not supported DONE : 180, // Done ARROW :181, // Shape tool COLOR :182, // Colors STAMP_REJECT :183, // Stamp tool CROP :184, // Crop HIGHLIGHTER :185, // HTML Highlighter MARKER :186, // Marker tool PIXELATE :187, // Pixelator tool TEXT :188, // Type tool ZOOM_IN :189, // Zoom In ZOOM_OUT :190, // Zoom Out ZOOM_RESET :191, // Reset ZOOM_TIP :192, // Tip: Hold Ctrl while clicking to pan CROP_APPLY :193, // Apply CROP_CANCEL :194, // Cancel SCREENSHOT_CAPTURED :195, // Screenshot captured SAVING : 196, // Saving... IMAGE_HIGHLIGHTER : 197, // Image highlighter FORBIDDEN : 198, // Not allowed for this action SETTINGS : 200, // Settings ONE_CLICK_CLIPPING: 201, // 1-click Clipping ONE_CLICK_CLIPPING_DESC: 202, // ~~~ Put description here ~~~ NOTEBOOK_SELECTION: 203, // Notebook Selection LAST_USED_NOTEBOOK: 204, // Last used notebook SCREEN_CAPTURE_TOAST: 205, // Single clickto capture full screen
    or draga region and release CLIPPED: 206, // Clipped to TAKE_A_SCREENSHOT: 207, // Take a Screenshot DEFAULT_NOTEBOOK: 208, // default notebook ERROR_LOGS: 209, // Error logs VIEW_LOGS: 210, // View Logs LOGS_DESCRIPTION: 211, // If you contact Evernote Support, they may ask you to view these logs to help diagnose a problem COPY_TO_CLIPBOARD: 212, // Copy to clipboard AFTER_CLIP: 213, // After clip SHOW_POST_CLIP_DESC: 214, // Show successful clip dialog CLOSE_POST_CLIP_DESC: 215, // Automatically close clipper LEGAL: 216, // Legal LEGAL_HEADER: 217, // Web Clipper uses the following open source software CLIP_ERROR: 218, // Cannot save clip VIEW_REPORT: 219 // View Crash Report };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.ResponseReceiver = { parsers : [], receivers : [], onResponse: function(str) { Evernote.Logger.debug("Response received" + str); for(var i = 0; i < Evernote.ResponseReceiver.parsers.length; i++) { if(Evernote.ResponseReceiver.parsers[i].canParse && Evernote.ResponseReceiver.parsers[i].canParse(str)) { Evernote.ResponseReceiver.notify(Evernote.ResponseReceiver.parsers[i].parse(str)); } } }, registerParser: function(parser) { Evernote.ResponseReceiver.parsers.push(parser); }, subscribe: function(receiver) { Evernote.ResponseReceiver.receivers.push(receiver); }, notify: function(data) { for(var i=0; i < Evernote.ResponseReceiver.receivers.length; i++) { Evernote.ResponseReceiver.receivers[i].onDataReceived(data); } } }; function EvernoteGlobalReceiver(str) { Evernote.ResponseReceiver.onResponse(str); } </script><script defer="" type="text/javascript" charset="ANSI">Evernote.ProcessIDResponseParser = { parse : function(str) { Evernote.Logger.debug("ProcessIDResponseParser: response" + str); var xmlDom = Evernote.JQuery(str); var result = xmlDom.attr("process_id"); return new Evernote.Response("process_id", result); }, canParse: function(str) { var request = Evernote.JQuery(str).attr("request"); return request && (request == "get_process_id"); } }; Evernote.ResponseReceiver.registerParser(Evernote.ProcessIDResponseParser);</script><script defer="" type="text/javascript" charset="ANSI">Evernote.NotebookResponseParser = { parse : function(str) { str = Evernote.GlobalUtils.decodeXML(str); var xmlDom = Evernote.JQuery(str); var result = []; var type = xmlDom.attr("type"); if(xmlDom.length == 1) { var notebooks = xmlDom.find("notebook"); for(var i = 0; i < notebooks.length; i++) { var notebook = Evernote.JQuery(notebooks[i]); var notebookObj = Evernote.NotebookResponseParser.createNotebook(type,notebook); if(notebookObj) { result.push(notebookObj); } } } else if(xmlDom.length > 1) { for(var i = 1; i < xmlDom.length - 1; i += 2) { var notebook = Evernote.JQuery(xmlDom[i]); var notebookObj = Evernote.NotebookResponseParser.createNotebook(type, notebook); if(notebookObj) { result.push(notebookObj); } } } return new Evernote.Response("notebooks", result); }, createNotebook : function(type, notebook) { var notebookType; var notebookTypeText; switch (type) { case "personal": notebookType = Evernote.NotebookTypes.PERSONAL; notebookTypeText = Evernote.NotebookTypes.PERSONAL_TEXT; break; case "business": notebookType = Evernote.NotebookTypes.BUSINESS; notebookTypeText = Evernote.NotebookTypes.BUSINESS_TEXT; break; case "linked": notebookType = Evernote.NotebookTypes.LINKED; notebookTypeText = Evernote.NotebookTypes.LINKED_TEXT; break; } var hidden = false; var writableAttrValue = notebook.attr("writable"); if (notebookType == Evernote.NotebookTypes.BUSINESS) { return null } if(notebookType == Evernote.NotebookTypes.LINKED) { var business = notebook.attr("business"); if(business && ((business | 0) == 1)) { notebookType = Evernote.NotebookTypes.BUSINESS; notebookTypeText = Evernote.NotebookTypes.BUSINESS_TEXT; } } if(notebookType == Evernote.NotebookTypes.LINKED || notebookType == Evernote.NotebookTypes.BUSINESS) { if(!writableAttrValue || (writableAttrValue | 0) != 1) { if(notebookType == Evernote.NotebookTypes.LINKED) return null; else { hidden = true; } } } var owner = notebook.attr("owner"); if (owner && owner == Evernote.evernotePopup._user) owner = undefined; return new Evernote.Notebook( notebookType, notebook.attr("name"), notebook.attr("uid"), notebook.attr("stack"), owner, hidden, notebookTypeText ); }, canParse: function(str) { var request = Evernote.JQuery(str).attr("request"); return (request && (request == "get_notebooks")); } }; Evernote.ResponseReceiver.registerParser(Evernote.NotebookResponseParser);</script><script defer="" type="text/javascript" charset="ANSI">Evernote.AddNoteResponseParser = { parse : function(str) { Evernote.Logger.debug("AddNoteResponseParser: response" + str); var xmlDom = Evernote.JQuery(str); var result = xmlDom.attr("notebook_name"); return new Evernote.Response("clipped", result); }, canParse: function(str) { var request = Evernote.JQuery(str).attr("request"); return request && (request == "add_note"); } }; Evernote.ResponseReceiver.registerParser(Evernote.AddNoteResponseParser);</script><script defer="" type="text/javascript" charset="ANSI">Evernote.ErrorResponseParser = { parse : function(str) { Evernote.Logger.warn("Received error " + str); var error = Evernote.JQuery(str); var errorCode = error.attr("code"); var errorMessage = null; var problem = null; if(error.length == 1) { var problems = error.find("problem"); if(problems && problems.length > 0) { problem = Evernote.JQuery(problems[0]); } } else if(error.length > 2) { errorMessage = error[2].toString(); } if(problem) { errorMessage = problem.text(); } else if(!errorMessage) { errorMessage = error.attr("details"); } switch (errorCode) { case Evernote.ErrorCodes.AUTHENTICATION_ERROR : errorMessage = Evernote.Addin.getLocalizedMessage(Evernote.Messages.LOGIN_FAILED); break; case Evernote.ErrorCodes.CLIP_ERROR : errorMessage = Evernote.Addin.getLocalizedMessage(Evernote.Messages.CLIP_FAILED_TITLE) + "\n" + errorMessage; } var msg = { message: errorMessage, code: errorCode }; return new Evernote.Response("error", msg); }, canParse: function(str) { var request = Evernote.JQuery(str).get(0); return (request && (request.nodeName == "ERROR")); } }; Evernote.ResponseReceiver.registerParser(Evernote.ErrorResponseParser);</script><script defer="" type="text/javascript" charset="ANSI">Evernote.ErrorHandler = { getHandler: function() { return [Evernote.Addin, Evernote.evernotePopup, Evernote.evernotePostClipPopup, Evernote.AlertErrorHandler]; }, onDataReceived : function(response) { if(response.type) { if(response.type == "error") { this.notifyHandlers(response.data); } } }, notifyHandlers : function(error) { for(var i = 0; i < this.getHandler().length; i++) { var handler = this.getHandler()[i]; if(handler && handler.processError && handler.processError(error)) { return; } } } }; Evernote.ResponseReceiver.subscribe(Evernote.ErrorHandler);</script><script defer="" type="text/javascript" charset="ANSI">Evernote.Response = function(type, data) { this.type = type; this.data = data; };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.FS = { _addon : null, init : function(addon) { this._addon = addon; }, /** * Write content to the specified path. * @param content - content, that should be written to */ writeOptionsToFile : function(content) { if (!this._addon) return; try { this._addon.WriteOptionsContent(content ); } catch (e) { Evernote.Logger.error( "FS.writeOptionsToFile() failed " + e ); } }, /** * Read content of the file specified by path. * @return {string} - content of the file */ getOptionsFileContent : function() { if (!this._addon) return null; try { return this._addon.ReadOptionsContent(); } catch (e) { Evernote.Logger.error( "FS.getOptionsFileContent() failed " + e ); } return null; } }; </script><script defer="" type="text/javascript" charset="ANSI">//"use strict"; Evernote.AbstractElementSerializer = function AbstractElementSerializer( node, nodeStyle ) { this.initialize( node, nodeStyle ); }; Evernote.AbstractElementSerializer.isResponsibleFor = function( /*navigator*/ ) { return false; }; Evernote.AbstractElementSerializer.prototype._node = null; Evernote.AbstractElementSerializer.prototype._nodeStyle = null; Evernote.AbstractElementSerializer.prototype.handleInheritance = function( child/*, parent */) { Evernote.ElementSerializerFactory.ClassRegistry.push( child ); }; Evernote.AbstractElementSerializer.prototype.initialize = function( node, nodeStyle ) { this._node = node; this._nodeStyle = nodeStyle; }; Evernote.AbstractElementSerializer.prototype.serialize = function( /*docBase*/ ) { return ""; }; Evernote.AbstractElementSerializer.prototype.getImageUrl = function() { return ""; };</script><script defer="" type="text/javascript" charset="ANSI">//"use strict"; Evernote.ElementSerializerFactory = { getImplementationFor : function( node ) { for ( var i = 0; i < this.ClassRegistry.length; ++i ) { if ( this.ClassRegistry[ i ].isResponsibleFor( node ) ) { return this.ClassRegistry[ i ]; } } return null; } }; Evernote.ElementSerializerFactory.ClassRegistry = [ ];</script><script defer="" type="text/javascript" charset="ANSI">//"use strict"; Evernote.ClipStylingStrategy = function ClipStylingStrategy( ) { this.initialize( ); }; Evernote.ClipStylingStrategy.prototype.initialize = function( ) { }; Evernote.ClipStylingStrategy.prototype.styleForNode = function( /*node, root, fullPage, clipStyleType*/ ) { return null; }; Evernote.ClipStylingStrategy.prototype.getNodeView = function ( node ) { var doc = node.ownerDocument; return (doc.defaultView) ? doc.defaultView : null; }; Evernote.ClipStylingStrategy.prototype.getNodeStyle = function( node, filterFn, pseudo ) { Evernote.Logger.debug( "ClipStylingStrategy.getNodeStyle()" ); var style = new Evernote.ClipStyle(); if ( pseudo != "" ) { return style; } if ( node && typeof node.nodeType == 'number' && node.nodeType == 1 ) { var view = this.getNodeView( node ); style = new Evernote.ClipStyle( Evernote.ElementExtension.getComputedStyle( node, null, view ), filterFn ); } return style; }; Evernote.ClipStyleType = { NodeStyle : 0x01, InheritedFontStyle: 0x02, InheritedBgStyle: 0x04, AllStyle : 0x01 | 0x02 | 0x04, Default : 0x01 | 0x02 };</script><script defer="" type="text/javascript" charset="ANSI"> Evernote.ClipFullStylingStrategy = function ClipFullStylingStrategy( ) { this.initialize( ); }; Evernote.inherit( Evernote.ClipFullStylingStrategy, Evernote.ClipStylingStrategy, true ); Evernote.ClipFullStylingStrategy.prototype.styleForNode = function ( node, root, fullPage, clipStyleType ) { Evernote.Logger.debug( "ClipStylingStrategy.styleForNode()" ); if ( clipStyleType == null ) { clipStyleType = Evernote.ClipStyleType.Default; } var bodyStyles = new Evernote.ClipStyle( [ ], function ( prop, value ) { return value != "" } ); var inhFontStyles = new Evernote.ClipStyle( [ ] ); var inhBgStyles = [ ]; if ( (clipStyleType & Evernote.ClipStyleType.NodeStyle) == Evernote.ClipStyleType.NodeStyle ) { Evernote.Logger.debug( "ClipStylingStrategy.styleForNode(): get node style" ); try { if ( node.nodeName.toLowerCase() == "body" ) { for ( var attrName in Evernote.ClipStyle.STYLE_ATTRIBUTES ) { if ( Evernote.ElementExtension.hasAttribute(node, attrName) ) { var cssPropName = Evernote.ClipStyle.STYLE_ATTRIBUTES[ attrName ]; var style = { }; style[ cssPropName ] = node.getAttribute( attrName ); bodyStyles.addStyle( style ); } } } } catch(e) { Evernote.Logger.error("ClipFullStylingStrategy.styleForNode failed to get attributes from body due to error " + e); } var evaluatedStyles = this.getNodeStyle( node ); if ( node.nodeName.toLowerCase() == "table" && !evaluatedStyles.getStyle( "font-size" ) ) { evaluatedStyles.addStyle( {"font-size":"1em"} ); } if ( node.nodeName.toLowerCase() == "img" ) { style = new Evernote.ClipStyle( Evernote.ElementExtension.getComputedStyle( node, null, this.getNodeView( node ) ), function ( prop, value ) { return value != "" } ); evaluatedStyles.addStyle( { height:style.getStyle( "height" ) } ); evaluatedStyles.addStyle( { width:style.getStyle( "width" ) } ); } if ( evaluatedStyles.getStyle( "background-image" ) ) { var regExp = /url\((.*?)\)/; evaluatedStyles.addStyle( { "background-image": Evernote.StyleElementExtension.getPropertyValue(Evernote.ElementExtension.getComputedStyle( node, null, this.getNodeView( node ) ), Evernote.IEStylePropertiesMapping.getPropertyNameFor("background-image") ).replace( regExp, "url('$1')").replace(/('")|("')|('')/g, "'")} ); } if ( evaluatedStyles.getStyle( "height" ) == "100%" && Evernote.StyleElementExtension.getPropertyValue(Evernote.ElementExtension.getComputedStyle( node, null, this.getNodeView( node ) ), "height" ) == "0px" ) { evaluatedStyles.addStyle( { height:"0px" } ); } bodyStyles.mergeStyle( evaluatedStyles, true ); } if ( node == root && !fullPage ) { if ( (clipStyleType & Evernote.ClipStyleType.InheritedFontStyle) == Evernote.ClipStyleType.InheritedFontStyle ) { Evernote.Logger.debug( "ClipStylingStrategy.styleForNode(): get inherited font style" ); inhFontStyles = this.inheritFontForNode( node, true ); Evernote.Logger.debug( "ClipStylingStrategy.styleForNode(): inherited fonts " ); } if ( (clipStyleType & Evernote.ClipStyleType.InheritedBgStyle) == Evernote.ClipStyleType.InheritedBgStyle ) { Evernote.Logger.debug( "ClipStylingStrategy.styleForNode(): get inherited bg style" ); inhBgStyles = this.inheritBackgroundForNode( node, true ); } } bodyStyles.mergeStyle( inhFontStyles, true ); return { nodeStyle:bodyStyles, inheritedFonts:inhFontStyles, inheritedBackground:inhBgStyles, evaluated:bodyStyles }; }; Evernote.ClipFullStylingStrategy.prototype.getNodeStyle = function ( node, filterFn, pseudo ) { Evernote.Logger.debug( "ClipStylingStrategy.getNodeStyle()" ); if ( pseudo == null || typeof pseudo == "undefined" ) { pseudo = ""; } var style = new Evernote.ClipStyle([ ], filterFn); Evernote.Logger.debug( "Pseudo : " + pseudo ); if ( pseudo == "" && node && typeof node.nodeType == 'number' && node.nodeType == 1 ) { var view = this.getNodeView( node ); style = new Evernote.ClipStyle( Evernote.ElementExtension.getComputedStyle( node, null, view ), filterFn ); } return style; }; Evernote.ClipFullStylingStrategy.prototype.inheritFontForNode = function ( node, recur ) { Evernote.Logger.debug( "ClipFullStylingStrategy.inheritFontForNode()" ); var fontStyle = new Evernote.ClipStyle(); if ( !node ) { return fontStyle; } var parent = node; var styles = [ ]; var nodes = [ ]; var dynamicUnit = ["%", "em"]; var sizeUnitRegExp = /(.*?)(em|%|px|pt)/; while ( parent ) { nodes.push( parent ); styles.push( new Evernote.ClipStyle( this.getNodeStyle( parent ), function ( prop, value ) { return (Evernote.ArrayExtension.indexOf(Evernote.ClipStyle.INHERITED_STYLES, prop ) > 0 && value != "inherit" ); } ) ); Evernote.Logger.debug( "Inh parent style:" + styles[styles.length - 1].toString() ); if ( !recur || parent == document.body ) { break; } else { parent = parent.parentElement; } } //merge styles starting from low-priority parent styles Evernote.Logger.debug( "Styles inh for processing:" + (styles.length - 1) ); for ( var i = styles.length - 1; i >= 0; i-- ) { var style = styles[ i ]; var fontSize = fontStyle.getStyle( "font-size" ); var overFontStyle = style.getStyle( "font-size" ); Evernote.Logger.debug( "fontSize:" + fontSize + " ;overFontStyle: " + overFontStyle ); if ( fontSize && overFontStyle ) { var resFontSize = fontSize.match( sizeUnitRegExp ); if ( resFontSize == null ) { continue; } var sizeVal = resFontSize[1]; var sizeUnit = resFontSize[2]; var resOverFontSize = overFontStyle.match( sizeUnitRegExp ); if ( resOverFontSize == null ) { continue; } var overSizeVal = resOverFontSize[1]; var overSizeUnit = resOverFontSize[2]; if ( Evernote.ArrayExtension.indexOf(dynamicUnit, overSizeUnit ) != -1 ) { if ( overSizeUnit == "%" ) { style.addStyle( { "font-size":(parseFloat( sizeVal ) * parseFloat( overSizeVal ) / 100).toString() + sizeUnit } ); } else { style.addStyle( { "font-size":(parseFloat( sizeVal ) * parseFloat( overSizeVal )).toString() + ((sizeUnit != "em") ? sizeUnit : overSizeUnit) } ); } } Evernote.Logger.debug( "Style: " + i + " ;Eval inh style:" + style.toString() ); } fontStyle.mergeStyle( style, true ); } return fontStyle; }; Evernote.ClipFullStylingStrategy.prototype.inheritBackgroundForNode = function ( node, recur ) { Evernote.Logger.debug( "ClipFullStylingStrategy.inheritBackgroundForNode()" ); var bgStyle = new Evernote.ClipStyle(); if ( !node ) { return bgStyle; } var parent = node; var styles = [ ]; var nodes = [ ]; var topElement = (document.body.parentNode) ? document.body.parentNode : document.body; try { while ( parent ) { nodes.push( parent ); var filterFn = function ( prop, value ) { return !(prop == "background-repeat" && (value == "no-repeat" || value == "repeat-y")); }; var nodeStyle = new Evernote.ClipStyle( this.getNodeStyle( parent ), filterFn, Evernote.ClipStyle.CSS_GROUP.getExtForStyle( "background" ) ); if ( !nodeStyle.getStyle( "background-repeat" ) ) { nodeStyle.removeStyle( "background-image" ); } if ( !nodeStyle.getStyle( "background-color" ) && parent.getAttribute( "bgcolor" ) ) { Evernote.Logger.debug( "Set bgcolor attribute: " + parent.getAttribute( "bgcolor" ) ); nodeStyle.addStyle( {"background-color":parent.getAttribute( "bgcolor" )} ); } nodeStyle = this.evalBgPosition( node, parent, nodeStyle ); if ( nodeStyle.getStylesNames().length > 0 ) { styles.push( nodeStyle ); Evernote.Logger.debug( "Add inh bg style " + nodeStyle.toString() ); } if ( !recur || parent == topElement ) { break; } else { parent = parent.parentNode; } } } catch(e) { Evernote.Logger.error("ClipFullStylingStrategy.prototype.inheritBackgroundForNode failed to error " + e); } return styles; }; Evernote.ClipFullStylingStrategy.prototype.evalBgPosition = function ( node, inhNode, nodeBgStyle ) { Evernote.Logger.debug( "Dettermining background image offset" ); var strPosToPercent = { "center":"50%", "top":"0%", "bottom":"100%", "right":"100%", "left":"0%" }; var regExp = /url\((.*?)\)/; var bgImage = nodeBgStyle.getStyle( "background-image" ); if ( !regExp.test( nodeBgStyle.getStyle( "background-image" ) ) || (bgImage && nodeBgStyle.getStyle( "background-image" ).indexOf( "data:image" ) >= 0) ) { Evernote.Logger.debug( "bgStyle: " + nodeBgStyle.toString() ); return nodeBgStyle; } nodeBgStyle.addStyle( { "background-image": Evernote.StyleElementExtension.getPropertyValue(Evernote.ElementExtension.getComputedStyle( inhNode, null, this.getNodeView( inhNode ) ), Evernote.IEStylePropertiesMapping.getPropertyNameFor("background-image") ).replace( regExp, "url('$1')" ) } ); var actualImage = new Image(); actualImage.src = nodeBgStyle.getStyle( "background-image" ).match( regExp )[ 1 ].replace( /["']/g, "" ); var bgNodeRect = this.getOffsetRect( inhNode ); var nodeRect = this.getOffsetRect( node ); var yDelta = nodeRect.top - bgNodeRect.top; var xDelta = nodeRect.left - bgNodeRect.left; var bgNodeBgPosX = 0; var bgNodeBgPosY = 0; var origPosX = 0; var origPosY = 0; if ( nodeBgStyle.getStyle( "background-position" ) ) { var bgPosition = nodeBgStyle.getStyle( "background-position" ).split( " " ); bgNodeBgPosX = strPosToPercent[bgPosition[ 0 ]] != null ? strPosToPercent[bgPosition[ 0 ]] : bgPosition[ 0 ]; bgNodeBgPosY = strPosToPercent[bgPosition[ 1 ]] != null ? strPosToPercent[bgPosition[ 1 ]] : bgPosition[ 1 ]; if ( bgNodeBgPosX && bgNodeBgPosX.indexOf( "%" ) > 0 ) { origPosX = parseInt( bgNodeRect.width ) * (parseInt( bgNodeBgPosX ) / 100); origPosX -= parseInt(actualImage.width) * (parseInt(bgNodeBgPosX) / 100); } else { origPosX = parseInt( bgNodeBgPosX ); } if ( bgNodeBgPosY && bgNodeBgPosY.indexOf( "%" ) > 0 ) { origPosY = parseInt( bgNodeRect.height ) * (parseInt( bgNodeBgPosY ) / 100); origPosY -= parseInt(actualImage.height) * (parseInt(bgNodeBgPosY) / 100); } else { origPosY = parseInt( bgNodeBgPosY ); } } if ( isNaN( origPosX ) ) { origPosX = 0; } if ( isNaN( origPosY ) ) { origPosY = 0; } var xOffset = 0 - xDelta + origPosX; var yOffset = 0 - yDelta + origPosY; nodeBgStyle.addStyle( { "background-position":(xOffset + "px " + yOffset + "px") } ); Evernote.Logger.debug( "bgStyle: " + nodeBgStyle.toString() ); return nodeBgStyle; }; Evernote.ClipFullStylingStrategy.prototype.getOffsetRect = function ( elem ) { Evernote.Logger.debug( "ClipCSSStyleWalker.getOffsetRect()" ); var box = Evernote.ElementExtension.getBoundingClientRect(elem); var body = elem.ownerDocument.body; var docElem = elem.ownerDocument.documentElement; var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop; var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft; var clientTop = docElem.clientTop || body.clientTop || 0; var clientLeft = docElem.clientLeft || body.clientLeft || 0; var top = box.top + scrollTop - clientTop; var left = box.left + scrollLeft - clientLeft; return { top:Math.round( top ), left:Math.round( left ), width:box.width, height:box.height }; };</script><script defer="" type="text/javascript" charset="ANSI">//"use strict"; Evernote.ClipRules = { isNoKeepNodeAttr : function( attribute, nodeName, node ) { if ( !attribute ) { return true; } var attrName = attribute.name.toLowerCase(); var attrValue = attribute.value.toLowerCase(); if((node.nodeName.toUpperCase() == "SPAN" || node.nodeName.toUpperCase() == "A") && node.getElementsByTagName( "IMG" ).length > 0) { nodeName = "div"; } var attributesToKeepForNode = this.KEEP_NODE_ATTRIBUTES[nodeName]; if(attributesToKeepForNode) { var keepAttributeForNode = typeof attributesToKeepForNode[attrName] != 'undefined'; } return typeof this.NOKEEP_NODE_ATTRIBUTES[ attrName ] != 'undefined' || !keepAttributeForNode || attrName.substring( 0, 2 ) == "on" || attrName.indexOf("xml") == 0 || attrValue.indexOf("function(") >= 0 || (attrName == "href" && attrValue.substring( 0, 11 ) == "javascript_:"); }, isConditionalNode : function( node ) { return node && typeof this.CONDITIONAL_NODES[ node.nodeName.toUpperCase() ] != 'undefined'; }, translateNode : function( node ) { var nodeName = this.NODE_NAME_TRANSLATIONS[ node.nodeName.toUpperCase() ] || node.nodeName.toUpperCase(); return (typeof this.SUPPORTED_NODES[ nodeName ] != "undefined") ? nodeName.toLowerCase() : this.NODE_NAME_TRANSLATIONS[ "*" ].toLowerCase(); }, isSupportedNode : function( node ) { return node && typeof this.SUPPORTED_NODES[ node.nodeName.toUpperCase() ] != 'undefined'; }, isRejectedNode : function( node ) { return node && typeof this.REJECTED_NODES[ node.nodeName.toUpperCase() ] != 'undefined'; }, isNonAncestorNode : function( node ) { return node && typeof this.NON_ANCESTOR_NODES[ node.nodeName.toUpperCase() ] != 'undefined'; }, isSelfClosingNode : function( node ) { return node && typeof this.SELF_CLOSING_NODES[ node.nodeName.toUpperCase() ] != 'undefined'; } }; Evernote.ClipRules.KEEP_NODE_ATTRIBUTES = { "a" : { "title": null, "dir" : null, "accesskey": null, "charset": null, "type": null, "name": null, "href": null, "hreflang": null, "rel": null, "rev": null, "shape": null, "coords": null, "target": null }, "abbr" : { "title": null, "dir" : null }, "acronym" : { "title": null, "dir" : null }, "address" : { "title": null, "dir" : null }, "area" : { "title": null, "dir" : null, "accesskey": null, "shape": null, "coords": null, "href": null, "nohref": null, "alt": null, "target": null }, "b" : { "title": null, "dir" : null }, "bdo" : { "title": null, "dir" : null }, "big" : { "title": null, "dir" : null }, "blockquote" : { "title": null, "dir" : null, "cite": null }, "br" : { "title": null, "clear": null }, "caption" : { "title": null, "dir" : null, "align": null }, "center" : { "title": null, "dir" : null }, "cite" : { "title": null, "dir" : null }, "code" : { "title": null, "dir" : null }, "col" : { "title": null, "dir" : null, "span" : null, "width" : null, "align" : null, "char" : null, "charoff" : null, "valign" : null }, "colgroup" : { "title": null, "dir" : null, "span" : null, "width" : null, "align" : null, "char" : null, "charoff" : null, "valign" : null }, "dd" : { "title": null, "dir" : null }, "del" : { "title": null, "dir" : null, "cite" : null, "datetime" : null }, "dfn" : { "title": null, "dir" : null }, "div" : { "title": null, "dir" : null, "align" : null }, "dl": { "title": null, "dir" : null, "compact" : null }, "dt": { "title": null, "dir" : null }, "em": { "title": null, "dir" : null }, "font": { "title": null, "dir" : null, "size" : null, "color" : null, "face" : null }, "h1": { "title": null, "dir" : null, "align" : null }, "h2": { "title": null, "dir" : null, "align" : null }, "h3": { "title": null, "dir" : null, "align" : null }, "h4": { "title": null, "dir" : null, "align" : null }, "h5": { "title": null, "dir" : null, "align" : null }, "h6": { "title": null, "dir" : null, "align" : null }, "hr": { "title": null, "dir" : null, "align" : null, "noshade" : null, "size" : null, "width" : null }, "i": { "title": null, "dir" : null }, "img": { "title": null, "dir" : null, "src" : null, "alt" : null, "name" : null, "longdesc" : null, "height" : null, "width" : null, "usemap" : null, "ismap" : null, "align" : null, "border" : null, "hspace" : null, "vspace" : null }, "en-media": { "type" : null, "hash" : null, "title" : null, "dir" : null, "alt" : null, "longdesc" : null, "height" : null, "width" : null, "usemap" : null, "align" : null, "border" : null, "hspace" : null, "vspace" : null }, "ins": { "title": null, "dir" : null, "cite" : null, "datetime" : null }, "kbd": { "title": null, "dir" : null }, "li": { "title": null, "dir" : null, "type" : null, "value" : null }, "map": { "dir" : null, "title" : null, "name" : null }, "ol": { "title" : null, "dir" : null, "type" : null, "compact" : null, "start" : null }, "p": { "title" : null, "dir" : null, "align" : null }, "pre": { "title" : null, "dir" : null, "width" : null }, "s": { "title" : null, "dir" : null }, "samp": { "title" : null, "dir" : null }, "small": { "title" : null, "dir" : null }, "span": { "title" : null, "dir" : null }, "strike": { "title" : null, "dir" : null }, "strong": { "title" : null, "dir" : null }, "sub": { "title" : null, "dir" : null }, "sup": { "title" : null, "dir" : null }, "table": { "title" : null, "dir" : null, "summary" : null, "width" : null, "border" : null, "cellspacing" : null, "cellpadding" : null, "align" : null, "bgcolor" : null }, "tbody": { "title" : null, "dir" : null, "align" : null, "char" : null, "charoff" : null, "valign" : null }, "td": { "title" : null, "dir" : null, "align" : null, "char" : null, "charoff" : null, "valign" : null, "abbr" : null, "rowspan" : null, "colspan" : null, "nowrap" : null, "bgcolor" : null, "width" : null, "height" : null }, "tfoot": { "title" : null, "dir" : null, "align" : null, "char" : null, "charoff" : null, "valign" : null }, "th": { "title" : null, "dir" : null, "align" : null, "char" : null, "charoff" : null, "valign" : null, "abbr" : null, "rowspan" : null, "colspan" : null, "nowrap" : null, "bgcolor" : null, "width" : null, "height" : null }, "thead": { "title" : null, "dir" : null, "align" : null, "char" : null, "charoff" : null, "valign" : null }, "tr": { "title" : null, "dir" : null, "align" : null, "char" : null, "charoff" : null, "valign" : null, "bgcolor" : null }, "tt": { "title" : null, "dir" : null }, "u": { "title" : null, "dir" : null }, "ul": { "title" : null, "dir" : null, "type" : null, "compact" : null }, "var": { "title" : null, "dir" : null } }; Evernote.ClipRules.NOKEEP_NODE_ATTRIBUTES = { "style" : null, "tabindex" : null }; Evernote.ClipRules.CONDITIONAL_NODES = { "EMBED" : null, "OBJECT" : null, "IMG" : null, "VIDEO" : null }; Evernote.ClipRules.NODE_NAME_TRANSLATIONS = { "HTML" : "DIV", "BODY" : "DIV", "FORM" : "DIV", "CANVAS" : "DIV", "CUFON" : "DIV", "EMBED" : "IMG", "BUTTON" : "SPAN", "INPUT" : "SPAN", "LABEL" : "SPAN", "BDI" : "SPAN", "IMG" : "EN-MEDIA", "*" : "DIV" }; Evernote.ClipRules.SUPPORTED_NODES = { "A" : null, "ABBR" : null, "ACRONYM" : null, "ADDRESS" : null, "AREA" : null, "B" : null, "BUTTON" : null, "BDO" : null, "BIG" : null, "BLOCKQUOTE" : null, "BR" : null, "CAPTION" : null, "CENTER" : null, "CITE" : null, "CODE" : null, "COL" : null, "COLGROUP" : null, "DD" : null, "DEL" : null, "DFN" : null, "DIV" : null, "DL" : null, "DT" : null, "EM" : null, "FONT" : null, "FORM" : null, "H1" : null, "H2" : null, "H3" : null, "H4" : null, "H5" : null, "H6" : null, "HR" : null, "HTML" : null, "I" : null, "IMG" : null, "EN-MEDIA" : null, "INPUT" : null, "INS" : null, "KBD" : null, "LI" : null, "MAP" : null, "OL" : null, "P" : null, "PRE" : null, "Q" : null, "S" : null, "SAMP" : null, "SMALL" : null, "SPAN" : null, "STRIKE" : null, "STRONG" : null, "SUB" : null, "SUP" : null, "TABLE" : null, "TBODY" : null, "TD" : null, "TFOOT" : null, "TH" : null, "THEAD" : null, "TR" : null, "TT" : null, "U" : null, "UL" : null, "VAR" : null }; Evernote.ClipRules.REJECTED_NODES = { "SCRIPT" : null, "LINK" : null, "IFRAME" : null, "STYLE" : null, "SELECT" : null, "OPTION" : null, "OPTGROUP" : null, "NOSCRIPT" : null, "PARAM" : null, "HEAD" : null, "EVERNOTEDIV" : null, "CUFONTEXT" : null, "NOEMBED" : null }; Evernote.ClipRules.NON_ANCESTOR_NODES = { "OL" : null, "UL" : null, "LI" : null }; Evernote.ClipRules.SELF_CLOSING_NODES = { "IMG" : null, //"INPUT" : null, "BR" : null }; </script><script defer="" type="text/javascript" charset="ANSI">/** * ClipStyle is a container for CSS styles. It is able to add and remove * CSSStyleRules (and parse CSSRuleList's for rules), as well as * CSSStyleDeclaration's and instances of itself. * ClipStyle provides a mechanism to serialize itself via toString(), and * reports its length via length property. It also provides a method to clone * itself and expects to be manipulated via addStyle and removeStyle. */ Evernote.ClipStyle = function ClipStyle( css, filterFn, styleList ) { this.initialize( css, filterFn, styleList ); }; Evernote.ClipStyle.STYLES = [ "background", "background-attachment", "background-clip", "background-color", "background-image", "background-origin", "background-position-x", "background-position-y", "background-position", "background-repeat", "background-size", "border-bottom", "border-bottom-color", "border-bottom-left-radius", "border-bottom-right-radius", "border-bottom-style", "border-bottom-width", "border-left", "border-left-color", "border-left-style", "border-left-width", "border-right", "border-right-color", "border-right-style", "border-right-width", "border-top", "border-top-color", "border-top-left-radius", "border-top-right-radius", "border-top-style", "border-top-width", "border-collapse", "border-spacing", "bottom", "box-shadow", "caption-side", "clear", "clip", "color", "content", "counter-increment", "counter-reset", "cursor", "direction", "display", "empty-cells", "float", "font", "font-family", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-variant", "font-weight", "height", "ime-mode", "left", "letter-spacing", "line-height", "list-style", "list-style-image", "list-style-position", "list-style-type", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "marker-offset", "max-height", "max-width", "min-height", "min-width", "opacity", "outline", "outline-color", "outline-offset", "outline-style", "outline-width", "overflow", "overflow-x", "overflow-y", "padding", "padding-bottom", "padding-left", "padding-right", "padding-top", "page-break-after", "page-break-before", "pointer-events", "position", "resize", "right", "table-layout", "text-align", "text-anchor", "text-decoration", "text-indent", "text-overflow", "text-shadow", "text-transform", "top", "vertical-align", "visibility", "white-space", "width", "word-spacing", "word-wrap", "z-index" ]; Evernote.ClipStyle.NO_INHERIT_STYLES = { "*":[ "background", "background-image", "background-color", "background-position", "background-repeat", "border-bottom", "border-bottom-color", "border-bottom-left-radius", "border-bottom-right-radius", "border-bottom-style", "border-bottom-width", "border-left", "border-left-color", "border-left-style", "border-left-width", "border-right", "border-right-color", "border-right-style", "border-right-width", "border-top", "border-top-color", "border-top-left-radius", "border-top-right-radius", "border-top-style", "border-top-width", "border-collapse", "border-spacing", "bottom", "clear", "display", "float", "height", "left", "list-style", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "padding", "padding-bottom", "padding-left", "padding-right", "padding-top", "right", "text-decoration", "top", "width" ], "img":[ "height", "width" ] }; Evernote.ClipStyle.CSS_GROUP = { "margin":[ "left", "right", "top", "bottom" ], "padding":[ "left", "right", "top", "bottom" ], "border":[ "width", "style", "color" ], "border-bottom":[ "width", "style", "color" ], "border-top":[ "width", "style", "color" ], "border-right":[ "width", "style", "color" ], "border-left":[ "width", "style", "color" ], "border-image":[ "outset", "repeat", "slice", "source", "width" ], "background":[ "attachment", "color", "image", "position", "repeat", "clip", "origin", "size" ], "font":[ "family", "size", "style", "variant", "weight", "size-adjust", "stretch", "+line-height" ], "list-style":[ "image", "position", "type" ] }; Evernote.ClipStyle.CSS_GROUP.getExtForStyle = function ( name ) { var list = this[ name ]; var extList = [ ]; if ( list ) { for ( var i = 0; i < list.length; ++i ) { if ( list[ i ].indexOf( "+" ) >= 0 ) { var tmp = list[ i ]; extList.push( tmp.replace( "+", "" ) ); } else { extList.push( name + "-" + list[ i ] ); } } return extList; } return null; }; Evernote.ClipStyle.STYLE_ATTRIBUTES = { "bgcolor":"background-color", "text":"color" }; Evernote.ClipStyle.INHERITED_STYLES = [ "azimuth", "border-collapse", "border-spacing", "caption-side", "color", "cursor", "direction", "elevation", "empty-cells", "font-family", "font-size", "font-style", "font-weight", "font", "letter-spacing", "line-height", "list-style-image", "list-style-position", "list-style-type", "list-style", "orphans", "pitch-range", "pitch", "quotes", "richness", "speak-header", "speak-numeral", "speak-punctuation", "speak", "speak-rate", "stress", "text-align", "text-indent", "text-transform", "visibility", "voice-family", "volume", "white-space", "widows", "word-spacing" ]; Evernote.ClipStyle.prototype._collection = null; Evernote.ClipStyle.prototype._filterFn = null; Evernote.ClipStyle.prototype._styleList = null; Evernote.ClipStyle.prototype.initialize = function ( css, filterFn, styleList ) { Evernote.Logger.debug( "ClipStyle.initialize()" ); this._collection = new Evernote.StylesCollection(); Evernote.Logger.debug( "ClipStyle.initialize: collection initialized()" ); this._filterFn = (typeof filterFn == "function") ? filterFn : null; this._styleList = (styleList != null) ? styleList : Evernote.ClipStyle.STYLES; if(css) { this.addStyle( css, this._styleList ); } Evernote.Logger.debug( "ClipStyle.initialize() end "); }; Evernote.ClipStyle.prototype.fixBackground = function ( prop, value ) { if(prop && value) { if(prop.indexOf("background-image") != -1 && value.indexOf("url") != -1) { Evernote.Logger.debug("Start replace"); var regExp = /url\((.*?)\)/; var res = value.replace(regExp, "url('$1')").replace(/('")|("')|('')/g, "'"); Evernote.Logger.debug("End replace"); return Evernote.GlobalUtils.escapeXML(res); } } return value; }; Evernote.ClipStyle.prototype.addStyle = function ( style, styleList ) { Evernote.Logger.debug( "ClipStyle.addStyle()" ); if ( style.length > 0 ) { var list = (styleList != null) ? styleList : this._styleList; for ( var i = 0; i < list.length; ++i ) { var prop = list[ i ]; var value = Evernote.StyleElementExtension.getPropertyValue(style, prop ); var importantPriority = !!((style.getPropertyPriority(prop) == 'important')); value = this.fixBackground(prop, value); this.addSimpleStyle( prop, value, importantPriority ); } } else if ( style instanceof Evernote.ClipStyle ) { list = (styleList != null) ? styleList : style.getStylesNames(); for ( var i = 0; i < list.length; ++i ) { var prop = list[ i ]; value = style.getStyle( prop ); importantPriority = style.isImportant( prop ); value = this.fixBackground(prop, value); this.addSimpleStyle( prop, value, importantPriority ); } } else if ( typeof style == 'object' && style != null ) { list = (styleList != null) ? styleList : style; for ( var prop in list ) { // In some cases, attempt to get currentStyle.outline ( or outlineWidth ) property in IE8 throws // 'unspecified error' and crash whole serilization process. So we wrap it into try {...} catch. try { if ( list.hasOwnProperty( prop ) ) { var usedStyle = style[ prop ]; var pName = prop; if(!usedStyle) { usedStyle = style [list[prop]]; pName = list[prop]; if(!usedStyle) { var propName = Evernote.IEStylePropertiesMapping.getPropertyNameFor(list[prop]); if(propName) { usedStyle = style[propName[1]]; } } } usedStyle = this.fixBackground(pName, usedStyle); this.addSimpleStyle( pName, usedStyle ); } } catch (err) {} } } }; Evernote.ClipStyle.prototype.removeStyle = function ( style ) { Evernote.Logger.debug( "ClipStyle.removeStyle()" ); if(style) { if ( window.CSSStyleDeclaration && Evernote.Utils.isInstanceOf(style, window.CSSStyleDeclaration) || style instanceof Array ) { for ( var i = 0; i < style.length; ++i ) { this.removeSimpleStyle( style[ i ] ); } } else if ( style instanceof Evernote.ClipStyle ) { var stylesNames = style.getStylesNames(); for ( i = 0; i < stylesNames.length; ++i ) { this.removeSimpleStyle( stylesNames[ i ] ); } } else if ( typeof style == 'string' ) { this.removeSimpleStyle( style ); } } Evernote.Logger.debug("ClipStyle.removeStyle() end") }; Evernote.ClipStyle.prototype.mergeStyle = function ( style, override ) { Evernote.Logger.debug( "ClipStyle.mergeStyle()" ); if ( style instanceof Evernote.ClipStyle ) { var stylesNames = style.getStylesNames(); for ( var i = 0; i < stylesNames.length; ++i ) { var styleName = stylesNames[ i ]; var styleValue = this._collection.getStyle( styleName ); if ( styleValue == null || override || (style.isImportant( styleName ) && !this._collection.isImportant( styleName )) ) { var newValue = style.getStyle( styleName ); if ( style.isImportant( styleName ) ) { this._collection.addStyle( styleName, newValue, true ); } else if ( override && !this._collection.isImportant( styleName ) ) { this._collection.addStyle( styleName, newValue, false ); } else if ( styleValue == null && !override ) { this._collection.addStyle( styleName, newValue, style.isImportant( styleName ) ); } } } } }; Evernote.ClipStyle.prototype.getStylesNames = function () { return this._collection.getStylesNames(); }; Evernote.ClipStyle.prototype.getStyle = function ( prop ) { return this._collection.getStyle( prop ); }; Evernote.ClipStyle.prototype.isImportant = function ( prop ) { return this._collection.isImportant( prop ); }; Evernote.ClipStyle.prototype.addSimpleStyle = function ( prop, value, importantPriority ) { if ( typeof this._filterFn == "function" && !this._filterFn( prop, value ) ) { return; } var impl = Evernote.StylesReplacementRegistry.getImplementationFor(prop); if(impl && impl.getValue) { value = impl.getValue(value); } this._collection.addStyle( prop, value, importantPriority ); }; Evernote.ClipStyle.prototype.removeSimpleStyle = function ( prop ) { this._collection.removeStyle( prop ); }; Evernote.ClipStyle.prototype.toString = function () { var str = ""; var stylesNames = this.getStylesNames(); for ( var i = 0; i < stylesNames.length; ++i ) { var styleName = stylesNames[ i ]; var value = this._collection.getStyle( styleName ); if ( value != null && value.length > 0 ) { str += styleName + ":" + value + ";"; } } return str; }; Evernote.ClipStyle.CSSDefaultStyle = { "background-attachment": "scroll", "background-color" : "transparent", "background-image" : "none", "background-position-x" : "0px", "background-position-y" : "0px", "background-repeat" : "repeat", "border-bottom-style" : "none", "border-bottom-width" : "medium", "border-left-style" : "none", "border-left-width" : "medium", "border-right-style" : "none", "border-right-width" : "medium", "border-top-style" : "none", "border-top-width" : "medium", "border-collapse" : "separate", "bottom" : "auto", "clear" : "none", "height" : "auto", "left" : "auto", "margin-bottom" : "0px", "margin-left" : "0px", "margin-right" : "0px", "margin-top" : "0px", "max-height" : "none", "max-width" : "none", "min-height" : "0px", "min-width" : "0px", "overflow" : "visible", "overflow-x" : "visible", "overflow-y" : "visible", "padding" : "0px", "padding-bottom" : "0px", "padding-left" : "0px", "padding-right" : "0px", "padding-top" : "0px", "page-break-before" : "auto", "page-break-after" : "auto", "position" : "static", "right" : "auto", "text-align" : "left", "text-decoration" : "none", "text-indent" : "0px", "text-overflow" : "clip", "top" : "auto", "width" : "auto" }; Evernote.ClipStyle.prototype.removeDefaultCssStyle = function () { var stylesNames = this.getStylesNames(); for ( var i = 0; i < stylesNames.length; ++i ) { var styleName = stylesNames[ i ]; var defaultCssValue = Evernote.ClipStyle.CSSDefaultStyle[styleName]; var value = this.getStyle( styleName ); if (!value) continue; if (defaultCssValue == value) { this.removeStyle(styleName); } } };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.ClipStyleProperty = function ClipStyleProperty( name, value, isImportant ) { this.initialize( name, value, isImportant ); }; Evernote.ClipStyleProperty.prototype.initialize = function( name, value, isImportant ) { if ( typeof name == "string" && typeof value == "string" ) { this._name = name; this._value = value; } this._isImportant = (isImportant) ? true : false; }; Evernote.ClipStyleProperty.prototype._name = null; Evernote.ClipStyleProperty.prototype._value = null; Evernote.ClipStyleProperty.prototype._isImportant = null; Evernote.ClipStyleProperty.prototype.name = function() { return this._name; }; Evernote.ClipStyleProperty.prototype.value = function() { return this._value; }; Evernote.ClipStyleProperty.prototype.isImportant = function() { return this._isImportant; };</script><script defer="" type="text/javascript" charset="ANSI">/** * Represents DOM parser that could able to traverse the DOM node tree from specified root. * @param tab - current window object * @param range - current selection on the page (if any) * @constructor */ Evernote.DomParser = function DomParser( tab, range ) { this.initialize( tab, range ); }; Evernote.DomParser.prototype._tab = null; /** * Update current parser data * @param tab - current window object * @param range - current selection on the page (if any) */ Evernote.DomParser.prototype.initialize = function ( tab, range ) { Evernote.Logger.debug( "DomSerializer.initialize()" ); this._tab = tab; this._range = range; }; /** * Determines if passed node should be serialized. * Node should not be initialized if one of the following is true: * - node is rejected according to configuration * - there is the selection on the page and this node is out of selection range. * @param node - DOM node * @return {Boolean} */ Evernote.DomParser.prototype.isNodeForSerialize = function ( node ) { if ( !node || Evernote.ClipRules.isRejectedNode( node ) || node.id == "evernoteContentClipperWait" ) { return false; } if(Evernote.ClipperElementsIdentifiers.match(node)) { Evernote.Logger.debug("Node is rejected because it is clipper information " + node.id); return false; } return (!this._range || this.isNodeInRange( node )) ? true : false; }; /** * Determines whether passed node is inside the selection range. Returns true if it is, false otherwise. * @param node - DOM node * @return {Boolean} */ Evernote.DomParser.prototype.isNodeInRange = function ( node ) { Evernote.Logger.debug( "DomParser.isNodeInRange()" ); var nodeRange, endsAfterNodeStart, startsBeforeNodeEnd; if (typeof node.ownerDocument.createRange == 'function') { // ie9, ie10, ie11 if ( node && this._range ) { nodeRange = node.ownerDocument.createRange(); // create new selection from node, or node content try { nodeRange.selectNode( node ); } catch ( e ) { nodeRange.selectNodeContents( node ); } // compare boundary points of selection and current node. endsAfterNodeStart = this._range.compareBoundaryPoints( Range.START_TO_END, nodeRange ) == 1; startsBeforeNodeEnd = this._range.compareBoundaryPoints( Range.END_TO_START, nodeRange ) == -1; return endsAfterNodeStart && startsBeforeNodeEnd; } } else { // ie7 , ie8 nodeRange = node.ownerDocument.body.createTextRange(); try { nodeRange.moveToElementText(node); } catch (e) { // [object Text] // probably, here should be analog for createRange().selectNodeContents(); return true; } endsAfterNodeStart = this._range.compareEndPoints('EndToStart', nodeRange) == 1; startsBeforeNodeEnd = this._range.compareEndPoints('StartToEnd', nodeRange) == -1; return endsAfterNodeStart && startsBeforeNodeEnd; } return false; // not found. }; /** * Determines whether passed node is visible on the page. * @param node - DOM node. * @return {Boolean} */ Evernote.DomParser.prototype.isNodeVisible = function ( node ) { Evernote.Logger.debug( "DomParser.isNodeVisible()" ); if ( !node ) { return false; } var compStyles = Evernote.ElementExtension.getComputedStyle( node, null, this._tab ); return Evernote.StyleElementExtension.getPropertyValue(compStyles, "display" ) != "none"; }; Evernote.DomParser.prototype.parseAsync = function ( root, fullPage, serializer, callback ) { var PARSING_TIMEOUT_INTERVAL = 1000; //milliseconds if (!callback) { this.parse(root, fullPage, serializer); return; } if ( !root ) { throw new Error( "No root element for parsing" ); } var node = root; var parentNode = null; var thizz = this; var asyncParser = function() { var parsingEnd = true; var startTimeParsing = new Date().getTime(); while ( node ) { if ( node != root && node.parentNode ) { parentNode = node.parentNode.serializedNode; } if ( thizz.isNodeForSerialize( node ) ) { if ( node.nodeType == Evernote.Node.TEXT_NODE ) { serializer.textNode( node, thizz._range ); } else if ( node.nodeType == Evernote.Node.ELEMENT_NODE && thizz.isNodeVisible( node ) ) { node.serializedNode = serializer.startNode( new Evernote.SerializedNode( node, parentNode ), root, fullPage ); if ( node.hasChildNodes() ) { node = node.childNodes[ 0 ]; continue; } else { serializer.endNode( node.serializedNode ); if ( node.serializedNode ) { try { delete node.serializedNode; } catch(e) { //If we are failed to delete the property, than just set it to undefined node.serializedNode = undefined; } } } } } /** * Check if there is a next node available and it is not the root */ if ( node.nextSibling && node != root ) { node = node.nextSibling; } else if ( node != root ) { while ( node.parentNode && node != root ) { node = node.parentNode; try { serializer.endNode( node.serializedNode ); } catch (err) { node.serializedNode = undefined; continue; }; try { delete node.serializedNode; } catch (e) { //If we are failed to delete the property, than just set it to undefined node.serializedNode = undefined; } if ( node.nextSibling && node != root ) { node = node.nextSibling; break; } } if ( node == root ) { break; } } else { break; } var endTimeParsing = new Date().getTime(); if ( (endTimeParsing - startTimeParsing) >= PARSING_TIMEOUT_INTERVAL ) { Evernote.Logger.debug("Parsing interval timeout: " + (endTimeParsing - startTimeParsing)); parsingEnd = false; break; } } if (parsingEnd) { Evernote.Logger.debug("Parsing end"); callback(); }else { Evernote.Logger.debug("Parsing repeat"); setTimeout(asyncParser, 0); } }; setTimeout(asyncParser, 0); }; /** * Starts parsing from specified root. * @param root - starting DOM node. * @param fullPage - is user selects to serialize the full page * @param serializer - current serializer to be used to serialize the DOM node to string */ Evernote.DomParser.prototype.parse = function ( root, fullPage, serializer ) { Evernote.Logger.debug( "DomParser.parse()" ); if ( !root ) { throw new Error( "No root element for parsing" ); } var node = root; var parentNode = null; while ( node ) { if ( node != root && node.parentNode ) { parentNode = node.parentNode.serializedNode; } if ( this.isNodeForSerialize( node ) ) { if ( node.nodeType == Evernote.Node.TEXT_NODE ) { serializer.textNode( node, this._range ); } else if ( node.nodeType == Evernote.Node.ELEMENT_NODE && this.isNodeVisible( node ) ) { node.serializedNode = serializer.startNode( new Evernote.SerializedNode( node, parentNode ), root, fullPage ); if ( node.hasChildNodes() ) { node = node.childNodes[ 0 ]; continue; } else { serializer.endNode( node.serializedNode ); if ( node.serializedNode ) { try { delete node.serializedNode; } catch(e) { //If we are failed to delete the property, than just set it to undefined node.serializedNode = undefined; } } } } } /** * Check if there is a next node available and it is not the root */ if ( node.nextSibling && node != root ) { node = node.nextSibling; } else if ( node != root ) { while ( node.parentNode && node != root ) { node = node.parentNode; try { serializer.endNode( node.serializedNode ); } catch (err) { node.serializedNode = undefined; continue; }; try { delete node.serializedNode; } catch (e) { //If we are failed to delete the property, than just set it to undefined node.serializedNode = undefined; } if ( node.nextSibling && node != root ) { node = node.nextSibling; break; } } if ( node == root ) { break; } } else { break; } } };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.NodeSerializer = function NodeSerializer( tab, styleStrategy, includeBg , isRange) { this.initialize( tab, styleStrategy, includeBg , isRange); }; Evernote.NodeSerializer.prototype._tab = null; Evernote.NodeSerializer.prototype._styleStrategy = null; Evernote.NodeSerializer.prototype._docBase = null; Evernote.NodeSerializer.prototype._imagesUrls = null; Evernote.NodeSerializer.prototype._isRange = null; Evernote.NodeSerializer.prototype._serializedDom = ""; Evernote.NodeSerializer.prototype._includeBgStyles = true; Evernote.NodeSerializer.prototype.initialize = function ( tab, styleStrategy, includeBg ,isRange ) { Evernote.Logger.debug( "DomSerializer.initialize()" ); this._tab = tab; this._styleStrategy = (styleStrategy instanceof Evernote.ClipStylingStrategy) ? styleStrategy : null; this._imagesUrls = [ ]; this._includeBgStyles = ( includeBg != null ) ? includeBg : true; this._isRange = ( isRange != null ) ? isRange : false; this.getDocumentBase(); }; Evernote.NodeSerializer.prototype.startNode = function ( serializedNode, root, fullPage ) { Evernote.Logger.debug( "Start to serialize node :" + serializedNode.node.nodeName + ", class = " + serializedNode.node.className + ", id = " + serializedNode.node.id ); try { var node = serializedNode.node; if ( Evernote.ClipRules.isConditionalNode( node ) && Evernote.ElementSerializerFactory.getImplementationFor( node ) != null ) { var result = this.serializeConditionalNode( node, root, fullPage ); this._serializedDom += result.content; // hack for desktop Win client if ( result.imageUrl ) { this._imagesUrls.push( result.imageUrl ); } serializedNode.setStyle(result.nodeStyle); return serializedNode; } if ( node.nodeName.toLowerCase() == "embed" ) { var src = node.getAttribute( "src" ); if ( src && (src.indexOf(".swf", src.length - ".swf".length) !== -1) ) { serializedNode.setStyle(new Evernote.ClipStyle()); return serializedNode; } } if ( node.nodeName.toLowerCase() == "img" ) { var src = node.getAttribute( "src" ); if (src && src.indexOf('&') != -1) { src = src.slice(0, src.indexOf('&')); } var absoluteSource = Evernote.Utils.makeAbsolutePath(this._docBase, src).replace(/\s/g, "%20"); node.setAttribute( "type", "put-media-type-here-for-" + absoluteSource); node.setAttribute( "hash", "put-hash-type-here-for-" + absoluteSource); node.setAttribute( "src", src); if ( src && src.indexOf( "data:image" ) < 0 ) { this._imagesUrls.push( src ); } } var attrsStr = this.serializeAttributes( node ); var stylesStr = ""; var nodeName = Evernote.ClipRules.translateNode( node ); if ( this._styleStrategy ) { var nodeStyle = this._styleStrategy.styleForNode( node, root, fullPage, Evernote.ClipStyleType.Default ).evaluated; var inhBgStyle = null; if ( this._includeBgStyles ) inhBgStyle = this._styleStrategy.styleForNode( node, root, fullPage, Evernote.ClipStyleType.InheritedBgStyle ).inheritedBackground; if ( inhBgStyle != null ) for ( var inhI = inhBgStyle.length - 1; inhI >= 0; inhI-- ) { var inhStyle = inhBgStyle[inhI]; this._serializedDom += "
    "; serializedNode.translateTo.push( "div" ); } var pseudoStyle = this._styleStrategy.getNodeStyle( node, null, ":before" ); if ( fullPage && node.nodeName.toLowerCase() == "body" ) { var wrapBodyStyle = new Evernote.ClipStyle( nodeStyle, null, Evernote.ClipStyle.CSS_GROUP.getExtForStyle( "background" ) ); this._serializedDom += "<" + "div" + " " + this.serializeStyles( node, wrapBodyStyle ) + " >"; serializedNode.translateTo.push( "div" ); var bgGroup = Evernote.ClipStyle.CSS_GROUP.getExtForStyle( "background" ); for ( var ind in bgGroup ) { if ( bgGroup.hasOwnProperty( ind ) ) { nodeStyle.removeStyle( bgGroup[ind] ); } } } // Bug 47705. dirty fix, may cause problems in some cases. if (this._isRange) { nodeStyle.addSimpleStyle('height', node.currentStyle.height); } if ( !fullPage && node == root ) { nodeStyle.removeStyle( "float" ); } if ( !serializedNode.node.hasChildNodes() && !(nodeStyle.getStyle( "height" ) || node.getAttribute( "height" )) ) { nodeStyle.addStyle( {height:"0px"} ); } if ( !serializedNode.node.hasChildNodes() && !(nodeStyle.getStyle( "width" ) || node.getAttribute( "width" )) ) { nodeStyle.addStyle( {width:"0px"} ); } if(nodeStyle.getStyle("position") == "fixed") { nodeStyle.addStyle({position: "absolute"}); } if ( (node.nodeName.toUpperCase() == "SPAN"/* || node.nodeName.toUpperCase() == "A"*/) && node.getElementsByTagName( "IMG" ).length > 0) { nodeName = "div"; if ( !nodeStyle.getStyle( "display" ) ) nodeStyle.addStyle( {display:"inline"} ); } if (node.nodeName.toUpperCase() == "TH" || node.nodeName.toUpperCase() == "TD") { nodeStyle.addStyle( {display:"table-cell"} ); } nodeStyle.removeDefaultCssStyle(); this._serializedDom += this.serializePseudoElement( node, pseudoStyle ); stylesStr = this.serializeStyles( node, nodeStyle ); if ( (nodeName.toLowerCase() == "div" /*|| nodeName.toLowerCase() == "span"*/) && nodeStyle.getStyle( "float" ) && nodeStyle.getStyle( "float" ) != "none" && serializedNode.parentNode && node.parentNode.nodeName.toLowerCase() != "a" ) { if ( !serializedNode.node.nextSibling || serializedNode.node.nextSibling.nodeType == 3 ) serializedNode.parentNode.isInlineBlock = true; } } Evernote.Logger.debug( node.nodeName + " " + attrsStr + " -> " + nodeName + " " + stylesStr ); this._serializedDom += "<" + nodeName + " " + attrsStr + " " + stylesStr + " >"; serializedNode.setStyle(nodeStyle); serializedNode.translateTo.push( nodeName ); return serializedNode; } catch ( e ) { Evernote.Logger.error( "Failed to start serialize node :" + e ); throw e; } }; Evernote.NodeSerializer.prototype.serializePseudoElement = function ( node, pseudoStyle ) { try { var nodeName = Evernote.ClipRules.translateNode( node ); if ( pseudoStyle.getStylesNames().length > 0 ) { var content = " "; if ( pseudoStyle.getStyle( "content" ) ) { content = pseudoStyle.getStyle( "content" ); pseudoStyle.removeStyle( "content" ); } var beforeStylesStr = this.serializeStyles( node, pseudoStyle ); return "<" + nodeName + " " + beforeStylesStr + " >" + content.replace( /"/g, '' ) + "</" + nodeName + ">"; } return ""; } catch ( e ) { Evernote.Logger.error( "Failed to serialize pseudo element :" + e ); throw e; } }; Evernote.NodeSerializer.prototype.textNode = function ( node, range ) { this._serializedDom += this.serializeTextNode( node, range ); }; Evernote.NodeSerializer.prototype.endNode = function ( serializedNode ) { try { Evernote.Logger.debug( "end serialize node :" + serializedNode.translateTo ); if ( serializedNode.isInlineBlock ) { var name = "div"; if ( serializedNode.node.nodeName.toLowerCase() == "ul" ) { name = "li" } this._serializedDom += "<" + name + " style=\"clear: both; width: 0px; height: 0px;\">" + " " + "</" + name + ">" } var node = serializedNode.node; var serializedPseudo = ""; var pseudoStyle = new Evernote.ClipStyle(); if ( this._styleStrategy ) { pseudoStyle = this._styleStrategy.getNodeStyle( node, null, ":after" ); if ( pseudoStyle.getStylesNames().length > 0 ) { var floatStyle = serializedNode.getStyle().getStyle( "float" ); if ( floatStyle && !pseudoStyle.getStyle( "float" ) ) pseudoStyle.addStyle( { "float" : floatStyle } ); if ( node.nodeName.toLowerCase() == "ul" ) serializedPseudo = this.serializePseudoElement( document.createElement( "div" ), pseudoStyle ); } } while ( serializedNode.translateTo.length > 0 ) { var nodeName = serializedNode.translateTo.pop(); if ( !Evernote.ClipRules.isSelfClosingNode( serializedNode.node ) ) { if ( !serializedNode.node.hasChildNodes() ) this._serializedDom += " "; } if ( nodeName.toLowerCase() == "ul" ) { this._serializedDom += this.serializePseudoElement( document.createElement( "li" ), pseudoStyle ); } this._serializedDom += "</" + nodeName + ">"; } this._serializedDom += serializedPseudo; } catch ( e ) { Evernote.Logger.error( "Failed to end serialize node :" + e ); throw e; } }; Evernote.NodeSerializer.prototype.serializeTextNode = function ( node, range ) { Evernote.Logger.debug( "DomSerializer.serializeTextNode()" ); try { var nodeValue = node.nodeValue; if ( !range ) { return Evernote.Utils.htmlEncode( nodeValue ); } else { if ( range.startContainer == node && range.startContainer == range.endContainer ) { return Evernote.Utils.htmlEncode( nodeValue.substring( range.startOffset, range.endOffset ) ); } else if ( range.startContainer == node ) { return Evernote.Utils.htmlEncode( nodeValue.substring( range.startOffset ) ); } else if ( range.endContainer == node ) { return Evernote.Utils.htmlEncode( nodeValue.substring( 0, range.endOffset ) ); } else if ( range.commonAncestorContainer != node ) { return Evernote.Utils.htmlEncode( nodeValue ); } } } catch ( e ) { Evernote.Logger.error( "DomSerializer.serializeTextNode() failed " + e ); throw e; } return ""; }; Evernote.NodeSerializer.prototype.serializeConditionalNode = function ( node, root, fullPage ) { Evernote.Logger.debug( "DomSerializer.serializeConditionalNode()" ); var impl = Evernote.ElementSerializerFactory.getImplementationFor( node ); if ( typeof impl == 'function' ) { var nodeStyle = (this._styleStrategy) ? this._styleStrategy.styleForNode( node, root, fullPage ).evaluated : null; if (nodeStyle) nodeStyle.removeDefaultCssStyle(); var serializer = new impl( node, nodeStyle ); var content = serializer.serialize( this._docBase ); var imageUrl = serializer.getImageUrl(); return { content:content, imageUrl:imageUrl, nodeStyle:nodeStyle }; } return { content:"", imageUrl:"", nodeStyle:new Evernote.ClipStyle() }; }; Evernote.NodeSerializer.prototype.serializeAttributes = function ( node ) { Evernote.Logger.debug( "DomSerializer.serializeAttributes()" ); try { var attrs = node.attributes; var str = ""; for ( var i = 0; i < attrs.length; ++i ) { if ( !Evernote.ClipRules.isNoKeepNodeAttr( attrs[ i ], Evernote.ClipRules.translateNode( node ), node ) ) { var attrValue = (attrs[ i ].value) ? Evernote.GlobalUtils.escapeXML( attrs[ i ].value ) : ""; if ( (attrs[ i ].name.toLowerCase() == "src" || attrs[ i ].name.toLowerCase() == "href") && attrValue.toLowerCase().indexOf( "http" ) != 0 ) { attrValue = Evernote.Utils.makeAbsolutePath( this._docBase, attrValue ); } str += " " + attrs[ i ].name.toLowerCase() + "=\"" + attrValue + "\""; } } return str; } catch ( e ) { Evernote.Logger.error( "DomSerializer.serializeAttributes() failed: error = " + e ); } return ""; }; Evernote.NodeSerializer.prototype.serializeStyles = function ( node, nodeStyle ) { Evernote.Logger.debug( "DomSerializer.serializeStyles()" ); try { var str = ""; if(node.nodeName.toLowerCase() == "map") { //Map should not have style attribute according to Evernote DTD return ""; } if ( node && nodeStyle instanceof Evernote.ClipStyle ) { str += " style=\"" + nodeStyle.toString().replace( /"/g, "" ) + "\""; } return str; } catch ( e ) { Evernote.Logger.error( "DomSerializer.serializeStyles() failed: error = " + e ); throw e; } return ""; }; Evernote.NodeSerializer.prototype.getDocumentBase = function () { Evernote.Logger.debug( "DomSerializer.getDocumentBase()" ); if ( !this._docBase ) { var baseTags = this._tab.document.getElementsByTagName( "base" ); for ( var i = 0; i < baseTags.length; ++i ) { var baseTag = baseTags[ i ]; if ( typeof baseTag == 'string' && baseTag.indexOf( "http" ) == 0 ) { this._docBase = baseTag; } if ( this._docBase ) { break; } } if ( !this._docBase ) { var location = this._tab.document.location; this._docBase = location.protocol + "//" + location.host + location.pathname.replace( /[^\/]+$/, "" ); } } return this._docBase; }; Evernote.NodeSerializer.prototype.getImagesUrls = function () { return this._imagesUrls; }; Evernote.NodeSerializer.prototype.getSerializedDom = function () { return '
    ' + this._serializedDom.replace(/[^\u0009\u000a\u000d\u0020-\uD7FF\uE000-\uFFFD]+/g, "") + '
    '; };</script><script defer="" type="text/javascript" charset="ANSI">//"use strict"; Evernote.SerializedNode = function SerializedNode( node, parent ) { this.node = node; this._parentSerializedNode = parent; this.translateTo = [ ]; }; Evernote.SerializedNode.prototype.translateTo = null; Evernote.SerializedNode.prototype.node = null; Evernote.SerializedNode.prototype._parentSerializedNode = null; Evernote.SerializedNode.prototype.setStyle = function ( clipStyle ) { this._clipStyle = clipStyle; }; Evernote.SerializedNode.prototype.getStyle = function () { return this._clipStyle; }; Evernote.SerializedNode.prototype.parentNode = function () { return this._parentSerializedNode; }; </script><script defer="" type="text/javascript" charset="ANSI">//"use strict"; Evernote.StylesCollection = function StylesCollection() { this._styles = { }; }; Evernote.StylesCollection.prototype._styles = null; Evernote.StylesCollection.prototype.addStyle = function( name, value, isImportant ) { if ( typeof name == "string" && typeof value == "string" ) { Evernote.Logger.debug( "StylesCollection.addStyle(): name = " + name + ", value = " + value + ", isImportant = " + isImportant ); this._styles[ name ] = new Evernote.ClipStyleProperty( name, value, isImportant); } }; Evernote.StylesCollection.prototype.getStyle = function( name ) { if ( typeof name == "string" ) { Evernote.Logger.debug( "StylesCollection.getStyle(): name = " + name + " value: " + ((typeof this._styles[ name ] != "undefined") ? this._styles[ name ].value() : null) ); return (typeof this._styles[ name ] != "undefined") ? this._styles[ name ].value() : null; } return null; }; Evernote.StylesCollection.prototype.removeStyle = function( name ) { if ( typeof name == "string" ) { Evernote.Logger.debug( "StylesCollection.removeStyle(): name = " + name ); this._styles[ name ] = null; delete this._styles[ name ]; } }; Evernote.StylesCollection.prototype.isImportant = function( name ) { if ( typeof name == "string" ) { return (typeof this._styles[ name ] != "undefined") ? this._styles[ name ].isImportant() : false; } }; Evernote.StylesCollection.prototype.getStylesNames = function() { Evernote.Logger.debug( "StylesCollection.getStylesNames()" ); var stylesNames = [ ]; for ( var key in this._styles ) { if ( this._styles[ key ] != null ) { stylesNames.push( key ); } } return stylesNames; }; Evernote.StylesCollection.prototype.getStylesNumber = function() { Evernote.Logger.debug( "StylesCollection.getStylesNumber()" ); var num = 0; for ( var key in this._styles ) { if ( this._styles[ key ] != null ) { ++num; } } return num; }; </script><script defer="" type="text/javascript" charset="ANSI">Evernote.DataImageSerializer = function DataImageSerializer( node, nodeStyle ) { if ( !nodeStyle ) { nodeStyle = new Evernote.ClipStyle(); } this.initialize( node, nodeStyle ); }; Evernote.inherit( Evernote.DataImageSerializer, Evernote.AbstractElementSerializer, true ); Evernote.DataImageSerializer.isResponsibleFor = function( node ) { try { if ( node && node.nodeType == Evernote.Node.ELEMENT_NODE && node.nodeName.toLowerCase() == "img" ) { var src = node.getAttribute( "src" ); if ( src && src.indexOf( "data:image" ) != -1 ) { return true; } } } catch(e) { Evernote.Logger.error("DataImageSerializer.isResponsibleFor failed due to error " + e); } return false; }; Evernote.DataImageSerializer.prototype.serialize = function( /*docBase*/ ) { Evernote.Logger.debug( "DataImageSerializer.serialize()" ); try { this._nodeStyle.addStyle( { "background-image" : "url('" + this._node.getAttribute( "src" ) + "')", "width" : this._node.offsetWidth + "px", "height" : this._node.offsetHeight + "px", "background-repeat" : "no-repeat", "display" : "block" } ); return " "; } catch ( e ) { Evernote.Logger.error( "DataImageSerializer.serialize() failed: error = " + e ); } return ""; };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.VideoElementSerializer = function VideoElementSerializer( node, nodeStyle ) { this.initialize( node, nodeStyle ); }; Evernote.inherit( Evernote.VideoElementSerializer, Evernote.AbstractElementSerializer, true ); Evernote.VideoElementSerializer.isResponsibleFor = function( node ) { return node && node.nodeType == Evernote.Node.ELEMENT_NODE && node.nodeName.toLowerCase() == "video"; }; Evernote.VideoElementSerializer.prototype.serialize = function( /*docBase*/ ) { Evernote.Logger.debug( "VideoElementSerializer.serialize()" ); try { var width = this._node.offsetWidth; var height = this._node.offsetHeight; var doc = this._node.ownerDocument; var canvas = doc.createElement( "CANVAS" ); canvas.width = width; canvas.height = height; var context = canvas.getContext( "2d" ); context.drawImage( this._node, 0, 0, width, height ); var dataUrl = canvas.toDataURL( "image/png" ); context.clearRect( 0, 0, width, height ); this._nodeStyle.addStyle( { "background-image" : "url('" + dataUrl + "')", "width" : width + "px", "height" : height + "px", "display" : "block" } ); return " * * Sample URLs are: * *
     * http: //www.youtube.com/embed/IWJJBwKhvp4?wmode=opaque&rel=0 * http: //www.youtube.com/v/YZEbBZ2IrXE?version=3&rel=1&fs=1&showsearch=0&showinfo=1&iv_load_policy=1 * http: //www.youtube.com/v/J3mjFSTsKiM&hl=en&fs=1 * http://www.youtube.com/watch?v=cAcxHQalWOw * http://www.youtube.com/user/IFiDieApp?v=sdzCELofGgE&feature=pyv *
    */ Evernote.YoutubeElementSerializer = function YoutubeElementSerializer( doc, node, nodeStyle ) { this.initialize( doc, node, nodeStyle ); }; Evernote.inherit( Evernote.YoutubeElementSerializer, Evernote.AbstractElementSerializer, true ); Evernote.YoutubeElementSerializer.WATCH_URL_REGEX = /^https?:\/\/www\.youtube\.com\/watch\?.*v=([^&]+)/i; Evernote.YoutubeElementSerializer.USER_CHANNEL_URL_REGEX = /^https?:\/\/www\.youtube\.com\/user\/([a-zA-Z0-9]+)\?v=([^&]+)/i; Evernote.YoutubeElementSerializer.EMBED_URL_REGEX = /^https?:\/\/www\.youtube\.com\/embed\/([^\/\?&]+)/i; Evernote.YoutubeElementSerializer.VIDEO_URL_REGEX = /^https?:\/\/www\.youtube\.com\/v\/([^\/\?&]+)/i; Evernote.YoutubeElementSerializer.POSSIBLE_CONTAINER_NODES = [ "OBJECT" ]; Evernote.YoutubeElementSerializer.VIDEO_NODES = [ "EMBED", "IFRAME" ]; Evernote.YoutubeElementSerializer.WATCH_URL = "http://www.youtube.com/watch?v=$videoId$"; Evernote.YoutubeElementSerializer.USER_CHANNEL_URL = "http://www.youtube.com/user/$userId$?v=$videoId$"; Evernote.YoutubeElementSerializer.DEFAULT_THUMB_URL = "https://i2.ytimg.com/vi/$videoId$/default.jpg"; Evernote.YoutubeElementSerializer.HQ_THUMB_URL = "https://i2.ytimg.com/vi/$videoId$/hqdefault.jpg"; Evernote.YoutubeElementSerializer.DEFAULT_THUMB_WIDTH = 120; Evernote.YoutubeElementSerializer.DEFAULT_THUMB_HEIGHT = 90; Evernote.YoutubeElementSerializer.isResponsibleFor = function( node ) { var params = this.extractVideoParamsFromNode( node ); return (params) ? true : false; }; Evernote.YoutubeElementSerializer.extractVideoParamsFromNode = function( node ) { Evernote.Logger.debug( "YoutubeElementSerializer.extractVideoIdFromNode()" ); try { if ( node && node.nodeType == Evernote.Node.ELEMENT_NODE ) { var view = window; try { view = node.ownerDocument.defaultView; } catch ( e ) { } var matches = null; if ( view && (node.nodeName.toLowerCase() == "embed" || node.nodeName.toLowerCase() == "object") && view.location ) { if ( (matches = view.location.href.match( this.WATCH_URL_REGEX )) && matches[ 1 ] ) { return matches[ 1 ]; } else if ( (matches = view.location.href.match( this.USER_CHANNEL_URL_REGEX )) && matches[ 1 ] && matches[ 2 ] ) { return [ matches[ 1 ], matches[ 2 ] ]; } } else { var videoNode = this.findVideoNode( node ); if ( videoNode ) { var src = videoNode.getAttribute( "src" ); if ( src && (matches = src.match( this.EMBED_URL_REGEX )) && matches[ 1 ] ) { return matches[ 1 ]; } else if ( src && (matches = src.match( this.VIDEO_URL_REGEX )) && matches[ 1 ] ) { return matches[ 1 ]; } } } } } catch(e) { Evernote.Logger.error("failed to YoutubeElementSerializer.extractVideoParamsFromNode due to error " + e); } return null; }; Evernote.YoutubeElementSerializer.findVideoNode = function( node ) { Evernote.Logger.debug( "YoutubeElementSerializer.findVideoNode()" ); if ( node && node.nodeType == Evernote.Node.ELEMENT_NODE ) { if ( Evernote.ArrayExtension.indexOf(this.VIDEO_NODES, node.nodeName.toUpperCase() ) >= 0 ) { return node; } else if ( Evernote.ArrayExtension.indexOf(this.POSSIBLE_CONTAINER_NODES, node.nodeName.toUpperCase() ) >= 0 ) { try { var it = node.ownerDocument.createNodeIterator( node, NodeFilter.SHOW_ELEMENT, null, false ); var next = null; while ( next = it.nextNode() ) { if ( Evernote.ArrayExtension.indexOf(this.VIDEO_NODES, next.nodeName.toUpperCase() ) >= 0 ) { return next; } } } catch(e) { //We ignore exception here, because if node iterator is not supported, than we could skip old pages (not Youtube). return null; } } } return null; }; Evernote.YoutubeElementSerializer.prototype._imageUrl = ""; Evernote.YoutubeElementSerializer.prototype.serialize = function( /*docBase*/ ) { Evernote.Logger.debug( "YoutubeElementSerializer.serialize()" ); try { var userId = null; var videoId = null; var params = this.constructor.extractVideoParamsFromNode( this._node ); if ( params instanceof Array ) { userId = params[ 0 ]; videoId = params[ 1 ]; } else if ( typeof params == "string" ) { videoId = params; } if ( videoId ) { var thumbUrl = null; var w = 0; var h = 0; if ( this._nodeStyle ) { var view = window; try { view = this._node.ownerDocument.defaultView; } catch ( e ) { } var computedStyles = Evernote.ElementExtension.getComputedStyle( this._node, null, view ); w = parseInt( Evernote.StyleElementExtension.getPropertyValue(computedStyles, "width" ) ); w = (isNaN( w )) ? 0 : w; h = parseInt( Evernote.StyleElementExtension.getPropertyValue(computedStyles, "height" ) ); h = (isNaN( h )) ? 0 : h; if ( w < this.constructor.DEFAULT_THUMB_WIDTH || h < this.constructor.DEFAULT_THUMB_HEIGHT ) { thumbUrl = this.getDefaultThumbnailUrl( videoId ); } else { thumbUrl = this.getHQThumbnailUrl( videoId ); } } else { thumbUrl = this.getDefaultThumbnailUrl( videoId ); } if ( thumbUrl ) { var styleStr = (this._nodeStyle instanceof Evernote.ClipStyle) ? ("style=\"" + this._nodeStyle.toString() + "\"") : ""; var attrs = this._node.attributes; var attrStr = ""; for ( var i = 0; i < attrs.length; ++i ) { var attr = attrs[ i ]; if(Evernote.ClipRules.KEEP_NODE_ATTRIBUTES["a"][attr.name]) { attrStr += attr.name; if ( attr.value ) { attrStr += "=" + attr.value; } attrStr += " "; } } var href = ( userId ) ? this.getUserChannelUrl( userId, videoId ) : this.getWatchUrl( videoId ); var imgAttrStr = ""; if ( w && h ) { var k = w / h; // scale by height if ( k > this.constructor.DEFAULT_THUMB_WIDTH / this.constructor.DEFAULT_THUMB_HEIGHT ) { imgAttrStr += "height=\"" + h + "\""; } else { // scale by width imgAttrStr += "width=\"" + w + "\""; } } this._imageUrl = thumbUrl; return ""; } } } catch ( e ) { Evernote.Logger.error( "YoutubeElementSerializer.serialize() failed: error = " + e ); } return ""; }; Evernote.YoutubeElementSerializer.prototype.getDefaultThumbnailUrl = function( videoId ) { return this.constructor.DEFAULT_THUMB_URL.replace( /\$videoId\$/, videoId ); }; Evernote.YoutubeElementSerializer.prototype.getHQThumbnailUrl = function( videoId ) { return this.constructor.HQ_THUMB_URL.replace( /\$videoId\$/, videoId ); }; Evernote.YoutubeElementSerializer.prototype.getWatchUrl = function( videoId ) { return this.constructor.WATCH_URL.replace( /\$videoId\$/, videoId ); }; Evernote.YoutubeElementSerializer.prototype.getUserChannelUrl = function( userId, videoId ) { return this.constructor.USER_CHANNEL_URL.replace( /\$userId\$/, userId ).replace( /\$videoId\$/, videoId ); }; Evernote.YoutubeElementSerializer.prototype.getImageUrl = function() { return this._imageUrl; };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.IEStylePropertiesMapping = { _mapping : { "background-attachment" : "backgroundAttachment", "background-color" : "backgroundColor", "background-image" : "backgroundImage", "background-repeat" : "backgroundRepeat", "background-position-x" : "backgroundPositionX", "background-position-y" : "backgroundPositionY", "border-bottom-color" : "borderBottomColor", "border-bottom-style" : "borderBottomStyle", "border-bottom-width" : "borderBottomWidth", "border-left-color" : "borderLeftColor", "border-left-style" : "borderLeftStyle", "border-left-width" : "borderLeftWidth", "border-right-color" : "borderRightColor", "border-right-style" : "borderRightStyle", "border-right-width" : "borderRightWidth", "border-top-color" : "borderTopColor", "border-top-style" : "borderTopStyle", "border-top-width" : "borderTopWidth", "border-collapse" : "borderCollapse", "font-family" : "fontFamily", "font-size" : "fontSize", "font-style" : "fontStyle", "font-weight" : "fontWeight", "float" : "styleFloat", "ime-mode" : "imeMode", "letter-spacing" : "letterSpacing", "line-height" : "lineHeight", "list-style-image" : "listStyleImage", "list-style-position" : "listStylePosition", "list-style-type" : "listStyleType", "margin-bottom" : "marginBottom", "margin-left" : "marginLeft", "margin-right" : "marginRight", "margin-top" : "marginTop", "max-height" : "maxHeight", "max-width" : "maxWidth", "min-height" : "minHeight", "min-width" : "minWidth", "overflow-x" : "overflowX", "overflow-y" : "overflowY", "padding-bottom" : "paddingBottom", "padding-left" : "paddingLeft", "padding-right" : "paddingRight", "padding-top" : "paddingTop", "page-break-after" : "pageBreakAfter", "page-break-before" : "pageBreakBefore", "table-layout" : "tableLayout", "text-align" : "textAlign", "text-decoration" : "textDecoration", "text-indent" : "textIndent", "text-overflow" : "textOverflow", "text-transform" : "textTransform", "vertical-align" : "verticalAlign", "white-space" : "whiteSpace", "word-spacing" : "wordSpacing", "word-wrap" : "wordWrap", "z-index" : "zIndex" }, getPropertyNameFor: function(styleName) { return [styleName, this._mapping[styleName]]; }, getPropertiesList: function() { return this._mapping; } };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.StylesReplacementRegistry = { registry: [], getImplementationFor: function(name) { if(name) { return this.registry[name]; } return null; }, register: function(name, impl) { this.registry[name] = impl; } };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.FontSizeReplacement = { SUPPORTED_FONT_SIZES: ["em", "%", "pt", "px"], getValue: function(val) { if(typeof val != "string") return val; if(this.isCalculationRequired(val)) { return Evernote.Utils.getFontSizeInPixels(val) + "px"; } else { //Do not set browser dependant CSS since it does not supported by Evernote Chromium Viewer. return null; } }, isCalculationRequired: function(val) { for(var i = 0; i < this.SUPPORTED_FONT_SIZES.length; i++) { if(val.indexOf(this.SUPPORTED_FONT_SIZES[i]) != -1) { return true; } } return false; } }; Evernote.StylesReplacementRegistry.register("font-size", Evernote.FontSizeReplacement);</script><script defer="" type="text/javascript" charset="ANSI">Evernote.ClipperElementsIdentifiers = { _clipperElementsIds : [Constants.CLIP_DIALOG_ID, Constants.OPTIONS_DIALOG_ID, Constants.ATTR_DIALOG_ID, Constants.CLIP_DIALOG_NEW_ID, Constants.POST_CLIP_DIALOG_ID], match: function(node) { if(node && node.id) { var position = Evernote.ArrayExtension.indexOf(this._clipperElementsIds, node.id); if(position) { return position != -1; } } return false; } };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.NotebooksLoader = { notebooks: [], // TODO: add cache; getNotebookByUid: function(uid) { Evernote.ResponseReceiver.subscribe(this); Evernote.Addin.getNotebooks(document); for(var i = 0; i < this.notebooks.length; i++) { if(this.notebooks[i].uid == uid) { return this.notebooks[i]; } } return null; }, onDataReceived: function(response) { if(response.type) { if(response.type == "notebooks") { this.notebooks = this.notebooks.concat(response.data); } } } }; Evernote.NotebooksPopupLoader = function( subscriber , doc ) { this.subscriber = subscriber; this.doc = doc; this.cache = []; }; Evernote.NotebooksPopupLoader.prototype.getNotebooksAsync = function( onSuccess ) { var self = this; var countNotebooksResponse = 0; Evernote.Addin.getNotebooksAsync(function(response, args) { if (Evernote.NotebookResponseParser.canParse(response)) { var res = Evernote.NotebookResponseParser.parse(response); countNotebooksResponse++; self.subscriber.updateNotebooks.call(self.subscriber, res.data); if (countNotebooksResponse == 3) { onSuccess(); } } }); };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.Notebook = function(type, name, uid, stack, author, hidden, typeText) { this.type = type; this.name = name; this.uid = uid; this.stack = stack; this.author = author; this.hidden = hidden; this.typeText = typeText; }; </script><script defer="" type="text/javascript" charset="ANSI">Evernote.Tag = function(name, uid) { this.name = name; this.uid = uid; };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.NotebookTypes = { PERSONAL: 1, PERSONAL_TEXT: 'pers', BUSINESS: 2, BUSINESS_TEXT: 'biz', LINKED: 3, LINKED_TEXT: 'linked' };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.ErrorCodes = { AUTHENTICATION_ERROR: "LoginFailure", CLIP_ERROR: "NoteImportFailure", CONNECTION_FAILED: "ConnectionAttemptFailed" };</script><script defer="" type="text/javascript" charset="ANSI">Evernote.AuthenticatedException = function(msg){ this.msg = msg; this.code = Evernote.ErrorCodes.AUTHENTICATION_ERROR; };</script><script defer="" type="text/javascript" charset="ANSI">try { Evernote.Addin.init(EvernoteExternal.Addin); Evernote.Addin.resetAuthenticatedState(); Evernote.FS.init(EvernoteExternal.Addin); Evernote.Logger = Evernote.LoggerConfigurator.getLogger(); if(!Evernote.JQuery) Evernote.JQueryLoader.initJQuery(); window.jQueryForClearlyComponent = Evernote.JQuery; initClearly(window); // todo: create bulletproof function for popup close before context-clipping. if (Evernote.evernotePopup) Evernote.evernotePopup.hide(); if (Evernote.SkitchController) Evernote.SkitchController.clearSkitch(); Evernote.Logger.debug("Init EnClipper"); Evernote.EnClipper.init(); Evernote.Logger.debug("EnClipper initialized"); Evernote.pageInfo = new PageInfo(); if (!Evernote.contentPreviewer) Evernote.contentPreviewer = new ContentPreview(); Evernote.Options.load(); Evernote.evernotePostClipPopup = new Evernote.PostClipPopup( document ); if (EvernoteExternal.Addin.isServerAvailable()) { Evernote.Clipper.clipWithOptions(EvernoteExternal.clipOptions); } } catch(e) { throw e; }</script>

    2017.01.06.

    도움이 되었다면 UP 눌러주세요!
    UP이 많은 답변일수록 사용자들에게 더 많이 노출됩니다.

    profile_image 익명 작성일 -

    {{=it.contents}}

    간이과세에서일반과세자로전환

    22년하반기까지 간이과세자였는데 23년1월1일에 일반과세자로전환되었습니다 그사실을모르고 이번에 23년2기확정신고하려고하는데 1월1일에...

    일반 과세 사업자 간이 사업자 전환

    일반 과세 사업자로 대출이 있고 3년정도 지났고, 이번에 일반과세 사업자에서 간이 사업자 로 전환 통지를 받았습니다. 일단 대출은 일반과세 사업자로 되어 있는데 만약 간이...

    간이과세전환시에...

    ... 네 일반과세자로 신고를 하시면 전년도 신고내역을 바탕으로 세무서에서 간이과세전환 통지를 받게 되실거에요 혹시 통지를 못받으셔서 간이가 된지안되는지...

    일반과세자에서 간이과세전환

    연매출 8천 미만으로 일반과세자에서 간이과세로 자동 전환시 그해 매출에대한 부가세는 일반과세자로 적용받나요 간이과세자로 적용받나요? 간단합니다 전환전까지는...

    간이과세->일반과세 전환시 종합소득세...

    안녕하세요, 현재 간이과세로 사업을 하고 있습니다. 올해 갑자기 매출이 늘었는데... 일반과세자로 전환시점은 언제일까요? 매출이 1억 5천인데 하청업체에 지불한 금액이...

    작년오픈한가게인데 간이과세,일반과세...

    ... 일반과세 7월 전환된다면 간이과세로 다시 전환시키려면 몇월까지 매출로 간이과세로 다시전환시킬 수 있을까요? 고맙습니다. 안녕하세요 택스런 대표세무사 한정민...