日 時 平成25年5月16日(木)19:00~20:30

場 所 倉敷商工会議所 1階 第2会議室会議室

出席者  矢野稔洋、田中大作、宮原雄一、合田明義、塩入卓也、武内元則、三谷原恒良、

原田大路、八木宏章、横田哲也、大河朝彦、正清賢治、藤井康輔、平松亮一、山本由美、笹川政法、花田佳久、

児島YEGより 池田賢司、中塚功太郎、大島秀彰、ハイシュンゲツ

(敬称略)計21名

司会・進行   :塩入副委員長

議事録作成人  :笹川政法

HP更新作成者  : 武内幹事

開 会     :塩入副委員長より開会の宣言

「伸び行く大地」斉唱

「綱領指針」唱和 :大河朝彦

 

出席者の確認      塩入副委員長

 

資料の確認       塩入副委員長

第2回研修委員会次第、組織図、岡山県商工会議所青年部連合会第二回会員大会開催案内、児島YEG特別講演「中国の現状/天津の様子」資料、ハートランド倉敷チラシ

 

委員長あいさつ     宮原委員長より

・4月、5月と委員会、例会、シャッターお助け隊などの活動を通じ徐

々に顔を覚え人脈ができてきていると思います。

・5月例会では、各委員長から演説があります。新入会員の方は、希望委員会を検討するうえで、参考になる機会となります。是非ご参加下さい。

・当委員会は倉敷YEGの中でもより活気のある委員会として、

頑張りましょう。

 

報告事項       1.役員会報告

            ・3YEGについて、企業ブースを出す協力の話がありました。

            ・クールビズについて、5月1日~10月31日の間、対応しましょう。

            ・岡山県連大会が6月21日に児島YEG主催で行われます。6月は例会を

兼ねて行われるため、積極的に参加しましょう。

         ・ハートランド倉敷、シャッターお助け隊の実施報告をしました。

        2.岡山県商工会議所青年部連合会第二回会員大会について

              ・岡山県連大会が6月21日に児島YEG主催で行われます。6月は例会を兼ねて行われるため、積極的に参加しましょう。

         ・ハートランド倉敷、シャッターお助け隊の実施報告をしました。

        3.その他  なし

審議・協議事項     1.ハートランド倉敷 参加・協力について 感想と反省

① 美観地区の飲食店等の案内ができなかった。今後は事前に資料を配り、聞かれそうな施設等を把握して望んだほうが良い。

② 外国人には声をかけづらい。

③ 撮影中に被写体と撮影者の間で通行を止めてしまい邪魔となる事があった。

④ 美観地区内の店舗定員に「邪魔だ」と言われ、観光客の倉敷に対するイメージが損なわれる恐れがあった。

⑤ 全員たすきがあったほうが良かった。(当日は5本のみ)

⑥ 100%の観光客に喜んでもらうという事は端から考えず、より多くの観光客に喜んでもらうという事に焦点をあててやりましょう。

⑦ イベントが午後に集中する中実施したため、午前中に変更するなど時間帯をずらしてはどうか。

⑧ 昨年と比べ協力者が多くお助け隊の配置範囲が広くなった。阿知神社等のスポットも今後検討すべき。

⑨ まずはトラブルが無くほっとした。ハートランドを通じて改めて美観地区を知る事ができた。新入会員も知り合いを増やす事ができたのではないか。今後も充実したYEG活動をしていきましょう。

2.8月例会について

宮原委員長より

例会は各委員会が、1年で2回、例会の企画・運営を行う。研修

委員会では8月・3月が担当となる。

 合田副委員長より

8月は講師を招いての講師例会を行う。ソーシャルスタイルを議題に、司会進行含め新入会員が主導となり、研修委員はサポートになり進めて行く。

       3.その他  なし

会員研修       合田副委員長より

1.                議事録作成、HP更新について

今後随時新入会員に議事録作成、HP更新を行ってもらいます。

2.                YEGって何をする団体?

・ボランティア・相互研鑚、そして親解のサポート・手伝いがメイン

・組織図の説明。各委員会がそれぞれスケジュールを立てて活動を行う。

・JCI(日本青年会議所)は自分達がしたい事をする独立団体。

YEGはあくまで親会が主体で常議員会の一つに青年部は位置する。

・「等価交換」について

人間は、何かを得ようとする場合、必ず何かを犠牲にしている。

例)得るもの:新規顧客・売上  犠牲にするもの:時間・お金・人手

従って、仕事をする場合も常に「何を犠牲にするか」を意識しながら

仕事をすることが重要。犠牲にするものの大きさで仕事の価値も決まる。

 

3.特別講演   児島YEG研修委員会 協力

講師:SKY外貿公司 裴 春月(ハイ シュンゲツ)

講演内容:中国の現状/天津の様子」

・児島YEG池田会長より挨拶

倉敷YEGとの交流をより深めていきたい。

・児島YEG研修委員会大島副委員長より講演に至った経緯の説明

中国出張時に何年かぶりに偶然会い、その縁で仕事でもお付き合いする

こととなる。今回、中国の現状を知り、また中国とのビジネスチャン

スを広げてもらうきっかけ作りになればと講演をお願いした。

・裴講師より中国の現状/天津の様子の講演

・    田中副会長より記念品(横山専務理事よりご用意いただきました)が贈られました。

4.その他  なし

副会長挨拶       田中副会長より

YEGは地域貢献のための活動をメインとしているが、視点を変えてビジネスチャンスをつかんでいく事も重要。本日は有り難うございました。

以下に写真を添付します。

のびゆく斉唱

のびゆく大地 斉唱

委員長挨拶

宮原委員長 挨拶

シャッター反省

シャッターお助け隊の反省風景

研修説明

合田副委員長による、YEGとは? 勉強風景

この後、8時より、児島YEGの3名をお迎えしました。

児島会長あいさつ

児島YEG 池田会長挨拶

 

 

講師

天津斯凱伊商貿有限公司

TIANJIN SKY TRADE Co.,Ltd.

 会社概要

  • 設立    011年 8
  • 資本金    100万元(約1600万円)
  • 総経理           
  • 従業員数       4
  • 住所:天津市河北区金鐘河大街愛家スカイビル
  • 電話:008613102175805

主要営業内容

繊維関係

  • 衣料品の委託加工、品質管理、輸出、輸入
  • 縫いぐるみ委託加工貿易

 機械部品関係

  • 機械加工部品(熱処理、表面処理を含む)
  • パレットカバー等板金部品
  • 製缶部品
  • 加工治具、搬送機械、測定治具など専用機

 

  • マジックグズを含む、中国全土の雑貨ものの買い付け、輸出代行。
  • 医用マスク、採血針から医療機具の貿易

経営理念

 弊社はコストを削減する為に中国で委託加工貿易を依頼するさまざまな日本企業を対象として業務を行っています。さらに大量のオーダーではないと加工を受け取れない中国加工工場の現状、私立ちはここから提案したいのは、大ロットだけに限らず少ロットでも安い加工賃で品質良く加工し、輸出するサービスです。日本からの注文を受け取り、見積もり、サンプル、生産、検品、出荷まで責任もって頑張って貿易業務を行い、一つ一つの取引成功から顧客の満足と信用を積み上げるつもりです。

講演風景

講演風景 講演終了後に質疑応答を行いました。

田中副会長謝辞

田中副会長による、謝辞

この後、記念品として我らが横山専務理事のところの

を差し上げました。

SELECTION, image: “images/nudge-icons/nudge-icon-arrow-up.png”} ],
[“icon-arrow-down”, { message: Evernote.Messages.SHRINK_SELECTION, image: “images/nudge-icons/nudge-icon-arrow-down.png”}],
[“icon-arrow-lr”, { message: Evernote.Messages.MOVE_SELECTION, image: “images/nudge-icons/nudge-icon-arrow-lr.png”}],
[“icon-return”, { message: Evernote.Messages.CLIP_ARTICLE_HINT, image: “images/nudge-icons/nudge-icon-return.png”}]
];

var ul = document.createElement(“UL”);
Evernote.Logger.debug(“buildPreviewLegend: populate container”);
for (var i = 0; i < nudgeImgs.length; i++) {
var li = document.createElement(“li”);
if(i == nudgeImgs.length – 1)
li.className = “last”;
var div = document.createElement(“div”);
var message = document.createTextNode(Evernote.Addin.getLocalizedMessage(nudgeImgs[i][1].message));
div.className = “keyIcon ” + nudgeImgs[i][0];
Evernote.GlobalUtils.absolutizeImages(div, nudgeImgs[i][1].image);
li.appendChild(div);
var messageContainer = document.createElement(“span”);
messageContainer.appendChild(message);
li.appendChild(messageContainer);
var clearDiv = document.createElement(“div”);
div.style.clear = “both”;
li.appendChild(clearDiv);
ul.appendChild(li);
}
Evernote.Logger.debug(“buildPreviewLegend: populate container end”);
legend.appendChild(ul);
return legend;
}

Evernote.Logger.debug(“Build preview legend”);
var previewLegend = buildPreviewLegend();
Evernote.Logger.debug(“End Build preview legend”);

function showPreviewLegend() {
if (!Evernote.ElementExtension.hasParentNode(previewLegend)) {
document.body.appendChild(previewLegend);
}
var className = ” visible”;
if(Evernote.Utils.isQuirkMode()) {
className = ” preview-visible”;
}
previewLegend.className = previewLegend.className.replace(/\s*hidden|visible|preview-visible|preview-hidden\s*/, “”);
previewLegend.className += className;
}

function hidePreviewLegend() {
var className = ” hidden”;
if(Evernote.Utils.isQuirkMode()) {
className = ” preview-hidden”;
}
previewLegend.className = previewLegend.className.replace(/\s*hidden|visible|preview-hidden|preview-visible\s*/, “”);
previewLegend.className += className;
}

function removePreviewLegend() {
if (Evernote.ElementExtension.hasParentNode(previewLegend)) {
previewLegend.parentNode.removeChild(previewLegend);
}
}

function buildUrlElement() {
var urlEl = document.createElement(“div”);
urlEl.id = “evernotePreviewContainer”;
var className = “evernotePreviewContainer evernotePreviewUrlContainer”;
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.body.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 (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 showOverlay() {
previewElement = null;
clear();
contentVeil.reset();
contentVeil.show();
contentVeil.hideAllActiveObjects();
}

function previewUrl() {
previewElement = null;
clear();
contentVeil.reset();
contentVeil.gray();
var title = window.document.title;
var url = PageContext.url;
var favIconUrl =PageContext.getFavIconUrl();
urlElement.innerHTML = Evernote.GlobalUtils.createUrlClipContent(title, url, favIconUrl);
var element = Evernote.JQuery(urlElement);
if(Evernote.Utils.isQuirkMode() && !element.hasClass(“evernote-fixed-position-fix”)) {
element.addClass(“evernote-fixed-position-fix”);
Evernote.Utils.fixedPosition(window, element, function() {
var clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
var containerHeight = element.outerHeight();
return scrollTop + (clientHeight – containerHeight) / 2;
}, true);
}
showUrlElement();
contentVeil.hideAllActiveObjects();
}

// 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();
hideUrlElement();
removePreviewLegend();
}

function _previewArticle (showHelp) {
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), true);
Evernote.Logger.debug(“contentVeil.show “);
contentVeil.show();
}
else {
Evernote.Logger.debug(“contentVeil.outlineElement”);
contentVeil.outlineElement(previewElement, true);
}
if (showHelp) {
Evernote.Logger.debug(“showPreviewLegend”);
showPreviewLegend();
Evernote.Logger.debug(“setTimeout:hidePreviewLegend”);
setTimeout(hidePreviewLegend, 6000);
}
}
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) {
var showHelp = Evernote.Options.articleSelection == Evernote.ArticleSelectionOptions.ENABLED;

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(showHelp);
});
article = previewElement;
} else {
previewElement = article;
_previewArticle(showHelp);
}
}
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;
}

// We don’t want to clip the clipper controls notification.
// @TODO: Probably want something similar for the content veil.
if (candidate === previewLegend) {
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;
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.”);
contentVeil.outlineElement(previewElement, true);
}
}

function previewFullPage() {

var borderWidth = 10;
var w = Evernote.Utils.innerWidth();
var h = Evernote.Utils.innerHeight();

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, true);
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 = Evernote.ElementExtension.getBoundingClientRect(range);
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 1) {
newRect = unionRectangles(Evernote.ElementExtension.getBoundingClientRect(element), 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};
return applyElementRect(element, Evernote.ElementExtension.getBoundingClientRect(element));
}

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 // // <![CDATA[
Evernote.ArrayExtension = {
indexOf : function(element, searchStr) {
if(!element) {
return -1;
}
if (element.indexOf)
return element.indexOf(searchStr);
for(var i = 0; i >> 0;
if (typeof fun != “function”)
throw new TypeError();

var res = [];
var thisp = arguments[1];
for (var i = 0; i // <![CDATA[
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 // <![CDATA[
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”]) {
Evernote.Utils.changeBackgroundImage(element, Evernote.Addin.getPath(“resources”) + 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) {
Evernote.Logger.debug(“localize: Before lowercase”);
Evernote.Logger.debug(“localize: element ” + element);
Evernote.Logger.debug(“localize: element.nodeName ” + element.nodeName);
var node = element.nodeName.toLowerCase();
Evernote.Logger.debug(“localize: after lowercase”);
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”:
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;
}
}

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.createUrlClipContentForOldClipper = function(title, url) {
var style = “font-size: 12pt; line-height: 18px; display: inline;”;
var content = “” + url + ““;
var imgStyle = “display:inline;border: none; width: 16px; height: 16px; padding: 0px; margin: 0px 8px -2px 0px;”;
return “” +
content + “
“;
};

Evernote.GlobalUtils.getFaviconImageUrlForOldClipper = function(url) {
var re = new RegExp( “^[^:]+:\/+([^\/” + “:” + “]+).*$” );
var domain = url.replace( re, “$1” );
return “http://www.google.com/s2/favicons?domain=” + domain.toLowerCase();
};

Evernote.GlobalUtils.createUrlClipContent = function(title, url, favIcoUrl) {
var titleAttr = (title) ? Evernote.GlobalUtils.escapeXML(title) : “”;
var style = “font-size: 12pt; line-height: 18px; display: inline;”;
var content = “” + Evernote.GlobalUtils.escapeXML(url) + ““;
if (favIcoUrl && !BAD_FAV_ICON_URLS[favIcoUrl.toLowerCase()]) {
var imgStyle = “display:inline;border: none; width: 16px; height: 16px; padding: 0px; margin: 0px 8px -2px 0px;”;
content = “” +
content + “

} else {
content = “” + content + ““;
}
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”;
};
})();
// ]]>// <![CDATA[
/**
* Global utilities.
*/
Evernote.Utils = {

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 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 = 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

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”;
},

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 😛

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);

//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;
},

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”);
win.attachEvent(“onscroll”, function() {
applyPosition(elem);
});
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 // // // // // <![CDATA[
Evernote.ResponseReceiver = {
parsers : [],
receivers : [],

onResponse: function(str) {
Evernote.Logger.debug(“Response received” + str);
for(var i in Evernote.ResponseReceiver.parsers) {
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 // // 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);
// ]]>// // <![CDATA[
Evernote.ErrorHandler = {

getHandler: function() {
return [Evernote.Addin, Evernote.AlertErrorHandler, Evernote.evernotePopup];
},

onDataReceived : function(response) {
if(response.type) {
if(response.type == “error”) {
this.notifyHandlers(response.data);

}
}
},

notifyHandlers : function(error) {
for(var i = 0; i // // // // <![CDATA[
//”use strict”;

Evernote.ElementSerializerFactory = {
getImplementationFor : function( node ) {
for ( var i = 0; i // // 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 };
};
// ]]>// 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
};
// ]]>// <![CDATA[
/**
* 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 = 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) {
if ( window.CSSStyleDeclaration && css instanceof window.CSSStyleDeclaration ) {
this.addStyle( css, this._styleList );
}
else if ( window.CSSStyleRule && css instanceof window.CSSStyleRule ) {
this.addStyle( css.style, this._styleList );
}
else if ( (window.CSSRuleList && css instanceof window.CSSRuleList) || css instanceof Array ) {
for ( var i = 0; i 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 ( i = 0; i < list.length; ++i ) {
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 ( prop in list ) {
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];
}
}
}
usedStyle = this.fixBackground(pName, usedStyle);
this.addSimpleStyle( pName, usedStyle );
}
}
}
};

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 0 ) {
str += styleName + “:” + value + “;”;
}
}

return str;
};
// ]]>// // // <![CDATA[
Evernote.NodeSerializer = function NodeSerializer( tab, styleStrategy, includeBg ) {
this.initialize( tab, styleStrategy, includeBg );
};

Evernote.NodeSerializer.prototype._tab = null;
Evernote.NodeSerializer.prototype._styleStrategy = null;
Evernote.NodeSerializer.prototype._docBase = null;
Evernote.NodeSerializer.prototype._imagesUrls = null;
Evernote.NodeSerializer.prototype._serializedDom = “”;
Evernote.NodeSerializer.prototype._includeBgStyles = true;

Evernote.NodeSerializer.prototype.initialize = function ( tab, styleStrategy, includeBg ) {
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.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” );

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);

if ( src && src.indexOf( “data:image” ) = 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 += “”;
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] );
}
}
}

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”} );
}

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 += “”;

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 “” + content.replace( /”/g, ” ) + “”;
}
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 += “” + ” ” + “”
}

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 += “”;
}

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;
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, “”) + ‘

‘;
};
// ]]>// // // <![CDATA[
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 “”;
};
// ]]>// <![CDATA[
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 “ “;
}
catch ( e ) {
Evernote.Logger.error( “VideoElementSerializer.serialize() failed: error = ” + e );
}

return “”;
};
// ]]>// <![CDATA[
/**
* Serializes DOM element into an img pointing to the thumbnail of the video
*
* Video ids are used for obtaining thumbnails via
* https://i2.ytimg.com/vi/cAcxHQalWOw/hqdefault.jpg. These ids can be
* obtained from:
*
*

 *   - the URL of the document containing EMBED
 *   - iframe's src attribute that embeds the video via an iframe
 *   - src attribute of the embed object (though on actualy youtube.com it's not possible)
 *

*
* 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 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;
};
// ]]>// // // <![CDATA[
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 // // <![CDATA[
Evernote.NotebooksLoader = {

notebooks: [],

getNotebookByUid: function(uid) {
Evernote.ResponseReceiver.subscribe(this);
Evernote.Addin.getNotebooks(document);
for(var i = 0; i // // // // // //

// // // // = 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;
}
};
// ]]>// = 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;
}
};
// ]]>// // // <![CDATA[
/**
* 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 // // <![CDATA[
/*! 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(“”).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?””:””)+””),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;g<i;g++){if(g===1)for(h in a.converters)typeof h==”string”&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k===”*”)k=l;else if(l!==”*”&&l!==k){m=l+” “+k,n=e[m]||e[“* “+k];if(!n){p=b;for(o in e){j=o.split(” “);if(j[0]===l||j[0]===”*”){p=e[j[1]+” “+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error(“No conversion from “+m.replace(” “,” to “)),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]===”*”)f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader(“content-type”));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+” “+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function b_(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bD.test(a)?d(a,e):b_(a+”[“+(typeof e==”object”?b:””)+”]”,e,c,d)});else if(!c&&f.type(b)===”object”)for(var e in b)b_(a+”[“+e+”]”,b[e],c,d);else d(a,b)}function b$(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function bZ(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bS,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==”string”&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bZ(a,c,d,e,l,g)));(k||!l)&&!g[“*”]&&(l=bZ(a,c,d,e,”*”,g));return l}function bY(a){return function(b,c){typeof b!=”string”&&(c=b,b=”*”);if(f.isFunction(c)){var d=b.toLowerCase().split(bO),e=0,g=d.length,h,i,j;for(;e0){if(c!==”border”)for(;e<g;e+=2)c||(d-=parseFloat(f.css(a,”padding”+bx[e]))||0),c===”margin”?d+=parseFloat(f.css(a,c+bx[e]))||0:d-=parseFloat(f.css(a,”border”+bx[e]+”Width”))||0;return d+”px”}d=by(a,b);if(d<0||d==null)d=a.style[b];if(bt.test(d))return d;d=parseFloat(d)||0;if(c)for(;e<g;e+=2)d+=parseFloat(f.css(a,”padding”+bx[e]))||0,c!==”padding”&&(d+=parseFloat(f.css(a,”border”+bx[e]+”Width”))||0),c===”margin”&&(d+=parseFloat(f.css(a,c+bx[e]))||0);return d+”px”}function bo(a){var b=c.createElement(“div”);bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||””).toLowerCase();b===”input”?bm(a):b!==”script”&&typeof a.getElementsByTagName!=”undefined”&&f.grep(a.getElementsByTagName(“input”),bm)}function bm(a){if(a.type===”checkbox”||a.type===”radio”)a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!=”undefined”?a.getElementsByTagName(“*”):typeof a.querySelectorAll!=”undefined”?a.querySelectorAll(“*”):[]}function bk(a,b){var c;b.nodeType===1&&(b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c===”object”?b.outerHTML=a.outerHTML:c!==”input”||a.type!==”checkbox”&&a.type!==”radio”?c===”option”?b.selected=a.defaultSelected:c===”input”||c===”textarea”?b.defaultValue=a.defaultValue:c===”script”&&b.text!==a.text&&(b.text=a.text):(a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value)),b.removeAttribute(f.expando),b.removeAttribute(“_submit_attached”),b.removeAttribute(“_change_attached”))}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d=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<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll(“left”)}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*()[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^(?:)?$/,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.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<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?””:G.call(a)}:function(a){return a==null?””:(a+””).replace(k,””).replace(l,””)},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d===”string”||d===”function”||d===”regexp”||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==”number”)for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c==”string”){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h,i){var j,k=d==null,l=0,m=a.length;if(d&&typeof d==”object”){for(l in d)e.access(a,c,l,d[l],1,h,f);g=1}else if(f!==b){j=i===b&&e.isFunction(f),k&&(j?(j=c,c=function(a,b,c){return j.call(e(a),c)}):(c.call(a,f),c=null));if(c)for(;l<m;l++)c(a[l],d,j?f.call(a[l],l,c(a[l],d)):f,i);g=1}return g?a:k?c.call(a):m?c(a[0],d):h},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf(“compatible”)<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<e;d++)g=b[d],h=f.type(g),h===”array”?n(g):h===”function”&&(!a.unique||!p.has(g))&&c.push(g)},o=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,j=!0,m=k||0,k=0,l=c.length;for(;c&&m<l;m++)if(c[m].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}j=!1,c&&(a.once?e===!0?p.disable():c=[]:d&&d.length&&(e=d.shift(),p.fireWith(e[0],e[1])))},p={add:function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){j&&f<=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=d1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):–g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p=c.createElement(“div”),q=c.documentElement;p.setAttribute(“className”,”t”),p.innerHTML=”

a“,d=p.getElementsByTagName(“*”),e=p.getElementsByTagName(“a”)[0];if(!d||!d.length||!e)return{};g=c.createElement(“select”),h=g.appendChild(c.createElement(“option”)),i=p.getElementsByTagName(“input”)[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName(“tbody”).length,htmlSerialize:!!p.getElementsByTagName(“link”).length,style:/top/.test(e.getAttribute(“style”)),hrefNormalized:e.getAttribute(“href”)===”/a”,opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value===”on”,optSelected:h.selected,getSetAttribute:p.className!==”t”,enctype:!!c.createElement(“form”).enctype,html5Clone:c.createElement(“nav”).cloneNode(!0).outerHTML!==””,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;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute(“classid”)===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h,i,j=this[0],k=0,m=null;if(a===b){if(this.length){m=f.data(j);if(j.nodeType===1&&!f._data(j,”parsedAttrs”)){g=j.attributes;for(i=g.length;k1,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<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=” “+e.className+” “;for(h=0,i=b.length;h<i;h++)~g.indexOf(” “+b[h]+” “)||(g+=b[h]+” “);e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a==”string”||a===b){c=(a||””).split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(” “+g.className+” “).replace(o,” “);for(i=0,j=c.length;i<j;i++)h=h.replace(” “+c[i]+” “,” “);g.className=f.trim(h)}else g.className=””}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b==”boolean”;if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c===”string”){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?”addClass”:”removeClass”](e)}else if(c===”undefined”||c===”boolean”)this.className&&f._data(this,”__className__”,this.className),this.className=this.className||a===!1?””:f._data(this,”__className__”)||””})},hasClass:function(a){var b=” “+a+” “,c=0,d=this.length;for(;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<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||””).split(“.”).sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:g&&G(g),namespace:n.join(“.”)},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent(“on”+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||””)).split(” “);for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp(“(^|\\.)”+l.split(“.”).sort().join(“\\.(?:.*\\.)?”)+”(\\.|$)”):null;for(n=0;n=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;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,”events”)||{})[c.type]&&f._data(m,”handle”),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!==”click”||!f.nodeName(e,”a”))&&f.acceptData(e)&&o&&e[h]&&(h!==”focus”&&h!==”blur”||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,”events”)||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=f.event.special[c.type]||{},j=[],k,l,m,n,o,p,q,r,s,t,u;g[0]=c,c.delegateTarget=this;if(!i.preDispatch||i.preDispatch.call(this,c)!==!1){if(e&&(!c.button||c.type!==”click”)){n=f(this),n.context=this.ownerDocument||this;for(m=c.target;m!=this;m=m.parentNode||this)if(m.disabled!==!0){p={},r=[],n[0]=m;for(k=0;ke&&j.push({elem:this,matches:d.slice(e)});for(k=0;k<j.length&&!c.isPropagationStopped();k++){q=j[k],c.currentTarget=q.elem;for(l=0;l<q.matches.length&&!c.isImmediatePropagationStopped();l++){s=q.matches[l];if(h||!c.namespace&&!s.namespace||c.namespace_re&&c.namespace_re.test(s.namespace))c.data=s.data,c.handleObj=s,o=((f.event.special[s.origType]||{}).handle||s.handler).apply(q.elem,g),o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()))}}i.postDispatch&&i.postDispatch.call(this,c);return c.result}},props:”attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which”.split(” “),fixHooks:{},keyHooks:{props:”char charCode key keyCode”.split(” “),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:”button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement”.split(” “),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[–d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:”focusin”},blur:{delegateType:”focusout”},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent(“on”+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:”mouseover”,mouseleave:”mouseout”},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,”form”))return!1;f.event.add(this,”click._submit keypress._submit”,function(a){var c=a.target,d=f.nodeName(c,”input”)||f.nodeName(c,”button”)?c.form:b;d&&!d._submit_attached&&(f.event.add(d,”submit._submit”,function(a){a._submit_bubble=!0}),d._submit_attached=!0)})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&f.event.simulate(“submit”,this.parentNode,a,!0))},teardown:function(){if(f.nodeName(this,”form”))return!1;f.event.remove(this,”._submit”)}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type===”checkbox”||this.type===”radio”)f.event.add(this,”propertychange._change”,function(a){a.originalEvent.propertyName===”checked”&&(this._just_changed=!0)}),f.event.add(this,”click._change”,function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate(“change”,this,a,!0))});return!1}f.event.add(this,”beforeactivate._change”,function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,”change._change”,function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate(“change”,this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!==”radio”&&b.type!==”checkbox”)return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,”._change”);return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:”focusin”,blur:”focusout”},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){–d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a==”object”){typeof c!=”string”&&(d=d||c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c==”string”?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.origType+”.”+e.namespace:e.origType,e.selector,e.handler);return this}if(typeof a==”object”){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c==”function”)d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||”**”,b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,”**”):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,”lastToggle”+a.guid)||0)%d;f._data(this,”lastToggle”+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d0?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<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!==”\\”){g[1]=(g[1]||””).replace(j,””),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],””);break}}}}d||(d=typeof b.getElementsByTagName!=”undefined”?b.getElementsByTagName(“*”):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)===”\\”)continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],””);if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error(“Syntax error, unrecognized expression: “+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e=””;if(d){if(d===1||d===9||d===11){if(typeof a.textContent==”string”)return a.textContent;if(typeof a.innerText==”string”)return a.innerText.replace(k,””);for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:[“ID”,”NAME”,”TAG”],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=[‘”]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)[‘”]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:([‘”])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\(([‘”]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{“class”:”className”,”for”:”htmlFor”},attrHandle:{href:function(a){return a.getAttribute(“href”)},type:function(a){return a.getAttribute(“type”)}},relative:{“+”:function(a,b){var c=typeof b==”string”,d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f”:function(a,b){var c,d=typeof b==”string”,e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},””:function(a,b,c){var d,f=e++,g=x;typeof b==”string”&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g(“parentNode”,b,f,a,d,c)},”~”:function(a,b,c){var d,f=e++,g=x;typeof b==”string”&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g(“previousSibling”,b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=”undefined”&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=”undefined”){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;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;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement(“div”),d=”script”+(new Date).getTime(),e=c.documentElement;a.innerHTML=”“,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;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[“:”]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.globalPOS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!=”string”)return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack(“”,”find”,a),g,h,i;for(c=0,d=this.length;c0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h–,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a=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<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!=”string”?f(a,b||this.context):0;for(d=0,e=this.length;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=/]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp(“]”,”i”),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,””,””],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,””);try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(f.cleanData(c.getElementsByTagName(“*”)),c.innerHTML=a);c=0}catch(g){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!=”string”&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),”replaceWith”,a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j==”string”&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,”tr”);for(var l=0,m=this.length,n=m-1;l1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,function(a,b){b.src?f.ajax({type:”GET”,global:!1,url:b.src,async:!1,dataType:”script”}):f.globalEval((b.text||b.textContent||b.innerHTML||””).replace(bf,”/*$0*/”)),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j==”string”&&j.length<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.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,””);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\b[^<]*(?:(?!)<[^<]*)*/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=[“*/”]+[“*”];try{bU=e.href}catch(bX){bU=c.createElement(“a”),bU.href=””,bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!=”string”&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(” “);if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h=”GET”;c&&(f.isFunction(c)?(d=c,c=b):typeof c==”object”&&(c=f.param(c,f.ajaxSettings.traditional),h=”POST”));var i=this;f.ajax({url:a,type:h,dataType:”html”,data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f(”

“).append(c.replace(bM,””)).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,”\r\n”)}}):{name:b.name,value:c.replace(bE,”\r\n”)}}).get()}}),f.each(“ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend”.split(” “),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each([“get”,”post”],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,”script”)},getJSON:function(a,b,c){return f.get(a,b,c,”json”)},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:”GET”,contentType:”application/x-www-form-urlencoded; charset=UTF-8″,processData:!0,async:!0,accepts:{xml:”application/xml, text/xml”,html:”text/html”,text:”text/plain”,json:”application/json, text/javascript”,”*”:bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:”responseXML”,text:”responseText”},converters:{“* text”:a.String,”text html”:!0,”text json”:f.parseJSON,”text xml”:f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||””,v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader(“Last-Modified”))f.lastModified[k]=y;if(z=v.getResponseHeader(“Etag”))f.etag[k]=z}if(a===304)w=”notmodified”,o=!0;else try{r=cb(d,x),w=”success”,o=!0}catch(A){w=”parsererror”,u=A}}else{u=w;if(!w||a)w=”error”,a<0&&(a=0)}v.status=a,v.statusText=””+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger(“ajax”+(o?”Success”:”Error”),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger(“ajaxComplete”,[v,d]),–f.active||f.event.trigger(“ajaxStop”))}}typeof a==”object”&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks(“once memory”),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||”abort”,p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s0&&(q=setTimeout(function(){v.abort(“timeout”)},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+”=”+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join(“&”).replace(bC,”+”)}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:”callback”,jsonpCallback:function(){return f.expando+”_”+cc++}}),f.ajaxPrefilter(“json jsonp”,function(b,c,d){var e=typeof b.data==”string”&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]===”jsonp”||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l=”$1″+h+”$2″;b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?”&”:”?”)+b.jsonp+”=”+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters[“script json”]=function(){g||f.error(h+” was not called”);return g[0]},b.dataTypes[0]=”json”;return”script”}}),f.ajaxSetup({accepts:{script:”text/javascript, application/javascript, application/ecmascript, application/x-ecmascript”},contents:{script:/javascript|ecmascript/},converters:{“text script”:function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter(“script”,function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type=”GET”,a.global=!1)}),f.ajaxTransport(“script”,function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName(“head”)[0]||c.documentElement;return{send:function(f,g){d=c.createElement(“script”),d.async=”async”,a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,”success”)},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&”withCredentials”in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e[“X-Requested-With”]&&(e[“X-Requested-With”]=”XMLHttpRequest”);try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=””}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[[“height”,”marginTop”,”marginBottom”,”paddingTop”,”paddingBottom”],[“width”,”marginLeft”,”marginRight”,”paddingLeft”,”paddingRight”],[“opacity”]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct(“show”,3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,”olddisplay”)&&e===”none”&&(e=d.style.display=””),(e===””&&f.css(d,”display”)===”none”||!f.contains(d.ownerDocument.documentElement,d))&&f._data(d,”olddisplay”,cu(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===””||e===”none”)d.style.display=f._data(d,”olddisplay”)||””}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ct(“hide”,3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,”display”),e!==”none”&&!f._data(d,”olddisplay”)&&f._data(d,”olddisplay”,e));for(g=0;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each([“”,”X”,”Y”],function(a,b){h.style[“overflow”+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,”fxshow”+b,!0),f.removeData(h,”toggle”+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),”using”in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,”marginTop”))||0,c.left-=parseFloat(f.css(a,”marginLeft”))||0,d.top+=parseFloat(f.css(b[0],”borderTopWidth”))||0,d.left+=parseFloat(f.css(b[0],”borderLeftWidth”))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,”position”)===”static”)a=a.offsetParent;return a})}}),f.each({scrollLeft:”pageXOffset”,scrollTop:”pageYOffset”},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:”height”,Width:”width”},function(a,c){var d=”client”+a,e=”scroll”+a,g=”offset”+a;f.fn[“inner”+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,”padding”)):this[c]():null},f.fn[“outer”+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?”margin”:”border”)):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define==”function”&&define.amd&&define.amd.jQuery&&define(“jquery”,[],function(){return f})})(window);
// ]]>// ” ? $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(‘<a ‘).length < 3) && ($R.measureText__getTextLength(_aboveHTML.replace(/]+?>/gi, ”).replace(/\s+/gi, ‘ ‘)) ”); 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 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 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 = ‘rgba(255, 85, 0, 0.5)’
;

// choose
switch (true)
{
case (_category == ‘target’ && _reason == ‘first’):
_outline = ‘#00cc00’;
_background = ‘rgba(0, 255, 0, 0.5)’;
break;

case (_category == ‘target’ && _reason == ‘second’):
_outline = ‘#0000cc’;
_background = ‘rgba(0, 0, 255, 0.5)’;
break;

// =====

case (_category == ‘target’ && _reason == ‘next-page’):
_outline = ‘#FF80C0’;
_background = ‘rgba(255, 128, 192, 0.5)’;
break;

case (_category == ‘target’ && _reason == ‘add-above’):
_outline = ‘#804000’;
_background = ‘rgba(128, 64, 0, 0.5)’;
break;

// =====

case (_category == ‘clean-before’ && _reason == ‘floating’):
_outline = ‘#808080’;
_background = ‘rgba(128, 128, 128, 0.5)’;
break;

case (_category == ‘clean-after’ && _reason == ‘missing-density’):
_outline = ‘#C0C0C0’;
_background = ‘rgba(192, 192, 192, 0.5)’;
break;

case (_category == ‘clean-after’ || _category == ‘clean-before’):
_outline = ‘#000000’;
_background = ‘rgba(0, 0, 0, 0.5)’;
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(”
+ ‘

‘ + ”
+ _key
+ ‘

+ ‘


+ _value
+ ‘

+ ‘


);
}

// first
for (var i=0, _i=_first.length; i 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 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 ” && _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 -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 -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= _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;
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 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 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)):
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;
default: return 0;
}
});

// second candidate computation
// ============================
for (var i=0, _i=_candidates.length; i 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’] 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 ”) ? _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 -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 -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 0)):
break;

case ((_explored._length__links_text / _explored._length__all_text) 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) -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 0)):
case (_node.getElementsByTagName && (_explored._length__plain_text 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 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 ”)
{ _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 -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 += ”;
/* 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)
+ ‘
<div class=”readableLargeImageContainer’
+ (($(_node).width() = 250) ? ‘ float’ : ”)
+ ‘”>’
+ _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(//gi, ”);
}

// for tables, clear empty rows
if (_tag_name == ‘table’)
{
_contents = _contents.replace(/
]*?>/gi, ”); _contents = _contents.replace(//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 -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.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 = [
/]*?>([\s\S]+?)/gi,
/]*?>([\s\S]+?)/gi,
/]*?>([\s\S]+?)/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 -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(/]*>/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 -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 -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 ” ? $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(‘<a ‘).length < 3) && ($R.measureText__getTextLength(_aboveHTML.replace(/]+?>/gi, ”).replace(/\s+/gi, ‘ ‘)) ”); 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 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 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 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(/]*)>(\s*
)+/gi, ”);
_html = _html.replace(/(
\s*)+/gi, ”);
_html = _html.replace(/(
\s*)+]*)>/gi, ”);
_html = _html.replace(/(\s*
)+/gi, ”);
_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 -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 -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 ”); else { continue; }
if ($R.measureText__getTextLength(_possible[i]._caption) <= 2); else { continue; }

for (var j=0, _j=$R.nextPage__captionKeywords.length; 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 -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 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;
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 = ”
+ ”
+ ‘ 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 ‘ ; // 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(/<noscript[^>]*?>([\s\S]*?)<\/noscript>/gi, ”); _html = _html.replace(/<onload=”*?” id=”nextPageFrame__’+_pageNr+'” ‘=”” +=”” frameborder=”0″ scrolling=”no” ‘<iframe’=”” $r.$nextpages.append(”=”” ==”==============” frame=”” append=”” body’);=”” _script+'<=”” _html=”_html.replace(/<\/body/i,” handler=”” load=”” add=”” ”);=”” gi,=””>’ ); // write to frame // ============== var _doc = $(‘#nextPageFrame__’+_pageNr).contents().get(0); _doc.open(); _doc.write(_html); _doc.close(); }; // loaded in frame // =============== $R.getContent__nextPage__loadedInFrame = function (_pageNr, _pageWindow) { // find // ==== var _found = $R.getContent__findInPage(_pageWindow), _foundHTML = _found._html, _removeTitleRegex = new RegExp($R.articleTitleMarker__start + ‘(.*?)’ + $R.articleTitleMarker__end, ‘i’) ; // get first fragment // ================== var _firstFragment = $R.getContent__nextPage__getFirstFragment(_foundHTML); // gets first 2000 characters // diff set at 100 — 0.05 switch (true) { case ($R.levenshteinDistance(_firstFragment, $R.nextPage__firstFragment__firstPage) < 100): case ($R.levenshteinDistance(_firstFragment, $R.nextPage__firstFragment__lastPage) < 100): // mark $R.debugPrint(‘NextPage’, ‘false’); // mark again if ($R.debug) { $(‘#debugOutput__value__NextPage’).html(‘false’); } // pop page $R.nextPage__loadedPages.pop(); // break return false; default: // add to first fragemnts $R.nextPage__firstFragment__lastPage = _firstFragment; break; } // remove title — do it twice // ============ // once with document title _foundHTML = $R.getContent__find__isolateTitleInHTML(_foundHTML, ($R.document.title > ” ? $R.document.title : ”)); _foundHTML = _foundHTML.replace(_removeTitleRegex, ”); // once with article title _foundHTML = $R.getContent__find__isolateTitleInHTML(_foundHTML, $R.articleTitle); _foundHTML = _foundHTML.replace(_removeTitleRegex, ”); // display // ======= $R.displayPageHTML(_foundHTML, _pageNr, _pageWindow.location.href); // next // ==== $R.getContent__nextPage__find(_pageWindow, _found._links); }; // rewrites // ======== // rewrite displayPageHTML — for multi-page articles // ======================= $R.displayPageHTML = function (_processedPageHTML, _pageNr, _pageURL) { // skip first if (_pageNr > 1); else { return; } // push to pages $C._nextPages.push({ ‘_html’: _processedPageHTML, ‘_url’: _pageURL }); }; // rewrite makeRTL — for right-to-left pages // =============== $R.makeRTL = function () { $R.rtl = true; }; $R.makeNotRTL = function () { $R.rtl = false; } // set component object // ==================== window.ClearlyComponent = $C; window.$readable = $R; }

// <![CDATA[
/*
http://www.JSON.org/json2.js
2008-11-19

Public Domain.

NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.

See http://www.JSON.org/js.html

This file creates a global JSON object containing two methods: stringify
and parse.

JSON.stringify(value, replacer, space)
value any JavaScript value, usually an object or array.

replacer an optional parameter that determines how object
values are stringified for objects. It can be a
function or an array of strings.

space an optional parameter that specifies the indentation
of nested structures. If it is omitted, the text will
be packed without extra whitespace. If it is a number,
it will specify the number of spaces to indent at each
level. If it is a string (such as ‘\t’ or ‘ ‘),
it contains the characters used to indent at each level.

This method produces a JSON text from a JavaScript value.

When an object value is found, if the object contains a toJSON
method, its toJSON method will be called and the result will be
stringified. A toJSON method does not serialize: it returns the
value represented by the name/value pair that should be serialized,
or undefined if nothing should be serialized. The toJSON method
will be passed the key associated with the value, and this will be
bound to the object holding the key.

For example, this would serialize Dates as ISO strings.

Date.prototype.toJSON = function (key) {
function f(n) {
// Format integers to have at least two digits.
return n < 10 ? ‘0’ + n : n;
}

return this.getUTCFullYear() + ‘-‘ +
f(this.getUTCMonth() + 1) + ‘-‘ +
f(this.getUTCDate()) + ‘T’ +
f(this.getUTCHours()) + ‘:’ +
f(this.getUTCMinutes()) + ‘:’ +
f(this.getUTCSeconds()) + ‘Z’;
};

You can provide an optional replacer method. It will be passed the
key and value of each member, with this bound to the containing
object. The value that is returned from your method will be
serialized. If your method returns undefined, then the member will
be excluded from the serialization.

If the replacer parameter is an array of strings, then it will be
used to select the members to be serialized. It filters the results
such that only members with keys listed in the replacer array are
stringified.

Values that do not have JSON representations, such as undefined or
functions, will not be serialized. Such values in objects will be
dropped; in arrays they will be replaced with null. You can use
a replacer function to replace those with JSON values.
JSON.stringify(undefined) returns undefined.

The optional space parameter produces a stringification of the
value that is filled with line breaks and indentation to make it
easier to read.

If the space parameter is a non-empty string, then that string will
be used for indentation. If the space parameter is a number, then
the indentation will be that many spaces.

Example:

text = JSON.stringify([‘e’, {pluribus: ‘unum’}]);
// text is ‘[“e”,{“pluribus”:”unum”}]’

text = JSON.stringify([‘e’, {pluribus: ‘unum’}], null, ‘\t’);
// text is ‘[\n\t”e”,\n\t{\n\t\t”pluribus”: “unum”\n\t}\n]’

text = JSON.stringify([new Date()], function (key, value) {
return this[key] instanceof Date ?
‘Date(‘ + this[key] + ‘)’ : value;
});
// text is ‘[“Date(—current time—)”]’

JSON.parse(text, reviver)
This method parses a JSON text to produce an object or array.
It can throw a SyntaxError exception.

The optional reviver parameter is a function that can filter and
transform the results. It receives each of the keys and values,
and its return value is used instead of the original value.
If it returns what it received, then the structure is not modified.
If it returns undefined then the member is deleted.

Example:

// Parse the text. Values that look like ISO date strings will
// be converted to Date objects.

myData = JSON.parse(text, function (key, value) {
var a;
if (typeof value === ‘string’) {
a =
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
if (a) {
return new Date(Date.UTC(+a[1], +a[2] – 1, +a[3], +a[4],
+a[5], +a[6]));
}
}
return value;
});

myData = JSON.parse(‘[“Date(09/09/2001)”]’, function (key, value) {
var d;
if (typeof value === ‘string’ &&
value.slice(0, 5) === ‘Date(‘ &&
value.slice(-1) === ‘)’) {
d = new Date(value.slice(5, -1));
if (d) {
return d;
}
}
return value;
});

This is a reference implementation. You are free to copy, modify, or
redistribute.

This code should be minified before deployment.
See http://javascript.crockford.com/jsmin.html

USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
NOT CONTROL.
*/

/*jslint evil: true */

/*global JSON */

/*members “”, “\b”, “\t”, “\n”, “\f”, “\r”, “\””, JSON, “\\”, apply,
call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
lastIndex, length, parse, prototype, push, replace, slice, stringify,
test, toJSON, toString, valueOf
*/

// Create a JSON object only if one does not already exist. We create the
// methods in a closure to avoid creating global variables.

if (!this.JSON) {
JSON = {};
}
(function () {

function f(n) {
// Format integers to have at least two digits.
return n < 10 ? ‘0’ + n : n;
}

if (typeof Date.prototype.toJSON !== ‘function’) {

Date.prototype.toJSON = function (key) {

return this.getUTCFullYear() + ‘-‘ +
f(this.getUTCMonth() + 1) + ‘-‘ +
f(this.getUTCDate()) + ‘T’ +
f(this.getUTCHours()) + ‘:’ +
f(this.getUTCMinutes()) + ‘:’ +
f(this.getUTCSeconds()) + ‘Z’;
};

String.prototype.toJSON =
Number.prototype.toJSON =
Boolean.prototype.toJSON = function (key) {
return this.valueOf();
};
}

var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
escapable = /[\\\”\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
gap,
indent,
meta = { // table of character substitutions
‘\b’: ‘\\b’,
‘\t’: ‘\\t’,
‘\n’: ‘\\n’,
‘\f’: ‘\\f’,
‘\r’: ‘\\r’,
‘”‘ : ‘\\”‘,
‘\\’: ‘\\\\’
},
rep;

function quote(string) {

// If the string contains no control characters, no quote characters, and no
// backslash characters, then we can safely slap some quotes around it.
// Otherwise we must also replace the offending characters with safe escape
// sequences.

escapable.lastIndex = 0;
return escapable.test(string) ?
‘”‘ + string.replace(escapable, function (a) {
var c = meta[a];
return typeof c === ‘string’ ? c :
‘\\u’ + (‘0000’ + a.charCodeAt(0).toString(16)).slice(-4);
}) + ‘”‘ :
‘”‘ + string + ‘”‘;
}

function str(key, holder) {

// Produce a string from holder[key].

var i, // The loop counter.
k, // The member key.
v, // The member value.
length,
mind = gap,
partial,
value = holder[key];

// If the value has a toJSON method, call it to obtain a replacement value.

if (value && typeof value === ‘object’ &&
typeof value.toJSON === ‘function’) {
value = value.toJSON(key);
}

// If we were called with a replacer function, then call the replacer to
// obtain a replacement value.

if (typeof rep === ‘function’) {
value = rep.call(holder, key, value);
}

// What happens next depends on the value’s type.

switch (typeof value) {
case ‘string’:
return quote(value);

case ‘number’:

// JSON numbers must be finite. Encode non-finite numbers as null.

return isFinite(value) ? String(value) : ‘null’;

case ‘boolean’:
case ‘null’:

// If the value is a boolean or null, convert it to a string. Note:
// typeof null does not produce ‘null’. The case is included here in
// the remote chance that this gets fixed someday.

return String(value);

// If the type is ‘object’, we might be dealing with an object or an array or
// null.

case ‘object’:

// Due to a specification blunder in ECMAScript, typeof null is ‘object’,
// so watch out for that case.

if (!value) {
return ‘null’;
}

// Make an array to hold the partial results of stringifying this object value.

gap += indent;
partial = [];

// Is the value an array?

if (Object.prototype.toString.apply(value) === ‘[object Array]’) {

// The value is an array. Stringify every element. Use null as a placeholder
// for non-JSON values.

length = value.length;
for (i = 0; i < length; i += 1) {
partial[i] = str(i, value) || ‘null’;
}

// Join all of the elements together, separated with commas, and wrap them in
// brackets.

v = partial.length === 0 ? ‘[]’ :
gap ? ‘[\n’ + gap +
partial.join(‘,\n’ + gap) + ‘\n’ +
mind + ‘]’ :
‘[‘ + partial.join(‘,’) + ‘]’;
gap = mind;
return v;
}

// If the replacer is an array, use it to select the members to be stringified.

if (rep && typeof rep === ‘object’) {
length = rep.length;
for (i = 0; i < length; i += 1) {
k = rep[i];
if (typeof k === ‘string’) {
v = str(k, value);
if (v) {
partial.push(quote(k) + (gap ? ‘: ‘ : ‘:’) + v);
}
}
}
} else {

// Otherwise, iterate through all of the keys in the object.

for (k in value) {
if (Object.hasOwnProperty.call(value, k)) {
v = str(k, value);
if (v) {
partial.push(quote(k) + (gap ? ‘: ‘ : ‘:’) + v);
}
}
}
}

// Join all of the member texts together, separated with commas,
// and wrap them in braces.

v = partial.length === 0 ? ‘{}’ :
gap ? ‘{\n’ + gap + partial.join(‘,\n’ + gap) + ‘\n’ +
mind + ‘}’ : ‘{‘ + partial.join(‘,’) + ‘}’;
gap = mind;
return v;
}
}

// If the JSON object does not yet have a stringify method, give it one.

if (typeof JSON.stringify !== ‘function’) {
JSON.stringify = function (value, replacer, space) {

// The stringify method takes a value and an optional replacer, and an optional
// space parameter, and returns a JSON text. The replacer can be a function
// that can replace values, or an array of strings that will select the keys.
// A default replacer method can be provided. Use of the space parameter can
// produce text that is more easily readable.

var i;
gap = ”;
indent = ”;

// If the space parameter is a number, make an indent string containing that
// many spaces.

if (typeof space === ‘number’) {
for (i = 0; i // <![CDATA[
// 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();

//
(function($){
//feature detection
var hasPlaceholder = ‘placeholder’ in document.createElement(‘input’);

//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

//stuff in some calculated values into the placeholderCSS object
options.placeholderCSS[‘width’] = inputWidth;
options.placeholderCSS[‘height’] = inputHeight;

// adjust position of placeholder
options.placeholderCSS.left = (isOldOpera && (this.type == ‘email’ || this.type == ‘url’)) ?
‘11%’ : o_left;
placeholder.css(options.placeholderCSS);

//place the placeholder if the input is empty

$this.wrap(options.inputWrapper);
$this.attr(‘id’, inputId).after(placeholder);

if(inputVal) {
$this.next().hide();
}

//hide placeholder on focus
$this.focus(function(){
$this.next().hide();
});

//show placeholder if the input is empty
$this.blur(function(){
if (!$.trim($this.val())){
$this.next().show();
};
});
});
};

//expose defaults
$.fn.placeholder.defaults = {
//you can pass in a custom wrapper
inputWrapper: ‘

‘,
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);
// ]]>// 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 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;
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
}
};
// ]]>// <![CDATA[
Evernote.JSSerializer = {

_selectionFinder : new Evernote.SelectionFinder(window.document),

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;
}
},

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 // // > 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”;
Evernote.GlobalUtils.absolutizeImages(spinner, “images/icon_scissors.png”);
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 ) {
Evernote.Logger.debug( “ClipNotificator.clearWait()” );

var wait = doc.getElementById( this.constructor.WAIT_CONTAINER_ID );
if ( wait ) {
wait.style.opacity = “0”;
setTimeout( function() {
if ( wait.parentNode ) {
wait.parentNode.removeChild( wait );
}
}, 1000 );
}
};
// ]]>// // // <![CDATA[
function ContentVeil() {
Evernote.Logger.debug(document);
var veil = document.createElement(“div”);
var inner = document.createElement(“div”);
veil.appendChild(inner);
veil.style.boxSizing = “border-box”;
veil.style.borderStyle = “solid”;
var scroller = new Evernote.Scroller( window );
try {
veil.style.borderColor = “rgba(0, 0, 0, 0.7)”;
} catch (e) {
veil.style.borderColor = “rgb(0, 0, 0)”;
veil.className = “evernote-top-fixed-position-quirks”;
}

inner.style.borderWidth = “4px”;
inner.style.borderStyle = “solid”;
try {
inner.style.borderColor = “rgba(255, 255, 0, 0.7)”;
} catch (e) {
inner.style.borderColor = “rgb(255, 255, 0)”;
}

inner.style.height = “100%”;
inner.style.width = “100%”;
inner.style.boxSizing = “border-box”;

// 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 currentRectOffsetTop = 0;
var currentRectOffsetLeft = 0;
var currentlyStatic = false;

function reset() {
currentlyShownRect = null;
currentRectOffsetTop = 0;
currentRectOffsetLeft = 0;

showElements(“embed”);
showElements(“object”);
showElements(“iframe”);
veil.style.position = “fixed”;
veil.style.left = “0px”;
veil.style.zIndex = “2147483646”;
if(Evernote.Utils.isQuirkMode() && !Evernote.BrowserDetection.isIE10()) {
veil.style.position = “absolute”;
veil.className = “evernote-top-fixed-position-quirks”;
}
else {
veil.style.top = “0px”;
}

blank();
}

function blank() {

if((Evernote.Utils.isQuirkMode() || Evernote.BrowserDetection.isLessThanIE9()) && !Evernote.BrowserDetection.isIE10()) {
veil.style.width = “0px”;
veil.style.height = “0px”;
}
else {
veil.style.height = Evernote.Utils.innerHeight() + “px”;
veil.style.width = Evernote.Utils.innerWidth() + “px”;
}
}

function gray() {
show();
inner.style.display = “none”;
}

function show() {
Evernote.Logger.debug(“Content veil show”);
inner.style.display = “”;
veil.style.backgroundColor = “”;
if (!Evernote.ElementExtension.hasParentNode(veil)) {
document.body.appendChild(veil);
}
}

function hide() {
veil.style.borderLeftWidth = Evernote.Utils.innerWidth()/2 + “px”;
veil.style.borderRightWidth = Evernote.Utils.innerWidth()/2 + “px”;

veil.style.borderBottomWidth = Evernote.Utils.innerHeight()/2 + “px”;
veil.style.borderTopWidth = Evernote.Utils.innerHeight()/2 + “px”;
if (Evernote.ElementExtension.hasParentNode(veil)) {
veil.parentNode.removeChild(veil);
}
}

// 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 scrollToRect(rect) {
var sLeft = document.documentElement.scrollLeft;
var sTop = document.documentElement.scrollTop;

var left = rect.left – (Evernote.Utils.innerWidth() / 2) + sLeft;
var top = rect.top – (Evernote.Utils.innerHeight() / 2) + sTop;
scroller.scrollTo( { x: left, y: top }, 120, 20 );
}

// DrawStroke is obsolete, it is now always “true”.
function revealRect(rect, drawStroke, staticView) {

// Save this info.
currentlyShownRect = rect;
currentRectOffsetTop = Evernote.Utils.scrollTop();
currentRectOffsetLeft = Evernote.Utils.scrollLeft();
currentlyStatic = staticView;

// 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 = Evernote.Utils.innerWidth(); //veil.style.width.replace(“px”, “”);
var veilHeight = Evernote.Utils.innerHeight(); //veil.style.height.replace(“px”, “”);
Evernote.Logger.debug(“Veil width ” + veilWidth);
Evernote.Logger.debug(“Veil height ” + veilHeight);
var offScreen = false;
if (y + height < 0) {
Evernote.Logger.debug(“y + height veilHeight) {
Evernote.Logger.debug(“y > veilHeight”);
offScreen = true;
}
else if (x + width < 0) {
Evernote.Logger.debug(“x + width veilWidth) {
Evernote.Logger.debug(“x > veilWidth”);
offScreen = true;
}
Evernote.Logger.debug(“Is offscreen ” + offScreen);
if (offScreen) {
veil.style.borderLeftWidth = veilWidth/2 + “px”;
veil.style.borderRightWidth = veilWidth/2 + “px”;
veil.style.borderTopWidth = veilHeight/2 + “px”;
veil.style.borderBottomWidth = veilHeight/2 + “px”;
inner.style.display = “none”;
return;
}
Evernote.Logger.debug(“Show rect ” + JSON.stringify(rect));
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”;

veil.style.width = veilWidth + “px”;
veil.style.height = veilHeight + “px”;
/*
veil.style.width = (veilWidth – (Math.max(x, 0) + Math.max((veilWidth – x – width), 0))) + “px”;
veil.style.height = (veilHeight – (Math.max(y, 0) + Math.max((veilHeight – y – height), 0))) + “px”;
*/
Evernote.Logger.debug(“revealRect finished”);
}

function revealStaticRect(rect, drawStroke) {
revealRect(rect, drawStroke, true);
}

function outlineElement(element, scrollTo) {
// See notes in Preview.js for why we use this method instead of just calling element.getBoundingClientRect().
if (scrollTo) {
Evernote.Logger.debug(“ContentVeil:scrollIntoViewIfNeeded “);
element.scrollIntoView(true);
}
var rect = Evernote.contentPreviewer.computeDescendantBoundingBox(element);
Evernote.Logger.debug(“Calculated rect ” + rect);
if (rect) {
var mutableRect = {
top: rect.top,
bottom: rect.bottom,
left: rect.left,
right: rect.right,
width: rect.width,
height: rect.height
}

// We don’t want to adjust ourselves into odd positions if the page is scrolled.
var sLeft = Evernote.Utils.scrollLeft();
var sTop = Evernote.Utils.scrollTop();

var BORDER_MIN = 9;
if (mutableRect.left < (BORDER_MIN – sLeft)) {
mutableRect.width -= (BORDER_MIN – sLeft) – mutableRect.left;
mutableRect.left = (BORDER_MIN – sLeft);
}
if (mutableRect.top (width – BORDER_MIN – sLeft)) {
mutableRect.right = (width – BORDER_MIN – sLeft);
mutableRect.width = mutableRect.right – mutableRect.left;
}
Evernote.Logger.debug(“Mutable record ” + mutableRect.top + “, ” + mutableRect.left + “, ” + mutableRect.right + “, ” + mutableRect.bottom + “, ” + mutableRect.width + “, ” + mutableRect.height);
Evernote.Logger.debug(“ContentVeil:reset “);

reset();
Evernote.Logger.debug(“ContentVeil:revealRect “);

revealRect(mutableRect, true);
Evernote.Logger.debug(“Hide elements embeded”);
hideElements(“embed”, element);
hideElements(“object”, element);
Evernote.Logger.debug(“Hide elements iframe”);
hideElements(“iframe”, element);
Evernote.Logger.debug(“Show it”);
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”;
}
}

function showElements (tagName, inElement) {
if (!inElement) {
inElement = document;
}
var els = inElement.getElementsByTagName(tagName);
for (var i = 0; i // 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 url = document.location.href;
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 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 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 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 || !window.ClearlyComponent)
{
Evernote.Logger.warn(“Couldn’t find clearly!”);
clearlyCallback(null, callback);
}
else {
Evernote.Logger.debug(“Call clearly to select article”);
try {
window.ClearlyComponent.getContentElementAndHTML(window, function(data){clearlyCallback(data, callback)});
} catch(e) {
Evernote.Logger.error(“Failed to find article by clearly due to error ” + e);
clearlyCallback(null, callback);
}
}
}
// If the page is big enough, clearly is excruciatingly slow. We’ll jsut get the whole page.
// @TODO: Maybe clearly can get faster.
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 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;
}

// 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 getText(node, soFar, maxLen) {
if (node.nodeType == Evernote.Node.TEXT_NODE) {
var trimmed = node.textContent.trim().replace(/\s+/g, ” “);
if (trimmed === ” ” || trimmed === “”) return soFar;
return soFar + ” ” + trimmed;
}

var banned = [
“script”,
“noscript”
];

if (node.nodeType == Evernote.Node.ELEMENT_NODE) {
if (Evernote.ArrayExtension.indexOf(banned, node.nodeName.toLowerCase()) == -1) {
for (var i = 0; i 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 // <![CDATA[
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 // <![CDATA[
function ContentPreview() {
Evernote.Logger.debug(“Start creating preview box”);
var contentVeil = new ContentVeil();
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;

function buildPreviewLegend() {
Evernote.Logger.debug(“buildPreviewLegend: start”);
var legend = document.createElement(“div”);
legend.id = “evernotePreviewLegend”;
legend.className = “evernotePreviewLegend”;
if(Evernote.Utils.isQuirkMode() || Evernote.BrowserDetection.isLessThanIE9()) {
legend.className += ” quirk-mode”;
legend.className += ” evernote-preview-position-top”;
}
legend.dir = “ltr”; // It ends up backwards on right-to-left pages otherwise.

var nudgeImgs = [
// Element class name Message identifier
[“icon-arrow-up”, { message: Evernote.Messages.EXPAND_SELECTION, image: “images/nudge-icons/nudge-icon-arrow-up.png”} ],
[“icon-arrow-down”, { message: Evernote.Messages.SHRINK_SELECTION, image: “images/nudge-icons/nudge-icon-arrow-down.png”}],
[“icon-arrow-lr”, { message: Evernote.Messages.MOVE_SELECTION, image: “images/nudge-icons/nudge-icon-arrow-lr.png”}],
[“icon-return”, { message: Evernote.Messages.CLIP_ARTICLE_HINT, image: “images/nudge-icons/nudge-icon-return.png”}]
];

var ul = document.createElement(“UL”);
Evernote.Logger.debug(“buildPreviewLegend: populate container”);
for (var i = 0; i < nudgeImgs.length; i++) {
var li = document.createElement(“li”);
if(i == nudgeImgs.length – 1)
li.className = “last”;
var div = document.createElement(“div”);
var message = document.createTextNode(Evernote.Addin.getLocalizedMessage(nudgeImgs[i][1].message));
div.className = “keyIcon ” + nudgeImgs[i][0];
Evernote.GlobalUtils.absolutizeImages(div, nudgeImgs[i][1].image);
li.appendChild(div);
var messageContainer = document.createElement(“span”);
messageContainer.appendChild(message);
li.appendChild(messageContainer);
var clearDiv = document.createElement(“div”);
div.style.clear = “both”;
li.appendChild(clearDiv);
ul.appendChild(li);
}
Evernote.Logger.debug(“buildPreviewLegend: populate container end”);
legend.appendChild(ul);
return legend;
}

Evernote.Logger.debug(“Build preview legend”);
var previewLegend = buildPreviewLegend();
Evernote.Logger.debug(“End Build preview legend”);

function showPreviewLegend() {
if (!Evernote.ElementExtension.hasParentNode(previewLegend)) {
document.body.appendChild(previewLegend);
}
var className = ” visible”;
if(Evernote.Utils.isQuirkMode()) {
className = ” preview-visible”;
}
previewLegend.className = previewLegend.className.replace(/\s*hidden|visible|preview-visible|preview-hidden\s*/, “”);
previewLegend.className += className;
}

function hidePreviewLegend() {
var className = ” hidden”;
if(Evernote.Utils.isQuirkMode()) {
className = ” preview-hidden”;
}
previewLegend.className = previewLegend.className.replace(/\s*hidden|visible|preview-hidden|preview-visible\s*/, “”);
previewLegend.className += className;
}

function removePreviewLegend() {
if (Evernote.ElementExtension.hasParentNode(previewLegend)) {
previewLegend.parentNode.removeChild(previewLegend);
}
}

function buildUrlElement() {
var urlEl = document.createElement(“div”);
urlEl.id = “evernotePreviewContainer”;
var className = “evernotePreviewContainer evernotePreviewUrlContainer”;
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.body.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 (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 showOverlay() {
previewElement = null;
clear();
contentVeil.reset();
contentVeil.show();
contentVeil.hideAllActiveObjects();
}

function previewUrl() {
previewElement = null;
clear();
contentVeil.reset();
contentVeil.gray();
var title = window.document.title;
var url = PageContext.url;
var favIconUrl =PageContext.getFavIconUrl();
urlElement.innerHTML = Evernote.GlobalUtils.createUrlClipContent(title, url, favIconUrl);
var element = Evernote.JQuery(urlElement);
if(Evernote.Utils.isQuirkMode() && !element.hasClass(“evernote-fixed-position-fix”)) {
element.addClass(“evernote-fixed-position-fix”);
Evernote.Utils.fixedPosition(window, element, function() {
var clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
var containerHeight = element.outerHeight();
return scrollTop + (clientHeight – containerHeight) / 2;
}, true);
}
showUrlElement();
contentVeil.hideAllActiveObjects();
}

// 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();
hideUrlElement();
removePreviewLegend();
}

function _previewArticle (showHelp) {
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), true);
Evernote.Logger.debug(“contentVeil.show “);
contentVeil.show();
}
else {
Evernote.Logger.debug(“contentVeil.outlineElement”);
contentVeil.outlineElement(previewElement, true);
}
if (showHelp) {
Evernote.Logger.debug(“showPreviewLegend”);
showPreviewLegend();
Evernote.Logger.debug(“setTimeout:hidePreviewLegend”);
setTimeout(hidePreviewLegend, 6000);
}
}
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) {
var showHelp = Evernote.Options.articleSelection == Evernote.ArticleSelectionOptions.ENABLED;

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(showHelp);
});
article = previewElement;
} else {
previewElement = article;
_previewArticle(showHelp);
}
}
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;
}

// We don’t want to clip the clipper controls notification.
// @TODO: Probably want something similar for the content veil.
if (candidate === previewLegend) {
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;
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.”);
contentVeil.outlineElement(previewElement, true);
}
}

function previewFullPage() {

var borderWidth = 10;
var w = Evernote.Utils.innerWidth();
var h = Evernote.Utils.innerHeight();

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, true);
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 = Evernote.ElementExtension.getBoundingClientRect(range);
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 1) {
newRect = unionRectangles(Evernote.ElementExtension.getBoundingClientRect(element), 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};
return applyElementRect(element, Evernote.ElementExtension.getBoundingClientRect(element));
}

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 // // <![CDATA[
Evernote.ArrayExtension = {
indexOf : function(element, searchStr) {
if(!element) {
return -1;
}
if (element.indexOf)
return element.indexOf(searchStr);
for(var i = 0; i >> 0;
if (typeof fun != “function”)
throw new TypeError();

var res = [];
var thisp = arguments[1];
for (var i = 0; i // <![CDATA[
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 // <![CDATA[
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”]) {
Evernote.Utils.changeBackgroundImage(element, Evernote.Addin.getPath(“resources”) + 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) {
Evernote.Logger.debug(“localize: Before lowercase”);
Evernote.Logger.debug(“localize: element ” + element);
Evernote.Logger.debug(“localize: element.nodeName ” + element.nodeName);
var node = element.nodeName.toLowerCase();
Evernote.Logger.debug(“localize: after lowercase”);
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”:
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;
}
}

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.createUrlClipContentForOldClipper = function(title, url) {
var style = “font-size: 12pt; line-height: 18px; display: inline;”;
var content = “” + url + ““;
var imgStyle = “display:inline;border: none; width: 16px; height: 16px; padding: 0px; margin: 0px 8px -2px 0px;”;
return “” +
content + “
“;
};

Evernote.GlobalUtils.getFaviconImageUrlForOldClipper = function(url) {
var re = new RegExp( “^[^:]+:\/+([^\/” + “:” + “]+).*$” );
var domain = url.replace( re, “$1” );
return “http://www.google.com/s2/favicons?domain=” + domain.toLowerCase();
};

Evernote.GlobalUtils.createUrlClipContent = function(title, url, favIcoUrl) {
var titleAttr = (title) ? Evernote.GlobalUtils.escapeXML(title) : “”;
var style = “font-size: 12pt; line-height: 18px; display: inline;”;
var content = “” + Evernote.GlobalUtils.escapeXML(url) + ““;
if (favIcoUrl && !BAD_FAV_ICON_URLS[favIcoUrl.toLowerCase()]) {
var imgStyle = “display:inline;border: none; width: 16px; height: 16px; padding: 0px; margin: 0px 8px -2px 0px;”;
content = “” +
content + “

} else {
content = “” + content + ““;
}
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”;
};
})();
// ]]>// <![CDATA[
/**
* Global utilities.
*/
Evernote.Utils = {

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 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 = 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

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”;
},

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 😛

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);

//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;
},

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”);
win.attachEvent(“onscroll”, function() {
applyPosition(elem);
});
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 // // // // // <![CDATA[
Evernote.ResponseReceiver = {
parsers : [],
receivers : [],

onResponse: function(str) {
Evernote.Logger.debug(“Response received” + str);
for(var i in Evernote.ResponseReceiver.parsers) {
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 // // 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);
// ]]>// // <![CDATA[
Evernote.ErrorHandler = {

getHandler: function() {
return [Evernote.Addin, Evernote.AlertErrorHandler, Evernote.evernotePopup];
},

onDataReceived : function(response) {
if(response.type) {
if(response.type == “error”) {
this.notifyHandlers(response.data);

}
}
},

notifyHandlers : function(error) {
for(var i = 0; i // // // // <![CDATA[
//”use strict”;

Evernote.ElementSerializerFactory = {
getImplementationFor : function( node ) {
for ( var i = 0; i // // 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 };
};
// ]]>// 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
};
// ]]>// <![CDATA[
/**
* 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 = 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) {
if ( window.CSSStyleDeclaration && css instanceof window.CSSStyleDeclaration ) {
this.addStyle( css, this._styleList );
}
else if ( window.CSSStyleRule && css instanceof window.CSSStyleRule ) {
this.addStyle( css.style, this._styleList );
}
else if ( (window.CSSRuleList && css instanceof window.CSSRuleList) || css instanceof Array ) {
for ( var i = 0; i 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 ( i = 0; i < list.length; ++i ) {
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 ( prop in list ) {
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];
}
}
}
usedStyle = this.fixBackground(pName, usedStyle);
this.addSimpleStyle( pName, usedStyle );
}
}
}
};

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 0 ) {
str += styleName + “:” + value + “;”;
}
}

return str;
};
// ]]>// // // <![CDATA[
Evernote.NodeSerializer = function NodeSerializer( tab, styleStrategy, includeBg ) {
this.initialize( tab, styleStrategy, includeBg );
};

Evernote.NodeSerializer.prototype._tab = null;
Evernote.NodeSerializer.prototype._styleStrategy = null;
Evernote.NodeSerializer.prototype._docBase = null;
Evernote.NodeSerializer.prototype._imagesUrls = null;
Evernote.NodeSerializer.prototype._serializedDom = “”;
Evernote.NodeSerializer.prototype._includeBgStyles = true;

Evernote.NodeSerializer.prototype.initialize = function ( tab, styleStrategy, includeBg ) {
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.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” );

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);

if ( src && src.indexOf( “data:image” ) = 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 += “”;
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] );
}
}
}

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”} );
}

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 += “”;

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 “” + content.replace( /”/g, ” ) + “”;
}
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 += “” + ” ” + “”
}

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 += “”;
}

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;
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, “”) + ‘

‘;
};
// ]]>// // // <![CDATA[
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 “”;
};
// ]]>// <![CDATA[
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 “ “;
}
catch ( e ) {
Evernote.Logger.error( “VideoElementSerializer.serialize() failed: error = ” + e );
}

return “”;
};
// ]]>// <![CDATA[
/**
* Serializes DOM element into an img pointing to the thumbnail of the video
*
* Video ids are used for obtaining thumbnails via
* https://i2.ytimg.com/vi/cAcxHQalWOw/hqdefault.jpg. These ids can be
* obtained from:
*
*

 *   - the URL of the document containing EMBED
 *   - iframe's src attribute that embeds the video via an iframe
 *   - src attribute of the embed object (though on actualy youtube.com it's not possible)
 *

*
* 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 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;
};
// ]]>// // // <![CDATA[
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 // // <![CDATA[
Evernote.NotebooksLoader = {

notebooks: [],

getNotebookByUid: function(uid) {
Evernote.ResponseReceiver.subscribe(this);
Evernote.Addin.getNotebooks(document);
for(var i = 0; i // // // // // //